前置条件与学习依赖 / PREREQUISITES
① 数学 / 统计基础
局部线性 / 局部多项式回归、非参数估计(核回归、三角核)、带宽选择(IMSE / 交叉验证)、结果与密度在 cutoff 处的连续性假设。
② 经济学理论前置
政策评估中的断点设计思想:sharp vs fuzzy RDD,阈值分配带来的准实验逻辑。
③ 软件 / 计算前置
Stata 17+(外部命令:rdrobustrdplotrdlocrandrddensity)。
④ 站内前置页面
先学 04 基准回归,再进入非参数局部识别。
⑤ 难度分级
进阶

01 RDD 的直觉:running variable 与 cutoff

想象一个奖学金发放规则:考试分数 ≥ 60 分的学生获奖学金,< 60 分的没有。你想知道奖学金对后续学业表现的影响。当然不能直接比较"获奖 vs 未获奖"——分数高的学生本来就更优秀。但 RDD 的洞见是:刚好考 59.5 分和刚好考 60.5 分的学生,在能力、努力、运气等所有维度上几乎是随机的,唯一的系统差异就是那 1 分以及由此带来的奖学金资格。于是我们只需要比较 cutoff 两侧很窄窗口内的个体,就能近似得到因果效应。

RDD 的两个核心概念:

  • Running variable (assignment variable / score):决定处理分配的连续变量 $X$。例如考试分数、年龄、降雨量距离阈值的偏差、企业规模距离某线的距离。
  • Cutoff (threshold):阈值 $c$。当 $X \ge c$ 时被处理,$X < c$ 时未被处理(或反过来)。

02 Sharp RDD 的形式化

当处理分配完全由 running variable 决定($X \ge c \Rightarrow D=1$,$X < c \Rightarrow D=0$,没有例外),这就是 Sharp RDD(精确断点)。Sharp RDD 的处理效应就是结果函数 $E[y|X]$ 在 cutoff 处的跳跃:

Eq. 2.1 — Sharp RDD 估计量
$$ \hat{\tau}_{SRD} = \lim_{x \downarrow c} E[y|X=x] - \lim_{x \uparrow c} E[y|X=x] $$

直观上,我们在 cutoff 左右两侧分别拟合 $y$ 关于 $X$ 的回归,然后在 $X=c$ 处读出两条回归线的预测值之差。这个差值就是处理效应。注意它只对恰好位于 cutoff 处的子总体(compliers at the margin)有因果解释,外推到其他位置需要额外假设。

03 Fuzzy RDD 的形式化

现实中政策规则往往不那么"硬":例如"分数 ≥ 60 的学生应该获奖学金",但有人考了 60.5 分却因为其他原因没拿到,有人考了 59.5 分却通过申诉拿到了。处理分配 $D$ 在 cutoff 处不是从 0 跳到 1,而只是概率上有一个跳跃——这就是 Fuzzy RDD(模糊断点)。

Fuzzy RDD 本质上是一个局部 IV:cutoff 指示变量 $1(X \ge c)$ 是处理变量 $D$ 的工具变量。估计量是"结果的跳跃"除以"处理概率的跳跃":

Eq. 3.1 — Fuzzy RDD 估计量(Wald 形式)
$$ \hat{\tau}_{FRD} = \frac{\lim_{x \downarrow c} E[y|X=x] - \lim_{x \uparrow c} E[y|X=x]}{\lim_{x \downarrow c} E[D|X=x] - \lim_{x \uparrow c} E[D|X=x]} $$

分子就是 Sharp RDD 风格的结果跳跃;分母是处理概率的跳跃(在 Sharp RDD 下它恒等于 1,所以 Fuzzy RDD 就退化成 Sharp RDD)。

04 局部线性回归与带宽选择(IK / CCT)

RDD 的估计不在全样本上做,而在 cutoff 附近一个很窄的带宽 $h$ 内做。常用 局部线性回归(local linear regression)

