11.6 本章小结
"The beauty of regression discontinuity is that it provides a transparent way to learn about causal effects.""断点回归的美妙之处在于它提供了一种透明的方式来了解因果效应。"— Joshua Angrist & Jörn-Steffen Pischke, Mostly Harmless Econometrics (《基本无害的计量经济学》)
掌握RDD,成为因果推断专家
核心概念回顾
RDD 的本质
Regression Discontinuity Design(断点回归设计)是一种准实验方法,利用处理分配规则在某个阈值处的不连续性来识别因果效应。
核心思想:
"在断点附近,处理分配是'准随机'的,类似于局部的随机对照试验(Local RCT)。" — Joshua Angrist
关键要素:
- 驱动变量(Running Variable):决定处理分配的连续变量
- 断点(Cutoff):处理分配改变的阈值
- 处理(Treatment):在断点处不连续变化
- 结果(Outcome):我们关心的变量
Sharp RDD vs Fuzzy RDD
Sharp RDD
定义:处理状态完全由断点决定
识别:
因果解释:断点处的局部平均处理效应(LATE)
经典案例:
- Lee (2008):选举得票率50%
- Carpenter & Dobkin (2009):21岁饮酒年龄
Fuzzy RDD
定义:处理概率在断点处跳跃,但不是从0到1
识别(Wald 估计量):
本质:工具变量(IV)估计,断点作为IV
因果解释:顺从者(Compliers)的LATE
经典案例:
- Angrist & Lavy (1999):班级规模(Maimonides' Rule)
核心假设
1. 连续性假设(Continuity Assumption)⭐
假设:潜在结果函数在断点处连续
白话:如果没有处理,结果在断点处不会跳跃
不可直接检验,但可通过以下方式间接验证:
- 协变量平衡检验
- 密度检验(McCrary Test)
- 安慰剂检验
2. 无精确操控(No Precise Manipulation)
假设:个体不能精确地操控驱动变量使自己刚好越过断点
检验:McCrary 密度检验
- : 密度在断点处连续
- 拒绝 → 可能存在操控
3. 局部排他性(Local Exclusion)
假设:驱动变量只通过处理影响结果(在断点附近)
实践:选择"外生"的驱动变量(年龄、抽签号码、考试分数等)
️ 实证实施步骤
1. 数据准备
import numpy as np
import pandas as pd
from rdrobust import rdrobust, rdplot, rdbwselect
# 中心化驱动变量
df['X_centered'] = df['X'] - cutoff
df['D'] = (df['X'] >= cutoff).astype(int)2. 可视化(RDD图)
# 使用 rdplot
rdplot(y=df['Y'], x=df['X'], c=cutoff,
title='RDD Plot',
x_label='Running Variable',
y_label='Outcome')3. 主效应估计
# 使用 rdrobust(CCT 最优带宽 + 稳健推断)
result = rdrobust(y=df['Y'], x=df['X'], c=cutoff)
print(result)4. 有效性检验
# 协变量平衡
for cov in covariates:
balance_test = rdrobust(y=df[cov], x=df['X'], c=cutoff)
print(f"{cov}: p={balance_test.pval[0]:.4f}")
# 密度检验
from rddensity import rddensity
density_test = rddensity(X=df['X'], c=cutoff)
print(f"McCrary Test p-value: {density_test.pval[0]:.4f}")
# 安慰剂检验(假断点)
placebo_cutoffs = [cutoff - 10, cutoff + 10]
for pc in placebo_cutoffs:
placebo_result = rdrobust(y=df['Y'], x=df['X'], c=pc)
print(f"Placebo {pc}: p={placebo_result.pval[0]:.4f}")5. 稳健性检验
# 带宽敏感性
bandwidths = [0.5*h_optimal, 0.75*h_optimal, h_optimal, 1.25*h_optimal]
for h in bandwidths:
result_h = rdrobust(y=df['Y'], x=df['X'], c=cutoff, h=h)
print(f"h={h:.2f}: Effect={result_h.coef[0]:.4f}")
# Donut-hole
df_donut = df[np.abs(df['X_centered']) >= 1] # 排除 |X-c| < 1
result_donut = rdrobust(y=df_donut['Y'], x=df_donut['X'], c=cutoff)️ 常见陷阱和注意事项
陷阱 1:高阶多项式()
问题:Gelman & Imbens (2019) 警告不要使用高阶多项式
- 容易过拟合
- 置信区间不可靠
建议:
- 使用局部线性()
- 最多局部二次()
- 避免
陷阱 2:忽略聚类
问题:如果数据有聚类结构(学校、地区),标准误会被低估
解决:使用聚类标准误
result = rdrobust(y=df['Y'], x=df['X'], c=cutoff,
cluster=df['cluster_id'])陷阱 3:多个断点未报告
问题:如果存在多个断点(如40, 80, 120),只报告一个会有选择性偏差
解决:
- 报告所有断点的结果
- 或者将它们合并(pooled RDD)
陷阱 4:外推到远离断点的效应
问题:RDD估计的是断点处的LATE,而非全样本ATE
教训:
- 明确说明估计的是局部效应
- 不要过度外推到整个分布
文献推荐
必读综述
Lee, D. S., & Lemieux, T. (2010). "Regression Discontinuity Designs in Economics." Journal of Economic Literature, 48(2), 281-355.
- RDD的圣经,必读!
Imbens, G. W., & Lemieux, T. (2008). "Regression discontinuity designs: A guide to practice." Journal of Econometrics, 142(2), 615-635.
方法论突破
Calonico, S., Cattaneo, M. D., & Titiunik, R. (2014). "Robust Nonparametric Confidence Intervals for Regression-Discontinuity Designs." Econometrica, 82(6), 2295-2326.
- CCT 稳健推断
Gelman, A., & Imbens, G. (2019). "Why High-Order Polynomials Should Not Be Used in Regression Discontinuity Designs." JBES, 37(3), 447-456.
- 警告高阶多项式
经典应用
Thistlethwaite, D. L., & Campbell, D. T. (1960). "Regression-discontinuity analysis." J. Educational Psychology, 51(6), 309.
- RDD的诞生
Angrist, J. D., & Lavy, V. (1999). "Using Maimonides' Rule to Estimate the Effect of Class Size on Scholastic Achievement." QJE, 114(2), 533-575.
Lee, D. S. (2008). "Randomized Experiments from Non-random Selection in U.S. House Elections." J. Econometrics, 142(2), 675-697.
Carpenter, C., & Dobkin, C. (2009). "The Effect of Alcohol Consumption on Mortality: Regression Discontinuity Evidence from the Minimum Drinking Age." AEJ: Applied, 1(1), 164-182.
推荐教材
- Angrist & Pischke (2009). Mostly Harmless Econometrics, Chapter 6
- Cunningham (2021). Causal Inference: The Mixtape, Chapter 6
- Huntington-Klein (2022). The Effect, Chapter 20
Python 工具箱
核心包
# 安装
pip install rdrobust rddensity numpy pandas matplotlib seaborn statsmodels
# 导入
from rdrobust import rdrobust, rdplot, rdbwselect
from rddensity import rddensity
import statsmodels.formula.api as smf
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt快速模板
# 1. 基础 RDD
result = rdrobust(y=Y, x=X, c=cutoff)
print(result)
# 2. 绘图
rdplot(y=Y, x=X, c=cutoff)
# 3. Fuzzy RDD
result_fuzzy = rdrobust(y=Y, x=X, c=cutoff, fuzzy=D)
# 4. 带宽选择
bw = rdbwselect(y=Y, x=X, c=cutoff)
print(f"Optimal bandwidth: {bw.bws[0]}")
# 5. 密度检验
density_test = rddensity(X=X, c=cutoff)
print(f"p-value: {density_test.pval[0]}")练习题
练习 1:概念理解
- 解释:为什么RDD被称为"局部的RCT"?
- 区分:Sharp RDD 和 Fuzzy RDD 的本质区别是什么?
- 假设:连续性假设为什么不可直接检验?我们能做什么?
练习 2:数据分析
数据生成:
np.random.seed(123)
n = 1000
X = np.random.uniform(-50, 50, n)
D = (X >= 0).astype(int)
Y = 50 + 0.5*X + 0.01*X**2 + 10*D + np.random.normal(0, 5, n)任务:
- 绘制 RDD 图
- 估计处理效应(使用 rdrobust)
- 进行协变量平衡检验(自己生成协变量)
- 进行密度检验
- 进行带宽敏感性分析
练习 3:案例复现
选择以下一篇经典论文,尝试复现主要结果:
- Angrist & Lavy (1999)
- Lee (2008)
- Carpenter & Dobkin (2009)
提示:许多论文的数据可在作者网站或期刊网站下载。
从 RDD 到更广阔的因果推断
RDD 在因果推断工具箱中的位置
| 方法 | 数据要求 | 核心假设 | 外部有效性 | 典型应用 |
|---|---|---|---|---|
| RCT | 实验数据 | 随机分配 | 可能较低 | 医学、发展经济学 |
| RDD | 断点规则 | 连续性假设 | 局部效应 | 教育、政治、公共卫生 |
| DID | 面板数据 | 平行趋势 | 可能较广 | 政策评估 |
| IV | 工具变量 | 排他性、相关性 | Compliers | 教育回报、健康 |
何时使用 RDD?
理想场景:
- 存在清晰的断点规则(政策、法律、制度)
- 断点是外生的(不可操控)
- 断点附近有足够的观测
- 关心局部效应(断点处)
不适用场景:
- 断点模糊或主观
- 严重的操控(选举舞弊、考试作弊)
- 断点附近观测太少
- 需要全样本ATE
下一步学习
高级主题
- 多维RDD(Multidimensional RDD):多个驱动变量
- 动态RDD:处理效应随时间变化
- Kink RDD:断点处斜率变化(而非水平跳跃)
- Geographic RDD:地理边界作为断点
- Machine Learning + RDD:用ML估计条件期望函数
相关方法
- 合成控制法(Synthetic Control):构造反事实
- 匹配(Matching):找到可比的对照组
- 事件研究(Event Study):动态效应
最后的话
Josh Angrist 的忠告:
"Econometrics is about using the right tool for the job. RDD is a powerful tool when you have a cutoff, but it's not a panacea. Always think carefully about identification."
RDD 的精髓:
- 简单但强大:概念直观,识别可信
- 局部但精确:牺牲外部有效性,换取内部有效性
- 透明且可检验:假设可以间接验证
记住:
- 寻找清晰的断点规则
- 严格检验连续性假设
- 报告稳健性分析
- 谨慎解释(LATE,非ATE)
结语
恭喜你完成 Module 11!你已经掌握了:
- RDD 的核心思想和识别逻辑
- Sharp 和 Fuzzy RDD 的区别
- 有效性检验和稳健性分析
- 经典案例的复现
- Python 实现的最佳实践
现在你已经具备了:
- 识别RDD研究机会的能力
- 严格实施RDD分析的技能
- 在顶级期刊发表RDD研究的基础
下一步:
- 阅读更多经典RDD论文
- 在你的研究中寻找断点规则
- 实践、实践、再实践!
RDD:局部随机化,因果推断的利器!
本章结束
感谢学习 Module 11!
如有问题或建议,欢迎交流讨论。
Happy Coding & Happy Researching!