首页 文章

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

提问于
浏览
6

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

Edit: Example

library(mice)
data(nhanes)

# create imputed datasets
imput = mice(nhanes)

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

imput$imp

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

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

imput$data

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

3 回答

  • 5

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

    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中的链式方程的多元插补

  • 4

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

    使用 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 . 请注意, as.mids() 需要 include=TRUE (用于包含缺失值的原始数据)以正确压缩长格式数据 . 请注意,在鼠标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

    有一个 with 超载,可以帮助你

    with(imput, chl/2)
    

    文件在 ?with.mids 给出

相关问题