2014-10-31 91 views
5

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

编辑:实施例

library(mice) 
data(nhanes) 

# create imputed datasets 
imput = mice(nhanes) 

插补数据集被存储为列表

imput$imp 

那里只有用于与插补对于给定的变量的观察的行的列表。

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

imput$data 

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

+0

如果你花时间创建一个[最小的,可重现的例子](http://stackoverflow.com/questions/5963269/how-to-make-a- great-r-reproducible-example)以便我们可以提供特定的代码建议。这有点过于宽泛,也不具体。 – MrFlick 2014-10-31 03:43:32

+0

@ user20650,它确实将原始数据集存储在'imput $ data'中,但它与推测数据集是分开的。我刚刚添加了一个例子。 – 2014-10-31 04:01:13

+0

如果你想产生'chl/2',你可以在插补之前计算它。与进行插补时相比,您添加的限制是,当缺少该列的任何插补值等于“chl/2”时 – user20650 2014-10-31 04:02:08

回答

3

给出另一种方法是计算之前对他们的归集和地点限制的变量。

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中

1

还有就是with过载,可以帮助你在这里

with(imput, chl/2) 

的文档在?with.mids

+0

谢谢。但有没有一种方法可以用它来实际修改每个推算数据集,例如通过添加计算列? '((imput,function(x)x $ imp $ new.var = chl/2)'不起作用,可能是因为格式错误。 – 2014-10-31 04:31:43

+0

你为什么需要这样做?带()的''不能用于赋值。但是,用'with()'运行的任何东西都可以完成转换。 – MrFlick 2014-10-31 04:33:31

4

这可以很容易如下进行多元插补由链式方程 -

使用complete()转换一个中频对象为长格式的数据。框架:

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

执行任何操作需要:

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

使用as.mids()到后面操纵的数据转换为中频对象:

midsobj2 <- as.mids(long2) 

现在你可以使用midsobj2要求。请注意,as.mids()需要include=TRUE(用于包含缺少值的原始数据)才能正确压缩长格式的数据。需要注意的是小鼠中之前将有V2.25是在as.mids()中的错误函数(看到这个帖子https://stats.stackexchange.com/a/158327/69413

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

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

你会遇到麻烦,但如果你想子集$小鬼或者如果你想使用$调用,所以我不建议一般这种解决方案。

+1

看来'as.mids'中的错误可能已在最新的小鼠版本中得到纠正(2.25,2015-11-09)。 – 2016-04-04 21:09:45

+0

这个工作适合你吗?因为使用'as.mids'后我得到了一些奇怪的结果。更多这里:http://stackoverflow.com/questions/36511909/as-mids-replaces-added-values-with-na – 2016-04-11 13:10:17

相关问题