政策不是同一天在各地生效的。某个省 2015 年试点、另一个省 2018 年推开、还有些省一直没做——这种「分批实施」(staggered adoption)是应用研究里最常见的场景,也是双重差分(DID)最容易出错的地方:把全部样本丢进一个双向固定效应(TWFE)回归,跑出来的系数可能连方向都是错的。
Davidson College 的 Austin Denteh 为 QuantBridge 应用计量网络研讨会做了一套工作坊材料(2026 年 5 月 21 日),把这件事讲透并给出可跑的解法:两份 PDF 课件(理论 44 页、实现 75 页)、R 与 Stata 的完整模拟流水线、一个免安装的浏览器交互演示,以及五份示例数据。本贴把它拆成读者能直接用的几块。
为什么政策分批实施时 TWFE 会出错
标准 2×2 DID 的逻辑很干净:一个处理组、一个对照组、两期,在平行趋势假设下用「处理组的变化减去对照组的变化」识别 ATT。TWFE 回归写出来是 Yit = αi + λt + τDit + εit,在没有控制变量时,OLS 可以非参数地还原 DID 估计量。
问题出在分批实施。课件第 15 页把 TWFE 实际在做的比较摊开:处理组对从未处理组(看着没问题)、后处理组对尚未处理组(也没问题)、后处理组对已经处理组——「This seems bad!」。而 TWFE 系数是所有这些比较的加权平均,包括坏的那些。已经处理组在充当「控制组」时,它自己的处理效应还在随时间变化,这份变化会被当成「控制组的变化」减掉,污染估计。
课件的结论只有四个字:TWFE ≠ DID。它引了 Wooldridge(2025)的一句话把责任分清楚:
there is nothing wrong with the TWFE estimator in the context of staggered interventions provided one applies the TWFE estimator to a sufficiently flexible model
也就是说,毛病不在双向固定效应这个估计方法,而在「假设处理效应同质」这个过紧的模型设定。DID 是研究设计,TWFE 是估计方法,两者不该划等号。
把 TWFE 拆开看:哪些 2×2 比较是干净的
Goodman-Bacon(2021)的分解定理是理解一切的钥匙:TWFE 系数等于数据里所有可能的 2×2 DID 估计量的加权平均,权重由子样本规模与处理变量在该比较窗口内的方差决定。
课件用一个具体设定讲清了三种比较:T = 8 期、4 个队列(第 3 期处理、第 5 期、第 7 期、从未处理),K = 3 个处理队列,于是有 K = 9 个 2×2 比较。类型一是「处理队列对从未处理」(3 个,干净);类型二是「早处理对晚处理,只用晚者处理之前的窗口」(3 个,干净,因为对照那时还没被处理);类型三是「晚处理对早处理,围绕晚者处理时点」(3 个,"the bad comparison")。
关键在类型三:早处理组在被当作对照的那段时间里,自己的处理效应还在演化。只有当处理效应恒定且同质(对所有组、所有期都等于同一个 τ)时,这个演化才只是一个水平移动,趋势仍平行,TWFE 还能等于 τ;一旦效应随时间或跨组变化,类型三就产生有偏的 2×2 估计,TWFE 不再等于 DID 估计量。
分解定理的极限形式把偏差写得很明白:plim 是三项之和——方差加权的干净 2×2(VWATT,有清楚因果解释,但权重来自处理方差,未必是研究者想要的 ATT)、共同趋势项(平行趋势成立时为零)、以及 ΔATT。最后这项是「坏」的那块,是处理效应随时间变化量的加权和,只有效应恒定时才消失。
四种方法各自在做什么
实现课件把解法归成四类,共同策略只有两步:先估出分解的组-时 ATT(group-time ATT),再聚合成可解释的汇总参数。原文写得很直白:
Estimate disaggregated group-time ATTs
Then aggregate into interpretable summary parameters
第一种是 ETWFE(Wooldridge 2025),思路是把 TWFE 模型「饱和化」——加上队列×时间的全部交互项,让每个 τ(g,
t) 直接就是组-时 ATT,再用边际效应聚合。R 里用 etwfe 包配 emfx(),Stata 里用 jwdid 配 estat simple / estat event。
第二种是 CS(Callaway & Sant'Anna 2021),直接估组-时 ATT,三条假设摆在明面上:处理不可逆(一旦处理就一直处理)、无预期效应、条件平行趋势。估计有三条路——结果回归(OR)、逆概率加权(IPW)、双重稳健(DR,把前两者结合)。R 用 did::att_gt() 配 aggte(),Stata 用 csdid2。它的聚合方式有四种:simple(总体)、group(按队列)、dynamic(按事件时间)、calendar(按日历年)——这四个词后面写论文时会反复用到。
第三种是 BJS(Borusyak, Jaravel & Spiess 2024),插补法,四步:只用未处理观测估个体与时间固定效应,用估出的固定效应给处理观测插补反事实,取实际值减插补值得到 τ,最后聚合。它的效率优势来自用上了全部处理前时期,而不只是处理前一期。
第四种是 FLEX(Deb, Norton, Wooldridge & Zabel 2024),专为重复截面数据准备:把饱和模型里的个体固定效应换成组固定效应,用队列×时间×协变量的交互做混合 OLS。
同一份模拟数据上,四种方法各给出什么数
工作坊的设计很讲究:一份数据、四种方法、R 与 Stata 双实现。模拟面板是 50 组、15 期、500 个单位,四个队列的处理效应既跨组异质又随暴露时长增长(早队列效应大且增长快),真总体 ATT = 7.56。
结果:朴素 TWFE 给出 2.58,CS 7.54、ETWFE 7.58、BJS 7.60。也就是说 TWFE 把效应压掉了三分之二,而三种修正方法都贴着真值。
还有一个容易被忽略的细节:跨软件平台不完全一致。课件第 60 页的对照表里,TWFE、CS、ETWFE 在 R 与 Stata 下点估计完全相同,但 BJS 是 R 7.595、Stata 6.913。原因写得很具体——Stata 的 did_imputation, autosample 会丢掉固定效应无法从未处理观测插补的样本,这一版里丢了 7,500 个观测中的 2,700 个。作者的建议是把 R 结果当作课件口径的基准数,把 Stata 与 Python 脚本当作可核查的对照实现。
三个真实数据例子:结论一致还是打架
课件用三份真实数据检验,结论并不整齐,这恰恰是它的价值。
离婚改革(Stevenson & Wolfers 2006,州-年面板 1964—1996,51 个州,结果是女性自杀数):TWFE 1.
5、CS 1.
6、ETWFE 10.
3、BJS 9.7——TWFE 明显被 attenuate(衰减),另两种给出大得多的效应,但标准误也大。
Castle doctrine(Cheng & Hoekstra 2013,50 个州 2000—2010,结果是对数凶杀率):TWFE 0.082、CS 0.
11、ETWFE 0.08、BJS 0.08——四种方法基本一致。
Medicaid 扩保(Baker 等 2025,县-年面板 2009—2019,3,060 个县,结果是 20—64 岁死亡率,按 2013 年人口加权):TWFE 2.
5、CS 0.
6、ETWFE 2.
5、BJS 3.2——量级差得远,而且 CS 的事件研究里 e = 1 的 lead 显著、e = 5 边缘显著(p ≈ 0.05),作者直接写明「pre-trend concerns are not trivial」,建议做 Rambachan & Roth(2023)的敏感性分析。
所以「用哪种方法」没有标准答案,但「只报一种方法」肯定不合格。
有面板还是只有重复截面,方法怎么选
课件的决策指南分三步,可以直接照着走。
第一步看数据结构:只有重复截面(调查数据、没有个体 ID 的行政数据),选 FLEX、jwdid(省略 ivar)或 CS(panel = FALSE);有面板则四种都能用。课件给了重复截面的实测:CS 在 RC 数据上 ATT = 7.65(SE = 0.
1),真值 7.56。
第二步看协变量与函数形式:没有协变量或只有离散协变量,用 ETWFE;连续协变量且近似线性,ETWFE 或 BJS;非线性协变量效应且重叠良好,用 CS 的双稳健;重叠很差,回到 ETWFE 以避开 IPW 权重不稳。
第三步看稳健性:至少报两种方法(比如 ETWFE + CS),如果结论分歧,就去查协变量设定、平行趋势的具体形式、或对照组选择。
写论文时报告什么、别踩什么坑
课件后半段有两份清单,比方法本身更实用。
估计前的自检(改编自 Roth 等 2023 表
1):是不是所有人同时被处理(是则标准 TWFE 就够)?处理是否不可逆(否则考虑 did_multiplegt)?有没有从未处理组?面板还是重复截面?协变量是否需要灵活建模(需要则上 CS 的双稳健)?
报告时的要求:永远给事件研究图+汇总 ATT;展示对对照组选择的敏感性(从未处理 vs 尚未处理);标准误聚类到处理分配的层级;至少报两种方法作为稳健性;说明聚合方案——不要只说「the ATT」,因为 simple、group、dynamic、calendar 回答的是四个不同问题。
预趋势检验要谨慎。课件引 Roth(2022)与 Rambachan & Roth(2023)指出两个问题:一是功效低,不显著的预趋势不等于平行趋势成立,小的违背常常检不出来却足以造成大偏差;二是预检验偏差,靠「通过检验」筛选设定本身会带来选择问题。建议改用敏感性分析,比如 honestDiD 包,或 Ban & Kédagni(2022)、Rambachan & Roth(2023)的界。
最后一段是压力测试,值得单独看:作者设计了四个 DGP,每个只破坏一个假设——非线性协变量效应(ETWFE 偏差 3.75,CS-DR 1.30,BJS 1.
16)、处理不可逆被违反(三种方法都低估约 1.1—1.
2)、重叠被破坏(纯 IPW 偏差 0.54、纯 OR 0.32,双稳健在结果模型正确时仍能活下来)、平行趋势被违反(三种方法都高估 2.0—2.
5)。这四行数字给出的实用结论是:没有哪种方法在所有违背下都最好,所以「报两种、看分歧」不是形式主义。
────────────────
回复本帖,可见这套工作坊材料的官方入口(GitHub 仓库、两份 PDF 课件、R/Stata/Python 代码、五份数据文件与免安装的浏览器演示),以及它的许可条款原文、各文件对应的包安装命令,和数据来源中的第三方许可说明。
把经管之家装进你常用的 AI 智能体中 一键快捷安装经管之家 MCP/技能,让 AI 帮你查教程、找数据、读论坛帖子。 检索、阅读公开帖子不收费,安装可申请领取:3 通用积分+100 论坛币+3 元论坛资金 说明: AI 算力按所用平台规则计算;附件按原帖条件获取;福利领取条件以活动页面为准。 |


雷达卡


京公网安备 11010802022788号







