如何在R

时间:2019-01-31 19:37:36

标签: r least-squares

我想获得一些如何处理这种方法的一般规则。我有大数据,但以下是其中的代表性示例:

set.seed(2019)

myFun <- function(n = 50) {
  a <- do.call(paste0, replicate(5, sample(LETTERS, n, TRUE), FALSE))
  paste0(a, sprintf("%04d", sample(9999, n, TRUE)), sample(LETTERS, n, TRUE))
}
names = myFun()
group = round(runif(50, 0, 4))
condit = ifelse(round(runif(50, 0, 1.2)) > 0, "TRUE", "FALSE")
edf <- data.frame(names, group, condit, stringsAsFactors = F)
> head(edf)
       names group condit
1 NPWZX7229I     1  FALSE
2 FTANS2931N     0   TRUE
3 XUUGJ9010I     1  FALSE
4 THMIQ8703O     2   TRUE
5 NRLLS3573V     1   TRUE
6 LCETQ1320W     0  FALSE

问题是将这些数据分成N个组(约束):

说N = 5,

每个组都需要具有相同数量的TRUE和FALSE值(在没有50%的比率的情况下,尽可能接近)

每个组在group列中可能需要具有相同数量的值。

例如,对于N = 5,我们将手动进行:

names   group   condit
wrd0        0     TRUE
wrd1        0     TRUE
wrd2        1     TRUE
wrd3        1    FALSE
wrd4        2    FALSE
wrd5        2    FALSE
wrd6        3     TRUE
wrd7        3    FALSE
wrd8        4    FALSE
wrd9        4     TRUE

这是理想的,但如何自动为其他组复制呢?它是某个库(肯定是),但是我不知道该用什么。簇?还是一些最小二乘法?使用什么库?谢谢。

将其随机拆分的建议具有一定的意义和结果:

split(edf, sample(1:N, nrow(df), replace=T))

但我知道这可能是更合适。

2 个答案:

答案 0 :(得分:0)

最后,我找到了答案。这非常简单,可能会提供最佳的拟合度。这是迭代的东西。

devtools::install_github("m-Py/minDiff")

library(minDiff)

xdf <- create_groups(edf, criteria_scale = c("group"), 
                     criteria_nominal = c("condit"), sets_n = 5, repetitions = 5000)

您可以看到它的存在-取决于歪斜或不对称的数据量,它给人的感觉会更好或更糟。

查看依据: xdf[order(xdf$newSet, xdf$condit, xdf$group),]

乌夫...

答案 1 :(得分:0)

惰性方式

这是一种tidyverse通过随机抽样的方法。

library(dplyr)
library(purrr)

edf %>%
  split(.$group) %>%
  map(~ sample_n(., size = 5, replace = T)) %>%
  bind_rows()

自定义方式

这是一种灵活的方式,您可以根据自己的条件进行扩展。在这里,我确保所有包含少于5次迭代的原始样本都可以包括在内。您要如何处理倾斜采样取决于您自己。

library(dplyr)
library(purrr)

desired_sample_size = 5

conditional_sampling <- function(l){

    r = list(
      l %>% map(
                ~ sample_n(., 
                size = ifelse(nrow(.) < desired_sample_size, nrow(.), desired_sample_size), 
                replace = F)),
      l %>% map_if(~ desired_sample_size - nrow(.) > 0, 
                   ~ sample_n(., 
                              size = desired_sample_size - nrow(.), 
                              replace = T))
    )

    return(combine(r))
}

edf %>%
  split(.$group) %>%
  conditional_sampling() %>%
  bind_rows()