Stata实操:用双重差分法(DID)评估政策效果,从数据清洗到结果解读保姆级教程
当我们需要评估一项政策或项目的实际效果时,双重差分法(DID)是最常用的准实验方法之一。不同于简单的"前后对比"或"有无对比",DID通过巧妙的设计,能够更好地控制内生性问题,为政策评估提供更可靠的证据。本文将手把手教你如何在Stata中完成DID分析的全流程。
1. 数据准备与变量生成
在开始DID分析前,我们需要确保数据格式正确并生成必要的变量。假设我们使用的数据集是经典的"Panel101.dta",包含多个国家在不同年份的观测值。
首先,导入数据并检查数据结构:
use "Panel101.dta", clear describe关键变量生成步骤:
- 时间虚拟变量(政策实施前后):
gen time = (year>=1994) & !missing(year)- 处理组虚拟变量(区分实验组和对照组):
gen treated = (country>4) & !missing(country)- 交互项(DID的核心变量):
gen did = time*treated提示:在处理实际数据时,务必检查各变量的缺失值情况,使用
tab或sum命令验证生成的虚拟变量是否符合预期。
2. 基础DID模型估计
有了必要的变量后,我们可以通过两种方式估计DID模型:
2.1 回归法(reg命令)
reg y time treated did, r结果解读要点:
did系数:反映政策净效应- t值和p值:判断统计显著性
- R-squared:模型整体解释力
2.2 专用命令法(diff命令)
首先安装diff命令:
ssc install diff然后运行:
diff y, t(treated) p(time)两种方法对比:
| 方法 | 优点 | 缺点 |
|---|---|---|
| reg | 灵活,可添加控制变量 | 需要手动生成变量 |
| diff | 专用命令,输出更友好 | 功能相对局限 |
3. 模型诊断与稳健性检验
DID分析必须满足平行趋势假设,我们需要通过以下方法验证:
3.1 平行趋势检验
* 生成年份虚拟变量与处理组的交互项 gen period = year - 1994 forvalues i = 3(-1)1 { gen pre_`i' = (period == -`i' & treated == 1) } gen current = (period == 0 & treated == 1) forvalues j = 1(1)3 { gen time_`j' = (period == `j' & treated == 1) } * 回归分析 xtreg y time treated pre_* current time_* i.year, fe3.2 安慰剂检验
通过虚构处理时间或处理组来验证模型稳健性:
* 虚构处理时间(比实际政策早2年) gen placebo_time = (year>=1992) & !missing(year) gen placebo_did = placebo_time*treated reg y placebo_time treated placebo_did, r注意:如果虚构的处理变量也显示"显著"效应,则可能表明模型存在问题。
4. 结果报告与可视化
完成分析后,我们需要专业地呈现结果:
4.1 结果表格制作
esttab using did_results.rtf, replace /// b(3) se(3) star(* 0.1 ** 0.05 *** 0.01) /// stats(N r2, fmt(0 3)) /// title("DID估计结果")4.2 系数可视化
coefplot, /// keep(pre_* current time_*) /// vertical /// yline(0) xline(4, lp(dash)) /// title("平行趋势检验结果")报告撰写要点:
- 明确说明数据来源和样本范围
- 详细描述变量构建方法
- 报告基准回归结果和稳健性检验
- 讨论政策效应的实际意义而非仅统计显著性
5. 高级应用与问题排查
当基础DID模型遇到问题时,可考虑以下解决方案:
5.1 多期DID处理
当处理时间不一致时:
gen t = 0 replace t=1 if year >= treatime // treatime记录每个个体的实际处理时间 gen did = treated*t5.2 三重差分(DDD)
当平行趋势假设不满足时:
gen did_y = did*y_bin // y_bin是另一个影响因素 gen time_y = time*y_bin gen treated_y = treated*y_bin * 方法1:回归法 reg y time treated y_bin did time_y treated_y did_y, r * 方法2:diff命令 diff y, t(treated) p(time) ddd(y_bin)常见问题排查清单:
- 检查数据结构是否为面板格式
- 验证关键变量生成逻辑是否正确
- 确认样本量在添加变量后没有异常减少
- 检查核心系数的大小是否合理
在实际分析中,我发现很多初学者容易忽视平行趋势检验的重要性。有一次分析教育政策效果时,基准DID结果显示显著正效应,但平行趋势检验发现处理组和对照组在政策前就存在趋势差异,这意味着我们需要更谨慎地解释结果,或者考虑使用三重差分等更复杂的方法。