共计 2644 个字符,预计需要花费 7 分钟才能阅读完成。
1. 背景:为什么我们需要 Propensity Score 匹配后的分析
在因果推断中,我们经常遇到观察性数据(非随机实验数据),这时处理组(实验组)和对照组之间可能存在混杂变量(confounders)。Propensity Score(倾向性得分)匹配通过模拟随机实验环境,帮助我们减少选择偏差。

但匹配只是第一步,真正的挑战在于匹配后:
- 匹配后的样本量通常会减少
- 协变量平衡性需要验证
- 因果效应的估计方法直接影响结论可靠性
2. 核心方法:三种主流分析方法
2.1 直接对比法(最简单但风险最高)
匹配后直接比较两组的结果差异:
# 匹配后的 DataFrame 包含匹配对信息
matched_df = matching_algorithm(pscores, treatment_indicator)
# 简单均值比较(不建议单独使用)ate_naive = matched_df[matched_df['treatment']==1]['outcome'].mean() - \
matched_df[matched_df['treatment']==0]['outcome'].mean()
问题 :未考虑残余偏差和测量误差
2.2 双重稳健估计(Doubly Robust)
结合倾向得分和结果模型的双重保护:
1. 先建立结果预测模型(如线性回归)
2. 再结合倾向得分进行修正
from causalml.inference.meta import LRSRegressor
dr = LRSRegressor()
# 输入特征、处理标识、结果变量
ate = dr.estimate_ate(X, treatment, y)
优势 :只要倾向得分模型或结果模型有一个正确,估计就是一致的
2.3 基于机器学习的处理效应模型
2.3.1 Causal Forest
from econml.grf import CausalForest
cf = CausalForest(n_estimators=100)
cf.fit(X, treatment, y)
# 获取个体处理效应 (ITE)
ite = cf.predict(X)
# 平均处理效应 (ATE)
ate = ite.mean()
2.3.2 Meta-Learners
- S-Learner:单一模型
- T-Learner:双模型
- X-Learner:交叉纠正
# 使用 causalml 实现
from causalml.inference.meta import XGBoostRegressor
learner = XGBoostRegressor()
ate = learner.estimate_ate(X, treatment, y)
3. 完整代码示例
# 环境准备
!pip install causalml econml
import pandas as pd
import numpy as np
from sklearn.ensemble import GradientBoostingClassifier
from sklearn.model_selection import train_test_split
# 生成模拟数据
np.random.seed(42)
n = 2000
X = np.random.normal(size=(n, 5))
# 生成倾向得分
true_pscore = 1/(1+np.exp(-X[:,0]-X[:,1]))
treatment = np.random.binomial(1, true_pscore)
# 生成结果变量
y = treatment * (X[:,0]+X[:,1]) + (1-treatment)*X[:,1] + np.random.normal(size=n)
# 步骤 1:Propensity Score 匹配(使用最邻近匹配)from causalml.match import NearestNeighborMatch
matcher = NearestNeighborMatch(replace=False)
matched_df = matcher.match(data=pd.DataFrame(X),
treatment=treatment,
score=pscore)
# 步骤 2:双重稳健估计
from causalml.inference.dr import DRLearner
dr = DRLearner()
# 拟合模型
dr.fit(X, treatment, y)
# 获取 ATE 和置信区间
ate, ate_lb, ate_ub = dr.estimate_ate(interval=True)
print(f"ATE: {ate:.2f}, 95% CI: [{ate_lb:.2f}, {ate_ub:.2f}]")
# 步骤 3:Causal Forest
from econml.grf import CausalForest
cf = CausalForest(n_estimators=500)
cf.fit(X, treatment, y)
# 可视化变量重要性
import matplotlib.pyplot as plt
plt.bar(range(X.shape[1]), cf.feature_importances_)
plt.title('Feature Importance')
plt.show()
4. 实践关键检查点
4.1 匹配质量验证
- 标准化均值差 (SMD):应 <0.1
- QQ 图 :检查变量分布平衡性
- t 检验 :连续变量组间差异
from causalml.match import create_table_one
# 生成平衡性报告
table1 = create_table_one(data=matched_df,
treatment_col='treatment',
features=['feature_0','feature_1'])
print(table1)
4.2 常见问题解决方案
- 样本量不足 :考虑卡尺匹配或分层匹配
- 残余偏差 :加入协变量调整
- 模型不稳定 :使用交叉验证
5. 方法选择指南
| 方法 | 适用场景 | 计算成本 | 假设条件 |
|---|---|---|---|
| 直接对比 | 快速验证 | 低 | 强 ignorability |
| 双重稳健 | 中等样本 | 中 | 模型之一正确 |
| Causal Forest | 非线性关系 | 高 | 无强假设 |
6. 生产环境建议
- 定期验证倾向得分模型
- 监控 ATE 随时间变化
- 建立因果效应置信区间
- 考虑使用 bootstrap 获取稳健标准误
结语
在实际业务中,我建议从双重稳健方法开始,逐步过渡到更复杂的机器学习方法。重要的是要记住:无论使用多高级的算法,因果推断的核心仍然是识别假设——没有方法可以完全替代领域知识和实验设计。
下一步可以探索:
– 动态处理效应(时间序列场景)
– 异质处理效应分析
– 工具变量法的结合使用
正文完