Eq. 4.1 — 局部线性 RDD 回归
$$ \min_{\alpha, \beta, \tau, \delta} \sum_{i=1}^n K\left(\frac{X_i-c}{h}\right)\big(y_i - \alpha - \beta(X_i-c) - \tau D_i - \delta D_i(X_i-c)\big)^2 $$

其中 $K(\cdot)$ 是核函数(triangular kernel 最常用),$h$ 是带宽。我们关心的系数是 $\tau$。

带宽选择

带宽 $h$ 太小 → 样本太少,方差大;带宽太大 → 把 cutoff 远处非线性的关系扯进来,偏误大。最优带宽由数据自动选择,最常用两个:

  • IK (Imbens–Kalyanaraman, 2012):RDD 专用的最优带宽选择。
  • CCT (Calonico–Cattaneo–Titiunik, 2014):目前 rdrobust 默认带宽,对偏误修正更稳健。
实务做法

报告 rdrobust 默认 CCT 带宽结果作为主回归;同时报告 IK 带宽、0.5×h、2×h 作为稳健性。如果结果在这些带宽下都稳健,说明结论不是带宽选择的产物。

05 协变量连续性与排序检验 rddensity

RDD 的核心识别假设是:在 cutoff 处,除了处理变量本身跳跃外,其他所有东西都连续。这包括:

  • 协变量连续:年龄、性别、教育这些不应该被处理影响的协变量,在 cutoff 两侧应该平滑过渡。如果它们在 cutoff 处也跳跃,说明个体在 manipulate running variable——RDD 不成立。检验方法:对每个协变量跑一次 rdrobust,系数应该不显著。
  • 密度连续(排序检验,McCrary test / rddensity):running variable 的分布在 cutoff 处应该平滑。如果 cutoff 附近样本数异常多(例如刚好 60 分的学生远多于 59 分的),说明个体在 manipulation(例如老师改卷时"手下留情"把 59 分改成 60 分)。Stata 命令 rddensity X, c(cutoff) 直接检验。

06 完整 Stata 代码(rdrobust / rdplot / rddensity)

下面这段代码用 Stata 内置的 rdrobust 配套模拟数据演示完整 RDD 流程。所有命令都是 RDD 论文里的事实标准。

stata · rdd.do
*==============================================================*
* RDD 完整演示:Sharp RDD + Fuzzy RDD + rdplot + rddensity
*==============================================================*
clear all
set more off
set seed 20260911

* --- 首次运行安装 ---
* ssc install rdrobust,     replace
* ssc install rddensity,   replace
* ssc install lpdensity,   replace

* --- 1. 构造 RDD 模拟数据 ---
* running variable X ~ Uniform(-1, 1),cutoff c=0
* 处理规则:X >= 0 时 D=1(Sharp)
* 真实处理效应 tau = 0.8
set obs 2000
gen X = (runiform()*2 - 1)        // running variable, c=0
gen D = (X >= 0)
gen eps = rnormal()
gen y = 0.5 + 0.3*X + 0.8*D + 0.1*X*D + eps
gen age = 30 + 5*X + rnormal()*3     // 协变量:应在 cutoff 处连续
gen female = rbinomial(1, 0.5 + 0.1*X) // 协变量:应在 cutoff 处连续

* --- 2. Sharp RDD 主回归:rdrobust ---
* y 是结果,X 是 running variable,c(0) 指定 cutoff
rdrobust y X, c(0)
* 输出包括:
*   Coef. (在 cutoff 处的跳跃)
*   Conventional / Bias-corrected / Robust 三种置信区间
*   带宽 h_left, h_right

* --- 3. 画 RDD 图:rdplot ---
rdplot y X, c(0) ///
    title("RDD:奖学金对后续学业表现的影响") ///
    ytitle("后续 GPA") xtitle("入学考试分数(距 cutoff 的距离)") ///
    graph_options(legend(off))

* --- 4. 带宽敏感性分析:0.5h, h, 2h ---
rdrobust y X, c(0) h(0.2)
rdrobust y X, c(0) h(0.4)
rdrobust y X, c(0) h(0.8)

