11

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

编辑:示例

library(mice)
data(nhanes)

# create imputed datasets
imput = mice(nhanes)

估算的数据集存储为列表列表

imput$imp

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

原始(不完整)数据集存储在这里:

imput$data

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

4

4 回答 4

12

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

用于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,你会遇到麻烦,所以我一般不会推荐这个解决方案。

于 2015-06-17T12:49:29.823 回答
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 isn't used to predict
pred["extra", "chl"] <- 1

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

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

于 2014-10-31T04:20:53.930 回答
1

有一个超载with可以在这里帮助你

with(imput, chl/2)

文档在?with.mids

于 2014-10-31T04:03:39.780 回答
1

包中有一个功能basecamb

library(basecamb)
apply_function_to_imputed_data(mids_object, function)
于 2021-05-09T14:56:14.863 回答