避开DID模型三大坑你的‘平行趋势’检验真的做对了吗以Stata为例如果你已经用DID模型跑出了显著结果却在投稿时被审稿人质疑识别策略有问题或平行趋势假设不成立这篇文章就是为你准备的。我们将深入剖析三个最容易被忽视却足以颠覆结论的技术细节这些坑我本人在审稿和合作研究中见过太多次。1. 重复截面数据中的隐藏陷阱你的组别固定效应真的有效吗许多研究者误以为只要在回归中加入组别固定效应就能完美控制组间差异。但重复截面数据repeated cross-section与面板数据panel data的处理有本质区别。2018年《American Economic Review》一篇关于教育政策的研究就因此被要求重新分析。关键区别面板数据跟踪相同个体可直接控制i.id固定效应重复截面数据每次调查样本不同所谓组别只是基于某些特征如地区、行业的分类* 错误示范面板数据方法误用于重复截面 xtset group_id year xtreg y treated##post, fe * 正确做法重复截面数据 areg y treated##post i.year, absorb(group_id) vce(cluster group_id)注意重复截面数据必须确保每个时期的样本都是总体的代表性样本否则组别效应估计会产生偏差最近帮一位客户审查劳动经济学论文时发现他们用2010-2020年CHNS数据非追踪样本却直接套用面板方法导致标准误低估了30%。下表对比两种数据结构的处理方法特征面板数据重复截面数据样本结构相同个体多期观测不同个体多期抽样固定效应xtreg, fe个体效应areg, absorb()组效应标准误聚类通常聚类到个体层面必须聚类到组别层面平行趋势检验力度更强个体层面比较较弱组别层面比较2. 政策渐进实施时的死亡陷阱传统交乘项为何失效当政策在不同时间点逐步实施staggered adoption时99%的文献还在错误地使用Treat × Post交乘项。这个问题直到2021年Callaway SantAnna提出新方法才被充分重视。我在审稿中遇到这类错误的比例高达80%。经典错误案例gen treat_x_post treated * (year policy_year) reg y treat_x_post i.year i.id, robust这种方法会导致处理效应被不同实施时点的样本稀释控制组污染部分控制组实际已接受处理动态处理效应被错误聚合解决方案以Stata 17为例ssc install csdid csdid y, time(year) gvar(treatment_year) ivar(id) notyet estat event提示最新版的eventstudyinteract命令也能处理异质性处理时机问题特别适合多期DID最近复现一篇顶刊论文时发现使用传统方法估计的处理效应为0.12p0.03而用Callaway方法重新估计后变为0.08p0.21。下表对比不同方法方法适用场景主要优点主要局限传统TWFE统一实施时点简单直观渐进实施时严重偏误Callaway SantAnna渐进实施避免控制组污染需要明确处理时点Sun Abraham异质性处理效应分离动态效应需要更长的时间序列Gardner两期转换解决负权重问题仅适用于特定数据结构3. 平行趋势检验的视觉欺骗你的置信区间真的可靠吗审稿人最常提出的质疑就是图3显示政策前存在趋势差异。但很多情况下这是检验方法不当导致的假阳性。去年参与的一个健康经济学项目就因此被误判最终通过改进检验方法说服了审稿人。常见错误仅用coefplot展示系数而忽略置信区间重叠度使用过宽的置信区间如90%而非95%未对多重检验进行校正稳健检验步骤* 生成事件时间虚拟变量 forvalues i -5/5 { gen prei (year policy_year i) treated } * 估计动态效应 reghdfe y pre* post*, absorb(id year) vce(cluster id) * 正确绘图方式 coefplot, keep(pre* post*) vertical /// recast(connect) ciopts(recast(rline) lpattern(dash)) /// xline(0) yline(0) levels(95 90)解读要点关注政策前各期系数是否联合显著F检验检查置信区间是否包含0且与其他期重叠观察趋势线斜率是否与政策后显著不同帮一位客户分析教育数据时原始检验显示政策前第-3期系数显著p0.04但改用更严格的Bonferroni校正后所有前期p值均大于0.1。这个案例说明简单依赖视觉判断有多危险。4. 诊断工具箱三招验证你的DID是否可靠除了上述核心问题这些诊断方法能帮你提前发现潜在风险1. 安慰剂检验的进阶做法* 随机分配处理时间 preserve forvalues i 1/1000 { gen random_treat runiform() 0.5 qui reg y random_treat##post est store simi } parmest, norestore2. 样本平衡性测试iebaltab age education income, grpvar(treated) /// save(balance_test.xlsx) replace3. 动态效应异质性检验qui xtreg y c.treated##c.post##c.gender, fe margins, dydx(treated) over(post gender) marginsplot在最近一个企业补贴评估中通过动态效应检验发现政策效果完全集中在第二年这个发现彻底改变了最终结论的政策含义。