手把手教你搞定双重差分模型(DID):从数学原理到Stata实操,一篇全讲透

10 0
松鼠协会总动员 发表于 2026-7-27 14:45:52 | 查看全部 阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?立即注册

×
写在前面

“老师,我的论文想做政策效应评估,用什么方法?”
“双重差分。”
“什么是双重差分?怎么操作?需要什么软件?”
这可能是实证论文写作者最常遇到的对话。
双重差分法(Difference-in-Differences,简称DID)是政策评估、因果推断领域最主流的方法之一。它可以帮助你回答这样的问题:“某项政策到底有没有效果?效果有多大?”
但很多同学对它望而生畏:一看数学公式就头大,一到软件操作就手抖。
别怕。这篇文章会从零开始,把DID的数学原理、适用条件、操作步骤、结果解读全部讲透。读完这篇,你就能自己跑出一个靠谱的DID模型。
一、先搞懂:双重差分到底在算什么?

1.1 一个简单的例子

假设你要评估“某地区实施的最低工资政策是否提高了就业率”。
最简单的想法:比较政策实施前后的就业人数。
问题:就业人数变化可能不是因为政策,而是经济周期、季节性因素等。
另一个想法:找一个没实施政策的地区(对照组),和实施了政策的地区(实验组)做对比。
问题:两个地区的就业水平本来就有差异,不能直接减。
DID的核心思路是:减两次。
时间 实验组(实施政策) 对照组(未实施) 组间差
政策前 Y_before,T Y_before,C Δ_before = Y_before,T - Y_before,C
政策后 Y_after,T Y_after,C Δ_after = Y_after,T - Y_after,C
第一次差分(组内差):计算实验组政策前后的变化量 ΔT = Y_after,T - Y_before,T
第二次差分(组间差):计算对照组的同期变化量 ΔC = Y_after,C - Y_before,C
DID估计量 = ΔT - ΔC = (Y_after,T - Y_before,T) - (Y_after,C - Y_before,C)
这个差值,就是政策带来的净效应。
1.2 用图片理解DID

想象一张图:横轴是时间,纵轴是结果变量(比如就业率)。
  • 一条线代表实验组,一条线代表对照组
  • 政策实施前,两条线大致平行(趋势相同)
  • 政策实施后,实验组的线发生了“跳跃”,对照组的线平稳变化
  • 这个“跳跃”的高度(实验组的变化减去对照组的变化),就是政策效应

这就是DID的直觉:把实验组“本应该”的变化(用对照组趋势推算)和“实际”的变化做差,差出来的就是政策效果。
二、数学原理:DID的计量经济学表达

2.1 基础DID模型

DID的标准计量模型可以写成:
Y_it = α + β·Treat_i + γ·Post_t + δ·(Treat_i × Post_t) + ε_it
各符号含义:
符号 含义 取值
Y_it 结果变量(如就业率) 连续变量
Treat_i 组别虚拟变量 实验组=1,对照组=0
Post_t 时间虚拟变量 政策后=1,政策前=0
Treat_i×Post_t 交互项(核心!) 两者相乘
δ DID估计量(你真正关心的) 数值
ε_it 误差项
核心解读:
  • β:实验组和对照组的固有差异(政策前就存在的差距)
  • γ:时间带来的共同趋势(所有人都受到的影响,如经济周期)
  • δ:政策的净效应——这就是DID的核心结论

为什么交互项的系数就是政策效应?
因为:
  • 实验组政策前后的变化 = γ + δ
  • 对照组政策前后的变化 = γ
  • 两者相减 = δ

2.2 一个具体的数字例子

假设研究“数字人民币试点对消费额的影响”:
组别 试点前月消费 试点后月消费 变化量
试点城市(实验组) 5000元 6000元 +1000元
非试点城市(对照组) 4800元 5200元 +400元
DID估计量 = 1000 - 400 = 600元
解读:数字人民币试点使试点城市居民月消费比非试点城市多增长了600元。
如果没有对照组,你可能误以为政策带来了1000元的增长,但其中400元是自然增长(经济回暖、收入增加等),政策真正的贡献只有600元。这就是DID的妙处:剔除共同趋势,识别净效应。
三、DID的前提条件:平行趋势假设

3.1 什么是平行趋势假设?

核心假设:如果实验组没有接受政策干预,它的变化趋势应该与对照组保持一致。
用数学语言表述:E[Y(0)_it | Treat=1, t] - E[Y(0)_it | Treat=0, t] = 常数(不随时间变化)
大白话:政策实施前,实验组和对照组的结果变量“走势差不多”。
为什么这个假设如此重要?因为DID的核心逻辑就是“用对照组的变化趋势来推算实验组如果没有政策会怎样”。如果两条线本来就不平行,你推算出来的“本应该”就是错的,结论自然不可靠。
3.2 如何检验平行趋势?

