Skip to content

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()

处理: 修剪不重叠区域

常见做法:

  1. 剔除的观测
  2. 只保留两组倾向得分分布重叠的区域
  3. 报告修剪前后的样本量和估计结果

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实现

基于 MIT 许可证发布。内容版权归作者所有。