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

升级marginaleffects至0.25.1后,mice::pool()无法合并avg_comparisons结果

多重插补结果合并问题:marginaleffects 0.25.x + mice::pool()

问题背景

升级marginaleffects至0.25.1版本后,使用mice::pool()合并多重插补数据集的ATE结果时出现报错。此前流程为:基于mice生成的mids对象,用lapply调用avg_comparisons()计算相对风险尺度的平均处理效应,再通过pool()合并结果。旧版本中hypothesis = "pairwise"(字符串形式)可正常运行,但0.25.x版本要求使用hypothesis = ~pairwise(公式形式),此时pool()无法识别返回结果的结构。

最小复现代码

ATE_all_subgroup <- lapply(results_all_sub$analyses, function(fit) {
  marginaleffects::avg_comparisons(
    fit,
    variables = "treatment",
    by = "groups",
    comparison = "lnratioavg",
    hypothesis = ~pairwise
  )
})

ATE_results <- mice::pool(ATE_all_subgroup)  # 此处报错

报错核心原因:avg_comparisons()返回的对象带有marginaleffects专属类属性,超出mice::pool()的识别范围。

疑问

  • 使用hypothesis = ~pairwise时,有没有推荐的结果合并方法?
  • 是否需要手动提取估计值和方差后再合并?
  • mice::pool()是否不再兼容公式形式的hypothesis参数?

解决方案

1. 优先方案:转换结果为纯数据框适配pool()

新版本marginaleffects返回的对象除了数据框结构外,还附带了专属类标签,导致pool()无法解析。只需在lapply内部将结果转换为标准数据框,并保留pool()所需的核心列,即可正常合并:

修改后的代码:

ATE_all_subgroup <- lapply(results_all_sub$analyses, function(fit) {
  res <- marginaleffects::avg_comparisons(
    fit,
    variables = "treatment",
    by = "groups",
    comparison = "lnratioavg",
    hypothesis = ~pairwise
  )
  # 转换为标准数据框,保留必要统计量列
  as.data.frame(res)[, c("term", "estimate", "std.error", "statistic", "p.value", "df")]
})

ATE_results <- mice::pool(ATE_all_subgroup)

2. 备选方案:手动提取估计值与方差,用pool.scalar()合并

如果上述方法无效,可以手动提取每个插补结果的估计值和方差,再通过mice::pool.scalar()逐个合并对比项:

# 提取所有插补数据集的估计值和方差
estimates <- lapply(ATE_all_subgroup, function(x) x$estimate)
variances <- lapply(ATE_all_subgroup, function(x) x$std.error^2)

# 逐个合并每个对比项的结果
pooled_list <- lapply(seq_along(estimates[[1]]), function(i) {
  # 提取第i个对比项在所有插补集中的估计值和方差
  est_vec <- sapply(estimates, function(x) x[i])
  var_vec <- sapply(variances, function(x) x[i])
  # 调用pool.scalar合并
  mice::pool.scalar(est_vec, var_vec, df = ATE_all_subgroup[[1]]$df[i])
})

# 整理为结构化数据框
pooled_results <- do.call(rbind, pooled_list)
rownames(pooled_results) <- ATE_all_subgroup[[1]]$term
colnames(pooled_results) <- c("estimate", "std.error", "t_value", "df", "p_value")

3. 兼容性说明

mice::pool()并非不兼容公式形式的hypothesis参数,而是新版本marginaleffects返回的对象结构发生了变化——新增了marginaleffects、avg_comparisons等类属性,而pool()默认仅识别标准模型对象或结构规范的基础数据框。通过转换为纯数据框的方式,即可消除这种兼容性冲突。


内容的提问来源于stack exchange,提问作者Ludovico Ambrosi

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.12 14:51:01