DID双重差分:平行趋势检验,为什么"通过"了也未必可信?_新浪财经_新浪网
10月20-22日上海黄浦江畔,2026可持续全球领导者大会再度来袭。诺奖、图灵奖得主现场讲述科技未来与趋势,更有“解救”焦虑、内卷时代的网红教授——麦克法兰与项飙现场对话! 名额有限,手慢无。让我们共赴可持续之约!【点击报名】

(来源:小鱼量化)

* 统一政策时点gen did = treat * post  reghdfe y did x1 x2, ///absorb(id year) vce(cluster id) 
* 相对时间:政策当年=0gen rel = year - policy_year  * 以 -1 期为基准,不能省reghdfe y ib(-1).rel x1 x2, ///absorb(id year) vce(cluster id)  coefplot, keep(*.rel) vertical ///   yline(0) xline(4.5, lp(dash)) 
sscinstall bacondecomp, replace bacondecomp y did, ///   ddetail gropt(legend(off)) 

如果结果显示绝大部分权重来自"处理组 vs 从未处理组",那你那个 TWFE 系数问题不大,可以放心用。如果"后处理 vs 先处理"那类占了大头,就得换方法。

这个分解是诊断工具,不是修正工具。它告诉你的数据到底在靠哪类对比撑着。

第二,换异质性稳健估计量。目前最主流的是 Callaway & Sant'Anna:

sscinstall csdid, replacesscinstall drdid, replace* gvar: 0=从未处理,其他=首次处理年份 csdid y x1 x2, ///   ivar(id) time(year) gvar(gvar) ///   method(dripw) notyet  estat event, window(-5 5) 

它的思路很朴素:只拿还没被处理的、或者压根没被处理的样本做对照,从根上避免"已处理组当对照组"。

装 csdid 有个老坑:如果之前装过旧版,先cap ado uninstall csdid再装,不然 Stata 会同时认两个版本,跑出来不知道用的是哪个。装完用csdid version确认一下。

五、安慰剂检验到底在"安慰"什么

最后是安慰剂。常见的三种做法:

提前政策时间——假设政策早两三年发生,跑一遍,系数应该消失。如果提前了还能跑出显著效应,说明你抓到的可能是宏观周期,不是政策。

随机化处理组——随机抽一批假处理组,重复 500 次,看真实系数是不是落在分布之外。

换伪结果变量——找一个理论上不该受这个政策影响的变量当 Y,效应应该归零。

但得说清楚:安慰剂检验排除不了遗漏变量。它只能说明你的结果不是纯随机噪声撞出来的。如果有个没观测到的变量跟政策时间高度相关,安慰剂照样给你"通过"。

所以别把它当护身符。

六、几句实话

DID 是经管论文里用得最多、也最容易做得糊弄的方法。很多人跑出个显著的交互项就交差了,平行趋势的图是补上去的,渐进 DID 的偏误压根没听说过。

但反过来讲,这也是最容易拉开差距的地方。

同样一个政策评估的题目,你能把基准期为什么选 -1 期讲清楚、知道"不显著不等于平行"、跑一次培根分解看看权重、再用 csdid 做个稳健性——这四件事做完,你的工作量没增加多少,但整篇论文的可信度完全不是一个档次。

盲审专家看的就是这些。他们不问你跑没跑回归,问的是你凭什么相信这个系数。

难住人的从来不是代码跑不通。是不知道自己跑出来的东西,到底能不能信。