使用倾向得分计算对被治疗者 (ATET/ATT) 的平均治疗效果
Calculating Average Treatment Effect on the Treated (ATET/ATT) with propensity score
我正在尝试使用倾向得分计算对被治疗者的平均治疗效果。我正在使用这些数据来估计母亲在怀孕期间吸烟是否会影响出生体重。
数据包括一个包含出生体重的列 (dbrwt)、一个包含吸烟状况的列 (tobacco01) 以及包含多个协变量的列。
我计算的平均治疗效果 (ATE) 如下:
model1 <- lm(dbrwt ~ tobacco01, data = dfc, weights = weight)
"weight" 对象包括通过回归几个其他协变量的吸烟状况生成的倾向得分。
既然我已经计算了 ATE,我正试图找到一种方法来计算对被治疗者的平均治疗效果 (ATET)。理想情况下,我可以通过修改上面的公式来做到这一点。在 Stata 中,有一个简单的 "atet" 命令,所以我想知道 R 中是否有任何可比较的东西。我搜索时没有发现任何可比较的东西,特别是当我指定要包括倾向得分时。
我也愿意手动执行此操作。 ATE 是整个人口的斜率平均值(也就是上面的 tobacco01 变量的系数)。 ATET 是怀孕期间吸烟的母亲人口子集的斜率平均值。它本质上是在问:如果吸烟人群中的母亲不吸烟,您期望该系数是多少?
您可以通过应用统计知识避免使用包。
倾向得分 (ps
) 很可能还不是您的加权 ATE 回归的权重。您应该使用适当的公式计算权重(例如,参见 Morgan and Winship 2015,第 7 章)。
# ATE
dfc$w.ate <- with(dfc, ifelse(tobacco01 == 1, 1 / ps, 1 / (1 - ps)))
ate <- lm(dbrwt ~ tobacco01, data=dfc, weights=w.ate)
coef(ate)
# (Intercept) tobacco01
# 3817.6932 -178.0539
还有一个加权 ATT 回归公式。
dfc$w.att <- with(dfc, ifelse(tobacco01 == 1, 1, ps / (1 - ps)))
att <- lm(dbrwt ~ tobacco01, data=dfc, weights=w.att)
coef(att)
# (Intercept) tobacco01
# 3843.0671 -334.1448
玩具数据:
set.seed(42)
n <- 1e3
dfc <- data.frame(dbrwt=rnorm(n, 3500, 500), tobacco01=rbinom(n, 1, .1), ps=runif(n))
我正在尝试使用倾向得分计算对被治疗者的平均治疗效果。我正在使用这些数据来估计母亲在怀孕期间吸烟是否会影响出生体重。
数据包括一个包含出生体重的列 (dbrwt)、一个包含吸烟状况的列 (tobacco01) 以及包含多个协变量的列。
我计算的平均治疗效果 (ATE) 如下:
model1 <- lm(dbrwt ~ tobacco01, data = dfc, weights = weight)
"weight" 对象包括通过回归几个其他协变量的吸烟状况生成的倾向得分。
既然我已经计算了 ATE,我正试图找到一种方法来计算对被治疗者的平均治疗效果 (ATET)。理想情况下,我可以通过修改上面的公式来做到这一点。在 Stata 中,有一个简单的 "atet" 命令,所以我想知道 R 中是否有任何可比较的东西。我搜索时没有发现任何可比较的东西,特别是当我指定要包括倾向得分时。
我也愿意手动执行此操作。 ATE 是整个人口的斜率平均值(也就是上面的 tobacco01 变量的系数)。 ATET 是怀孕期间吸烟的母亲人口子集的斜率平均值。它本质上是在问:如果吸烟人群中的母亲不吸烟,您期望该系数是多少?
您可以通过应用统计知识避免使用包。
倾向得分 (ps
) 很可能还不是您的加权 ATE 回归的权重。您应该使用适当的公式计算权重(例如,参见 Morgan and Winship 2015,第 7 章)。
# ATE
dfc$w.ate <- with(dfc, ifelse(tobacco01 == 1, 1 / ps, 1 / (1 - ps)))
ate <- lm(dbrwt ~ tobacco01, data=dfc, weights=w.ate)
coef(ate)
# (Intercept) tobacco01
# 3817.6932 -178.0539
还有一个加权 ATT 回归公式。
dfc$w.att <- with(dfc, ifelse(tobacco01 == 1, 1, ps / (1 - ps)))
att <- lm(dbrwt ~ tobacco01, data=dfc, weights=w.att)
coef(att)
# (Intercept) tobacco01
# 3843.0671 -334.1448
玩具数据:
set.seed(42)
n <- 1e3
dfc <- data.frame(dbrwt=rnorm(n, 3500, 500), tobacco01=rbinom(n, 1, .1), ps=runif(n))