* --- 5. 三角核 vs 矩形核 vs 局部二次 ---
rdrobust y X, c(0) kernel(triangular) p(1)
rdrobust y X, c(0) kernel(uniform)    p(1)
rdrobust y X, c(0) kernel(triangular) p(2)

* --- 6. Fuzzy RDD:处理分配不完全由 X 决定 ---
* 假设 D 在 X>=0 时以 0.8 概率为 1,X<0 时以 0.2 概率为 1
replace D = (X >= 0 & runiform()<0.8) | (X<0 & runiform()<0.2)
gen y_fuzzy = 0.5 + 0.3*X + 0.8*D + eps

* Fuzzy RDD:用 c(0) 处的虚拟变量作为 D 的工具
rdrobust y_fuzzy X, c(0) fuzzy(D)
* 等价于局部 IV:cutoff indicator 是 D 的工具

* --- 7. 协变量连续性检验(placebo outcome) ---
* 对 age、female 跑 rdrobust,系数应不显著
rdrobust age    X, c(0)
rdrobust female X, c(0)

* --- 8. 排序检验 / 密度检验(McCrary 类) ---
rddensity X, c(0) plot
* 原假设:running variable 的密度在 cutoff 处连续
* 不拒绝 → 没有 manipulation,RDD 识别有效
* 拒绝 → 个体在 manipulate running variable,RDD 失效

* --- 9. 导出结果 ---
* rdrobust 结果可以用 esttab 导出,也可以用 outreg2
* rdrobust 没有 estimates 范式,建议手工记录系数和稳健标准误

06b 前沿扩展:Honest CI、Donut RDD、带宽敏感性与操纵检验

上面 s4–s6 是 RDD 的"标配流程"。本节补上 2018 年以来审稿人最常追问的四块进阶内容:(1) 当回归函数在断点处有曲率时,传统置信区间 coverage 不足,需要 Honest / bias-aware CI;(2) 怀疑断点附近有 sorting/操纵时,用 Donut RDD 把最可疑的一小圈观测挖掉再估;(3) 带宽选择不能只报一个数字,要做 IK / CCT 双口径 + 带宽敏感性曲线;(4) 密度操纵检验从 McCrary (2008) 升级到 Cattaneo–Jansson–Ma (2018) 的 rddensity

6b.1 Honest confidence intervals(诚实置信区间)

问题:传统局部线性 RDD 的置信区间(rdrobust 的 conventional CI)默认"在给定带宽下把估计量当渐近正态"。但 Kolesár & Rothe (2018, AER) 证明:当条件期望函数 $m(x)=E[y|X=x]$ 在断点附近有曲率(二阶导不为零)、尤其当 running variable 离散(如年龄按岁、分数按整分计)时,局部线性估计量的偏误 $O(h^2)$ 不随带宽缩小而按渐近理论消失,CI 的实际 coverage 会显著低于名义 95%——也就是说你以为的"95% 置信区间"可能只覆盖 80%。

两条修正路线

  • Bias-aware / conditional unbiased CIs(CCT 路线):用同一数据先估偏误,做 bias-correction 再用 robust 标准误——这正是 rdrobust 默认输出的 Bias-corrected / Robust CI(CCT 2014, Econometrica)。它对渐近偏误稳健,但仍假设带宽按速率趋于零。
  • Honest CIs(Kolesár–Rothe / Armstrong–Kolesár 路线):不再依赖带宽趋于无穷的渐近论,而是显式给二阶导上界 $M$ 加约束(bounded second derivative,$|m''(x)|\le M$),在整个函数类 $\mathcal{F}(M)$ 上最小化最坏情形 coverage。只要真实曲率不超过 $M$,区间就有 95% 的保证覆盖,带宽固定也行。
