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

如何用bal.tab获取加权后协变量平衡表中二元变量的频数与比例?

获取加权后二元变量的频数与比例(基于cobalt包)

bal.tab() 默认仅输出二元变量的加权均值(即比例),但可以通过以下两种方式获取加权频数和比例,适配科研论文表1的展示需求:

方法一:手动计算(结合dplyr)

直接对原始数据分组,利用加权求和/均值计算二元变量的加权频数和比例:

library(dplyr)

lalonde %>%
  group_by(treat) %>%
  summarise(
    # 计算married变量的加权频数和比例
    married_weighted_n = sum(married * weight),
    married_weighted_prop = mean(married * weight),
    # 同理处理其他二元变量
    nodegree_weighted_n = sum(nodegree * weight),
    nodegree_weighted_prop = mean(nodegree * weight)
  )
  • 加权频数:sum(二元变量 * weight),利用0/1变量的特性,直接得到权重加权后的“有效频数”
  • 加权比例:mean(二元变量 * weight) 等价于 sum(二元变量*weight)/sum(weight),即加权频数除以组内总权重

方法二:基于bal.tab结果扩展

先通过bal.tab()获取加权比例,再结合组内总权重计算频数,方便和连续变量的平衡结果整合:

# 获取bal.tab平衡结果
bal_result <- bal.tab(formula, data = lalonde, thresholds = c(m = .1), un = TRUE, disp = c("means", "sds"), weights = lalonde$weight)

# 计算每组的总权重
group_total_weights <- lalonde %>%
  group_by(treat) %>%
  summarise(total_w = sum(weight)) %>%
  pull(total_w)

# 扩展bal.tab结果,添加加权频数和格式化比例
binary_bal_extended <- bal_result$Balance %>%
  filter(Type == "Binary") %>%
  mutate(
    N.0.Adj = round(M.0.Adj * group_total_weights[1], 2), # 对照组加权频数,保留2位小数
    N.1.Adj = round(M.1.Adj * group_total_weights[2], 2), # 处理组加权频数
    Prop.0.Adj = paste0(round(M.0.Adj * 100, 1), "%"),    # 百分比格式比例
    Prop.1.Adj = paste0(round(M.1.Adj * 100, 1), "%")
  ) %>%
  select(Variable, Type, N.0.Adj, Prop.0.Adj, N.1.Adj, Prop.1.Adj, Diff.Adj)

# 查看结果
binary_bal_extended

如果需要将连续变量和二元变量的平衡结果合并成统一表格,可以将bal_result$Balance中连续变量部分和上述扩展后的二元变量结果用bind_rows()合并。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.06 08:52:57