---
title: "机器学习与因果推断 - 第十一讲:双重机器学习——高维控制与去偏估计"
subtitle: "从 Frisch-Waugh 到 Neyman 正交性:完整讲义"
author: "陈志远"
institute: "中国人民大学商学院"
date: "2026-06-02"
format:
html:
theme: cosmo
css: lecture-notes.css
html-math-method: mathml
toc: true
toc-depth: 3
number-sections: true
code-fold: false
code-tools: true
highlight-style: github
embed-resources: true
page-layout: article
execute:
echo: true
warning: false
message: false
eval: true
cache: false
fig-width: 10
fig-height: 6
dpi: 150
lang: zh
jupyter: python3
---
```{python}
#| echo: false
#| output: false
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import matplotlib
import warnings
warnings.filterwarnings('ignore')
plt.rcParams['font.sans-serif'] = ['Arial Unicode MS', 'SimHei', 'DejaVu Sans']
plt.rcParams['axes.unicode_minus'] = False
plt.rcParams['figure.dpi'] = 150
np.random.seed(42)
```
# 引言 {#sec-intro}
在前十讲中,我们系统地从传统因果推断方法(随机实验、匹配、工具变量、断点回归、双重差分)过渡到了现代机器学习方法(LASSO 选择、因果树、因果森林)。在第十讲中,我们学会了使用因果森林估计条件平均处理效应(CATE),并通过 BLP 检验、GATES 分组、TOC/Qini 评估和政策树来验证和应用异质性估计。
然而,所有这些分析都假设我们已经正确地控制了混杂变量。*当混杂变量的维度很高,且与结果变量的关系可能是非线性的时候,如何可靠地估计因果效应?* 这正是本讲的核心问题。
## 本讲主题与动机 {#sec-motivation}
本讲聚焦 *双重机器学习*(Double/Debiased Machine Learning, DML),这是 Chernozhukov, Chetverikov, Demirer, Duflo, Hansen, Newey & Robins (2018) 提出的里程碑式方法。DML 巧妙地结合了机器学习的灵活预测能力和经典半参数理论的推断严谨性,使我们能在高维、非线性混杂的情形下进行有效的因果推断。
::: {.callout-note}
## 核心问题
给定高维控制变量 $X \in \mathbb{R}^p$($p$ 可能很大),如何估计处理 $D$ 对结果 $Y$ 的因果效应 $\theta_0$,同时获得有效的置信区间?
:::
本讲将依次阐明以下关键概念:
1. **高维控制的挑战**:为什么 OLS 和朴素 ML 方法都无法直接解决
2. **部分线性模型**:Robinson (1988) 的半参数框架
3. **Neyman 正交性**:消除一阶偏差的数学原理
4. **交叉拟合**:消除过拟合偏差的样本分割策略
5. **DML 算法**:完整的实现步骤与渐近理论
## 上节课回顾 {#sec-review}
在第十讲中,我们建立了以下关键概念:
- **BLP/GATES 检验**:使用样本分割,在独立测试集上验证 CATE 估计的异质性是否为真实信号
- **TOC/Qini 曲线**:评估 CATE 模型的排序性能,衡量政策靶向的效率
- **变量重要性**:识别驱动异质性的关键特征
- **政策树**:将连续的 CATE 估计转化为可解释、可操作的分配规则
这些工具解决的是 *已有因果效应估计后的下游问题*。本讲转向更基础的上游问题:*如何在高维混杂下准确估计因果效应本身*。
# 第一部分:高维控制的挑战 {#sec-challenge}
## 问题设定 {#sec-setup}
考虑最基本的因果推断设定。我们想估计处理变量 $D$ 对结果变量 $Y$ 的因果效应。数据生成过程为:
$$Y = \theta_0 D + g_0(X) + U, \quad E[U \mid D, X] = 0$$
其中:
- $\theta_0$ 是我们感兴趣的因果参数(标量)
- $g_0(X)$ 是控制变量 $X$ 对 $Y$ 的影响(讨厌参数)
- $X \in \mathbb{R}^p$ 是需要控制的混杂变量向量
::: {.callout-warning}
## 高维情形的困难
当 $p$(控制变量维度)很大时,问题变得棘手:
1. **维度灾难**:若 $p \geq n$,OLS 根本无法运行(设计矩阵不可逆)
2. **不稳定估计**:即使 $p < n$,当 $p$ 接近 $n$ 时,OLS 系数估计极不稳定,标准误暴增
3. **模型误设**:$g_0(X)$ 可能包含非线性项、交互项,线性 OLS 假设过强
:::
### 现实中的典型场景
高维控制变量在实证研究中非常常见:
| 领域 | 处理 $D$ | 控制变量 $X$ | 维度 $p$ |
|:---|:---|:---|:---|
| 医学临床试验 | 药物分配 | 基因表达谱 | 数千 |
| 数字营销 | 广告投放策略 | 用户画像特征 | 数百 |
| 劳动经济学 | 职业培训参与 | 个人与地区特征 | 数十至上百 |
| 政策评估 | 最低工资调整 | 地区经济社会指标 | 数十至上百 |
## 传统方法 vs 机器学习:各自的局限 {#sec-limits}
面对高维控制变量,两类主要方法各有缺陷:
### OLS 的局限
传统 OLS 假设 $g_0(X)$ 是线性的,并估计:
$$Y = \theta D + X'\beta + \varepsilon$$
当 $p$ 很大时:
- **不可行**:$p \geq n$ 时 $(X'X)^{-1}$ 不存在
- **不稳定**:$p$ 接近 $n$ 时方差爆炸
- **有偏**:若 $g_0(X)$ 是非线性的,线性规范存在模型误设偏差
### 机器学习的局限
机器学习方法(LASSO、随机森林、神经网络等)能灵活处理高维和非线性,但直接用于因果推断有根本困难:
::: {.callout-warning}
## 正则化偏差
ML 模型通过正则化(L1 惩罚、树深度限制等)控制过拟合。这种正则化引入系统性偏差——预测值被向均值方向压缩。在预测问题中,这是可接受的偏差-方差权衡;但在因果推断中,这种偏差会传播到 $\hat{\theta}$ 的估计中,使得置信区间不可靠。
:::
### 理想方案
| 方法 | 高维能力 | 非线性建模 | $\sqrt{n}$ 推断 |
|:---|:---|:---|:---|
| OLS | 否 | 否 | 是 |
| ML(LASSO/RF/NN) | 是 | 是 | 否 |
| **DML** | **是** | **是** | **是** |
DML 的目标正是:*结合 ML 的灵活预测能力和经典半参数理论的推断严谨性*。
## 朴素策略:为什么不能直接用 ML {#sec-naive}
一个自然的想法是两步策略:
1. 用 ML 方法估计 $\hat{g}(X) \approx g_0(X)$
2. 计算部分残差 $\tilde{Y} = Y - \hat{g}(X)$
3. 用 OLS 回归 $\tilde{Y}$ 对 $D$ 得到 $\hat{\theta}$
这个策略看起来合理,但存在两个根本性问题:
### 问题一:正则化偏差的传播
ML 估计 $\hat{g}(X) = g_0(X) + \Delta_g(X)$,其中 $\Delta_g$ 是正则化导致的偏差。代入得:
$$\tilde{Y} = Y - \hat{g}(X) = \theta_0 D + (g_0(X) - \hat{g}(X)) + U = \theta_0 D - \Delta_g(X) + U$$
OLS 估计为:
$$\hat{\theta} = \theta_0 + \frac{\sum_i D_i(-\Delta_g(X_i) + U_i)}{\sum_i D_i^2}$$
当 $D$ 与 $X$ 相关时(即 $E[D \mid X] \neq \text{const}$,这在观察性研究中几乎必然成立),$D$ 与 $\Delta_g(X)$ 也将相关,导致偏差项不为零。
### 问题二:过拟合偏差
如果用全部样本训练 ML 模型并在同一样本上预测,$\hat{g}(X_i)$ 会过度拟合个体 $i$ 的信息,导致 $\hat{g}(X_i)$ 与 $U_i$ 之间产生虚假相关性。
::: {.callout-note}
## 关键教训
直接将 ML 的预测结果插入因果估计公式,会产生不可忽略的偏差,使标准推断(置信区间、假设检验)无效。我们需要更精细的策略来消除这些偏差。
:::
# 第二部分:部分线性模型 {#sec-plm}
## Robinson 的半参数框架 {#sec-robinson}
部分线性模型(Partially Linear Model, PLM)由 Robinson (1988) 提出,是 DML 的理论基石。
::: {.callout-note}
## 部分线性模型
**结果方程**:
$$Y_i = \theta_0 D_i + g_0(X_i) + U_i, \quad E[U_i \mid D_i, X_i] = 0$$
**处理方程**:
$$D_i = m_0(X_i) + V_i, \quad E[V_i \mid X_i] = 0$$
其中 $\theta_0$ 是低维感兴趣参数,$g_0(\cdot)$ 和 $m_0(\cdot)$ 是未知的高维讨厌参数。
:::
模型的关键特征:
- $\theta_0$ 是 *参数化* 的(标量或低维向量),我们可以进行传统的统计推断
- $g_0(X)$ 和 $m_0(X) = E[D \mid X]$ 是 *非参数* 的,可以是 $X$ 的任意函数
- 这种结构被称为 *半参数*(semiparametric):参数化的感兴趣参数 + 非参数的讨厌参数
### 各变量的含义
| 符号 | 含义 | 角色 |
|:---|:---|:---|
| $\theta_0$ | 处理 $D$ 对 $Y$ 的因果效应 | 感兴趣参数 |
| $g_0(X)$ | $X$ 对 $Y$ 的影响(非线性) | 讨厌参数 |
| $m_0(X) = E[D \mid X]$ | 处理的条件期望(倾向得分) | 讨厌参数 |
| $U_i$ | 结果方程中的随机误差 | 噪声 |
| $V_i = D_i - m_0(X_i)$ | 处理中不被 $X$ 解释的变异 | 外生变异 |
## Frisch-Waugh-Lovell 定理的启示 {#sec-fwl}
在引入 DML 之前,先回顾经典计量经济学中的一个核心结果。
::: {.callout-note}
## FWL 定理
在线性回归中,$\theta_0$ 的 OLS 估计等价于以下两步程序的估计:
1. 将 $Y$ 对 $X$ 回归,取残差 $\tilde{Y} = Y - \text{proj}_X Y$
2. 将 $D$ 对 $X$ 回归,取残差 $\tilde{D} = D - \text{proj}_X D$
3. 将 $\tilde{Y}$ 对 $\tilde{D}$ 做简单回归
$$\hat{\theta}_{FWL} = \frac{\sum_i \tilde{D}_i \tilde{Y}_i}{\sum_i \tilde{D}_i^2}$$
:::
FWL 定理告诉我们:估计 $\theta_0$ 的本质是先去除 $X$ 对 $Y$ 和 $D$ 的共同影响,然后看剩余的(纯净的)变异之间的关系。这个思想是 DML 的直接灵感来源。
### Robinson 的非参数推广
Robinson (1988) 将 FWL 的思想推广到非参数场景。对结果方程两边取条件期望:
$$E[Y \mid X] = \theta_0 E[D \mid X] + g_0(X) + E[U \mid X]$$
由 $E[U \mid D, X] = 0$ 且 $E[U \mid X] = 0$,两式相减得:
$$Y - E[Y \mid X] = \theta_0 (D - E[D \mid X]) + U$$
定义 $\ell_0(X) = E[Y \mid X] = \theta_0 m_0(X) + g_0(X)$,则:
$$(Y - \ell_0(X)) = \theta_0 (D - m_0(X)) + U$$
::: {.callout-tip}
## Robinson 的关键洞见
如果我们知道条件期望 $\ell_0(X) = E[Y \mid X]$ 和 $m_0(X) = E[D \mid X]$,就可以通过回归残差来恢复 $\theta_0$。这完全绕开了直接估计 $g_0(X)$ 的需要。
:::
问题在于:$\ell_0(X)$ 和 $m_0(X)$ 本身未知,需要被估计。如果我们用 ML 来估计它们,就回到了前面提到的偏差问题。DML 的创新在于通过 *Neyman 正交性* 和 *交叉拟合* 彻底解决这些偏差。
## Python 演示:设定偏误 {#sec-ols-bias}
让我们通过模拟数据来直观展示高维非线性混杂下 OLS 的失败。
```{python}
#| echo: true
#| eval: true
#| output: true
from sklearn.linear_model import LinearRegression, LassoCV
from sklearn.ensemble import RandomForestRegressor
from sklearn.model_selection import cross_val_predict
# 模拟数据:部分线性模型
n = 2000
p = 10
X = np.random.normal(0, 1, (n, p))
# 非线性混杂函数 g₀(X)
g0 = X[:, 0]**2 + 2 * np.sin(X[:, 1]) + 0.5 * X[:, 2] * X[:, 3]
# 处理方程 m₀(X)
m0 = 0.8 * X[:, 0] + 0.5 * X[:, 1] - 0.3 * X[:, 2]
# 二值处理变量
D = (m0 + np.random.normal(0, 1, n) > 0).astype(float)
# 真实处理效应
theta_0 = 2.0
# 观测结果
Y = theta_0 * D + g0 + np.random.normal(0, 1, n)
# OLS(线性控制)
DX = np.column_stack([D.reshape(-1, 1), X])
ols = LinearRegression().fit(DX, Y)
theta_ols = ols.coef_[0]
print("=" * 50)
print("OLS 估计结果(线性控制)")
print("=" * 50)
print(f"真实处理效应: theta_0 = {theta_0:.3f}")
print(f"OLS 估计: hat_theta = {theta_ols:.3f}")
print(f"偏差: {theta_ols - theta_0:+.3f}")
print()
print("OLS 存在设定偏误:")
print(" g_0(X) 包含 X^2 和 sin(X) 等非线性项,")
print(" 线性控制无法完全消除混杂。")
```
OLS 假设 $g_0(X) = X'\beta$ 是线性的,但真实的 $g_0(X)$ 包含平方项和三角函数。线性控制遗漏了这些非线性成分,导致偏差通过 $D$ 与 $X$ 的相关性渗入 $\hat{\theta}$。
# 第三部分:Neyman 正交性 {#sec-neyman}
## 偏差的两个来源 {#sec-bias-sources}
在第一部分中,我们指出朴素 ML 插件方法有两个问题。现在更精确地形式化这两个偏差来源。
### 来源一:正则化偏差
ML 模型由于正则化(如 LASSO 的 L1 惩罚、随机森林的树深限制)而产生系统性估计偏差:
$$\hat{\ell}(X) = \ell_0(X) + \Delta_\ell(X), \quad \hat{m}(X) = m_0(X) + \Delta_m(X)$$
当这些偏差与处理变量 $D$ 或处理残差 $V$ 相关时,它们会传播到 $\hat{\theta}$ 中。
### 来源二:过拟合偏差
用全部样本训练的 ML 模型在同一数据上预测时会过拟合:$\hat{\ell}(X_i)$ 不仅拟合了 $\ell_0(X_i)$,还部分拟合了个体噪声 $U_i$。这使得残差 $Y_i - \hat{\ell}(X_i)$ 与 $U_i$ 不再独立,破坏了推断的前提条件。
::: {.callout-warning}
## 偏差的量级
在朴素方法中,正则化偏差的量级为 $O(n^{-1/4})$(对于典型的 ML 方法)。这个量级虽然比 $O(1)$ 小,但远大于 $O(n^{-1/2})$,因此 *无法被 $\sqrt{n}$ 缩放消除*。标准渐近推断在此条件下完全失效。
:::
## 什么是 Neyman 正交性 {#sec-neyman-def}
Neyman 正交性是 DML 理论的核心。要理解它,我们先引入 *得分函数*(或矩条件)的概念。
### 矩条件框架
参数 $\theta_0$ 通常可以通过矩条件来定义:
$$E[\psi(W; \theta_0, \eta_0)] = 0$$
其中 $W = (Y, D, X)$ 是观测数据,$\eta = (\ell, m)$ 是讨厌参数(条件期望函数)。
::: {.callout-note}
## Neyman 正交条件
得分函数 $\psi(W; \theta, \eta)$ 满足 Neyman 正交性,如果:
$$\frac{\partial}{\partial \eta} E[\psi(W; \theta_0, \eta)] \bigg|_{\eta = \eta_0} = 0$$
即在真值 $\eta_0$ 处,得分函数对讨厌参数的 *一阶导数* 为零。
:::
### 直觉解释
正交性意味着:当 $\hat{\eta}$ 偏离 $\eta_0$ 时,$E[\psi]$ 受到的影响只有 *二阶* 的。具体地,通过 Taylor 展开:
$$E[\psi(W; \theta_0, \hat{\eta})] = \underbrace{E[\psi(W; \theta_0, \eta_0)]}_{= 0} + \underbrace{\frac{\partial}{\partial \eta} E[\psi]}_{= 0 \text{ (正交性)}} \cdot (\hat{\eta} - \eta_0) + O(\|\hat{\eta} - \eta_0\|^2)$$
残余偏差仅为 $O(\|\hat{\eta} - \eta_0\|^2)$,远小于一阶项。对于典型的 ML 方法,这使得 $\hat{\theta}$ 能够达到 $\sqrt{n}$ 一致性。
## 非正交 vs 正交矩条件 {#sec-compare-moments}
对比两种矩条件能最清楚地看出正交性的作用。
### 非正交(朴素)矩条件
$$\psi_{\text{naive}}(W; \theta, \ell) = (Y - \ell(X) - \theta D) \cdot D$$
展开在 $\eta_0$ 附近的一阶项:
$$\frac{\partial}{\partial \ell} E[\psi_{\text{naive}}] = E[-\Delta_\ell(X) \cdot D] \neq 0$$
因为 $D$ 与 $X$ 相关($E[D \mid X] = m_0(X)$),所以 $\Delta_\ell(X)$ 与 $D$ 相关。*一阶偏差无法消除*。
### 正交(DML)矩条件
$$\psi_{\text{DML}}(W; \theta, \ell, m) = \big(Y - \ell(X) - \theta(D - m(X))\big) \cdot (D - m(X))$$
展开一阶项:
$$\frac{\partial}{\partial \ell} E[\psi_{\text{DML}}] = E[-\Delta_\ell(X) \cdot (D - m_0(X))] = E[-\Delta_\ell(X) \cdot V] = 0$$
因为 $V = D - m_0(X)$ 与 $X$ 独立($E[V \mid X] = 0$),所以与 $\Delta_\ell(X)$ 不相关。类似地:
$$\frac{\partial}{\partial m} E[\psi_{\text{DML}}] = E[\theta \cdot \Delta_m(X) \cdot V - (Y - \ell_0(X) - \theta_0 D) \cdot \Delta_m(X)] = 0$$
*一阶偏差完全消除!*
::: {.callout-tip}
## 双重残差化的本质
DML 矩条件用 $(D - m(X))$ 代替了 $D$——这就是 *双重* 的含义:
- **第一重**:从 $Y$ 中去除 $X$ 的影响 → $\tilde{Y} = Y - \hat{\ell}(X)$
- **第二重**:从 $D$ 中去除 $X$ 的影响 → $\tilde{D} = D - \hat{m}(X)$
回归 $\tilde{Y}$ 对 $\tilde{D}$,正则化偏差的一阶项被消除。
:::
### 为什么必须双重残差化
只做第一重(仅残差化 $Y$)相当于使用非正交矩条件,$\hat{\ell}(X)$ 的偏差 $\Delta_\ell$ 通过与 $D$ 的相关性直接污染 $\hat{\theta}$。
同时残差化 $D$ 后,$\tilde{D} = D - m_0(X) = V$ 与 $X$ 独立,因此与 $\Delta_\ell(X)$ 也不相关——偏差被切断。
这正是 Frisch-Waugh-Lovell 定理的非参数推广:FWL 在线性框架中通过投影消除 $X$ 的影响,DML 在非参数框架中通过条件期望达到同样目的。
# 第四部分:交叉拟合 {#sec-cross-fitting}
## 为什么需要样本分割 {#sec-sample-split}
Neyman 正交性解决了正则化偏差的一阶项问题,但还未解决过拟合偏差。
::: {.callout-warning}
## 过拟合偏差的问题
如果用全部 $n$ 个样本训练 ML 模型,再在 *同一批* 样本上计算残差:
$$\tilde{Y}_i = Y_i - \hat{\ell}(X_i; \text{trained on all data including } i)$$
$\hat{\ell}(X_i)$ 会过度拟合个体 $i$ 的信息(相当于部分拟合了 $U_i$),使残差 $\tilde{Y}_i$ 与 $U_i$ 不独立。这破坏了矩条件成立的前提。
:::
最简单的解决方案是 *样本分割*:
1. 用一半数据训练 ML 模型
2. 在另一半数据上计算残差和估计 $\theta_0$
但简单的二分法浪费了一半样本。交叉拟合(cross-fitting)是更高效的策略。
## 交叉拟合算法 {#sec-cross-fit-algo}
::: {.callout-note}
## 交叉拟合策略
将全部 $n$ 个样本随机分成 $K$ 折(通常 $K = 5$):$I_1, I_2, \ldots, I_K$。
对每一折 $k = 1, \ldots, K$:
1. 在 *除第 $k$ 折之外的数据* $I_{-k}$ 上训练 $\hat{\ell}_{-k}(\cdot)$ 和 $\hat{m}_{-k}(\cdot)$
2. 在 *第 $k$ 折* 数据上计算残差:
$$\tilde{Y}_i = Y_i - \hat{\ell}_{-k}(X_i), \quad \tilde{D}_i = D_i - \hat{m}_{-k}(X_i), \quad i \in I_k$$
:::
交叉拟合的关键性质:
- 每个观测 $i$ 的预测值 $\hat{\ell}_{-k}(X_i)$ 来自 *不包含 $i$ 的训练集*,消除了过拟合偏差
- 所有 $n$ 个观测都被用于估计 $\theta_0$,没有样本浪费
- 这与 $K$ 折交叉验证在形式上相同,但目的不同:交叉验证用于模型选择,交叉拟合用于消除过拟合偏差
### 与交叉验证的对比
| 特征 | $K$ 折交叉验证 | $K$ 折交叉拟合 |
|:---|:---|:---|
| 目的 | 估计预测误差 | 消除过拟合偏差 |
| 输出 | 模型性能指标 | 每个样本的样本外预测值 |
| 使用 | 模型选择 | 因果参数估计 |
# 第五部分:DML 完整算法 {#sec-dml-algorithm}
## DML 算法步骤 {#sec-dml-steps}
将 Neyman 正交矩条件与交叉拟合结合,就得到完整的 DML 算法。
::: {.callout-note}
## DML(部分线性模型版本)
**输入**:数据 $\{(Y_i, D_i, X_i)\}_{i=1}^n$,ML 学习器,折数 $K$
**步骤**:
1. 将样本随机分成 $K$ 折:$I_1, I_2, \ldots, I_K$
2. 对每折 $k = 1, \ldots, K$:
- 在 $I_{-k}$ 上拟合 $\hat{\ell}_{-k}$(预测 $Y$)和 $\hat{m}_{-k}$(预测 $D$)
- 在 $I_k$ 上计算残差:$\tilde{Y}_i = Y_i - \hat{\ell}_{-k}(X_i)$,$\tilde{D}_i = D_i - \hat{m}_{-k}(X_i)$
3. DML 估计量:
$$\hat{\theta}_{DML} = \frac{\sum_{k=1}^K \sum_{i \in I_k} \tilde{D}_i \tilde{Y}_i}{\sum_{k=1}^K \sum_{i \in I_k} \tilde{D}_i^2}$$
4. 标准误估计:
$$\hat{\sigma}^2 = \frac{1}{n}\sum_{k=1}^K \sum_{i \in I_k} (\tilde{Y}_i - \hat{\theta}_{DML} \tilde{D}_i)^2 \tilde{D}_i^2 \Big/ \left(\frac{1}{n}\sum_{k=1}^K \sum_{i \in I_k} \tilde{D}_i^2\right)^2$$
:::
## 渐近理论 {#sec-asymptotics}
::: {.callout-note}
## DML 渐近性质 (Chernozhukov et al., 2018)
在适当条件下,DML 估计量满足:
$$\sqrt{n}(\hat{\theta}_{DML} - \theta_0) \xrightarrow{d} N(0, \sigma^2)$$
其中 $\sigma^2 = E[\tilde{D}^2 U^2] / (E[\tilde{D}^2])^2$
:::
### 乘积率条件
DML 渐近理论的关键条件是 *乘积率*(product rate):
$$\|\hat{\ell} - \ell_0\|_2 \cdot \|\hat{m} - m_0\|_2 = o_P(n^{-1/2})$$
这意味着:
- 两个讨厌参数的估计误差之 *积* 需要快于 $n^{-1/2}$ 收敛到零
- 单个学习器 *不需要* 达到 $n^{-1/2}$ 收敛率
- 只要每个学习器以 $n^{-1/4}$ 或更快的速率收敛,就满足条件
::: {.callout-tip}
## 对 ML 方法的宽容性
乘积率条件意味着 DML 对 ML 学习器的要求是 *宽松的*。下列方法通常满足条件:
- LASSO(在稀疏假设下,收敛率为 $\sqrt{s \log p / n}$)
- 随机森林(在光滑假设下,收敛率接近 $n^{-1/3}$ 到 $n^{-2/5}$)
- 梯度提升树
- 神经网络(在适当架构下)
越灵活的 ML 方法,$\hat{\ell}$ 和 $\hat{m}$ 的收敛率越快,乘积率条件越容易满足。
:::
### 为什么是乘积率而非单一率
回忆 Neyman 正交性消除了一阶偏差,残余偏差为:
$$\text{bias} \propto E[\Delta_\ell(X) \cdot \Delta_m(X)]$$
由 Cauchy-Schwarz 不等式:
$$|E[\Delta_\ell \cdot \Delta_m]| \leq \|\Delta_\ell\|_2 \cdot \|\Delta_m\|_2$$
因此只要两个误差的乘积足够小即可。这是正交性带来的巨大优势——将要求从单一 $n^{-1/2}$ 率降低到乘积 $n^{-1/2}$ 率。
## Python 实现:econml LinearDML {#sec-econml}
```{python}
#| echo: true
#| eval: true
#| output: true
from econml.dml import LinearDML
# 使用随机森林作为 ML 学习器
dml = LinearDML(
model_y=RandomForestRegressor(
n_estimators=200, max_depth=5, random_state=42),
model_t=RandomForestRegressor(
n_estimators=200, max_depth=5, random_state=42),
cv=5, random_state=42
)
dml.fit(Y, D, W=X)
theta_dml = float(dml.const_marginal_effect())
ci = dml.const_marginal_effect_interval(alpha=0.05)
ci_lower, ci_upper = float(ci[0]), float(ci[1])
print("=" * 50)
print("DML 估计结果")
print("=" * 50)
print(f"DML 估计值: {theta_dml:.4f}")
print(f"95% 置信区间: [{ci_lower:.4f}, {ci_upper:.4f}]")
print(f"真实值: theta_0 = {theta_0}")
print(f"真实值在 CI 内: {'是' if ci_lower <= theta_0 <= ci_upper else '否'}")
print()
print("对比 OLS:")
print(f" OLS 估计: {theta_ols:.4f} (偏差 {theta_ols - theta_0:+.4f})")
print(f" DML 估计: {theta_dml:.4f} (偏差 {theta_dml - theta_0:+.4f})")
```
## 手动实现双重残差化 {#sec-manual-dml}
为了深入理解 DML 的工作原理,下面用 scikit-learn 手动实现双重残差化过程。
```{python}
#| echo: true
#| eval: true
#| output: true
# Step 1: 残差化 Y(交叉拟合)
Y_hat = cross_val_predict(
RandomForestRegressor(n_estimators=200, max_depth=5, random_state=42),
X, Y, cv=5
)
Y_tilde = Y - Y_hat
# Step 2: 残差化 D(交叉拟合)
D_hat = cross_val_predict(
RandomForestRegressor(n_estimators=200, max_depth=5, random_state=42),
X, D, cv=5
)
D_tilde = D - D_hat
# Step 3: OLS 回归残差
theta_manual = np.sum(D_tilde * Y_tilde) / np.sum(D_tilde**2)
# Step 4: 标准误(异方差稳健)
residuals = Y_tilde - theta_manual * D_tilde
V_hat = np.mean(D_tilde**2 * residuals**2) / (np.mean(D_tilde**2))**2
se_manual = np.sqrt(V_hat / n)
ci_manual = (theta_manual - 1.96 * se_manual, theta_manual + 1.96 * se_manual)
print("=" * 50)
print("手动 DML 实现")
print("=" * 50)
print(f"手动 DML 估计: {theta_manual:.4f}")
print(f"econml DML 估计: {theta_dml:.4f}")
print(f"真实值: {theta_0:.4f}")
print()
print(f"手动 95% CI: [{ci_manual[0]:.4f}, {ci_manual[1]:.4f}]")
print(f"econml 95% CI: [{ci_lower:.4f}, {ci_upper:.4f}]")
```
两种实现给出几乎相同的结果。`econml` 封装了更多细节(如自动选择折数、多种标准误计算),但核心逻辑完全一致。
### scikit-learn `cross_val_predict` 的作用
`cross_val_predict` 实质上就是交叉拟合——它自动执行 $K$ 折分割,对每折用其余数据训练模型并在该折上预测。这正是 DML 所需的样本外预测。
## 估计结果可视化 {#sec-visualization}
```{python}
#| echo: true
#| eval: true
#| fig-align: center
fig, axes = plt.subplots(1, 2, figsize=(14, 5))
# 左图:估计对比
methods = ['线性 OLS', 'DML (econml)', 'DML (手动)']
estimates = [theta_ols, theta_dml, theta_manual]
colors = ['#8B6F4E', '#AE0B2A', '#2E4057']
bars = axes[0].bar(methods, estimates, color=colors, width=0.5,
edgecolor='white', linewidth=1.5)
axes[0].axhline(y=theta_0, color='black', linestyle='--', linewidth=2,
label=f'真实值 $\\theta_0$ = {theta_0}')
axes[0].fill_between([-0.5, 2.5], ci_lower, ci_upper,
alpha=0.12, color='#AE0B2A', label='DML 95% CI')
for bar, est in zip(bars, estimates):
axes[0].text(bar.get_x() + bar.get_width() / 2., bar.get_height() + 0.03,
f'{est:.3f}', ha='center', va='bottom', fontsize=12,
fontweight='bold')
axes[0].set_ylabel('估计值', fontsize=13)
axes[0].set_title('处理效应估计对比', fontsize=14, fontweight='bold')
axes[0].legend(fontsize=11, loc='upper right')
axes[0].set_ylim(0, max(estimates) * 1.35)
# 右图:双重残差化散点图
axes[1].scatter(D_tilde, Y_tilde, alpha=0.2, s=8, color='#AE0B2A',
edgecolors='none')
x_line = np.linspace(D_tilde.min(), D_tilde.max(), 100)
axes[1].plot(x_line, theta_manual * x_line, color='black', linewidth=2.5,
label=f'斜率 = {theta_manual:.3f}')
axes[1].axhline(y=0, color='gray', linestyle='-', linewidth=0.5)
axes[1].axvline(x=0, color='gray', linestyle='-', linewidth=0.5)
axes[1].set_xlabel('$\\tilde{D} = D - E[D|X]$', fontsize=13)
axes[1].set_ylabel('$\\tilde{Y} = Y - E[Y|X]$', fontsize=13)
axes[1].set_title('双重残差化散点图', fontsize=14, fontweight='bold')
axes[1].legend(fontsize=12)
plt.tight_layout()
plt.show()
```
左图展示了三种方法的估计结果——OLS 由于设定偏误明显偏离真实值,而两种 DML 实现都准确地恢复了 $\theta_0 = 2$。右图可视化了双重残差化后的数据:去除 $X$ 的共同影响后,$\tilde{Y}$ 和 $\tilde{D}$ 之间呈现清晰的线性关系,斜率即为因果效应。
## 不同 ML 学习器的比较 {#sec-learner-comparison}
DML 的一个重要优势是支持任意 ML 学习器。不同学习器的选择如何影响结果?
```{python}
#| echo: true
#| eval: true
#| output: true
from sklearn.ensemble import GradientBoostingRegressor
learners = {
'LASSO': LassoCV(cv=5),
'随机森林': RandomForestRegressor(
n_estimators=200, max_depth=5, random_state=42),
'梯度提升': GradientBoostingRegressor(
n_estimators=200, max_depth=3, random_state=42),
}
print("=" * 60)
print("不同 ML 学习器的 DML 估计对比")
print("=" * 60)
print(f"{'学习器':<12} {'估计值':>8} {'偏差':>8} {'95% CI':>24}")
print("-" * 60)
for name, learner in learners.items():
import copy
dml_tmp = LinearDML(
model_y=copy.deepcopy(learner),
model_t=copy.deepcopy(learner),
cv=5, random_state=42
)
dml_tmp.fit(Y, D, W=X)
est = float(dml_tmp.const_marginal_effect())
ci_tmp = dml_tmp.const_marginal_effect_interval(alpha=0.05)
lo, hi = float(ci_tmp[0]), float(ci_tmp[1])
print(f"{name:<12} {est:>8.4f} {est - theta_0:>+8.4f} "
f"[{lo:.4f}, {hi:.4f}]")
print("-" * 60)
print(f"{'真实值':<12} {theta_0:>8.4f}")
```
不同学习器的估计结果通常接近——只要满足乘积率条件即可。灵活性更强的模型(随机森林、梯度提升)在非线性 $g_0$ 下通常优于 LASSO。
# 第六部分:扩展与应用 {#sec-extensions}
## 交互式回归模型 (IRM) {#sec-irm}
部分线性模型假设处理效应 $\theta_0$ 是常数。如果效应可能随 $X$ 变化(异质性),可以使用 *交互式回归模型*(Interactive Regression Model):
$$Y = g_0(D, X) + U, \quad E[U \mid D, X] = 0$$
$$D = m_0(X) + V, \quad E[V \mid X] = 0$$
ATE 定义为:
$$\theta_0 = E[g_0(1, X) - g_0(0, X)]$$
DML 的正交矩条件推广为:
$$\psi_{\text{IRM}} = g_0(1, X) - g_0(0, X) + \frac{D(Y - g_0(1, X))}{m_0(X)} - \frac{(1-D)(Y - g_0(0, X))}{1 - m_0(X)} - \theta$$
这是经典的 *增广逆概率加权*(AIPW)估计量的 DML 版本。它同时使用了结果模型 $g_0(d, X)$ 和倾向得分 $m_0(X)$,具有 *双重稳健性*:两个模型中只要有一个正确,估计量就是一致的。
## DML 与条件平均处理效应 {#sec-dml-cate}
DML 框架也可以用于估计 CATE:
```python
from econml.dml import CausalForestDML
# CausalForestDML: DML + 因果森林
cfdml = CausalForestDML(
model_y=RandomForestRegressor(n_estimators=200),
model_t=RandomForestRegressor(n_estimators=200),
n_estimators=2000, random_state=42
)
cfdml.fit(Y, D, X=X, W=X)
cate = cfdml.effect(X) # 每个个体的 CATE
```
这将第一阶段的讨厌参数估计(DML 部分)与第二阶段的异质性建模(因果森林部分)结合起来。
## 经典应用:401(k) 养老金计划 {#sec-401k}
Chernozhukov et al. (2018) 的经典应用是评估美国 401(k) 养老金计划对个人储蓄的因果效应。
### 背景
- **处理 $D$**:是否参与 401(k) 计划
- **结果 $Y$**:净金融资产
- **控制变量 $X$**:收入、年龄、教育、家庭规模、婚姻状况、IRA 参与等($p \approx 10$–20)
### 挑战
401(k) 参与不是随机的——高收入、高储蓄倾向的人更可能参与,产生正向选择偏差。需要控制大量混杂变量,且效应的函数形式未知。
### DML 的优势
- 灵活控制收入等变量的非线性效应
- 不需要假设 $g_0(X)$ 的函数形式
- 得到的是具有有效推断的 ATE 估计
## 实践指南 {#sec-practice}
### 何时使用 DML
DML 特别适用于以下场景:
- 需要控制中高维混杂变量($p > 10$)
- $g_0(X)$ 可能为非线性
- 需要对 $\theta_0$ 进行严格的统计推断
- 处理效应是低维的(标量或低维向量)
### ML 学习器选择建议
| 学习器 | 适用场景 | 注意事项 |
|:---|:---|:---|
| LASSO | 高维稀疏,线性 $g_0$ | 无法处理非线性 |
| 随机森林 | 中维,非线性 | 调参:`max_depth`, `n_estimators` |
| 梯度提升 | 中高维,非线性,交互项 | 调参:`learning_rate`, `max_depth` |
| 神经网络 | 超高维,复杂非线性 | 需大量数据,调参困难 |
### 推荐工具包
::: {.callout-tip}
## Python 工具
- **econml** (Microsoft):`LinearDML`, `DML`, `CausalForestDML`, `SparseLinearDML`
- **doubleml** (DoubleML project):`DoubleMLPLR`, `DoubleMLIRM`,基于 sklearn 接口
- **scikit-learn**:提供底层 ML 学习器和 `cross_val_predict`
:::
::: {.callout-tip}
## R 工具
- **DoubleML**:基于 mlr3 生态系统,API 清晰
- **grf**:`causal_forest` 内置交叉拟合
- **hdm**:高维稀疏模型,Double Selection LASSO
:::
# 总结与思考 {#sec-summary}
## 本讲核心要点 {#sec-key-points}
1. **高维控制变量的挑战**
- OLS 在 $p \geq n$ 时不可行,在 $p$ 大时不稳定
- ML 能预测但正则化导致偏差,无法直接做因果推断
2. **部分线性模型 (PLM)**
- $Y = \theta_0 D + g_0(X) + U$:参数化因果效应 + 非参数混杂
- Robinson 思想:通过条件期望差分消除 $g_0(X)$
3. **Neyman 正交性**
- 正交矩条件对讨厌参数估计误差的一阶项免疫
- 双重残差化同时去除 $Y$ 和 $D$ 中 $X$ 的影响
- 将单一 $n^{-1/2}$ 率要求降低为乘积率
4. **交叉拟合**
- $K$ 折样本分割消除过拟合偏差
- 每个观测的预测值来自不包含该观测的训练集
- 保留全部样本用于最终估计
5. **DML 渐近性质**
- $\sqrt{n}$ 一致性和渐近正态性
- 乘积率条件:两个学习器误差之积达到 $n^{-1/2}$ 即可
- 支持标准的假设检验和置信区间构建
## 方法论的位置 {#sec-position}
在课程的方法论全景中,DML 填补了一个关键空白:
| 方法 | 控制变量 | 效应类型 | 推断 |
|:---|:---|:---|:---|
| OLS | 低维线性 | ATE | $\sqrt{n}$ |
| Double Selection | 高维稀疏线性 | ATE | $\sqrt{n}$ |
| **DML** | **高维非线性** | **ATE** | **$\sqrt{n}$** |
| 因果森林 | 中维 | CATE | 逐点 |
| CausalForestDML | 高维非线性 | CATE | 逐点 |
DML 是连接传统半参数估计理论与现代 ML 预测能力的桥梁。
## 拓展阅读 {#sec-reading}
### 必读文献
- Chernozhukov, V., Chetverikov, D., Demirer, M., Duflo, E., Hansen, C., Newey, W., & Robins, J. (2018). Double/Debiased Machine Learning for Treatment and Structural Parameters. *The Econometrics Journal*, 21(1), C1–C68.
- Robinson, P.M. (1988). Root-N-Consistent Semiparametric Regression. *Econometrica*, 56(4), 931–954.
### 推荐阅读
- Bach, P., Chernozhukov, V., Kurz, M., & Spindler, M. (2022). DoubleML: An Object-Oriented Implementation of Double Machine Learning in Python. *Journal of Machine Learning Research*, 23(53), 1–6.
- Chernozhukov, V., Hansen, C., Kallus, N., Spindler, M., & Syrgkanis, V. (2024). *Applied Causal Inference Powered by ML and AI*. [causalml-book.org](https://causalml-book.org/)
- Athey, S., & Imbens, G.W. (2019). Machine Learning Methods That Economists Should Know About. *Annual Review of Economics*, 11, 685–725.
### 工具文档
- econml 文档:[econml.azurewebsites.net](https://econml.azurewebsites.net/)
- DoubleML 文档:[docs.doubleml.org](https://docs.doubleml.org/)
## 练习题 {#sec-exercises}
### 概念题(难)
1. 解释为什么朴素 ML 插件方法(先用 ML 估计 $g_0(X)$,再 OLS)不能得到无偏的 $\hat{\theta}$。偏差的两个来源分别是什么?
2. Neyman 正交性如何消除正则化偏差?试用 Taylor 展开说明。
3. 为什么交叉拟合使用 $K=5$ 而非简单的 $K=2$(样本对半分)?各有什么优劣?
4. 解释乘积率条件 $\|\hat{\ell} - \ell_0\| \cdot \|\hat{m} - m_0\| = o(n^{-1/2})$ 的直觉含义。为什么 DML 对单个学习器的要求比朴素方法宽松?
### 编程题
5. 修改本讲的模拟代码,将 $g_0(X)$ 改为纯线性函数 $g_0(X) = 2X_1 + 3X_2$。在这种情况下,OLS 和 DML 的表现是否有差异?为什么?
6. 尝试增加 $p$(控制变量维度)至 100 和 500,观察 OLS、LASSO-DML 和随机森林-DML 的表现如何变化。
7. 实现 IRM(交互式回归模型)的 DML 版本,允许处理效应随 $X$ 变化。提示:使用 `econml.dml.DML` 或 `doubleml.DoubleMLIRM`。
8. (挑战题)手动实现 DML 的标准误估计(不使用 econml),并与 econml 的结果对比。