我的问题是对使用“小鼠”进行分组插补的问题的后续: 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)
哪个数据是“正确的”数据?为什么要最后一步?
谢谢你!
答案 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)