共计 1734 个字符,预计需要花费 5 分钟才能阅读完成。
从 AB 测试到观察性研究
在理想情况下,我们通过随机对照试验 (如 AB 测试) 来评估干预效果,因为随机化能保证处理组和对照组的协变量分布平衡。但现实中很多场景无法进行随机实验,例如:

- 医学研究中无法随机分配患者接受高风险手术
- 经济政策实施后需要评估历史数据影响
- 营销活动无法对同一用户同时展示不同策略
这时候就需要因果推断方法从观察性数据中估计因果效应。今天重点讨论两种主流方法:适用于低维数据的倾向分匹配 (PSM) 和擅长高维非线性的因果森林。
倾向分匹配 (PSM) 原理详解
PSM 的核心思想是:通过建模处理分配概率来模拟随机实验。具体分为三个阶段:
-
倾向分估计
使用逻辑回归建模处理分配概率:
$$\hat{e}(X_i) = P(T_i=1|X_i) = \frac{1}{1+exp(-X_i\beta)}$$
其中 $X_i$ 是协变量向量,$T_i$ 是处理指示变量 -
匹配阶段
- 最近邻匹配:为每个处理组样本寻找倾向分最接近的对照组样本
- 卡钳匹配(Caliper):设置最大允许差异 $\delta$,通常取倾向分标准差的 0.2 倍
-
核匹配:使用核函数加权多个对照组样本
-
平衡性检验
匹配后需检查标准化均值差异(SMD):
$$SMD = \frac{\bar{X}{treat} – \bar{X}$$
所有协变量的 SMD 应 <0.1}}{\sqrt{(s_{treat}^2 + s_{control}^2)/2}
因果森林的机器学习实现
因果森林建立在广义随机森林框架上,通过以下机制解决异质性处理效应估计:
-
分裂准则
最大化处理组间的效应差异:
$$\Delta(\tau) = \frac{1}{N_{left}} \sum_{i \in left} (\tau_i – \bar{\tau}{left})^2 + \frac{1}{N)^2$$}} \sum_{i \in right} (\tau_i – \bar{\tau}_{right -
局部估计
在叶子节点内求解局部方程:
$$\hat{\tau}(x) = argmin_{\tau} \sum_{i=1}^n \alpha_i(x)[(Y_i – m(X_i)) – \tau(W_i – e(X_i))]^2$$
其中 $m(X_i)$ 是结果模型,$e(X_i)$ 是倾向模型
Python 实战演示
PSM 案例:教育对收入的影响
from causalinference import CausalModel
# 加载数据集
causal = CausalModel(Y=df['income'].values, # 结果变量
D=df['college'].values, # 处理变量(是否上大学)
X=df[['age','gender','parent_edu']].values # 协变量
)
# 估计倾向分
causal.est_propensity()
# 最近邻匹配
causal.est_via_matching(matches=1, bias_adj=True)
# 输出 ATE 估计
print(causal.estimates)
因果森林案例:用户补贴效果
from econml.grf import CausalForest
# 初始化模型
cf = CausalForest(
n_estimators=2000,
honest=True, # 启用诚实树
max_depth=20
)
# 训练模型
cf.fit(
X=user_features,
T=discount_amounts,
y=conversion_rates
)
# 预测个体处理效应
ite = cf.predict(user_features)
常见陷阱与解决方案
PM 中遗漏重要变量
- 问题表现:匹配后仍有协变量不平衡
- 解决方案:
- 进行敏感性分析评估遗漏变量的潜在影响
- 使用双重稳健估计结合结果模型
因果森林过拟合
- 问题表现:样本外预测效果差
- 解决方案:
- 设置
honest=True分离训练 / 预测样本 - 增加
min_samples_leaf限制叶子节点大小
延伸思考
当存在未观测混杂变量时,可考虑:
1. 工具变量法(IV):利用外生变量间接估计
2. 差分法(DID):利用时间维度变化
3. 断点回归(RD):利用临界点的准随机性
因果推断从来不是单一方法的比拼,而是需要根据数据特征选择合适工具,甚至组合多种方法交叉验证。希望本文介绍的两个 ” 法宝 ” 能成为你分析工具箱中的得力助手。
