【问题标题】:Combine imputed data by group in r using mice使用小鼠在 r 中按组组合估算数据
【发布时间】:2020-03-07 03:39:34
【问题描述】:

我的问题是对使用“小鼠”按组进行插补的问题的后续: 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)

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

非常感谢!

【问题讨论】:

  • df.clean 是数据帧列表,而imputed.both 是与一个数据帧相同的数据。你的问题到底是什么?
  • df.clean 基本上是我在其中寻找的答案的三倍。用推算的数据。那么这三个 data.frames 中的哪一个是“正确的”?其次,这三个数据框合二为一的意义何在?在我的示例中,检查输出仍然相对容易,但我的原始数据集约为 500 组。 IE。如果没有必要,我不想增加我的数据大小。
  • 嗨胡安,我想你误解了stackoverflow.com/questions/48770037/…。 OP 需要在每个子集中进行估算,因此拆分
  • 在你的情况下,你不需要这样做,你可以在你的函数中看到, lapply(split(df,df$ID), function(x) mice::complete( mouse(df,m=5))),x 实际上没用。
  • 好的,我把它作为答案发布,我希望现在更清楚

标签: r group-by imputation r-mice


【解决方案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 或 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)

【讨论】:

  • 再次感谢您指出该错字。在我的实际数据上运行代码时,它会在一段时间后出错。我认为是因为每个组的观察结果很少。您知道是否是这种情况,或者是否有不同的原因?错误消息如下: Edit.setup(data, setup, ...) 中的错误:没有什么可以估算的另外:有 16 个警告(使用 warnings() 来查看它们)调用自:edit.setup(data ,设置,...)有什么想法吗?
  • 嘿@Juan,我遇到过一两次错误消息。老实说,我不记得它是否重要。我正在检查我最近的一些使用情况,我认为在某些情况下需要转换变量.. 希望这对您有所帮助
猜你喜欢
  • 1970-01-01
  • 2015-03-10
  • 2018-08-18
  • 2012-06-20
  • 1970-01-01
  • 2019-08-16
  • 2019-01-24
  • 2022-07-06
  • 2013-06-03
相关资源
最近更新 更多