如何在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对象?
另一种选择是在插补之前计算变量并对它们施加限制。
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。
这可以很容易地完成如下 -
使用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,你会遇到麻烦,所以我不推荐这个解决方案.