R中使用mi、survey包基于插补数据创建复杂调查设计对象报错
报错原因
mi()函数返回的是mi包定义的S4类多重重插补结果对象,不符合mitools::imputationList()的输入要求——该函数需要接收普通R列表,且列表内每个元素为单轮插补完成的data.frame对象。直接传入S4类对象时,R无法完成类型转换,就会抛出对应错误。
修正方案
- 插补完成后,使用mi包内置的
complete()方法逐轮提取插补结果,组装为符合要求的普通列表 - 将组装好的列表传入
imputationList(),再用于创建调查设计对象
修正后的可运行代码如下:
library(tidyverse) library(survey) library(mi) library(mitools) data(api) apisub <- apiclus1 %>% select(-c("name", "sname", "dname", "cname", "flag", "acs.46", "acs.core")) mdf <- missing_data.frame(apisub) mdf <- change(mdf, "cds", what = "type", to = "irrelevant") mdf <- change(mdf, "stype", what = "type", to = "irrelevant") mdf <- change(mdf, "snum", what = "type", to = "irrelevant") mdf <- change(mdf, "dnum", what = "type", to = "irrelevant") mdf <- change(mdf, "cnum", what = "type", to = "irrelevant") mdf <- change(mdf, "fpc", what = "type", to = "irrelevant") mdf <- change(mdf, "pw", what = "type", to = "irrelevant") show(mdf) imputations <- mi(mdf) # 逐轮提取插补结果为普通数据框,组装为列表 imp_list <- lapply(1:imputations@m, function(i) complete(imputations, i)) # 传入符合格式的插补列表创建调查设计对象 dsn1 <- svydesign(id = ~dnum, weights = ~pw, data = imputationList(imp_list), fpc = ~fpc)
注:前期将聚类ID、权重、有限总体校正因子等调查设计相关变量标记为irrelevant的操作逻辑正确,mi不会对这类变量做插补处理,会直接保留原始值,提取出的数据框中相关字段完整,不影响调查设计对象的正常创建。
内容的提问来源于stack exchange,提问作者lamhine
相关产品推荐
相关产品推荐

