You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.30 16:06:13