Eq. 6b.1 — Honest CI 的偏误界思想
$$ \hat{\tau}_{h} = \tau + \underbrace{O(h^{p+1} m'' \cdots)}_{\text{局部线性偏误}} + O_p\!\left(\frac{1}{\sqrt{nh}}\right), \qquad \text{Honest half-width} = 1.96\,\widehat{SE} + \underbrace{M\!\cdot h^2}_{\text{worst-case bias}} $$

直观:Honest CI = 渐近正态区间 再往外扩一段 $M h^2$,把"曲率可能带来的最坏偏误"直接吃进区间半径里。$M$ 越大区间越宽,但越安全;实务中常用数据估出的二阶导稳健上界来设 $M$。

工具现实:honest CI 的主实现是 R,不是 Stata

目前 rdrobust(Stata)没有现成的 honest 选项;honest/BSD CI 的事实标准实现是 R 包 RDHonest(Kolesár 维护)。下面 Stata 代码给出"手动 bias-aware 区间"的等价写法(先 rdbwselect 选带宽,再用 rdrobust 自带的 bias-corrected robust CI),并在注释里给出 R 端 RDHonest 的对应命令。论文中若用 honest CI,建议在附录报 R 包结果,正文用 CCT robust CI。

stata · s6b1_honest_ci.do
*--------------------------------------------------------------*
* Honest / bias-aware CI 演示:Kolesar-Rothe(2018) 思想的 Stata 等价
* 数据沿用 s6:X ~ U(-1,1), cutoff c=0, tau=0.8
*--------------------------------------------------------------*
set seed 20260911
set obs 2000
gen X = (runiform()*2 - 1)
gen D = (X >= 0)
gen eps = rnormal()
* 故意加入曲率(X 的二次项),制造 honest CI 要对付的情形
gen y = 0.5 + 0.3*X + 0.15*X^2 + 0.8*D + eps

* --- (a) rdrobust 自带的 bias-corrected robust CI(CCT 路线) ---
* 默认即输出 Conventional / Bias-corrected / Robust 三套 CI
rdrobust y X, c(0) kernel(triangular) p(1)
* 论文主报 "Robust" 那一列:它已经把偏误估计并校正、用稳健 SE。

* --- (b) 手动选带宽:rdbwselect(CCT IK 口径都能出) ---
* mserd  = IMSE 最优(CCT 默认)
* cerrd  = coverage-error-rate optimal(CI 专用,更接近 honest 思想)
rdbwselect y X, c(0) deriv(0) kernel(triangular) p(1) bwselect(mserd)
rdbwselect y X, c(0) deriv(0) kernel(triangular) p(1) bwselect(cerrd)
* 把上面返回的带宽 h 记下来:
*   e(h_l), e(h_r) 为 CCT 最优;cerrd 为 CI 专用带宽

