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 做个稳健性——这四件事做完,你的工作量没增加多少,但整篇论文的可信度完全不是一个档次。
盲审专家看的就是这些。他们不问你跑没跑回归,问的是你凭什么相信这个系数。
难住人的从来不是代码跑不通。是不知道自己跑出来的东西,到底能不能信。