8.2 工具变量的直觉与原理
"The key to instrumental variables is finding a source of variation in treatment that is unrelated to omitted variables.""工具变量的关键在于找到一个与遗漏变量无关的处理变异来源。"— Joshua Angrist & Jörn-Steffen Pischke, Mostly Harmless Econometrics
从内生性困境到工具变量的三大条件
📌 本节概要
在本节中,我们将深入探讨:
- 内生性问题的严格数学定义
- 有效工具变量的三大条件及其直觉
- DAG 图示:每个条件在因果图中的含义
- Wald 估计量的推导与直觉
- IV 作为简化形式之比
- 经典工具变量案例
🔴 内生性问题:OLS 为什么会失败?
回归模型的设定
考虑最简单的线性回归模型:
其中:
- 是结果变量(如工资)
- 是处理变量/核心解释变量(如受教育年限)
- 是误差项(包含所有其他影响 的因素)
- 是我们想要估计的因果效应
OLS 的关键假设
OLS 能给出无偏估计的必要条件:
大白话:处理变量 和误差项 不相关。即, 的变化不能和那些"我们没观测到的、但也影响 的因素"有系统性的关联。
内生性的定义
当这个条件被违反时:
我们称 是内生的(endogenous)。
OLS 偏差的推导
让我们看看内生性到底会带来什么后果。
OLS 估计量:
将 代入:
关键洞察:
- 如果 ,OLS 是无偏的
- 如果 (如能力同时推高教育和工资),OLS 高估了真实效应
- 如果 ,OLS 低估了真实效应
内生性的三个来源
1. 遗漏变量偏差(Omitted Variable Bias, OVB) 🎯
这是最常见的原因。某个变量同时影响 和 ,但我们没有在回归中控制它。
例子:
- 能力 → 教育、工资(能力越高,读书越多,赚钱也越多)
- 家庭财富 → 健康保险购买、健康状况
2. 双向因果(Simultaneity/Reverse Causality)
影响 ,同时 也影响 。
例子:
- 警力 → 犯罪率?还是 犯罪率 → 警力?(犯罪多的地方会增加警力)
- 价格 → 需求量?还是 需求量 → 价格?
3. 测量误差(Measurement Error)
的测量不精确,含有噪声。
例子:
- 自报的受教育年限可能有误差
- 调查中的收入数据常有记忆偏差
🔧 工具变量的三大条件
正式定义
一个变量 是 的有效工具变量,如果它满足以下三个条件:
条件 1:相关性(Relevance)
大白话:工具变量 必须和处理变量 有显著的相关性。 变了, 也跟着变。
为什么需要? 如果 和 毫无关系, 就没有提供任何关于 的信息,我们自然无法通过 来了解 对 的效应。
在 DAG 中:
Z ——→ D ——→ Y到 有一条箭头(直接因果关系)。
如何检验? 这是三个条件中唯一可以直接检验的!跑一个 对 的回归,看 的系数是否显著(第一阶段 F 统计量 > 10)。
条件 2:排他性约束(Exclusion Restriction)
更严格地说:在控制了 之后, 对 没有直接效应。
大白话:工具变量 影响结果 的唯一途径是通过处理变量 。 不能"绕过" 直接影响 。
在 DAG 中:
Z ——→ D ——→ Y
Z ——✗——→ Y (不能有这条直接路径!)这是最难满足的条件,也是最容易被挑战的。
反例:如果出生季度不仅通过教育影响工资,还通过其他渠道影响(比如,1月出生的人在体育方面有优势,而体育能力也影响收入),那么出生季度就不满足排他性约束。
如何检验? 严格来说,这个条件不可直接检验,因为我们无法观测到 对 的所有可能路径。它需要经济学直觉和理论来论证。
条件 3:独立性(Independence / Exogeneity)
大白话:工具变量 必须和误差项 (包含所有不可观测的混淆因素)不相关。
在 DAG 中:
U (不可观测)
↗ ↘
Z ——→ D ——→ Y
Z ——✗——→ U (Z 和 U 之间不能有关联!)为什么需要? 如果 和 相关,那么用 来"清洗" 的变异就没有意义——被 解释的那部分 变异仍然是"脏"的。
如何检验? 与排他性类似,独立性也不可直接检验(因为 包含不可观测变量)。需要依赖理论和制度知识。
三大条件的总结
| 条件 | 数学表达 | 直觉 | 可检验? |
|---|---|---|---|
| 相关性 | IV 推动处理变量 | ✅ 可以(第一阶段 F) | |
| 排他性 | 只通过 影响 | IV 不走"捷径" | ❌ 不可直接检验 |
| 独立性 | IV 与混淆无关 | ❌ 不可直接检验 |
经验法则:一个好的 IV 论文需要花大量篇幅论证排他性和独立性条件,而不仅仅是报告第一阶段 F 统计量。
📐 DAG 图示:完整的工具变量结构
有效 IV 的 DAG
U (不可观测混淆)
↗ ↘
Z ——→ D ——→ Y路径分析:
- :这是我们想利用的路径(因果链)
- :这是需要被"绕过"的混淆路径
- 和 之间没有箭头:独立性条件
- 和 之间没有直接箭头:排他性条件
违反排他性的 DAG
U (不可观测混淆)
↗ ↘
Z ——→ D ——→ Y
\ ↑
\——————————————/
直接效应(违反排他性!)例子:出生季度 → 教育 → 工资,但出生季度也可能通过"星座效应"、"运动能力"等直接影响工资。
违反独立性的 DAG
U (不可观测混淆)
↗ ↑ ↘
Z ——→ D | ——→ Y
↖———/
U 也影响 Z(违反独立性!)例子:用"父母教育"作为"个人教育"的 IV,但父母教育也和能力基因()相关。
📊 Wald 估计量:IV 的核心公式
最简单的情形:二值工具变量
假设 是一个二值(binary)工具变量。
直觉推导:
第一步:比较 和 两组的结果差异(简化形式, Reduced Form):
这个差异包含了 对 的总效应。但 只通过 影响 (排他性),所以这个效应 = 对 的效应 × 对 的效应。
第二步:比较 和 两组的处理差异(第一阶段, First Stage):
这告诉我们 "推动"了多少人改变处理状态。
第三步:两者相除,得到 Wald 估计量:
大白话:
Wald 估计量 = ( 导致的 变化)÷( 导致的 变化)
就像物理学中的"速度 = 距离 ÷ 时间"一样,IV 估计量 = "结果的变化 ÷ 处理的变化"
一般连续工具变量的 IV 估计量
当 不是二值变量时,IV 估计量推广为:
推导:
由回归模型 ,两边对 取协方差:
由独立性条件 :
因此:
前提是 (相关性条件)。
IV 作为两个 OLS 回归之比
还有一种等价的理解方式:
简化形式回归(Reduced Form):
衡量 对 的总效应。
第一阶段回归(First Stage):
衡量 对 的效应。
IV 估计量:
大白话: 每让你多上 年学(第一阶段),你的工资就多 (简化形式)。那么多上一年学的效果就是 。
🎓 经典工具变量案例
案例 1:降雨量 → 出席率 → 考试成绩
研究问题:上课出席率对考试成绩的因果效应是什么?
内生性问题:
- 更"认真"的学生既更可能出席,也更可能考高分(遗漏变量偏差)
- 直接回归出席率对成绩,会高估真实效应
工具变量:降雨量(Rainfall)
为什么有效?
- 相关性 ✅:下雨天学生更不愿意出门上课(降雨 → 出席率 ↓)
- 排他性 ✅(需要论证):下雨不直接影响考试表现(考试不是在户外进行的)
- 独立性 ✅:降雨是自然现象,和学生的"认真程度"无关
DAG:
U (认真程度)
↗ ↘
Rain ——→ Attend ——→ Score案例 2:距离学院 → 教育 → 工资(Card 1995)
研究问题:教育的因果回报是多少?
工具变量:与最近的四年制学院的距离(Proximity to College)
为什么有效?
- 相关性 ✅:住得离学院近的人更可能上大学(通勤成本低、信息更充分)
- 排他性 ⚠️(需要仔细论证):距离本身不直接影响工资?
- 反驳:住在学院附近可能意味着住在城市,城市本身工资就高
- Card 的应对:控制了地区固定效应和家庭背景变量
- 独立性 ⚠️:住在哪里可能与家庭背景相关
- Card 的应对:控制了种族、地区等变量
主要发现:教育每增加一年,工资约增加 12-14%(高于 OLS 的约 7%!)
为什么 IV 估计反而更大? 这是一个有趣的发现。可能的解释:
- LATE ≠ ATE:IV 估计的是"顺从者"(被距离影响是否上大学的人)的效应,这些人可能是教育边际回报较高的群体
- 测量误差:如果教育年限有测量误差,OLS 会有衰减偏差(attenuation bias),IV 可以修正
案例 3:出生季度 → 教育 → 工资(Angrist & Krueger 1991)
研究问题:义务教育是否真的提高了工资?
工具变量:出生季度(Quarter of Birth)
制度背景:
- 美国义务教育法:年满 16 岁方可辍学
- 入学规则:在当年某个日期前满 6 岁的孩子进入一年级
- 结果:1月出生的孩子和12月出生的孩子在同一年级,但16岁时分别在9年级和10年级
- 因此,1月出生的人(更早满16岁)倾向于更少的教育年限
为什么有效?
- 相关性 ✅:出生季度通过义务教育法影响教育年限
- 排他性 ⚠️:出生季度是否直接影响工资?
- Angrist & Krueger 认为:出生日期是"准随机"的
- 后来的争议:Bound, Jaeger & Baker (1995) 指出弱工具变量问题
- 独立性 ✅:出生季度基本上是随机的
主要发现:教育每增加一年,工资约增加 7.5%
案例 4:军事征兵抽签 → 兵役 → 终身收入(Angrist 1990)
研究问题:越战兵役对退伍军人终身收入的因果效应是什么?
工具变量:征兵抽签号码(Draft Lottery Number)
背景:
- 1970-1972 年,美国实行抽签征兵制
- 每个人根据出生日期获得一个随机的抽签号码
- 号码低的人被征入伍的概率更高
为什么这是近乎完美的 IV?
- 相关性 ✅:低抽签号码 → 更可能服兵役
- 排他性 ✅:抽签号码本身是随机分配的,不直接影响收入
- 独立性 ✅:抽签号码与个人特征无关(这是真正的随机数!)
主要发现:越战退伍军人的长期收入比非退伍军人约低 15%
📏 IV 估计量的性质
一致性(Consistency)
在三大条件成立的前提下,IV 估计量是一致的(consistent):
但注意:IV 估计量一般不是无偏的(unbiased),只在大样本下收敛到真实值。
与 OLS 的比较
| 性质 | OLS(无内生性) | OLS(有内生性) | IV |
|---|---|---|---|
| 无偏性 | ✅ | ❌ | ❌(一般不无偏) |
| 一致性 | ✅ | ❌ | ✅ |
| 效率 | 高 | — | 低(方差更大) |
| 适用条件 | — | 三大条件 |
关键权衡:
- IV 用效率换一致性
- IV 的标准误通常比 OLS 大得多
- 在没有内生性时,IV 反而不如 OLS(因为方差更大)
IV 估计量的标准误
IV 估计量的渐近方差为:
其中 是第一阶段回归的 。
关键洞察:当第一阶段 很低(即 对 的解释力弱)时,IV 的方差会爆炸式增长。这就是弱工具变量问题的根源(详见第 4 节)。
🔢 Python 实现:Wald 估计量
模拟数据
import numpy as np
import pandas as pd
np.random.seed(42)
n = 5000
# 不可观测的混淆变量(能力)
ability = np.random.normal(0, 1, n)
# 工具变量(如征兵抽签号码,0 或 1)
Z = np.random.binomial(1, 0.5, n)
# 处理变量(教育):受能力和 IV 影响
D = 12 + 2 * Z + 1.5 * ability + np.random.normal(0, 1, n)
# 结果变量(工资):受教育和能力影响
# 真实的教育因果效应 = 3
beta_true = 3
Y = 20 + beta_true * D + 2 * ability + np.random.normal(0, 2, n)
df = pd.DataFrame({'Y': Y, 'D': D, 'Z': Z, 'ability': ability})
print("=" * 70)
print("模拟数据概览")
print("=" * 70)
print(f"真实因果效应 β₁ = {beta_true}")
print(f"样本量: {n}")
print(f"\n数据前5行:")
print(df[['Y', 'D', 'Z']].head())OLS 估计(有偏的)
import statsmodels.formula.api as smf
# OLS 回归(忽略内生性)
ols_result = smf.ols('Y ~ D', data=df).fit()
print("\n" + "=" * 70)
print("OLS 估计(有偏)")
print("=" * 70)
print(f"OLS 估计的 β₁ = {ols_result.params['D']:.4f}")
print(f"真实 β₁ = {beta_true}")
print(f"偏差 = {ols_result.params['D'] - beta_true:.4f}")
print("(因为能力同时影响教育和工资,OLS 高估了教育的效应)")Wald 估计量(手动计算)
# Wald 估计量 = (E[Y|Z=1] - E[Y|Z=0]) / (E[D|Z=1] - E[D|Z=0])
# 简化形式:Y 在 Z=1 和 Z=0 两组的均值差
Y_Z1 = df.loc[df['Z'] == 1, 'Y'].mean()
Y_Z0 = df.loc[df['Z'] == 0, 'Y'].mean()
reduced_form = Y_Z1 - Y_Z0
# 第一阶段:D 在 Z=1 和 Z=0 两组的均值差
D_Z1 = df.loc[df['Z'] == 1, 'D'].mean()
D_Z0 = df.loc[df['Z'] == 0, 'D'].mean()
first_stage = D_Z1 - D_Z0
# Wald 估计量
wald_estimate = reduced_form / first_stage
print("\n" + "=" * 70)
print("Wald 估计量(手动计算)")
print("=" * 70)
print(f"E[Y|Z=1] = {Y_Z1:.4f}")
print(f"E[Y|Z=0] = {Y_Z0:.4f}")
print(f"简化形式(Reduced Form)= {reduced_form:.4f}")
print(f"\nE[D|Z=1] = {D_Z1:.4f}")
print(f"E[D|Z=0] = {D_Z0:.4f}")
print(f"第一阶段(First Stage)= {first_stage:.4f}")
print(f"\nWald 估计量 = {reduced_form:.4f} / {first_stage:.4f} = {wald_estimate:.4f}")
print(f"真实 β₁ = {beta_true}")
print(f"偏差 = {wald_estimate - beta_true:.4f}")IV 估计量(协方差比)
# IV 估计量 = Cov(Y, Z) / Cov(D, Z)
cov_YZ = np.cov(df['Y'], df['Z'])[0, 1]
cov_DZ = np.cov(df['D'], df['Z'])[0, 1]
iv_cov_estimate = cov_YZ / cov_DZ
print("\n" + "=" * 70)
print("IV 估计量(协方差比)")
print("=" * 70)
print(f"Cov(Y, Z) = {cov_YZ:.4f}")
print(f"Cov(D, Z) = {cov_DZ:.4f}")
print(f"IV 估计量 = {iv_cov_estimate:.4f}")
print(f"真实 β₁ = {beta_true}")两个 OLS 之比
# 简化形式回归:Y ~ Z
rf_result = smf.ols('Y ~ Z', data=df).fit()
# 第一阶段回归:D ~ Z
fs_result = smf.ols('D ~ Z', data=df).fit()
# IV = RF 系数 / FS 系数
iv_ratio_estimate = rf_result.params['Z'] / fs_result.params['Z']
print("\n" + "=" * 70)
print("IV = 简化形式 / 第一阶段")
print("=" * 70)
print(f"简化形式系数 γ₁ = {rf_result.params['Z']:.4f} (p = {rf_result.pvalues['Z']:.6f})")
print(f"第一阶段系数 π₁ = {fs_result.params['Z']:.4f} (p = {fs_result.pvalues['Z']:.6f})")
print(f"IV 估计量 = {rf_result.params['Z']:.4f} / {fs_result.params['Z']:.4f} = {iv_ratio_estimate:.4f}")
# 汇总比较
print("\n" + "=" * 70)
print("三种方法比较")
print("=" * 70)
print(f"{'方法':<20} {'估计值':<12} {'偏差':<12}")
print("-" * 44)
print(f"{'真实效应':<20} {beta_true:<12.4f} {'—':<12}")
print(f"{'OLS(有偏)':<18} {ols_result.params['D']:<12.4f} {ols_result.params['D'] - beta_true:<12.4f}")
print(f"{'Wald 估计量':<18} {wald_estimate:<12.4f} {wald_estimate - beta_true:<12.4f}")
print(f"{'IV(协方差比)':<17} {iv_cov_estimate:<12.4f} {iv_cov_estimate - beta_true:<12.4f}")
print(f"{'IV(RF/FS)':<18} {iv_ratio_estimate:<12.4f} {iv_ratio_estimate - beta_true:<12.4f}")可视化:OLS vs IV
import matplotlib.pyplot as plt
import seaborn as sns
plt.rcParams['font.sans-serif'] = ['SimHei', 'Arial Unicode MS', 'DejaVu Sans']
plt.rcParams['axes.unicode_minus'] = False
sns.set_style("whitegrid")
fig, axes = plt.subplots(1, 3, figsize=(18, 6))
# 图1:D 和 Y 的散点图(OLS 视角)
axes[0].scatter(df['D'], df['Y'], alpha=0.1, s=10, color='gray')
x_range = np.linspace(df['D'].min(), df['D'].max(), 100)
axes[0].plot(x_range, ols_result.params['Intercept'] + ols_result.params['D'] * x_range,
color='red', linewidth=2, label=f'OLS: β={ols_result.params["D"]:.2f}')
axes[0].set_xlabel('Education (D)', fontsize=12)
axes[0].set_ylabel('Wage (Y)', fontsize=12)
axes[0].set_title('OLS 回归(有偏)', fontsize=14, fontweight='bold')
axes[0].legend(fontsize=11)
# 图2:第一阶段 Z -> D
df_grouped = df.groupby('Z').agg({'D': 'mean', 'Y': 'mean'}).reset_index()
axes[1].bar([0, 1], df_grouped['D'], color=['steelblue', 'coral'],
edgecolor='black', width=0.5)
axes[1].set_xticks([0, 1])
axes[1].set_xticklabels(['Z = 0', 'Z = 1'], fontsize=12)
axes[1].set_ylabel('平均 Education (D)', fontsize=12)
axes[1].set_title(f'第一阶段:E[D|Z]\n差值 = {first_stage:.3f}', fontsize=14, fontweight='bold')
# 图3:简化形式 Z -> Y
axes[2].bar([0, 1], df_grouped['Y'], color=['steelblue', 'coral'],
edgecolor='black', width=0.5)
axes[2].set_xticks([0, 1])
axes[2].set_xticklabels(['Z = 0', 'Z = 1'], fontsize=12)
axes[2].set_ylabel('平均 Wage (Y)', fontsize=12)
axes[2].set_title(f'简化形式:E[Y|Z]\n差值 = {reduced_form:.3f}', fontsize=14, fontweight='bold')
plt.suptitle(f'Wald IV 估计量 = {reduced_form:.3f} / {first_stage:.3f} = {wald_estimate:.3f}(真实值 = {beta_true})',
fontsize=15, fontweight='bold', y=1.02)
plt.tight_layout()
plt.savefig('wald_iv_illustration.png', dpi=300, bbox_inches='tight')
plt.show()🧠 直觉小结:为什么 IV 有效?
让我们用一个最直观的方式总结 IV 的逻辑:
Step 1:问题
和 搅在一起了(内生性),OLS 分不清 对 的效应是"因果的"还是"混淆的"。
Step 2:解决思路
找一个外部变量 ,它只通过 影响 ,且与 无关。
Step 3:提取干净变异
用 来"预测" (第一阶段),得到 。 是 中被 解释的那部分——这部分是"干净的",因为 与 无关。
Step 4:用干净变异估计因果效应
把 (干净的部分)拿去解释 (第二阶段),得到的就是 对 的因果效应。
这就是**两阶段最小二乘法(2SLS)**的核心思想,我们将在下一节详细讨论。
📝 本节要点
- 内生性()会导致 OLS 有偏且不一致
- 有效 IV 需要满足三个条件:相关性、排他性、独立性
- 只有相关性可以直接检验(第一阶段 F 统计量)
- Wald 估计量 = 简化形式 / 第一阶段 =
- 等价地,IV 估计量 =
- IV 牺牲了效率(更大的方差)换取了一致性
下一节:8.3 两阶段最小二乘法 — 从 Wald 估计量到 2SLS 的完整框架,以及局部平均处理效应(LATE)的深刻含义。