使用 '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))
我需要用估算值计算一些变量的总和。我用 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))