如何使用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
相关产品推荐
相关产品推荐

