双重差分(DID)

所属分类:因果推断

这个方法是做什么的

双重差分把“政策有没有用”变成一个能算的量:处理组在政策前后的变化,减去对照组在同一段时间里的变化。对照组的那段变化被当作“处理组若没有政策会怎么变”的替身,两次相减之后,两组之间固定不变的水平差异、以及同时作用于两组的时间趋势,都被差掉了。模块拟合 Y ~ Treat + Post + Treat×Post + 控制变量,交互项的系数就是净效应 ATT,演示数据上为 4.175(95%CI[2.909, 5.440])。

除了这一个数,报告还给出:卡① 用事件研究法做的事前联合检验(演示数据 F(2, 59)=0.124,p=0.884)与只用事件前样本的线性趋势差异检验;卡③ 的平行趋势图与逐期动态效应图;卡④ 的标准化效应 δ(以回归残差标准差为标尺)、逐期动态效应表(基期归一化为 0,事件前各期即平行趋势检验的逐期版本),以及一张稳健性表——去掉全部控制变量、更换标准误口径、把事件时点前移到真实事件之前,各重估一遍。卡① 的识别前提表里还有一行“事件时点”,会写明这个时点是你自己填的,还是系统按时间变量取值的中位次序自动推断的。

需要准备什么数据

  • 放入[定量]因变量 Y:1 个,定量变量(数值)
  • 放入[定类]分组变量 Treat:1 个,定类变量(分组/标签)
  • 放入[定量]时间变量 Time:1 个,定量变量(数值)
  • 放入[定类]个体ID (可选)(可选):不限
  • 放入控制变量 (可选)(可选):不限

数据要求

  • 数据表至少 30 行。
  • 单列缺失率不超过 20%。
  • 不接受取值全都一样的列(零方差列没有可分析的变异)。
  • 「放入[定类]分组变量 Treat」必须正好是 2 个类别。
  • 「放入[定类]分组变量 Treat」的每一组至少 4 个样本。

以上条目由系统从该方法的校验规则直接生成,与上传数据时的实际拦截规则一致。

什么时候用它

  • 某个时点起一部分对象受到政策或干预、另一部分没有,且两组在前后两段都有观测
  • 多期面板,想看效应是一次性跳升还是逐期显现(事件研究动态效应图)
  • 两组基线水平本来就不同,但你有理由相信“若无政策,这个差距会保持不变”
  • 需要一张能写进论文的净效应表,外加一份正式的平行趋势检验

分组变量必须严格编码为 0=对照组、1=处理组,非 0/1 编码会让净效应符号反向,模块直接拒绝而不猜测;时间变量须为数值且至少两个取值;处理前后 × 处理对照的四个单元格都要有观测,交互项才可识别。个体 ID 是可选的,但它决定标准误口径:提供后按个体聚类稳健,不提供则退回 HC1。

什么时候不要用它

  • 只有政策前后各一期,而且两组基线特征差得多:一期做不了事前趋势检验,基线不可比又让平行趋势更难成立。改用「PSM-DID」,它先按倾向得分匹配出可比的两组再做差分。
  • 完全没有对照组,只有处理组自己的前后数据:第二重差分无从做起,前后变化没法与同期的宏观趋势分开。此时只能用「配对样本T检验」如实描述前后差异,并在文中写明它不是政策效应。
  • 是否受处理由一条连续的分数线决定(过线才入选):分配规则已知且在线附近近似随机,用「断点回归(RD)」比费力找对照组更有说服力。
  • 处理与否由个体自己选择,且只有一期截面:没有时间维度就差分不出来,改用「倾向得分匹配 (PSM)」在可观测协变量上构造可比对照。
  • 因变量是二分类或计数:因变量区只收定量列;而且在非线性模型里交互项的系数并不等于双重差分效应,硬套会读错。二分类结局用「逻辑回归」、计数结局用「计数数据回归」,按发生比或发生率比表述组间差异。
  • 不同个体在不同时点才开始受处理(交错 DID):卡⑤ 已写明本模块的经典 2×2 设定不处理这种情形,双向固定效应估计量在处理效应异质时还可能有偏。产品内可行的做法是用「面板模型」做双向固定效应,但要说明它同样不解决异质性处理效应带来的偏误。

容易误读的地方

  • 平行趋势检验通过,不等于平行趋势成立。 卡① 的判定说明写着这个检验只能证伪、不能证实,仍须结合制度背景论证。演示数据 F(2, 59)=0.124、p=0.884,能说的只有“未发现违背证据”。更要紧的是它检验的是政策之前那几期,而 DID 真正需要的是“政策之后若无政策仍然平行”——那一段永远没有数据。事前期数少时功效也低,“没查出来”和“没有”是两回事。
  • 事件前两组差异显著,并不违反平行趋势。 演示数据事件前组间差 3.557、p=0.004,卡② 的结论文案专门指出这本身不违反平行趋势,因为 DID 允许水平差异,被差掉的正是这个固定差距。该看的是趋势不是水平——这由卡① 的趋势检验和卡④ 的逐期动态效应回答,看到基线不平不必以为方法用错了。
  • 给不给个体 ID,点估计一模一样,区间能差将近一倍。 实测同一份数据:提供“企业编号”时 ATT=4.175、标准误 0.632、95%CI[2.909, 5.440],推断自由度 59;去掉个体 ID 后 ATT 仍是 4.175,标准误却变成 1.172、95%CI[1.871, 6.479],自由度 355,稳健性表里“更换标准误口径”那一行还会变成未执行。面板数据不给 ID,等于假装这 360 个观测彼此独立。另一头同样要小心:聚类数少于 30 时聚类推断本身就不可靠,卡① 会把聚类数与这条经验下限一起印出来。
  • 卡② 的“回归推得均值”和卡① 的描述统计均值不是一回事。 表注写明各单元格均值由统一的交互效应回归模型推得,含控制变量时是控制变量取 0 处的条件均值,与描述统计口径不同、二者不应直接比对。卡④ 那行“相对处理组事前均值的变化率 3.98%”用的是描述统计里的 104.962,不是卡② 的 61.347。两处均值相减对不上,不是算错。
  • 净效应会把同期一切对两组不对称的冲击都吸收进去。 卡① 的结论文案把这条反事实说得很直白:DID 只在“若无政策,两组差距会保持不变”之下成立,同期发生的其它冲击只要对两组影响不同,就会被整体归入净效应。卡⑤ 另提示了溢出效应:政策若通过市场竞争等渠道影响到对照组,SUTVA 被违反,净效应会被系统性高估或低估。卡④ 的安慰剂检验(演示数据伪事件时点 2019,伪净效应 0.467、p=0.637)只能排掉“事前趋势驱动”这一种解释,排不掉上面这两类。

报告里有什么

  1. 输出结果一:数据概览与前提检验
  2. 输出结果二:主结果表(DID 回归)
  3. 输出结果三:可视化(平行趋势与动态效应)
  4. 输出结果四:效应量与事后分析(动态效应·稳健性·安慰剂)
  5. 输出结果五:结论与学术表述
时间序列图
图1 时间序列图
事件研究:逐期动态效应(含 95%CI)
图2 事件研究:逐期动态效应(含 95%CI)
上图展示实验组与控制组因变量均值随时间的变化,虚线标记事件时点(2021);第二张图给出以基期为参照的逐期动态效应及其 95% 置信区间。

在线统计分析平台 · 233 种分析方法 · AI 智能解读

在线使用
使用教程