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

时间:2014-10-31 03:34:49

标签: r r-mice

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

编辑:示例

library(mice)
data(nhanes)

# create imputed datasets
imput = mice(nhanes)

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

imput$imp

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

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

imput$data

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

4 个答案:

答案 0 :(得分:5)

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

使用complete()将mids对象转换为长格式data.frame:

 long1 <- complete(midsobj1, action='long', include=TRUE)

执行所需的任何操作:

 long1$new.var <- long1$chl/2
 long2 <- subset(long1, age >= 5)

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

 midsobj2 <- as.mids(long2)

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

编辑:根据这个答案https://stackoverflow.com/a/34859264/4269699(从本质上是一个重复的问题)你也可以通过访问$ data和$ imp直接编辑mids对象。例如,

 midsobj2<-midsobj1
 midsobj2$data$new.var <- midsobj2$data$chl/2
 midsobj2$imp$new.var <- midsobj2$imp$chl/2

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

答案 1 :(得分:4)

另一个选择是在插补之前计算变量并对它们设置限制。

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 isnt used to predict
pred[ "extra", "chl"] <- 1

# Imputations
imput <- mice(nhanes, seed=1, pred = pred, meth = meth, print = FALSE)

小鼠中有一些例子:R

中的链式方程的多元插补

答案 2 :(得分:1)

with超载可以帮到你

with(imput, chl/2)

文档在?with.mids

给出

答案 3 :(得分:0)

basecamb 包中有一个函数:

library(basecamb)
apply_function_to_imputed_data(mids_object, function)