Skip to content

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 估计反而更大? 这是一个有趣的发现。可能的解释:

  1. LATE ≠ ATE:IV 估计的是"顺从者"(被距离影响是否上大学的人)的效应,这些人可能是教育边际回报较高的群体
  2. 测量误差:如果教育年限有测量误差,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 估计量

模拟数据

python
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 估计(有偏的)

python
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 估计量(手动计算)

python
# 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 估计量(协方差比)

python
# 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 之比

python
# 简化形式回归: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

python
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)**的核心思想,我们将在下一节详细讨论。


📝 本节要点

  1. 内生性)会导致 OLS 有偏且不一致
  2. 有效 IV 需要满足三个条件:相关性、排他性、独立性
  3. 只有相关性可以直接检验(第一阶段 F 统计量)
  4. Wald 估计量 = 简化形式 / 第一阶段 =
  5. 等价地,IV 估计量 =
  6. IV 牺牲了效率(更大的方差)换取了一致性

下一节8.3 两阶段最小二乘法 — 从 Wald 估计量到 2SLS 的完整框架,以及局部平均处理效应(LATE)的深刻含义。

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