使用 mice 在 r 中按组合并估算数据
Combine imputed data by group in r using mice
我的问题是这个关于使用 "mice" 按组估算的问题的后续问题:
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 个元素的列表。每组一个元素。但是每个元素都包含我正在寻找的完整数据集。
原始答案建议 rbind() 在 df.clean 中获得数据,这给我留下了一个包含 45(原始大小的 3 倍)观察值的新数据集。
这是最后一步的原始代码:
imputed.both <- do.call(args = df.clean, what = rbind)
"right" 是哪个数据?为什么是最后一步?
非常感谢!
代码中有一个错误,我在下面有一个有效的编辑版本:
#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)
您将数据框拆分为 data.frames 列表,其中只有 A、B 或 C。那么如果你 lapply 通过这个列表,你会得到
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)
我的问题是这个关于使用 "mice" 按组估算的问题的后续问题: 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 个元素的列表。每组一个元素。但是每个元素都包含我正在寻找的完整数据集。
原始答案建议 rbind() 在 df.clean 中获得数据,这给我留下了一个包含 45(原始大小的 3 倍)观察值的新数据集。 这是最后一步的原始代码:
imputed.both <- do.call(args = df.clean, what = rbind)
"right" 是哪个数据?为什么是最后一步?
非常感谢!
代码中有一个错误,我在下面有一个有效的编辑版本:
#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)
您将数据框拆分为 data.frames 列表,其中只有 A、B 或 C。那么如果你 lapply 通过这个列表,你会得到
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)