多重插补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
相关产品推荐
相关产品推荐

