MICE - 如何为每个子集生成缺失值而不是整个data.frame

时间:2016-07-23 15:41:08

标签: r r-mice

我正在尝试分析一些数据,作为我论文的一部分,但开发代码证明是不可能的(对我而言)

我正在使用更大的数据子集来开发我的代码。 (不确定如何链接数据框)

head(df) 

 well   x   y   time     dist      speed grp
1    1 117 127 15.265 0.000000 0.00000000   1
2    1 118 127 15.303 1.000000 0.06534666   1
3    1 118 127 15.339 0.000000 0.00000000   1
4    1 118 127 15.368 0.000000 0.00000000   1
5    1 119 129 15.403 2.236068 0.14517094   1
6    1 120 129 15.443 1.000000 0.06475426   1

tail(df)

       well   x   y     time     dist        speed grp
664074   24 519 345 6957.419 0.000000 0.0000000000  24
664075   24 519 345 6957.453 0.000000 0.0000000000  24
664076   24 519 345 6957.490 0.000000 0.0000000000  24
664077   24 519 345 6957.529 0.000000 0.0000000000  24
664078   24 518 345 6957.557 1.000000 0.0001437286  24
664079   24 517 344 6957.598 1.414214 0.0002032618  24

基本上,XY值来自24孔板。记录周期结束后,grp值将增加N + 1(只是grp / well以相同值结束的巧合)。

在每个录制时段之后,录制中断,一旦完成录制,录制将重新开始。我目前正在尝试分析我设置为NA的数据中的缺失值。为了找到缺失的值,我使用了这个代码(下面)使用了MICE包。我希望每个小组的每个well分别由MICE包进行分析 - 而不是所有XY坐标。

for (i in unique(df$well)){

  w1 <- df[df$well==i,]

  for (j in unique(w1$grp)){

    w2 <- w1[w1$grp==j,]  

    temp_df <- mice(data = w2, m = 5, method = "rf", maxit = 5)
  }
}

两件事 - 首先,for循环非常慢,我不确定如何提高脚本的速度。我最初的想法是在我的d.f中创建一个新列,每当df$well值发生变化时,该列将填充N + 1,因为这将包含df$well&amp; df$grp,但我无法提出产生此功能的功能。一旦生成了新列,我可以使用一个for循环,而不是上面的两个 - 我认为这会提高速度?其次,上面的脚本不断重写“temp_df”,而我要求它添加到它 - 我尝试使用“rbind”和“apply”这些已经从搜索结果中建议但无济于事。

道歉,如果这看起来相对简单,或已在其他地方得到回答。正如我所说,我对R和计算语言一般都比较新。

1 个答案:

答案 0 :(得分:1)

使用expand.grid()lapply()

考虑此基本R解决方案
# DATA FRAME OF ALL COMBINATIONS BETWEEN WELL AND GRP
matches <- expand.grid(unique(df$well), unique(df$grp))

# LIST OF DFs
dfList <- lapply(seq_len(nrow(matches)), function(i) {
              x <- data.frame(df[(df$well == matches$Var1[i]) & 
                                 (df$grp == matches$Var2[i]),])
              temp_df <- mice(data = x, m = 5, method = "rf", maxit = 5)
          })

# ROW BIND LIST OF DFs
finaldf <- do.call(rbind, dfList)