方法一:图示法(最直观)
画出实验组和对照组在政策实施前各时期的结果变量均值趋势图。如果两条线大致平行,说明假设成立。
方法二:事件研究法(计量检验)
在Stata中,用政策前各时期的虚拟变量与Treat的交互项做回归。如果这些交互项的系数都不显著(p>0.1),说明政策前两组无显著差异,平行趋势成立。
方法三:t检验法
直接用t检验比较政策前实验组和对照组的均值差异,若不显著则通过。
3.3 不满足平行趋势怎么办?

方案一:PSM-DID——用倾向得分匹配法为实验组找到“长得像”的对照组,再进行DID分析
方案二:合成控制法(SCM)——通过加权构建“合成”对照组
方案三:三重差分(DDD)——再引入一个维度(如不同人群、不同地区),做两次DID的差
四、Stata实操:手把手教你跑DID

4.1 数据准备

面板数据需要包含三个核心变量:
变量名 含义 取值示例
id 个体标识符 1,2,3...
time 时间变量 2019,2020,2021...
treat 是否实验组 实验组=1,对照组=0
post 是否政策后 政策后=1,政策前=0
y 结果变量 连续数值
生成示例数据(Stata命令):

  1. stataclearset obs 200gen id = _ngen treat =(id >100)// 前100个为对照组,后100个为实验组expand5bysort id:gen time = _ngen post =(time >3)// 假设第4期开始实施政策gen y =10+2*treat +3*post +5*treat*post +rnormal()// 生成包含DID效应的因变量xtset id time
复制代码
4.2 基础DID回归

方法一:直接使用交互项
  1. statareg y i.treat##i.post, robust
复制代码
方法二:使用xtreg固定效应模型(推荐)
  1. xtreg y i.treat##i.post, fe robust
复制代码
方法三:使用reghdfe(顶刊标配,可同时控制多维固定效应)
  1. * 需要先安装:ssc install reghdfereghdfe y c.treat#c.post,absorb(id time)vce(robust)
