马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有账号?立即注册
×
写在前面
“老师,我的论文想做政策效应评估,用什么方法?” “双重差分。” “什么是双重差分?怎么操作?需要什么软件?” 这可能是实证论文写作者最常遇到的对话。 双重差分法(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命令):
- 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回归
方法一:直接使用交互项 - statareg y i.treat##i.post, robust
复制代码方法二:使用xtreg固定效应模型(推荐) - xtreg y i.treat##i.post, fe robust
复制代码方法三:使用reghdfe(顶刊标配,可同时控制多维固定效应) - * 需要先安装: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 | | 1 | 1992 | 1 | 0 | 100 | | 1 | 1993 | 1 | 0 | 105 | | 1 | 1994 | 1 | 1 | 112 | | 1 | 1995 | 1 | 1 | 118 | | 2 | 1992 | 0 | 0 | 98 | | 2 | 1993 | 0 | 0 | 102 | | 2 | 1994 | 0 | 1 | 104 | | 2 | 1995 | 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.
|