1. 双重差分法:因果推断的黄金标准
双重差分法(Difference-in-Differences,简称DID)是经济学和社会科学领域最常用的因果推断方法之一。我第一次接触这个方法是在分析某电商平台促销活动效果时——当时我们团队争论不休:销售额增长到底是因为活动本身,还是季节性波动?DID给了我们一个清晰的答案。
简单来说,DID通过比较"受政策影响的处理组"和"未受影响的对照组"在干预前后的变化差异,剥离出政策或事件的真实效果。就像医生给两组病人做药物试验时,既要看吃药组吃药前后的变化,也要对比没吃药组同期的变化,最后用两个变化的差值判断药效。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. DID的核心逻辑与四大假设
2.1 基本公式解析
DID的核心计算公式可以表示为:
code复制处理效应 = (处理组后测 - 处理组前测) - (对照组后测 - 对照组前测)
举个例子:某城市2023年1月实施最低工资上调政策(干预点),我们想评估政策对就业率的影响:
- 处理组:该城市就业率(干预前20%,干预后18%)
- 对照组:相邻未调薪城市就业率(干预前22%,干预后21%)
计算得出:
code复制政策效应 = (18%-20%) - (21%-22%) = (-2%) - (-1%) = -1%
说明最低工资上调导致就业率下降1个百分点。
2.2 必须满足的四大前提
我在实际项目中总结出DID应用的四个生死线:
-
平行趋势假设:干预前处理组和对照组的变化趋势必须一致。检验方法:
- 画干预前多期趋势图
- 进行Placebo Test(伪干预点测试)
- 我最常用的方法是加入处理组*时间虚拟变量的交互项进行统计检验
-
无溢出效应:对照组的个体不能受到干预影响。比如研究A市环保政策时,如果B市工厂因临近A市而被动改变生产方式,就会污染结果。
-
干预外生性:干预分配不能与结果变量相关。例如研究培训项目对工资的影响时,如果员工自愿报名培训,那些积极报名的人可能本身能力更强。
-
样本稳定性:处理组和对照组在干预前后不应有系统性流失。我在一次零售研究中就踩过坑——对照组门店因业绩差在观察期内关闭了20%,导致结果严重偏误。
3. 标准DID的实现步骤(含Stata代码)
3.1 数据准备要点
- 必须包含:处理组标识变量(treated)、时间虚拟变量(post)、结果变量(y)
- 建议面板数据结构(个体+时间两个维度)
- 处理缺失值的经验:连续变量用线性插值,分类变量用众数填补
stata复制// 生成关键变量示例
gen treated = (city=="北京") // 北京是处理组
gen post = (year>=2023) // 2023年起实施政策
gen did = treated * post // 交互项
3.2 基准回归模型
最基础的TWFE(双向固定效应)模型:
stata复制xtset id year // 声明面板数据
reghdfe y treated post did, absorb(id year) vce(robust)
参数解释:
absorb(id year)控制个体和时间固定效应vce(robust)使用稳健标准误- did系数就是处理效应
3.3 必须做的稳健性检验
- 平行趋势检验:
stata复制// 生成事件研究虚拟变量
forvalues k = 2(-1)4 {
gen pre`k' = (year == 2023-`k') * treated
gen post`k' = (year == 2023+`k') * treated
}
// 回归检验(基准期设为干预前1年)
reghdfe y pre* post* treated, absorb(id year) vce(robust)
看pre*的系数是否联合显著为0
- 安慰剂检验:
- 虚构干预时间点(如提前2年)
- 虚构处理组(随机抽取样本)
- 理论上应该得到不显著的处理效应
4. DID的五大实战变体与应用场景
4.1 多期DID(时变处理效应)
当不同个体在不同时间点受到干预时(如各省份陆续实施环保政策),需要使用交错DID(Staggered DID)。最近学界推荐使用Callaway & Sant'Anna(2021)方法:
stata复制csdid y, ivar(id) time(year) gvar(first_treated) ///
method(dripw) agg(simple)
4.2 连续型处理强度
当处理不是0/1变量而是连续变量(如补贴金额不同)时,可用连续DID:
stata复制gen treatment_intensity = subsidy_amount // 处理强度变量
reghdfe y c.treatment_intensity#post, absorb(id year)
4.3 三重差分法(DDD)
当存在异质性处理效应时(如政策对男女影响不同),可以加入第三重差分:
stata复制gen female = (gender==2) // 女性虚拟变量
reghdfe y treated##post##female, absorb(id year)
5. 常见错误与避坑指南
5.1 样本选择偏差
我曾分析某教育项目时犯的典型错误——只保留了始终存在的学校(survivor bias)。正确做法:
- 使用逆概率加权(IPW)
- 或者用Lee bounds方法估计效应上下限
5.2 动态处理效应
处理效应可能随时间变化(如政策效果有滞后性)。解决方案:
stata复制// 生成事件时间虚拟变量
forvalues k = 1/5 {
gen post_`k' = (year == 2023+`k') * treated
}
reghdfe y post_*, absorb(id year)
5.3 标准误低估
DID常见聚类层级选择错误:
- 政策在省份层面实施,却只聚类到个体层面
- 应采用多路聚类(如省份-年份双聚类):
stata复制reghdfe y did, absorb(id year) vce(cluster province year)
6. 前沿进展与学习资源
最近两年DID领域的重要突破:
- Bacon分解:识别TWFE模型中的负权重问题
- 交互固定效应:替代传统TWFE的新估计量
- 堆叠回归:处理交错DID的新方法
推荐三本实战宝典:
- Mostly Harmless Econometrics (Angrist & Pischke)
- Causal Inference: The Mixtape (Cunningham)
- Handbook of Labor Economics第4卷中的DID专题
我个人的学习路径是:先掌握基础TWFE模型 → 理解Bacon分解的警示 → 实践Callaway & Sant'Anna包 → 最后研究交互固定效应。每次项目都会重新检验平行趋势,这步绝对不能偷懒。