复制代码
三种方法的区别
方法 适用场景 优点 缺点
reg 截面数据 简单直观 无法控制个体效应
xtreg,fe 面板数据 控制个体异质性 计算较慢
reghdfe 大数据+多维固定效应 高效、灵活 需要额外安装
结果解读:重点关注treat[color=#576B95 !important][url=]#post[/url](交互项)的系数和p值。系数就是政策效应,p<0.05说明显著。
4.3 平行趋势检验(事件研究法)

步骤一:生成相对时间变量
stata
* 假设政策在第4期实施gen time_to_treat = time -4
步骤二:生成各时期虚拟变量与treat的交互项
stata
tab time_to_treat,gen(d)forv i=1/7{gen treat_d`i'= treat * d`i'}
步骤三:回归并绘图
stata
reghdfe y treat_d*,absorb(id time)vce(robust)coefplot,drop(_cons)xline(3.5)///xlabel(1"t-3"2"t-2"3"t-1"4"t"5"t+1"6"t+2"7"t+3")///title("平行趋势检验")
判断标准:政策实施前的交互项系数(t-3、t-2、t-1)的置信区间应包含0(即不显著)。
4.4 安慰剂检验

方法一:虚构政策时间
假设政策提前1-2期发生,重新估计DID。如果“伪政策效应”显著,说明原结果不可靠。
stata
* 假设政策在第3期实施(实际是第4期)gen fake_post =(time >3)reg y i.treat##i.fake_post, robust
方法二:随机分配实验组
随机生成实验组标签,重新估计DID。重复500-1000次,看真实的DID估计量是否在伪估计量的分布之外。
4.5 稳健性检验


检验类型 操作 目的
更换对照组 使用不同的对照组样本 排除对照组选择偏差
加入控制变量 添加协变量(如GDP、人口等) 排除混杂因素
更换时间窗口 缩短或延长样本期 排除时间窗口选择偏差
更换变量测量方式 使用替代指标 排除测量误差
五、完整案例演示:最低工资政策对就业的影响

5.1 研究背景

某地区(实验组)1994年实施了提高最低工资政策,相邻地区(对照组)未实施。我们要评估该政策对“就业人数”的影响。
5.2 数据准备


id time treat post employment
11992 1 0 100
11993 1 0 105
11994 1 1 112
11995 1 1 118
21992 0 0 98
21993 0 0 102
21994 0 1 104
21995 0 1 107
5.3 Stata操作

stata
* 1. 导入数据import excel "employment_data.xlsx", first clear* 2. 设置面板数据xtset id time* 3. 平行趋势检验(图示法)* 计算各年实验组和对照组的平均就业人数collapse(mean) employment,by(time treat)twoway(line employment time if treat==1)(line employment time if treat==0),///xline(1994)legend(label(1"实验组")label(2"对照组"))///title("就业人数变化趋势")ytitle("就业人数")xtitle("年份")* 4. 基础DID回归xtreg employment i.treat##i.post, fe robust* 5. 加入控制变量xtreg employment i.treat##i.post gdp population, fe robust* 6. 结果输出(使用outreg2)outreg2 using "did_results.doc", replace word dec(3)///ctitle("DID回归结果")///keep(treat#post)addtext(固定效应, 是, 控制变量, 已控制)5.4 结果解读

假设输出结果为:
变量 系数 标准误 t值 p值 95%置信区间
treat#post 3.25 1.02 3.19 0.002 [1.25, 5.25]
解读:交互项系数为3.25,p=0.002<0.05,说明最低工资政策显著提高了就业人数,平均提高了约3.25个单位。
论文中的写法:
“双重差分模型估计结果显示,政策虚拟变量与时间虚拟变量的交互项系数为3.25,在1%水平上显著为正,表明最低工资政策的实施使实验地区的就业人数比对照组多增长了3.25个单位,即该政策显著促进了就业。”
5.5 多期DID(政策在不同时间点实施)

如果政策不是在同一个时间点实施,而是分批次、在不同时间点对不同地区实施,需要使用多期DID(也称为交错DID或Staggered DID)。
stata
* 假设政策在不同时间点实施* 生成政策实施后的虚拟变量(处理组且在政策实施后=1)gen treated =(time >= policy_time & treat ==1)* 多期DID回归(双向固定效应)reghdfe y treated,absorb(id time)vce(cluster id)* 动态效应估计(事件研究法)* 生成相对时间变量forvalues i=1/5{gen lead_`i'=(time_to_treat ==-`i'& treat==1)gen lag_`i'=(time_to_treat ==`i'& treat==1)}reghdfe y lead_* lag_*,absorb(id time)vce(cluster id)
⚠️ 多期DID的重要提醒:传统的多期DID(双向固定效应TWFE模型)在存在异质性处理效应时可能存在估计偏误。建议使用最新的异质性稳健估计量,如did_multiplegt、csdid等命令。
六、常见问题与避坑指南

Q1:一定要用面板数据吗?

是的。DID的核心是追踪同一批个体在不同时间点的变化,所以面板数据是必需的。如果没有面板数据,只有不同时间点的截面数据,需要用重复截面数据的DID方法,但操作更复杂。
Q2:实验组和对照组的样本量要一样吗?

不需要。但建议两组样本量不要相差太大,否则影响估计效率。
Q3:控制变量怎么选?

选择同时影响结果变量和政策实施的变量。比如研究区域政策,要控制GDP、人口、产业结构等。但注意:不能控制“政策发生后”才变化的变量(这些可能是政策的结果,控制了会削弱政策效应)。
Q4:平行趋势检验没通过怎么办?

  • 尝试PSM-DID,为实验组匹配相似的对照组
  • 调整时间窗口,剔除趋势差异过大的早期样本
  • 使用合成控制法(SCM)或合成双重差分(SDID)
  • 使用三重差分(DDD),引入第三个维度消除偏差

Q5:DID和固定效应是什么关系?

双向固定效应模型(个体固定效应+时间固定效应)是DID的“标准配置”。xtreg, fe自动控制了个体固定效应,再通过加入i.time来控制时间固定效应。因此,DID本质上是一种特殊的双向固定效应模型。
Q6:SPSS能做DID吗?

SPSS没有专门的DID模块,但可以通过“广义线性模型”或“线性回归”手动构造交互项来实现。不过操作较繁琐,推荐使用Stata或专门的在线分析平台SPSSAU。
写在最后

双重差分模型之所以成为政策评估领域的“黄金标准”,是因为它用相对简单的数学逻辑,解决了一个核心问题:如何在非实验数据中识别因果关系。
它不需要复杂的假设,只需要你有一个好的“自然实验”场景、满足平行趋势假设、正确操作软件、合理解读结果。
写实证论文时,最怕的不是模型复杂,而是“不知道为什么要用这个模型、不知道结果意味着什么”。
希望这篇文章能帮你真正理解DID。当你下次在论文中写下“本文采用双重差分模型……”时,你能清楚地知道:
  • 你在算什么?(DID估计量)
  • 为什么能这么算?(平行趋势假设)
  • 怎么操作的?(Stata命令)
  • 结果怎么读?(交互项系数和p值)

这就是“会做”和“真懂”的区别。
祝你的因果推断之路一切顺利,所有估计都显著,所有稳健性都通过!
参考文献

  • Arkhangelsky D, Athey S, Hirshberg D A, et al. Synthetic difference-in-differences[J]. American Economic Review, 2021, 111(12): 4088-4118.
  • Card D. The impact of the Mariel boatlift on the Miami labor market[J]. Industrial and Labor Relations Review, 1990, 43(2): 245-257.
  • 双重差分法(DID)在Stata中的实践指南[EB/OL]. 百度开发者中心, 2026.





回复 转播

使用道具 举报

回复

高级模式
B Color Image Link Quote Code Smilies |上传

本版积分规则

学研领航向全体高校师生打造的一站式综合交流与资源服务平台,集知识学习、经验分享、资源下载、互动问答、职场成长、兼职实践于一体,覆盖校园生活、专业学习、求职就业、兴趣发展等全场景需求。

快捷导航

小黑屋
Copyright © 2026 学研领航 版权所有 陕ICP备2025077879号-1
关灯 在本版发帖 返回顶部
快速回复 返回顶部 返回列表