R survey包regTermTest传入MIResult对象Wald检验报错求助
报错原因
报错核心是传入对象类型错误:
regTermTest对多重插补调查模型的支持,针对的是with(插补后调查设计, svyglm(...))直接返回的未合并模型列表,而非MIcombine()输出的MIResult类合并结果。MIResult仅存储合并后的系数、方差矩阵等汇总值,不保留模型terms属性,因此会触发no terms component nor attribute报错。- 代码存在一处隐藏逻辑错误:
svyglm调用中手动指定design = dsn,会覆盖with从子集设计dsn_sub传入的数据环境,导致模型实际使用全样本而非筛选后both == "No"的子样本,估计结果完全偏离预期。
解决方案
方法1:官方标准写法(推荐)
直接对未合并的插补模型列表调用regTermTest即可,函数会自动按多重插补规则合并检验结果,输出校正自由度后的检验统计量和p值:
# 修正模型,移除错误的design参数 anl <- with(dsn_sub, svyglm(api99 ~ enroll + meals + avg.ed*ell, family = gaussian() ) ) # 直接传入未合并的模型列表运行Wald检验 regTermTest(anl, ~meals) regTermTest(anl, ~avg.ed:ell) regTermTest(anl, ~avg.ed*ell)
方法2:从MIcombine结果手动计算p值
如果需要基于已生成的MIResult对象提取检验结果,可通过合并后的系数和协方差矩阵手动计算Wald检验p值:
res <- MIcombine(anl) # 通用检验函数 calc_wald_p <- function(mi_res, target_terms) { est <- coef(mi_res) v <- vcov(mi_res) pos <- match(target_terms, names(est)) wald <- t(est[pos]) %*% solve(v[pos, pos]) %*% est[pos] p <- pchisq(wald, df = length(pos), lower.tail = F) return(unname(p)) } # 使用示例:先通过coef(res)确认模型项的准确命名,再传入检验 # 检验meals主效应 calc_wald_p(res, "meals") # 检验交互项 calc_wald_p(res, "avg.ed:ell") # 检验avg.ed与ell的联合效应(主效应+交互项) calc_wald_p(res, c("avg.ed", "ell", "avg.ed:ell"))
注意:该方法返回的是大样本Wald卡方检验结果,未做小样本自由度校正,样本量较小时优先使用方法1的输出。
内容的提问来源于stack exchange,提问作者lamhine
相关产品推荐
相关产品推荐

