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

多重插补PSM场景下,如何将Cobalt的bal.tab转为可用数据框?

解决方法:将多重插补PSM的平衡性结果转为数据框

针对你遇到的bal.tab结果无法直接转成可用数据框的问题,有两种可行方案:

方案1:从bal.tab结果中提取嵌套的平衡性数据

bal.tab针对多重插补的输出是嵌套结构,直接用ldply遍历整个列表会包含大量非数据框元素,需精准提取每个插补集的平衡性表格:

# 加载purrr(若未安装先运行install.packages("purrr"))
library(purrr)
library(dplyr)

# 提取每个插补数据集的匹配前后平衡性数据,添加插补编号
imputed_bal_df <- map_dfr(bal$Imputed, ~ .x$Balance, .id = "Imputation")

# 提取Rubin法则汇总的平衡性结果
pooled_bal_df <- bal$Pooled$Balance
pooled_bal_df$Imputation <- "Pooled (Rubin's Rule)"

# 合并所有结果
full_bal_df <- bind_rows(imputed_bal_df, pooled_bal_df)

# 查看最终数据框
View(full_bal_df)

bal$Imputed是包含每个插补集bal.tab结果的列表,每个元素的$Balance字段就是我们需要的匹配前后均值、标准化均值差等数据;bal$Pooled则是Cobalt用Rubin法则汇总后的结果,直接提取即可。

方案2:手动计算匹配后均值并应用Rubin法则

如果需要完全自定义均值表格,可直接从匹配后的插补数据计算:

# 获取匹配后的插补数据集列表
matched_data_list <- get_matched(matched.datasets)

# 遍历每个数据集,计算处理组/对照组的变量均值
mean_list <- map(seq_along(matched_data_list), function(i) {
  data <- matched_data_list[[i]]
  data %>%
    group_by(OSP) %>%
    summarise(across(c(AGE, SEX, BMI, RAC, SMK), mean, na.rm = TRUE)) %>%
    pivot_wider(names_from = OSP, values_from = everything()) %>%
    mutate(Imputation = i)
})

# 合并单个插补集的均值结果
mean_df <- bind_rows(mean_list)

# 用Rubin法则计算合并后的均值(均值的平均)
pooled_means <- mean_df %>%
  select(-Imputation) %>%
  summarise(across(everything(), mean)) %>%
  mutate(Imputation = "Pooled (Rubin's Rule)")

# 合并所有结果
full_mean_df <- bind_rows(mean_df, pooled_means)

View(full_mean_df)

这种方法更灵活,可根据研究需求调整统计量(如添加标准差等),再用Rubin法则完成插补结果的合并。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.06 04:06:13