ARTICLE DETAIL

资讯详情

深耕编程入门与网站建设的一线实战洞察。

真正理解 DID:从反事实到平行趋势的因果推断思维

真正理解 DID:从反事实到平行趋势的因果推断思维 摘要本文从因果推断的视角重新理解双重差分法DID。文章首先指出“前后变化”并不等于“处理效应”引出反事实Counterfactual这一核心概念随后通过一个虚构的企业政策示例说明 DID 如何利用对照组构造反事实时间线并强调平行趋势Parallel Trends假设是 DID 成立的关键前提。在此基础上文章将 DID 的经典回归模型与前面的逻辑对应起来并进一步介绍事件研究Event Study如何把静态的 Before-After 比较扩展为动态的效应变化。最后作者建议用“如果 Treatment 没发生会怎样”这一核心问题统领对 DID 的理解而非机械记忆公式。第一次接触 DIDDifference-in-Differences双重差分法时我对它的理解非常机械DID(处理组后-处理组前)-(对照组后-对照组前)先做一次前后差再减掉对照组的前后差所以叫“双重差分”。这个解释当然没有错但如果只记住公式真正遇到研究问题时还是很容易迷糊为什么不能直接比较处理前后为什么一定需要对照组为什么 DID 总是和平行趋势一起出现后来重新理解 DID我发现它真正想回答的问题其实不是“怎么做两次减法”而是如果某件事情没有发生结果原本会变成什么样这其实已经进入了因果推断最核心的问题。DID 真正试图比较的并不只是“过去”和“现在”而是现实中已经发生的结果与一个我们永远无法真正观察到的反事实结果。本文所有数字、场景和代码均为虚构教学示例仅用于方法学习。1. 前后发生变化不代表变化就是 Treatment 造成的假设某项政策在 2024 年开始实施一部分企业受到政策影响。其中一家企业在政策实施前的某项经营指标为 100政策实施以后变成了 130。最直接的计算当然是130-10030于是很容易得到政策让企业的经营指标提高了 30。但仔细想一下这个判断实际上偷偷加入了一个非常强的假设如果政策没有实施这家企业的指标会一直停留在 100。现实中显然未必如此。即使没有这项政策企业也可能因为市场增长、行业复苏、技术进步或者宏观经济变化从 100 自然增长到 120。如果是这样那么真正和政策有关的额外变化就应该是130-12010于是问题来了。现实中我们真正观察到的是真实世界 100 -------------------- 130 Treatment但为了判断 Treatment Effect我们真正需要知道的其实是如果 Treatment 没有发生 100 -------------------- ?这个问号就是整个问题的关键。因果推断中把这种“如果另一种情况发生结果会怎么样”的结果称为Counterfactual反事实。对于一个研究对象可以想象两个潜在结果。接受 Treatment 时Y(1)没有接受 Treatment 时Y(0)理论上真正的 Treatment Effect 是Y(1)-Y(0)问题在于同一个对象在同一个时间点不可能既接受 Treatment又同时没有接受 Treatment。现实世界只有一条时间线。所以两个潜在结果中我们永远只能观察一个。这也是为什么简单计算After-Before并不能直接得到可靠的因果效应。我们真正缺少的是如果 Treatment 没有发生这个对象本来会走到哪里DID 要做的事情就是想办法估计这个看不见的结果。2. DID 是怎样构造反事实的继续刚才的例子。与此同时我们还观察到一批没有受到政策影响、但具有一定可比性的企业。也就是说即使没有 Treatment对照组自己也增长了125-10520如果处理组和对照组原本具有相似的发展趋势那么 DID 会认为如果处理组没有受到 Treatment它可能也会随着共同环境增长大约 20。于是处理组在“没有 Treatment”的反事实世界里大约应该变成10020120这时候我们就得到了两条时间线。真实结果100 -------------------- 130 Treatment估计出来的反事实结果100 -------------------- 120 No Treatment因此 Treatment Effect 可以表示为130-12010再把它改写成经典的 DIDDID(130-100)-(125-105)DID30-2010现在“双重差分”就很好理解了。处理组本身发生了130-10030但同期对照组也发生了125-10520的变化。所以我们不能把全部 30 都归因于 Treatment。真正超过共同趋势的部分是30-2010用表格来看更加直观组别Treatment 前Treatment 后前后变化Treatment Group10013030Control Group10512520最终DID30-2010所以普通 Before-After 和 DID 问的是两个不同的问题。普通 Before-After 问Treatment 以后结果有没有变化DID 问Treatment 以后处理组是否出现了超过共同时间趋势的额外变化因此我现在更愿意把 DID 理解成利用对照组帮助处理组补出一条本来无法观察的反事实时间线。这比单纯记住“两次减法”更接近 DID 真正的思想。3. DID 最重要的条件平行趋势走到这里一个问题自然就出现了为什么对照组增长了 20我们就敢认为处理组如果没有 Treatment 也会增长大约 20这就是 DID 最重要的假设Parallel Trends Assumption平行趋势假设。需要特别注意的是平行趋势并不意味着处理组和对照组的数值必须一样。例如 Treatment 发生以前时间Treatment GroupControl Group202170402022805020239060两组始终相差 30。从结果变量的水平来看但是两组每一期都增长 10因此它们依然具有非常相似的变化趋势。所以 DID 真正关心的不是两组现在是不是一样高而是如果 Treatment 没有发生两组是否可能沿着类似的趋势继续变化换句话说Level 可以不同Trend 才是关键。这一点非常重要因为很多人第一次看到处理组和对照组平均值差很多时会直接认为 DID 不能做。其实未必。真正危险的是下面这种情况。Treatment 发生以前Treatment Group 50 - 70 - 90Control Group50 - 55 - 60可以明显看到即使 Treatment 还没有发生Treatment Group 本身就增长得更快。如果 Treatment 之后Treatment Group120 Control Group65当然仍然可以计算出一个很大的 DID。但问题是我们已经很难回答Treatment Group 后面的快速增长到底是 Treatment 导致的还是原来的趋势本来就在继续所以即使回归结果得到Coefficient 0 p-value 0.01也不能自动证明 Treatment 产生了可信的因果效应。这也是 DID 和普通预测模型非常不一样的地方。在预测问题中我们可能更关心模型预测得准不准。但在 DID 中更重要的问题往往是为什么这个 Control Group 可以代表 Treatment Group 没有接受 Treatment 时的变化因此对于 DID 来说Research Design 往往比 Regression Result 更重要。4. DID 回归其实只是把前面的逻辑写进模型理解了反事实和平行趋势以后再来看 DID 的经典回归模型会简单很多。其中Treat表示一个对象是否属于 Treatment GroupTreat 1Treatment Group Treat 0Control GroupPost表示当前是否已经进入 Treatment 以后Post 1After Post 0Before于是实际上只有四种情况TreatPost含义00ControlBefore01ControlAfter10TreatmentBefore11TreatmentAfter真正值得关注的是Treat × Post因为只有当一个对象属于 Treatment Group同时已经进入 Treatment 之后这个交互项才等于 1。Treatment Group 在 Treatment 以后相对于 Control Group 的共同时间变化多出来多少。用 Python 可以非常简单地验证。import pandas as pd import statsmodels.formula.api as smf df pd.DataFrame({ y: [100, 130, 105, 125], treated: [1, 1, 0, 0], post: [0, 1, 0, 1] }) model smf.ols( y ~ treated * post, datadf ).fit() print(model.params)在这个教学例子中treated:post对应的系数应该是10这和前面手工计算(130-100)-(125-105)10完全一致。所以最基础的 DID 回归其实并没有创造什么新的东西。它只是把“双重差分”的逻辑写进了一个可以进一步扩展的统计模型。真实研究通常不会只有四条观测。很多情况下我们面对的是企业 × 年份 城市 × 月份 地区 × 季度 学校 × 学期这样的面板数据。这时候还经常会加入 Individual Fixed Effects 和 Time Fixed Effects用来控制长期稳定的个体差异以及所有研究对象共同经历的时间冲击。不过这些内容其实都是在 DID 基础逻辑上继续扩展。如果连“为什么要有 Control Group”和“反事实是什么”都还没有想清楚直接背固定效应公式反而很容易把 DID 学复杂。5. Event Study从一张 Before-After 照片变成一段视频普通 DID 通常把时间简单划分为Before | After这很方便但现实中的 Treatment Effect 往往不会在 Treatment 发生的那一刻突然全部出现。例如一种 Treatment 可能表现为Treatment 当期几乎没有变化 第 1 期开始产生影响 第 2 期效果进一步扩大 第 3 期逐渐稳定如果只使用Post 0 / 1这些动态变化都会被压缩进一个平均 Treatment Effect 中。所以 DID 中经常会进一步使用Event Study事件研究。Event Study 会把 Treatment 发生的时间定义为t 0然后观察 Treatment 前后不同的相对时间t -3 t -2 t -1 t 0 t 1 t 2 t 3也就是Treatment ↓ ------------------------------------------- -3 -2 -1 0 1 2 3于是我们得到的不再只是一个 DID coefficient而是一组动态 coefficients。例如-30.01 -2-0.02 -1基准期 00.05 10.18 20.31 30.35这样就能进一步观察Treatment Effect 是什么时候开始出现的效果是逐渐扩大还是逐渐消失Treatment 之前是否已经存在明显的趋势差异因此我觉得 Event Study 有一个非常直观的理解方式普通 DID 是一张 Before / After 照片而 Event Study 把它变成了一段视频。它不仅可以观察动态 Treatment Effect还可以辅助判断 Treatment 发生以前的趋势。如果 Treatment 前的 coefficients 大致围绕 0 波动而 Treatment 以后才开始明显偏离 0那么通常可以为 Parallel Trends 提供一定支持。但这里也需要注意Treatment 前的 coefficients “不显著”并不等于已经从数学上证明了平行趋势一定成立。样本量太小、标准误太大或者 Treatment 前的时间太短都可能让真正存在的问题难以被统计检验发现。所以平行趋势不能只看一个 p-value。还应该结合Treatment 前的趋势图系数大小Confidence IntervalControl Group 是否合理Treatment 是如何发生的实际研究背景。6. 真正理解 DID只需要一直追问一个问题刚开始学习 DID 时很容易把整个方法记成构造 Treat ↓ 构造 Post ↓ 生成 Treat × Post ↓ 跑回归 ↓ 看 p-value但如果按照这个顺序理解很容易把 DID 变成一套机械操作。我现在更喜欢反过来思考。首先问Treatment 到底是什么然后问谁接受了 Treatment再问谁可以作为 Control Group最后问最重要的一句如果 Treatment 没有发生我为什么认为 Treatment Group 会像这个 Control Group 一样变化如果最后这个问题没有合理答案那么即使模型形式完全正确DID 的因果解释仍然可能存在问题。所以当然可以记住$$DID处理组前后变化-对照组同期变化$$但是更值得记住的是DID 利用一个具有可比性的对照组去估计 Treatment Group 在没有接受 Treatment 时本来会沿着怎样的轨迹发展。也就是说它真正关心的是实际观察到的结果 vs. 构造出来的反事实结果这也是为什么 Counterfactual 和 Parallel Trends 才是 DID 最重要的两个概念。DID 表面上只是做了两次减法。但它真正试图回答的问题其实非常深现实已经发生了但如果它没有发生世界本来会是什么样当开始用这个问题理解 DID 时公式本身反而会变得很自然。总结如果只是快速记忆 DID可以记住$$DID(处理组后-处理组前)-(对照组后-对照组前)$$但如果真正想理解这个方法可以把整个逻辑压缩成下面几步Treatment 发生 ↓ 我们只能看到 Treatment 后的真实结果 ↓ 无法观察“没有 Treatment”的结果 ↓ 利用 Control Group 构造 Counterfactual ↓ 依靠 Parallel Trends 使这个反事实具有可信度 ↓ 比较真实结果与反事实结果 ↓ 得到 DID Treatment Effect所以本文最想留下的一句话是先问“如果 Treatment 没发生会怎样”再问“回归应该怎么跑”。理解这个顺序以后DID 就不再只是一条需要记住的统计公式而开始变成一种真正的因果推断思维。参考阅读Angrist, J. D., Pischke, J. S.Mostly Harmless Econometrics: An Empiricists Companion.Cunningham, S.Causal Inference: The Mixtape.Callaway, B., SantAnna, P. H. C. (2021). Difference-in-Differences with Multiple Time Periods.Journal of Econometrics, 225(2), 200–230.Goodman-Bacon, A. (2021). Difference-in-Differences with Variation in Treatment Timing.Journal of Econometrics, 225(2), 254–277.
返回列表