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

MICE - How to generate missing values per subset and not whole data.frame

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

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

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$welldf$grp , 但我一直无法想出一个函数来产生这个。生成新列后,我可以使用一个 for 循环,而不是上面的两个 - 我认为这会提高速度?其次,上面的脚本不断重写 "temp_df",而我要求它添加到它 - 我尝试使用搜索结果中建议的 "rbind" 和 "apply" 但无济于事.

如果这看起来相对简单,或者已在其他地方得到回答,我们深表歉意。正如我所说,我对 R 和一般的计算语言比较陌生。

考虑使用 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)