R survey包svydesign无法识别mitools imputationList对象的问题咨询
报错根因
- 第一类报错:
svydesign()默认入参仅支持单份数据框结构,无法直接识别imputationList类的多数据集列表属性,直接传入会触发类型强制转换失败。 - 第二类报错:编写的调用代码中,
weights是未定义的裸参数,被R识别为内置weights函数进入解析流程;同时未对mice输出的mids复合对象做格式清洗,直接嵌套imputationList()传入时,会把mids对象内部非数据集元素(插补模型函数、运行日志)当成数据集解析,最终触发“无法将function类对象强制转为data.frame”的错误。
正确对接流程
提取纯插补数据集列表
mice包生成的mids类对象是包含插补元信息的复合结构,不能直接作为imputationList的入参,需逐份提取插补完成的纯数据框:
# 假设yrbs_complex_imputations为mice流程生成的mids类对象 imp_df_list <- lapply( X = 1:yrbs_complex_imputations$m, # m为预先设置的插补次数 FUN = function(imp_idx) mice::complete(yrbs_complex_imputations, action = imp_idx) )
生成合规的imputationList对象
将上一步得到的、所有元素均为数据框的列表传入mitools::imputationList(),生成survey包可解析的多重插补对象:
yrbs_imp <- mitools::imputationList(imp_df_list)
构建复杂调查设计对象
调用svydesign()时需注意两个参数规范:
- 抽样设计字段(psu、strata、抽样权重等)需以带
~的公式形式传入,不直接传字符串 - 不要传入未赋值的裸参数,避免被R识别为内置函数触发类型错误
正确示例代码:
yrbs_svy_design <- svydesign( ids = ~psu, strata = ~stratum, nest = TRUE, data = yrbs_imp )
结果验证
运行完成后,通过class(yrbs_svy_design)确认输出对象同时归属svyimputationList与svydesign类,即说明多重插补数据已成功接入复杂调查分析逻辑,可直接调用survey包的分析函数开展后续工作。
内容的提问来源于stack exchange,提问作者rmwonder
相关产品推荐
相关产品推荐

