繁体   English   中英

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

[英]Combine imputed data by group in r using mice

我的问题是关于使用“小鼠”按组进行插补的问题的后续: R 中的多重插补和多组 SEM

就插补部分而言,答案中的代码可以正常工作。 但之后我得到了一份实际完整数据的列表,但不止一组。 该示例如下所示:

'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 个元素的列表。每组一个元素。 但是每个元素都包含我正在寻找的完整数据集。

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

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

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

非常感谢!

代码中有一个错误,我在下面有一个有效的编辑版本:

#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

function 用“x”指定,但您从全局环境中调用 df。 因此,您对完整的 df 进行估算。

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

split(df,df$ID)

您将数据框拆分为只有 A、B 或 Cs 的 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)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM