Stata实操:用双重差分DID评估政策效果,从数据清洗到结果解读保姆级教程
Stata实操用双重差分DID评估政策效果从数据清洗到结果解读保姆级教程当你在经济学或公共政策领域的研究中需要评估某项政策如最低工资调整、环保税实施的实际影响时双重差分法DID是最常用的实证工具之一。但很多新手研究者常常陷入理论理解与实操脱节的困境——明明知道DID原理却不知道如何在Stata中正确实现。本文将手把手带你完成从数据导入到结果解读的全流程重点解决以下实际问题如何正确生成time、treated和did变量为什么有了个体固定效应就不该再加treated变量reg和diff命令的结果不一致怎么办如何判断10%显著性水平下的负效应是否可靠1. 数据准备与变量生成首先我们需要明确DID分析所需的三个核心变量时间虚拟变量time标记政策实施前后处理组虚拟变量treated区分实验组和对照组交互项didtime与treated的乘积让我们用经典的Panel101.dta数据集进行演示use http://dss.princeton.edu/training/Panel101.dta, clear gen time (year1994) !missing(year) // 政策实施年为1994 gen treated (country4) !missing(country) // ID大于4的为处理组 gen did time*treated // 关键交互项注意country4只是示例实际研究中应根据真实处理组定义检查变量生成是否正确tab time tab treated tab did2. 基础回归模型实现2.1 使用reg命令最基础的DID模型可以通过OLS回归实现reg y time treated did, r // r表示使用稳健标准误输出结果中需要特别关注did系数政策净效应P|t|值显著性水平通常关注10%、5%、1%置信区间效应大小的波动范围2.2 使用diff命令Stata社区开发的diff命令更专业化ssc install diff // 首次使用需安装 diff y, t(treated) p(time)两种方法结果对比表统计量reg命令diff命令did系数-0.423-0.423标准误0.2190.219t值-1.93-1.93P值0.0540.054提示正常情况下两种方法结果应完全一致若出现差异需检查数据3. 面板数据与固定效应当数据为面板结构时应采用固定效应模型xtset id year // 声明面板结构 xtreg y did, fe r // fe表示固定效应关键注意事项不要加入treated变量因为个体固定效应已包含该信息时间固定效应可通过i.year或xtreg的fe选项实现聚类标准误建议使用vce(cluster id)处理自相关错误示范会导致多重共线性xtreg y treated did, fe r // 错误treated与个体固定效应冲突4. 结果解读与可视化假设我们得到如下回归结果did | -.4231508 .219079 -1.93 0.054 -.853398 .007096解读要点系数符号负号表示政策降低了y值经济意义政策使处理组的y平均降低了0.423单位统计显著性P值0.054在10%水平显著置信区间真实效应可能在[-0.853,0.007]之间结果可视化命令coefplot, keep(did) xline(0) levels(90 95)5. 稳健性检验5.1 平行趋势检验通过事件研究法验证政策前的平行趋势forvalues i 3(-1)1 { gen pre_i (year1994-i treated1) } forvalues j 0/3 { gen post_j (year1994j treated1) } reg y pre_* post_* i.year, r coefplot, keep(pre_* post_*)5.2 安慰剂检验通过虚构处理时间验证结果可靠性gen fake_time (year1992) // 假设政策提前两年 gen fake_did fake_time*treated reg y fake_time treated fake_did, r6. 常见问题排查问题1did系数不显著怎么办检查样本量是否足够确认政策确实有实质影响尝试加入更多控制变量问题2reg和diff结果不一致检查变量定义是否完全相同确认数据排序没有差异尝试重新生成核心变量问题3固定效应模型R2异常高这很正常个体固定效应解释了大部分变异应关注did系数的变化而非绝对R2值7. 完整代码模板// 数据准备 use Panel101.dta, clear gen time (year政策年份) gen treated (组别变量处理组编码) gen did time*treated // 基础回归 reg 因变量 time treated did, r diff 因变量, t(treated) p(time) // 面板数据 xtset id year xtreg 因变量 did i.year, fe r // 平行趋势检验 forvalues i 3(-1)1 { gen pre_i (year政策年份-i treated1) } gen current (year政策年份 treated1) forvalues j 1/3 { gen post_j (year政策年份j treated1) } reg 因变量 pre_* current post_* i.year, r实际分析中我发现很多学生在生成did变量时容易混淆time和treated的定义顺序特别是在多期DID场景下。建议每次回归前都用tab命令检查各变量的取值分布这个简单的习惯能避免90%的变量定义错误。