本文结构
- 原理:平行趋势假设的精确含义
- 直觉:为什么平行趋势如此关键
- 代码:可视化检验 + 预趋势统计检验
第一层:原理
平行趋势假设的精确表述
DID 的识别依赖于平行趋势假设(Parallel Trends Assumption):
用文字说:在反事实世界中(即假设没有处理),处理组和控制组的结果变量变化趋势相同。
不可检验性
平行趋势假设涉及反事实 ,因此在原则上不可直接检验。我们只能检查:
- 处理前两组的趋势是否平行(必要但不充分)
- 预趋势检验(Pre-trend test)
预趋势检验的事件研究框架
其中 是政策实施时点, 为基准期。
检验逻辑:如果 对所有 (处理前期间),则平行趋势假设得到支持。
第二层:直觉
想象两条平行铁轨:
- 处理前:两组像平行铁轨一样以相同速率变化
- 政策实施后:处理组的轨道发生偏转,偏转的幅度就是处理效应
如果处理前两条轨道就不平行(比如处理组本来就在加速增长),那么 DID 会把这种"预存在的差异趋势"错误地归因为处理效应。
第三层:Stata 代码
// ═══════════════════════════════════════════════
// 平行趋势检验
// ═══════════════════════════════════════════════
clear all
set seed 54321
set obs 500
gen id = _n
expand 10
bysort id: gen t = _n
gen treat = (id > 250)
gen post = (t > 5)
// 模拟数据:处理前趋势平行
gen y = 1 + 0.3*treat + 0.5*t + 2*treat*post + rnormal(0, 1)
// ═══ 可视化检验 ═══════════════════════════════
preserve
collapse (mean) y, by(treat t)
twoway (connected y t if treat==0, lcolor(blue) mcolor(blue)) ///
(connected y t if treat==1, lcolor(red) mcolor(red)), ///
xline(5.5, lpattern(dash)) ///
legend(order(1 "控制组" 2 "处理组")) ///
title("平行趋势可视化检验")
restore
// ═══ 预趋势统计检验 ═══════════════════════════
gen rel_t = t - 6
forval k = -5/4 {
gen D`k' = (rel_t == `k') * treat
}
drop D-1 // 基准期
reghdfe y D*, absorb(id t) cluster(id)
// 联合检验:处理前系数是否联合为零
test D-5 D-4 D-3 D-2
// p > 0.05 → 不能拒绝平行趋势参考文献
- Roth, J. (2022). Pretest with Caution: Event-Study Estimates after Testing for Parallel Trends. AER: Insights, 4(3), 305-322.
- Kahn-Lang, A., & Lang, K. (2020). The Promise and Pitfalls of Differences-in-Differences. Journal of Economic Perspectives, 34(3), 203-220.