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

如何使用cobalt包bal.plot批量绘制PSM平衡诊断密度图网格

批量生成PSM平衡诊断密度图(cobalt包)实现方案

现有基础

已完成全匹配操作,代码如下:

full_match <- matchit(buyout_flag ~ tsale + sfincs_avg + logprox + tenure + age +
                     percent_ethwhite_origin + percent_poverty_origin + percent_hs_origin + percent_owner_origin + house_medval_origin + percap_origin,
                   method = "full", distance = "glm", link = "probit", data = hcad_floodp, caliper = 0.1)

目前可用的绘图方式存在两个问题:

  • 调用plot(full_match, type = "density")生成的基础密度图样式粗糙,输出分散在3张以上绘图页面,排版不可控
  • 调用bal.plot()单变量绘图效果更好,但逐一手写var.name参数效率太低,无法快速生成全部变量的诊断图、也无法直接组合为多图网格

具体实现方法

方法1:批量生成所有变量的单图

先自动提取匹配用到的所有协变量名称,再循环绘图即可,不需要手动枚举变量名:

library(cobalt)

# 提取匹配公式中所有自变量名,剔除首位的因变量buyout_flag
cov_list <- all.vars(formula(full_match))[-1]
# 加入倾向得分distance变量,组成全部需要绘图的变量集合
target_vars <- c("distance", cov_list)

# 循环批量输出每个变量的平衡密度图
for (var in target_vars) {
  # 注意:循环中必须显式print才能正常输出ggplot对象
  print(bal.plot(full_match, var.name = var, which = "both"))
}

如果需要批量保存图片到本地,只需要在循环内加入ggsave()函数,以变量名作为文件名存储即可。

方法2:直接组合为多图网格布局

bal.plot()输出的是标准ggplot对象,可以用patchwork包快速拼接为统一的多面板网格,避免逐张调整:

library(patchwork)

# 批量生成所有图存入列表,同时去掉子图重复的图例节省空间
plot_collect <- lapply(target_vars, function(var) {
  bal.plot(full_match, var.name = var, which = "both") +
    theme(legend.position = "none")
})

# 按3列排布拼接,最后在底部添加统一的全局图例
wrap_plots(plot_collect, ncol = 3) +
  plot_layout(guides = "collect") &
  theme(legend.position = "bottom")

提示:如果协变量中包含分类变量,bal.plot()会自动识别变量类型,生成对应的条形平衡图,不需要额外修改参数适配。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.01 01:36:27