使用小鼠在r中按组合并估算的数据

时间:2019-11-11 12:40:20

标签: r group-by imputation r-mice complete

我的问题是对使用“小鼠”进行分组插补的问题的后续: multiple imputation and multigroup SEM in R

答案部分中的代码在插补部分的范围内都可以正常工作。但是之后,我剩下了一份实际上完整的数据列表,但不止一组。该示例如下所示:

'Set up data frame'
df.g1<-data.frame(ID=rep("A",5),x1=floor(runif(5,0,2)),x2=floor(runif(5,10,20)),x3=floor(runif(5,100,150)))
df.g2<-data.frame(ID=rep("B",5),x1=floor(runif(5,0,2)),x2=floor(runif(5,25,50)),x3=floor(runif(5,200,250)))
df.g3<-data.frame(ID=rep("C",5),x1=floor(runif(5,4,5)),x2=floor(runif(5,75,99)),x3=floor(runif(5,500,550)))
df<-rbind(df.g1,df.g2,df.g3)

'Introduce NAs'

df$x1[rbinom(15,1,0.1)==1]<-NA
df$x2[rbinom(15,1,0.1)==1]<-NA
df$x3[rbinom(15,1,0.1)==1]<-NA
df

'Impute values by group:'

df.clean<-lapply(split(df,df$ID), function(x) mice::complete(mice(df,m=5)))
df.clean

如您所见,df.clean是3的列表。每个组一个元素。但是每个元素都包含我要寻找的完整数据集。

原始答案建议在df.clean中rbind()获得的数据,这给了我一个具有45个观察值(原始大小的3倍)的新数据集。 这是最后一步的原始代码:

imputed.both <- do.call(args = df.clean, what = rbind)

哪个数据是“正确的”数据?为什么要最后一步?

谢谢你!

1 个答案:

答案 0 :(得分:1)

代码中有一个错误,下面有一个我可以使用的编辑版本:

#Set up data frame
set.seed(12345)
df.g1<-data.frame(ID=rep("A",5),x1=floor(runif(5,0,2)),x2=floor(runif(5,10,20)),x3=floor(runif(5,100,150)))
df.g2<-data.frame(ID=rep("B",5),x1=floor(runif(5,0,2)),x2=floor(runif(5,25,50)),x3=floor(runif(5,200,250)))
df.g3<-data.frame(ID=rep("C",5),x1=floor(runif(5,4,5)),x2=floor(runif(5,75,99)),x3=floor(runif(5,500,550)))
df<-rbind(df.g1,df.g2,df.g3)

#Introduce NAs

df$x1[rbinom(15,1,0.1)==1]<-NA
df$x2[rbinom(15,1,0.1)==1]<-NA
df$x3[rbinom(15,1,0.1)==1]<-NA
# check NAs
colSums(is.na(df))

#Impute values by group:

# here's the bug
df.clean<-lapply(split(df,df$ID), function(x) mice::complete(mice(x,m=5)))
imputed.both <- do.call(args = df.clean, what = rbind)
dim(imputed.both)
# returns 15,4

在问题代码中,您拥有

df.clean<-lapply(split(df,df$ID), function(x) mice::complete(mice(df,m=5)))
dim(do.call(rbind,df.clean))
#this returns 45,4

该函数用“ x”指定,但是您从全局环境调用df。因此,您可以估算完整的df。

如果要执行此步骤,请回答您的问题:

split(df,df$ID)

您将数据帧分为仅包含A,B或C的data.frames列表。然后,如果您仔细查看此列表,就会得到

df.clean<-lapply(split(df,df$ID), function(x) mice::complete(mice(x,m=5)))
names(df.clean)
lapply(df.clean,dim)

列表df.clean的每个项目都包含原始df的子集,ID为A,B或C。现在,您可以使用以下方法将此列表组合到一个data.frame中:

imputed.both <- do.call(rbind,df.clean)