Stata绘制DID平行趋势检验图的实战避坑指南
当你熬夜赶论文,终于跑完双重差分模型(DID)的核心回归,正准备用coefplot绘制平行趋势检验图时——突然弹出的红色报错信息、扭曲变形的置信区间、错位的坐标标签,是否让你瞬间崩溃?作为经历过数十次DID分析的老手,我总结出coefplot命令最棘手的三个"暗坑"及其破解方案。
1. 基线期选择陷阱:为什么我的图形总是少一个点?
许多人在生成事件研究变量时,会习惯性地用循环创建pre和post虚拟变量:
forvalues i = 5(-1)1 { gen pre`i' = (event == -`i' & treated == 1) } gen current = (event == 0 & treated == 1) forvalues i = 1(1)3 { gen post`i' = (event == `i' & treated == 1) }然后直接运行:
xtreg y pre* current post*, fe robust coefplot, keep(pre* current post*)问题现象:输出的图形中,基线期(current)的系数点神秘消失,只剩下置信区间孤零零地飘在空中。
根源诊断:Stata默认会将第一个pre变量作为基准类别。当你的变量命名是pre5、pre4...时,pre1意外成为了基准。
专业解决方案:
- 显式声明基线期:
coefplot, baselevels keep(pre* current post*)- 更安全的变量命名方案:
// 用下划线统一命名 forvalues i = 5(-1)1 { gen pre_`i' = (event == -`i' & treated == 1) } gen time_0 = (event == 0 & treated == 1) forvalues i = 1(1)3 { gen time_`i' = (event == `i' & treated == 1) } // 回归时明确排除基准 xtreg y pre_* time_*, fe robust coefplot, drop(pre_1) // 明确删除基准期2. 置信区间变形记:当你的误差线突然"放飞自我"
在默认设置下,coefplot绘制的置信区间可能呈现两种异常:
| 异常类型 | 典型表现 | 触发条件 |
|---|---|---|
| 区间断裂 | 置信区间变成离散的短横线 | 使用recast(rline)时 |
| 区间膨胀 | 置信区间异常宽大 | 存在极端标准误值 |
调试步骤:
- 检查标准误范围:
matrix list e(V)- 优化绘图参数:
coefplot, /// ciopts(recast(rcap) lcolor(blue%50)) // 改用半透明误差线 msize(medium) // 调整点大小 levels(90) // 改用90%置信区间- 极端情况处理:
// 当某个时期的标准误特别大时 coefplot, /// yscale(range(-1 1)) // 手动限制y轴范围 ylabel(-1(0.5)1) // 细化刻度3. 图形元素错位:学术级美化的终极方案
发表级图形需要精细控制每个元素:
coefplot, /// vertical // 垂直布局 coeflabels( // 人性化标签 pre_5 = "-5" pre_4 = "-4" pre_3 = "-3" pre_2 = "-2" time_0 = "0" time_1 = "+1" time_2 = "+2" ) /// yline(0, lpattern(dash) lcolor(red)) // 基准线 xline(5, lpattern(dot) lcolor(gs10)) // 政策线 graphregion(color(white)) // 白底 plotregion(margin(large)) // 边距 ytitle("政策效应值", size(medlarge)) // 轴标题 xtitle("相对政策期", size(medlarge)) // legend(off) // 删除图例 addplot(line @b @at, lcolor(black)) // 添加连线高阶技巧:用esttab保存多个模型结果后比较
// 跑不同模型 xtreg y pre_* time_*, fe robust est store model1 xtreg y pre_* time_* controls, fe robust est store model2 // 比较绘图 coefplot model1 model2, /// keep(pre_* time_*) /// legend(label(1 "基准模型") label(2 "加入控制变量"))4. 诊断工具箱:当图形依然异常时
创建这个检查清单来排查问题:
数据层面验证
tab event, sum(y)查看各期均值变化corr pre_* time_*检查共线性
模型层面验证
estat hettest检验异方差xttest2检查面板自相关
图形元素调试
- 临时删除置信区间:
noci - 简化图形:
scheme(s1mono)
- 临时删除置信区间:
// 最小化可复现代码示例 sysuse nlswork, clear gen treated = (id > 1000) gen event = year - 78 forvalues i = 3(-1)1 { gen pre_`i' = (event == -`i' & treated) } gen time_0 = (event == 0 & treated) forvalues i = 1(1)3 { gen time_`i' = (event == `i' & treated) } xtreg ln_wage pre_* time_*, fe robust coefplot, baselevels drop(pre_1)记住,完美的平行趋势图需要三次迭代:第一次验证功能,第二次调整布局,第三次微调视觉细节。当遇到诡异报错时,试试coefplot的debug选项,它会揭示图形引擎的幕后运作。