* --- (c) 手动 bias-aware / honest 区间(Stata 等价写法) ---
* 思路:估计局部线性 tau_hat 与 SE;
*       再用数据估二阶导上界 M,把偏误界 M*h^2 加进半宽。
local h = 0.4
* 局部线性估计(三角核)
gen w = (abs(X)<=`h') * (1 - abs(X)/`h')       // 三角核权重
reg y D c.X#i.D [aw=w] if abs(X)<=`h', vce(robust)
scalar tau = _b[D]
scalar se  = _se[D]
* 用断点两侧局部二次回归估二阶导上界 M(粗略:取两侧 |二阶导| 的较大值)
reg c.X##c.X if X<0 & abs(X)<=`h'
scalar m_lo = abs(_b[c.X#c.X])
reg c.X##c.X if X>=0 & abs(X)<=`h'
scalar m_hi = abs(_b[c.X#c.X])
scalar M = max(m_lo, m_hi)*1.2                  // 留 20% 安全余量
scalar bias = M*`h'^2                           // worst-case 偏误界
scalar hw   = invnormal(0.975)*se + bias         // honest 半宽
display "honest CI: [" tau - hw ", " tau + hw "]   (M=" M ", bias=" bias ")"

* --- (d) R 端真正的 honest CI(论文推荐,附录给出) ---
* R:  library(RDHonest)
*     RDHonest(y ~ X, cutoff=0, M=NULL)
*     # M=NULL 时用数据估二阶导上界;也可手动 M=0.5
* 输出:honest 95% CI,带宽固定即可,不要求 h→0。

6b.2 Donut RDD(甜甜圈 RDD)

原理:当怀疑个体在断点处有 sorting / 操纵 / 数据堆积(heaping)时,离断点越近的观测越可能是"精确卡线"的操纵者(例如老师把 59.5 分批改到 60 分、自报身高在 170cm 扎堆)。Donut RDD 的做法是:把断点周围一个宽度为 $d$ 的小窗口 $|X-c|\le d$ 内的观测直接挖掉,再在剩下的"甜甜圈"上做局部线性 RDD。被挖掉的正是最可能被操纵的那一圈;远处的观测操纵成本高、相对干净。

Eq. 6b.2 — Donut RDD 估计样本
$$ \hat{\tau}_{donut} = \hat{\tau}_{RDD}\Big|_{X \notin [c-d,\, c+d]}, \qquad d \text{ 由制度/堆积证据决定,事后不得调} $$

适用场景:(i) 密度检验在断点处显著(bunching);(ii) running variable 离散且在阈值附近 heaping;(iii) 制度上明确知道个体能在阈值附近做小幅操纵(分数、申报指标、考核线)。代价:丢掉了离断点最近、本来最"随机"的观测,方差变大——所以 Donut RDD 是稳健性检验,不是替代主回归;若 donut 后系数仍接近主回归,说明结果不是操纵那一小圈堆出来的。

donut 宽度 $d$ 怎么定

① 由数据堆积证据定:直方图上 bunching 的那几个 bin 宽度;② 由制度定:如分数按整分计,就挖 $|X-c|\le 0.5$;③ 报告多档 $d$(如 0.2、0.3、0.5)的结果表。禁止:试了好几个 $d$,挑"系数最显著"的那个写进正文。

stata · s6b2_donut.do
*--------------------------------------------------------------*
* Donut RDD:挖掉断点附近 d 宽的一圈再估计
*--------------------------------------------------------------*
set seed 20260911
set obs 2000
gen X = (runiform()*2 - 1)
gen D = (X >= 0)
gen eps = rnormal()
gen y = 0.5 + 0.3*X + 0.8*D + 0.1*X*D + eps

* --- 主回归(不挖洞)作为基准 ---
rdrobust y X, c(0)

* --- Donut:先手动挖掉 |X| <= d,再跑 rdrobust ---
local d = 0.1                       // donut 半径,由制度/堆积证据定
gen keep_donut = (abs(X) > `d')     // 挖掉断点周围 ±0.1
rdrobust y X if keep_donut, c(0)
* rdrobust 仍会在剩余样本里自动选带宽;断点处 now 是一个"洞"。

* --- 多档 donut 宽度做稳健性表 ---
foreach d in 0.05 0.1 0.2 {
    gen keep`d' = (abs(X) > `d')
    rdrobust y X if keep`d', c(0)
    drop keep`d'
}
* 报告:主回归 tau≈0.8;d=0.05/0.1/0.2 下 tau 仍显著为正且接近 0.8。

* --- 配合密度检验:先 rddensity 看哪里 bunching ---
rddensity X, c(0) plot
* 若断点右侧样本异常多 → 操纵嫌疑 → donut 稳健性更要做。

6b.3 带宽选择深化:IK、CCT 与带宽敏感性图

s4 已提到 IK 与 CCT。这里把它落成可执行流程,并补一张带宽敏感性图(bandwidth sensitivity plot)——审稿人越来越要求看到"系数随带宽怎么变"。

  • IK(Imbens & Kalyanaraman, 2012, ReStud):RDD 专用最优带宽,最小化渐近 MSE,带宽口径 bwselect(ik)
  • CCT(Calonico, Cattaneo & Titiunik, 2014, Econometrica)rdrobust 默认的 mserd(IMSE 最优),并配套 bias-corrected robust CI;CI 专用口径 cerrd
  • 带宽敏感性:在 $0.5h^\ast$、$h^\ast$、$2h^\ast$ 下分别估计,画"横轴=带宽、纵轴=tau 估计值 + 95%CI"的图。若结论只在某一个带宽下成立,就是 cherry-picking bandwidth
stata · s6b3_bw_sensitivity.do
*--------------------------------------------------------------*
* 带宽选择:IK vs CCT + 带宽敏感性曲线
*--------------------------------------------------------------*
set seed 20260911
set obs 2000
gen X = (runiform()*2 - 1)
gen D = (X >= 0)
gen y = 0.5 + 0.3*X + 0.8*D + 0.1*X*D + rnormal()

* --- 1. IK 最优带宽(rdbwselect_2014 / rdrobust 内 bwselect(ik)) ---
rdrobust y X, c(0) bwselect(ik)
* --- 2. CCT 默认 IMSE(rdrobust 默认,等价 bwselect(mserd)) ---
rdrobust y X, c(0) bwselect(mserd)
* --- 3. CI 最优带宽 cerrd ---
rdbwselect y X, c(0) bwselect(cerrd)

* --- 4. 带宽敏感性:循环跑 h = 0.2,0.3,...,0.8,存系数 ---
tempname bmat
postfile `bmat' double(h tau se) using "bw_sens.dta", replace
foreach h in 0.2 0.3 0.4 0.5 0.6 0.7 0.8 {
    rdrobust y X, c(0) h(`h')
    post `bmat' (`h') (e(tau_bc)) (e(se_rb))   // bias-corrected 系数 + robust SE
}
postclose `bmat'

use "bw_sens.dta", clear
gen lo = tau - 1.96*se
gen hi = tau + 1.96*se
twoway (rcap lo hi h, lcolor(navy%60)) ///
       (scatter tau h, mcolor(navy) msymbol(O)), ///
       yline(0, lcolor(red) lpattern(dash)) ///
       ytitle("处理效应 tau") xtitle("带宽 h") ///
       title("带宽敏感性图:tau 随 h 的变化") ///
       legend(label(1 "95% CI") label(2 "tau 估计"))
* 读图:tau 应在各带宽下稳定为正;若只在某一个 h 显著,需警惕。

6b.4 McCrary 密度检验与 rddensity(操纵检验)

s5 已用 rddensity。这里把两代方法讲清楚:

  • McCrary (2008, JoE):开创性地提出"检验 running variable 密度在断点处是否连续"来识别 manipulation。经典实现是 Stata 命令 DCdensity(需手动 bin + 选两个调参)。原假设 $H_0$:密度 $f(x)$ 在 $c$ 处连续;拒绝 → 个体在精确操纵 running variable。
  • Cattaneo–Jansson–Ma (2018, Stata Journal 18(1):234–261):用局部多项式密度估计重做这一检验,免去预分 bin、自动选带宽(rdbwdensity),size 性质更好、在额外约束下功效更高。Stata 命令 rddensity(配套 lpdensity)。这是目前的默认做法。
怎么读密度检验结果

rddensity X, c(0) 输出断点两侧密度比的估计、z 值与 p 值。p>0.05 → 不拒绝密度连续,无 manipulation 证据,RDD 识别安全;p<0.05 → 密度在断点处跳跃,说明有 bunching,必须上 donut RDD / 协变量连续性 / 制度解释。注意:密度检验不拒绝 ≠ 一定没有操纵(功效问题),但拒绝 = 明确的红旗。

stata · s6b4_density.do
*--------------------------------------------------------------*
* 操纵检验:McCrary (2008) 与 rddensity (CJM 2018)
*--------------------------------------------------------------*
* ssc install rddensity, replace
* ssc install lpdensity, replace
* ssc install DCdensity,   replace   // 经典 McCrary(可选,做对照)

set seed 20260911
set obs 3000
gen X = (runiform()*2 - 1)

* --- (a) 新版:rddensity(Cattaneo-Jansson-Ma 2018,默认做法) ---
rddensity X, c(0)
* 自动选带宽;输出断点处密度跳跃的 z/p 值 + 密度比。
rddensity X, c(0) plot          // 画断点两侧局部多项式密度 + CI
rddensity X, c(0) bwselect(comb) // 组合带宽选择

* --- (b) 经典:DCdensity(McCrary 2008),做对照 ---
* DCdensity X, breakpoint(0) generate(x1 f1 se1) graph
* 需手动指定 bin 与 bandwidth;与 rddensity 结论互证。

* --- (c) 若显著 → 三件事 ---
*   1) 报告 bunching 出现在断点哪一侧(直方图);
*   2) 做 Donut RDD(见 6b.2)作为稳健性;
*   3) 用制度语言解释:谁有动机/能力在断点附近操纵?

07 论文案例与常见错误

论文案例

English · JoE
Manipulation of the Running Variable in the Regression Discontinuity Design: A Density Test
Justin McCrary · Journal of Econometrics, 2008, 142(2): 698–714
密度操纵检验(McCrary test)的原始论文。提出通过检验 running variable 的密度在 cutoff 处是否连续来识别 manipulation:若刚好越过阈值的样本异常多,说明个体在操纵 running variable。Stata 经典命令 DCdensity
English · AER
Inference in Regression Discontinuity Designs with a Discrete Running Variable
Michal Kolesár & Christoph Rothe · American Economic Review, 2018, 108(8): 2277–2304
Honest / bounded-second-derivative CI 的核心文献。证明当回归函数有曲率、尤其 running variable 离散时,常规局部线性 CI 的 coverage 严重不足;提出在函数类约束下保证最坏情形 coverage 的诚实置信区间。R 包 RDHonest。本页 6b.1 的方法依据。
English · ReStud
Optimal Bandwidth Choice for the Regression Discontinuity Estimator
Guido Imbens & Karthik Kalyanaraman · Review of Economic Studies, 2012, 79(3): 933–959
IK 最优带宽选择的原始论文。提出 RDD 专用的 IMSE 最优带宽公式,是 CCT 之前的事实标准。Stata 中对应 bwselect(ik)
English · Econometrica
Robust Nonparametric Confidence Intervals for Regression-Discontinuity Designs
Sebastian Calonico, Matias D. Cattaneo & Rocío Titiunik · Econometrica, 2014, 82(6): 2295–2326
CCT 带宽选择 + bias-corrected robust CI 的原始理论论文。证明并给出把局部多项式偏误估计、校正后再用稳健 SE 构造 CI 的方法,是 rdrobust 默认输出 "Robust" 列的依据。
English · Stata Journal
rddensity: Manipulation Testing Based on Density Discontinuity
Matias D. Cattaneo, Michael Jansson & Xinwei Ma · Stata Journal, 2018, 18(1): 234–261
用局部多项式密度估计重做 McCrary 操纵检验,免预分 bin、自动选带宽(rdbwdensity),size 性质优于经典 McCrary。Stata 命令 rddensity 的出处。本页 6b.4 的方法依据。
English · QJE
Saving Babies? Revisiting the Effect of Very Low Birth Weight Classification
Alan I. Barreca, Melanie Guldi, Jason M. Lindo & Glen R. Waddell · Quarterly Journal of Economics, 2011, 126(4): 2111–2135
Donut RDD 的代表性应用:指出 1500g"极低出生体重"阈值附近存在数据堆积/操纵,挖掉断点附近观测后重估,发现原先的医疗效应大幅缩水。本页 6b.2 的方法依据。
English · JEL
Regression Discontinuity Designs in Economics
David S. Lee & Thomas Lemieux · Journal of Economic Literature, 2010
RDD 领域的最佳综述。系统讲清 Sharp / Fuzzy RDD 的识别假设、局部线性回归、带宽选择、协变量连续性、排序检验。每个做 RDD 的学生必读。
English · Stata Journal
rdrobust: Software for Regression-discontinuity Designs
Calonico, Cattaneo & Titiunik · Stata Journal, 2014 / 2017
rdrobust 命令的原始论文。讲清 CCT 带宽选择、bias-corrected robust 置信区间、rdplot 图形。
中文 · 《经济研究》
《政府补贴门槛与企业研发投入》类 RDD 文章
《经济研究》《管理世界》近年多篇 · 通用范式
中国情境下常见的 RDD 应用:高新技术企业认定标准(研发费用占比 ≥ 3%)、最低注册资本要求、企业规模门槛("规上"工业企业标准)、高考分数线、公务员考试面试线。文章通常报告 rdrobust 默认带宽、IK 带宽、协变量连续性、rddensity 排序检验,并画 rdplot 图。
中文 · 《管理世界》
《最低工资标准与企业雇佣决策》类 RDD 文章
《管理世界》系列 · 通用范式
最低工资政策在区县层面有一个明确的金额阈值,围绕阈值构造 running variable(企业平均工资距最低工资线的距离),用 Sharp RDD 估计政策对雇佣的影响。是中文顶刊里 RDD 用法最规范的一类。

常见错误

错误 1:不跑 rddensity / 排序检验就直接报 RDD 结果

如果 running variable 在 cutoff 处有 manipulation(个体精确地操纵分数越过阈值),RDD 识别假设就被破坏。必须报告 rddensity 检验的 p 值。

错误 2:在全样本上做 OLS 而不是局部线性回归

RDD 的识别只在 cutoff 附近成立。用全样本 OLS 等于假设 $E[y|X]$ 在整个定义域上线性,这几乎不成立。必须在 $[c-h, c+h]$ 窗口内做局部回归。

错误 3:只报一个带宽

带宽选择有主观性。必须报告默认带宽、IK 带宽、0.5h、2h 多档结果,证明结论对带宽不敏感。

错误 4:把协变量当结果变量做跳跃

协变量应该在 cutoff 处连续。如果某个协变量在 cutoff 处也跳跃,那它要么被处理影响(不该作为协变量),要么说明 running variable 被操纵。必须对所有预处理协变量跑一次 rdrobust。

错误 5:把 RDD 效应外推到 cutoff 之外

RDD 估计的是"边际上的局部处理效应"(treatment effect at the cutoff),不能直接说"政策对所有人都有这个效果"。

错误 6:忽略断点处曲率,只报 conventional CI 不做 bias-corrected / honest CI

当 $E[y|X]$ 在断点附近有曲率、尤其 running variable 离散时,常规局部线性 CI 的实际 coverage 会低于名义 95%(Kolesár–Rothe 2018)。主回归必须报 rdrobust 的 Bias-corrected / Robust 列;若 running variable 高度离散,附录补 RDHonest 的诚实 CI。

错误 7:密度检验显著后不做 Donut RDD 稳健性

rddensity 显著 = 断点附近有 bunching/操纵。正确做法是报告多档 donut 宽度(如 0.05/0.1/0.2)下的系数稳定性;直接忽略密度检验的 p 值继续报主回归,等于把红旗当装饰。

错误 8:用高阶全局多项式(p=3/4)或事后挑选多项式阶数

RDD 的事实标准是局部线性(p=1)+ 三角核。在宽窗口上拟合 p=3/4 的全局多项式会在端点附近剧烈振荡、外推扭曲;多项式阶数必须事前按规则定,不能"试到显著为止"。

进阶资料

  • Cattaneo, Idrobo & Titiunik (2020)A Practical Introduction to Regression Discontinuity Designs (Cambridge Elements):最实用的 RDD 操作手册。
  • Imbens & Lemieux (2008) — "Regression discontinuity designs: A guide to practice", Journal of Econometrics
  • 张航、范子英等中文教程 — 国内经济学者整理的 rdrobust 实操笔记。