使用 'complete'(小鼠)和 'update'(调查)估算值的行总和的不同 return 值

Different return values of the sum of a row with imputed values using 'complete' (mice) and 'update' (survey)

我需要用估算值计算一些变量的总和。我用 complete --> as.mids --> with --> do.call

我需要做同样的事情,但在调查环境中。因此,我做了:update --> with --> MIcombine

两种方式计算的变量均值不匹配。哪一个是正确的?

您可以在这个玩具数据库中检查这种不同的行为:

library(tidyverse)
library(mice)
library(mitools)
library(survey)

mydata <- structure(list(dis1 = c(NA, NA, 1, 0, 0, 1, 1, 1, 1, 0), 
                         dis2 = c(0, 1, 0, 1, NA, 1, 1, 1, 1, 0), 
                         dis3 = c(1, 1, 0, 0, NA, 1, 1, 1, 1, 0),
                         sex = c(0,0,0,1,0,1,1,1,1,0),
                         clus = c(1,1,1,1,1,2,2,2,2,2)), 
                    row.names = c(NA, 10L), 
                    class = c("tbl_df", "tbl", "data.frame") )

imp <- mice::mice(mydata, m = 5, seed = 237856)

# calculating numenf with mice::complete 
long <- mice::complete(imp, action = "long", include = TRUE)
long$numenf <- long$dis1 + long$dis2 + long$dis3
imp2 <- mice::as.mids(long)
res <- with(imp2, mean(numenf))
do.call(mean, res$analyses) # mean = 2.1

#calculating numenf with update (from survey)
imp1 <- mice::complete(imp)
imp2 <- mice::complete(imp, 2)
imp3 <- mice::complete(imp, 3)
imp4 <- mice::complete(imp, 4)
imp5 <- mice::complete(imp, 5)
listimp <- mitools::imputationList(list(imp1, imp2, imp3, imp4, imp5))                                             
clus <- survey::svydesign(id = ~clus, data = listimp)
clus <- stats::update(clus, numenf = dis1 + dis2 + dis3)
res <- with(clus, survey::svymean(~numenf))
summary(mitools::MIcombine(res)) # mean = 1.98

回答

do.call(mean, res$analyses)替换为mean(unlist(res$analyses))


理由

在第一个代码片段中,res$analyses 是一个 list。当输入 do.call 时,您实际上是在调用:

mean(res$analyses[1], res$analyses[2], res$analyses[3], res$analyses[4], res$analyses[5])

mean 在其第一个参数中取 vector 的平均值。其他参数未正确使用(请参阅 ?mean)。因此,你只是得到 2.1 回来,因为这是第一次分析的(平均值)值。


我们可以使用 unlist(res$analyses)list 中创建 vector。然后,我们可以将它作为参数提供给 mean

mean(unlist(res$analyses))