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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.29 22:48:22