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

使用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.25 11:57:55