Skip to content

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

关键要素

  1. 驱动变量(Running Variable):决定处理分配的连续变量
  2. 断点(Cutoff):处理分配改变的阈值
  3. 处理(Treatment):在断点处不连续变化
  4. 结果(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. 数据准备

python
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图)

python
# 使用 rdplot
rdplot(y=df['Y'], x=df['X'], c=cutoff,
       title='RDD Plot',
       x_label='Running Variable',
       y_label='Outcome')

3. 主效应估计

python
# 使用 rdrobust(CCT 最优带宽 + 稳健推断)
result = rdrobust(y=df['Y'], x=df['X'], c=cutoff)
print(result)

4. 有效性检验

python
# 协变量平衡
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. 稳健性检验

python
# 带宽敏感性
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:忽略聚类

问题:如果数据有聚类结构(学校、地区),标准误会被低估

解决:使用聚类标准误

python
result = rdrobust(y=df['Y'], x=df['X'], c=cutoff,
                 cluster=df['cluster_id'])

陷阱 3:多个断点未报告

问题:如果存在多个断点(如40, 80, 120),只报告一个会有选择性偏差

解决

  • 报告所有断点的结果
  • 或者将它们合并(pooled RDD)

陷阱 4:外推到远离断点的效应

问题:RDD估计的是断点处的LATE,而非全样本ATE

教训

  • 明确说明估计的是局部效应
  • 不要过度外推到整个分布

文献推荐

必读综述

  1. Lee, D. S., & Lemieux, T. (2010). "Regression Discontinuity Designs in Economics." Journal of Economic Literature, 48(2), 281-355.

    • RDD的圣经,必读!
  2. Imbens, G. W., & Lemieux, T. (2008). "Regression discontinuity designs: A guide to practice." Journal of Econometrics, 142(2), 615-635.

方法论突破

  1. Calonico, S., Cattaneo, M. D., & Titiunik, R. (2014). "Robust Nonparametric Confidence Intervals for Regression-Discontinuity Designs." Econometrica, 82(6), 2295-2326.

    • CCT 稳健推断
  2. Gelman, A., & Imbens, G. (2019). "Why High-Order Polynomials Should Not Be Used in Regression Discontinuity Designs." JBES, 37(3), 447-456.

    • 警告高阶多项式

经典应用

  1. Thistlethwaite, D. L., & Campbell, D. T. (1960). "Regression-discontinuity analysis." J. Educational Psychology, 51(6), 309.

    • RDD的诞生
  2. Angrist, J. D., & Lavy, V. (1999). "Using Maimonides' Rule to Estimate the Effect of Class Size on Scholastic Achievement." QJE, 114(2), 533-575.

  3. Lee, D. S. (2008). "Randomized Experiments from Non-random Selection in U.S. House Elections." J. Econometrics, 142(2), 675-697.

  4. 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 工具箱

核心包

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

快速模板

python
# 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:概念理解

  1. 解释:为什么RDD被称为"局部的RCT"?
  2. 区分:Sharp RDD 和 Fuzzy RDD 的本质区别是什么?
  3. 假设:连续性假设为什么不可直接检验?我们能做什么?

练习 2:数据分析

数据生成

python
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)

任务

  1. 绘制 RDD 图
  2. 估计处理效应(使用 rdrobust)
  3. 进行协变量平衡检验(自己生成协变量)
  4. 进行密度检验
  5. 进行带宽敏感性分析

练习 3:案例复现

选择以下一篇经典论文,尝试复现主要结果:

  • Angrist & Lavy (1999)
  • Lee (2008)
  • Carpenter & Dobkin (2009)

提示:许多论文的数据可在作者网站或期刊网站下载。


从 RDD 到更广阔的因果推断

RDD 在因果推断工具箱中的位置

方法数据要求核心假设外部有效性典型应用
RCT实验数据随机分配可能较低医学、发展经济学
RDD断点规则连续性假设局部效应教育、政治、公共卫生
DID面板数据平行趋势可能较广政策评估
IV工具变量排他性、相关性Compliers教育回报、健康

何时使用 RDD?

理想场景

  1. 存在清晰的断点规则(政策、法律、制度)
  2. 断点是外生的(不可操控)
  3. 断点附近有足够的观测
  4. 关心局部效应(断点处)

不适用场景

  1. 断点模糊或主观
  2. 严重的操控(选举舞弊、考试作弊)
  3. 断点附近观测太少
  4. 需要全样本ATE

下一步学习

高级主题

  1. 多维RDD(Multidimensional RDD):多个驱动变量
  2. 动态RDD:处理效应随时间变化
  3. Kink RDD:断点处斜率变化(而非水平跳跃)
  4. Geographic RDD:地理边界作为断点
  5. 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 的精髓

  1. 简单但强大:概念直观,识别可信
  2. 局部但精确:牺牲外部有效性,换取内部有效性
  3. 透明且可检验:假设可以间接验证

记住

  • 寻找清晰的断点规则
  • 严格检验连续性假设
  • 报告稳健性分析
  • 谨慎解释(LATE,非ATE)

结语

恭喜你完成 Module 11!你已经掌握了:

  • RDD 的核心思想和识别逻辑
  • Sharp 和 Fuzzy RDD 的区别
  • 有效性检验和稳健性分析
  • 经典案例的复现
  • Python 实现的最佳实践

现在你已经具备了

  • 识别RDD研究机会的能力
  • 严格实施RDD分析的技能
  • 在顶级期刊发表RDD研究的基础

下一步

  • 阅读更多经典RDD论文
  • 在你的研究中寻找断点规则
  • 实践、实践、再实践!

RDD:局部随机化,因果推断的利器!


本章结束

感谢学习 Module 11!

如有问题或建议,欢迎交流讨论。

Happy Coding & Happy Researching!

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