7.4 IPW与双重稳健估计
从匹配到加权:更灵活的因果效应估计
逆概率加权(IPW)
核心思想
Horvitz-Thompson估计量 (1952):
不是匹配,而是加权:
直觉:
- 处理组: 倾向得分低的个体权重高(因为稀有)
- 对照组: 倾向得分高的个体权重高
为什么有效?
类似地:
所以:
关键优势: IPW直接估计ATE(不仅仅是ATT)!
稳定IPW
问题: 极端权重
当接近0或1时,权重或爆炸!
后果: 估计量的方差极大,结果不稳定
解决: 稳定权重(Stabilized Weights)
估计量:
权重截断(Trimming)
Truncation: 限制极端权重
或使用对称截断:
实践建议: 报告截断前后的结果,检查结论是否稳健
共同支撑(Common Support / Overlap)
为什么共同支撑如此重要?
共同支撑条件:
如果违反:
- 某些处理个体的 → 找不到可比的对照
- 某些对照个体的 → 找不到可比的处理
- IPW权重爆炸,PSM匹配质量很差
诊断: 倾向得分分布图
python
plt.figure(figsize=(10, 4))
plt.hist(e_hat[D==1], bins=30, alpha=0.5, label='处理组', density=True)
plt.hist(e_hat[D==0], bins=30, alpha=0.5, label='对照组', density=True)
plt.xlabel('倾向得分')
plt.ylabel('密度')
plt.legend()
plt.title('倾向得分分布:检查共同支撑')
plt.show()处理: 修剪不重叠区域
常见做法:
- 剔除或的观测
- 只保留两组倾向得分分布重叠的区域
- 报告修剪前后的样本量和估计结果
Python实现:IPW
python
def estimate_ipw(X, D, Y, stabilized=True, trim=None):
"""
逆概率加权(IPW)
参数:
------
X: (N, K) 协变量
D: (N,) 处理指示器
Y: (N,) 结果变量
stabilized: 是否使用稳定权重
trim: 倾向得分截断阈值,如(0.1, 0.9)
返回:
------
ATE: 平均处理效应
weights: 权重向量
"""
N = len(D)
# 估计倾向得分
ps_model = LogisticRegression(max_iter=1000)
ps_model.fit(X, D)
e_hat = ps_model.predict_proba(X)[:, 1]
# 截断
if trim is not None:
e_hat = np.clip(e_hat, trim[0], trim[1])
# 计算权重
if stabilized:
p_D = D.mean()
w = np.where(D == 1, p_D / e_hat, (1 - p_D) / (1 - e_hat))
else:
w = np.where(D == 1, 1 / e_hat, 1 / (1 - e_hat))
# 估计ATE
if stabilized:
ATE = (np.sum(w[D==1] * Y[D==1]) / np.sum(w[D==1]) -
np.sum(w[D==0] * Y[D==0]) / np.sum(w[D==0]))
else:
ATE = np.mean(w * (D * Y - (1-D) * Y))
return ATE, w
# 使用
ATE_ipw, weights = estimate_ipw(X, D, Y, stabilized=True, trim=(0.1, 0.9))
print(f"IPW估计的ATE: {ATE_ipw:.3f}")双重稳健估计(Doubly Robust)
核心思想
结合: 结果回归(Outcome Regression) + 倾向得分加权
估计量 (Bang & Robins 2005):
其中:
- : 处理组结果模型
- : 对照组结果模型
Double Robustness 的神奇性质
定理: 只要或之一正确,就一致!
证明直觉:
情况1: 如果正确
所以IPW部分消失,剩下
情况2: 如果正确
IPW部分给出一致估计,即使错误。
优势: "双重保险"!
为什么 DR 是最优选择?
| 方法 | 需要正确的模型 | 一致性条件 |
|---|---|---|
| 回归调整 | 结果模型 | 正确 |
| IPW | 倾向得分 | 正确 |
| Doubly Robust | 至少一个 | 或正确即可 |
Python实现:Doubly Robust
python
from sklearn.ensemble import RandomForestRegressor
def estimate_doubly_robust(X, D, Y, trim=(0.1, 0.9)):
"""
双重稳健估计
参数:
------
X: (N, K) 协变量
D: (N,) 处理指示器
Y: (N,) 结果变量
trim: 倾向得分截断
返回:
------
ATE: 平均处理效应
"""
N = len(D)
# 第1步:估计倾向得分
ps_model = LogisticRegression(max_iter=1000)
ps_model.fit(X, D)
e_hat = np.clip(ps_model.predict_proba(X)[:, 1], trim[0], trim[1])
# 第2步:估计结果模型
# 处理组
model_1 = RandomForestRegressor(n_estimators=100, random_state=42)
model_1.fit(X[D==1], Y[D==1])
mu_1 = model_1.predict(X)
# 对照组
model_0 = RandomForestRegressor(n_estimators=100, random_state=42)
model_0.fit(X[D==0], Y[D==0])
mu_0 = model_0.predict(X)
# 第3步:双重稳健估计
term1 = D * (Y - mu_1) / e_hat
term2 = (1 - D) * (Y - mu_0) / (1 - e_hat)
term3 = mu_1 - mu_0
ATE = np.mean(term1 - term2 + term3)
return ATE, {'e_hat': e_hat, 'mu_1': mu_1, 'mu_0': mu_0}
# 使用
ATE_dr, components = estimate_doubly_robust(X, D, Y)
print(f"双重稳健估计的ATE: {ATE_dr:.3f}")️ 常见陷阱
陷阱1:忽略共同支撑
问题: 处理组和对照组倾向得分不重叠
后果: 外推,结果不可靠
解决: 剔除不重叠区域的样本,报告修剪前后的结果
陷阱2:过度自信
问题: CIA是强假设,无法检验!
缓解:
- 敏感性分析
- 报告多种方法
- 谨慎解释
陷阱3:模型依赖
PSM: 依赖倾向得分模型 IPW: 对极端权重敏感 DR: 虽然双重稳健,但两个模型都错则失效
建议: 使用机器学习估计和(如Random Forest, Gradient Boosting)
陷阱4:忽略平衡性检验
错误: 只报告估计值,不检查协变量平衡
正确: 报告Love Plot和SMD表
本节小结
核心要点
1. IPW: 通过加权创造"伪RCT",估计ATE
- Horvitz-Thompson估计量
- 稳定权重和截断处理极端权重
2. Doubly Robust: 结合结果模型和倾向得分
- 只需一个模型正确即可一致
- "双重保险"策略
3. 共同支撑: 匹配/加权有效的先决条件
关键公式
IPW-ATE:
Doubly Robust:
上一节: 7.3 倾向得分估计 | 下一节: 7.5 经典案例与Python实现