升级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
相关产品推荐
相关产品推荐

