对R的MICE中的每个插补数据集执行操作

hal*_*ass 7 r r-mice

如何在midsR的包中的类对象中的每个插补数据集上执行操作(如子集化或添加计算列)mice?我希望结果仍然是一个mids对象.

编辑:示例

library(mice)
data(nhanes)

# create imputed datasets
imput = mice(nhanes)
Run Code Online (Sandbox Code Playgroud)

插补数据集存储为列表列表

imput$imp
Run Code Online (Sandbox Code Playgroud)

其中只有针对给定变量的插补的观察行.

原始(不完整)数据集存储在此处:

imput$data
Run Code Online (Sandbox Code Playgroud)

例如,如何创建一个按照chl/2每个插补数据集计算的新变量,从而产生一个新mids对象?

use*_*650 6

另一种选择是在插补之前计算变量并对它们施加限制。

library(mice)

# Create the additional variable - this will have missing
nhanes$extra <- nhanes$chl / 2

# Change the method of imputation for extra, so that it always equals chl/2
# Change the predictor matrix so only chl predicts extra
ini <- mice(nhanes, max = 0, print = FALSE)

meth <- ini$meth
meth["extra"] <- "~I(chl / 2)"

pred <- ini$pred  # extra isn't used to predict
pred["extra", "chl"] <- 1

# Imputations
imput <- mice(nhanes, seed = 1, pred = pred, meth = meth, print = FALSE)
Run Code Online (Sandbox Code Playgroud)

小鼠中的例子:Multivariate Imputation by Chained Equations in R


wjc*_*lme 6

这可以很容易地完成如下 -

使用complete()的中频对象转换为长格式data.frame:

 long1 <- complete(midsobj1, action='long', include=TRUE)
Run Code Online (Sandbox Code Playgroud)

执行所需的任何操作:

 long1$new.var <- long1$chl/2
 long2 <- subset(long1, age >= 5)
Run Code Online (Sandbox Code Playgroud)

用于as.mids()将操纵数据转换回mids对象:

 midsobj2 <- as.mids(long2)
Run Code Online (Sandbox Code Playgroud)

现在您可以midsobj2根据需要使用.请注意,include=TRUE需要as.mids()正确压缩长格式数据(用于包含缺失值的原始数据).请注意,在鼠标v2.25之前,as.mids()函数中存在一个错误(请参阅此文章https://stats.stackexchange.com/a/158327/69413)

编辑:根据这个答案/sf/answers/2440148511/(从本质上是一个重复的问题)你也可以通过访问$ data和$ imp直接编辑mids对象.所以举个例子

 midsobj2<-midsobj1
 midsobj2$data$new.var <- midsobj2$data$chl/2
 midsobj2$imp$new.var <- midsobj2$imp$chl/2
Run Code Online (Sandbox Code Playgroud)

如果你想要$ imp子集或者你想使用$ call,你会遇到麻烦,所以我不推荐这个解决方案.