使用WeightIt平衡后,如何计算风险比及95%置信区间?
加权数据集中计算风险比(Risk Ratio)及95%置信区间
我用WeightIt对人群特征进行平衡,将人群分为处理组和非处理组,示例代码如下:
library(cobalt) library(WeightIt) data("lalonde", package = "cobalt") head(lalonde) W.out <- weightit(treat ~ age + educ + race + married + nodegree + re74 + re75, data = lalonde, estimand = "ATT", method = "ps")
我的结局变量为re78,希望计算**风险比(Risk Ratio)**及其95%置信区间,该如何操作?
我知道可以使用survey包的svyglm函数计算优势比,示例代码如下:
library(survey) d.w <- svydesign(~1, weights = W.out$weights, data = lalonde) fit <- svyglm(re78 ~ treat, design = d.w) coef(fit)
但如何在加权数据集中计算风险比及其95%置信区间,而非优势比?
解决方案
要在加权数据中计算风险比,核心是通过对数线性模型拟合(或直接计算均值比),将模型系数指数化后得到风险比。以下分两种结局类型给出具体操作:
情况1:结局变量为二分类(如re78>0定义为事件发生)
如果re78是二分类变量,可通过泊松对数线性模型拟合,系数指数化后即为风险比:
# 将re78转为二分类变量(示例:re78>0视为事件发生) lalonde$re78_bin <- as.integer(lalonde$re78 > 0) # 构建加权调查设计 library(survey) d.w <- svydesign(~1, weights = W.out$weights, data = lalonde) # 拟合对数线性泊松模型 fit_rr <- svyglm(re78_bin ~ treat, design = d.w, family = poisson(link = "log")) # 提取指数化后的风险比及95%置信区间 rr_results <- exp(cbind( Risk_Ratio = coef(fit_rr), confint(fit_rr) )) print(rr_results)
若事件发生率较高(>10%),可改用family = quasipoisson(link = "log")调整过度离散问题。
情况2:结局变量为连续型(如实际收入re78)
连续结局的风险比通常指处理组与对照组的加权均值比,可通过以下步骤计算:
# 计算加权后的组均值及标准误 mean_results <- svymean(~re78, by = ~treat, design = d.w) # 提取两组均值并计算风险比 treat_mean <- mean_results[2] control_mean <- mean_results[1] rr <- treat_mean / control_mean # 用delta法计算风险比的95%置信区间 library(multcomp) rr_se <- deltamethod(~ x2/x1, coef(mean_results), vcov(mean_results)) rr_ci <- exp(log(rr) + c(-1.96, 1.96) * rr_se) # 输出结果 cat(sprintf("风险比(RR):%.3f\n95%%置信区间:[%.3f, %.3f]", rr, rr_ci[1], rr_ci[2]))
注意事项
- 由于你设置了
estimand = "ATT",WeightIt已自动生成针对处理组的权重,无需额外调整。
内容的提问来源于stack exchange,提问作者user19745561
相关产品推荐
相关产品推荐

