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

