从图形到检验:Stata实战断点回归(RDD)的完整流程解析

张开发
2026/4/16 23:41:57 15 分钟阅读

分享文章

从图形到检验:Stata实战断点回归(RDD)的完整流程解析
1. 断点回归RDD的核心逻辑与适用场景断点回归设计Regression Discontinuity Design是政策评估中的黄金标准它的巧妙之处在于利用自然形成的分界线来模拟随机实验。想象一下高考录取假设某大学设定500分为录取线504分和496分的考生其实能力差异很小但就因为4分之差被划入不同组别。这种一刀切的规则恰好给我们创造了观察政策效果的天然实验场。在实际研究中RDD主要解决两类问题清晰断点Sharp RDD就像高考分数线规则明确且强制生效。比如年满18岁才能考驾照18岁就是绝对分界点模糊断点Fuzzy RDD分界线存在但不绝对比如贫困生助学金理论上按家庭收入划分但实际执行可能有弹性空间我经手的一个典型案例是评估某市垃圾分类政策效果。该政策规定当月抽查得分80分以上小区获得奖励我们以80分为断点比较79分和81分小区的后续垃圾减量效果。这种设计能有效规避传统方法中好学生更容易得高分的混淆因素。2. 数据准备与可视化诊断2.1 构建模拟数据集先通过Stata生成一份标准化的练习数据实际研究请替换为自己的数据clear all set obs 2000 set seed 2023 // 生成分配变量如考试分数 gen score runiform()*100 // 中心化处理断点设在60分 gen score_c score - 60 label var score_c Centered Assignment Variable // 生成混杂变量 gen income 50 rnormal()*10 // 家庭收入 gen prior_ability rnormal() // 前期能力 // 生成处理变量是否及格 gen treatment (score 60) // 生成结果变量如后续测试成绩 gen outcome 70 5*treatment 0.3*score 2*prior_ability rnormal()*32.2 可视化诊断四步法第一步原始散点图观察twoway (scatter outcome score_c, msize(tiny)), xline(0) title(Raw Scatter Plot)这个图能直观看到60分两侧是否存在明显跳跃但数据量大时可能像毛毯一样难以辨认。第二步局部均值平滑binscatter outcome score_c, line(0) title(Binned Scatter Plot)将数据分段计算均值后趋势会更清晰。我曾遇到一个案例原始散点图完全看不出断点但分箱后显现出3.5分的显著跳跃。第三步拟合曲线对比rdplot outcome score_c, c(0) p(1) // 线性拟合 rdplot outcome score_c, c(0) p(2) // 二次项拟合不同阶数多项式拟合能捕捉复杂形态。有个实用技巧如果线性与二次拟合结果差异大说明需要更高阶项。第四步密度检验rddensity score_c, c(0) plot检查断点两侧样本分布是否连续。某次分析发现60分右侧明显鼓包提示可能存在分数操纵后续改用模糊RDD才得到可靠结果。3. 核心估计方法与Stata实现3.1 局部线性回归实战主流有三种命令实现各有特点// 基础命令自动计算最优带宽 rd outcome score_c, c(0) // 更稳健的标准误 rdrobust outcome score_c, c(0) // 交叉验证选择带宽 rdcv outcome score_c, thr(0)参数解读经验带宽选择就像显微镜的焦距太窄带宽小看得清但样本少噪声大太宽则可能混入远端干扰实际项目中我会同时报告三种带宽结果默认最优带宽rdrobust给出半带宽hoptimal_h/2双倍带宽hoptimal_h*23.2 多项式回归的阶数选择线性假设不一定合理这时需要多项式回归。关键问题是选几阶合适// 自动阶数选择 rdrobust outcome score_c, c(0) deriv(0) // 手动尝试不同阶数 foreach p in 1 2 3 4 { rdrobust outcome score_c, c(0) p(p) estimates store model_pp } // 用AIC/BIC比较模型 estimates stats model_p*有个容易踩的坑高阶项可能导致过拟合。我曾遇到四阶回归系数反而不显著的情况最终根据AIC选择了二阶模型。4. 有效性检验的完整流程4.1 协变量平衡性检验原理除结果变量外其他变量在断点处应该连续。用Stata检验控制变量foreach var in income prior_ability { rdrobust var score_c, c(0) est store var_test }经验法则如果p值0.1需要警惕。有个项目发现家庭人口数在断点处p0.07进一步检查发现是低收入家庭故意少报人口后续改用RKD拐点设计解决。4.2 驱动变量操纵检验rddensity score_c, c(0) plot histogram score_c, by(treatment)重点看McCrary检验的p值应0.1直方图在断点处是否出现异常凹陷或凸起5. 稳健性检验的三大法宝5.1 安慰剂检验假断点测试// 测试假断点50分和70分 foreach fake_cut in -10 10 { rdrobust outcome score_c, c(fake_cut) est store placebo_fake_cut }有效结果应该真断点显著假断点不显著。有个反例某政策研究发现在非断点处也显著最终发现是季节性因素干扰。5.2 带宽敏感性分析// 获取最优带宽 rdrobust outcome score_c, c(0) local h e(h_l) // 测试不同带宽 foreach scale in 0.5 0.75 1 1.5 2 { rdrobust outcome score_c, c(0) h(h*scale) est store bw_scale }优质结果应该在带宽变化时保持稳定。我常用的报告格式是表格展示不同带宽下的系数和标准误。5.3 样本筛选检验// 排除边界样本甜甜圈方法 foreach margin in 1 2 5 { rdrobust outcome score_c if abs(score_c)margin, c(0) est store sample_margin }这个方法特别适合处理压线过关行为。某税务稽查研究排除±3分区间后效应量从1.2万降至0.8万但仍在5%水平显著。6. 结果呈现与报告要点最后分享我的成果输出模板图形三件套原始散点图与拟合曲线对比图协变量平衡性检验图带宽敏感性分析森林图核心结果表esttab rd_default rd_half rd_double using results.rtf, /// b(3) se(3) star(* 0.1 ** 0.05 *** 0.01) /// stats(N h pv) replace文字报告要点明确说明断点类型清晰/模糊带宽选择依据建议附带宽计算过程至少报告3种稳健性检验结果讨论可能的局限如样本量、操纵风险等实际操作中我习惯把完整分析流程封装成do文件关键步骤添加注释。最近帮客户做的一个教育政策评估do文件里特别标注了第35-40行处理了闰年出生 cohort 的特殊情况。这种细节注释能大幅提高代码复用率。

更多文章