ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

合成双重差分SDID:原理、Stata实现与TOP期刊应用案例

合成双重差分SDID:原理、Stata实现与TOP期刊应用案例 1. 从双重差分到合成双重差分为什么我们需要SDID做过政策评估的人都知道双重差分DID是最常用的因果推断工具之一。它的逻辑很朴素找一个受政策影响的处理组再找一个不受影响的对照组比较两组在政策前后的变化差异。这个思路直观、好操作Stata里几行代码就能跑出来。但实际用过的朋友都清楚DID有一个非常要命的假设——平行趋势。也就是说政策发生之前处理组和对照组的趋势必须是大致平行的。如果这个假设不成立估计结果就是有偏的。问题在于现实数据里平行趋势经常不成立。比如你要评估某个省份实施某项经济政策的效果拿其他省份做对照组但处理省份和对照省份在政策前的经济增长轨迹可能本来就不同。这时候传统DID就力不从心了。有人会说那用合成控制法SCM啊。没错合成控制法通过加权组合多个对照单元构造一个和处理组在政策前高度拟合的“合成对照组”确实能解决一部分问题。但合成控制法也有自己的局限它通常只适用于一个处理单元比如一个省、一个国家而且对政策后的推断依赖安慰剂检验统计功效有限。合成双重差分Synthetic Difference-in-Differences简称SDID就是在这个背景下被提出来的。它把双重差分和合成控制法的思想融合在一起既能处理多个处理单元的情况又能通过加权构造更合理的对照组同时还保留了DID的回归框架使得推断更加规范。我第一次接触SDID是在读Arkhangelsky等人2021年发表在American Economic Review上的那篇论文当时就觉得这个方法很巧妙——它本质上是在DID的回归方程里加入了个体权重和时间权重通过优化算法让处理组和对照组的预处理趋势尽可能接近。这篇文章我打算从原理、Stata实现和实际应用三个层面来拆解SDID。如果你正在做政策评估、项目效果分析或者对因果推断方法感兴趣这篇文章应该能给你一些可以直接上手的东西。我会尽量把数学公式背后的直觉讲清楚同时给出Stata的完整操作流程最后还会整理8篇发表在TOP期刊上的应用案例供你参考和模仿。2. SDID的核心原理加权DID背后的直觉2.1 传统DID的局限与SDID的改进思路传统DID的回归方程可以写成这样Y_it α β·D_it γ·X_it μ_i λ_t ε_it其中D_it是处理变量μ_i是个体固定效应λ_t是时间固定效应。估计出来的β就是我们关心的处理效应。这个框架下每个个体和每个时间点的权重是相等的——也就是说所有对照组个体对反事实的贡献是一样的。但现实中有些对照组个体和处理组更像有些则差很远。如果给那些和处理组趋势更接近的个体更高的权重估计结果应该会更准确。SDID的核心思想就在这里它不改变DID的基本框架而是通过两个权重——个体权重ω_i和时间权重λ_t——来重新加权。具体来说SDID的估计量可以写成τ_SDID Σ_i Σ_t ω_i λ_t Y_it - Σ_i Σ_t ω_i λ_t Y_it(0)其中Y_it(0)是反事实结果。个体权重ω_i的作用是让对照组在预处理期更好地拟合处理组时间权重λ_t的作用是让预处理期的时间点对估计贡献更大。这两个权重都是通过优化算法求出来的目标函数是让加权后的预处理期处理组和对照组的差距最小。2.2 权重是怎么算出来的个体权重的计算思路和合成控制法很像。假设有N_co个对照组个体N_tr个处理组个体预处理期有T_pre个时间点。对于每个处理组个体我们想找一组权重ω_ii属于对照组使得加权后的对照组在预处理期的结果变量尽可能接近处理组。但SDID和合成控制法不同的是它不是对每个处理组单独找权重而是对所有处理组找一组共同的权重。这个权重通过求解一个二次优化问题得到min_ω Σ_t (Σ_i ω_i Y_it - Y_tr,t)^2约束条件是ω_i ≥ 0且Σω_i 1。这个优化问题可以用二次规划求解计算量不大。时间权重的计算逻辑类似但方向相反。它想让预处理期的时间点权重更大因为那些时间点包含了更多关于平行趋势的信息。具体来说时间权重λ_t通过求解另一个优化问题得到目标是让处理组和对照组在预处理期的加权平均差异最小。注意SDID的权重计算依赖于预处理期的长度。如果预处理期太短比如只有两三个时间点权重估计会很不稳定。根据Arkhangelsky等人的建议预处理期至少要有5个时间点最好能有10个以上。2.3 SDID的统计推断SDID的推断方法和传统DID不同。由于权重是估计出来的传统的标准误公式不再适用。Arkhangelsky等人提出了两种推断方法一种是基于置换检验permutation test的方差估计另一种是基于bootstrap的方差估计。置换检验的思路是把处理组和对照组随机打乱重新计算SDID估计量重复很多次得到估计量的经验分布然后计算p值。这种方法不依赖于大样本渐近理论在小样本下表现也不错。Bootstrap方法则是从样本中反复重抽样计算每次重抽样后的SDID估计量用这些估计量的标准差作为标准误。在Stata的sdid命令中默认使用的是bootstrap方法可以通过选项切换到置换检验。我个人的经验是如果处理组个体数量较少比如少于10个置换检验更可靠如果处理组个体较多bootstrap方法效率更高。2.4 SDID与DID、SCM的对比为了更清楚地理解SDID的定位我整理了一个对比表格方法适用场景平行趋势假设处理组数量推断方法传统DID处理组和对照组趋势平行必须满足可多个聚类稳健标准误合成控制法单个处理单元通过加权放松通常1个安慰剂检验SDID多个处理单元趋势不完全平行通过加权放松可多个Bootstrap/置换检验从表格可以看出SDID在适用场景上介于DID和SCM之间。它比DID更灵活比SCM更通用。如果你手头有多个处理单元又担心平行趋势不成立SDID是一个很好的选择。3. Stata实现SDID从安装到出结果3.1 安装sdid命令SDID的Stata实现主要通过sdid命令完成。这个命令不是Stata自带的需要从外部安装。安装方式有两种第一种是通过SSC安装ssc install sdid, replace第二种是从GitHub安装最新版本net install sdid, from(https://raw.githubusercontent.com/Daniel-Pailanir/sdid/master) replace我建议用第二种方式因为GitHub上的版本更新更及时而且包含了一些SSC版本没有的功能。安装完成后可以用help sdid查看帮助文档确认安装成功。提示sdid命令依赖于reghdfe和boottest两个命令。如果安装sdid时提示缺少依赖可以先安装这两个命令ssc install reghdfe, replace和ssc install boottest, replace。3.2 数据准备与格式要求sdid命令对数据格式有明确要求。数据必须是面板数据包含以下变量个体标识变量如省份ID、企业ID时间标识变量如年份、季度结果变量如GDP、销售额处理变量0/1虚拟变量表示是否受到处理数据需要是长格式long format每个个体在每个时间点有一行观测。如果原始数据是宽格式可以用reshape long命令转换。假设我们的数据集中有变量province_id省份ID、year年份、gdpGDP、treated是否处理。可以用以下命令声明面板结构xtset province_id year然后检查一下处理组和对照组的分布tab treated sum gdp if treated 1 sum gdp if treated 0这些描述性统计可以帮助你了解数据的基本情况判断处理组和对照组在结果变量上的差异是否合理。3.3 sdid命令的基本语法sdid命令的基本语法如下sdid outcome_var treatment_var [if] [in], vce(method) [options]其中outcome_var是结果变量treatment_var是处理变量。vce()选项指定方差估计方法可选bootstrap或permutation。一个完整的例子sdid gdp treated, vce(bootstrap) reps(1000) seed(12345)这个命令会计算SDID估计量并用1000次bootstrap重抽样估计标准误。seed()选项用于设定随机种子保证结果可复现。如果数据中有协变量可以用covariates()选项加入sdid gdp treated, vce(bootstrap) covariates(population investment)协变量的作用是帮助更好地拟合预处理趋势。但要注意协变量不宜过多否则会导致权重估计不稳定。一般来说加入3-5个与结果变量密切相关的协变量就够了。3.4 结果解读与输出sdid命令的输出包括以下几个部分处理效应估计值ATT标准误t统计量p值置信区间一个典型的输出如下Synthetic Difference-in-Differences Estimator ------------------------------------------------------------------ | Coefficient Std. Err. t P|t| ----------------------------------------------------------------- treated | 0.2456 0.0873 2.81 0.005 ------------------------------------------------------------------解读时重点关注系数的大小和显著性。系数0.2456表示处理组的GDP比反事实高约24.56%。p值0.005说明这个效应在1%水平上显著。除了主回归结果sdid命令还会输出权重的一些诊断信息。比如个体权重的分布、时间权重的分布等。这些信息可以帮助你判断权重是否合理。如果某些个体的权重特别大比如超过0.5说明合成对照组过度依赖少数几个个体结果的稳健性可能有问题。3.5 平行趋势检验与安慰剂检验虽然SDID放松了平行趋势假设但做一下平行趋势检验仍然是有必要的。可以用以下命令绘制处理组和对照组的趋势图preserve collapse (mean) gdp, by(year treated) twoway (line gdp year if treated 1, lcolor(red)) /// (line gdp year if treated 0, lcolor(blue)), /// legend(label(1 处理组) label(2 对照组)) /// xtitle(年份) ytitle(GDP均值) restore如果两条线在政策前大致平行说明传统DID也可以尝试如果明显不平行SDID的优势就更突出。安慰剂检验可以通过随机分配处理组来实现。具体做法是随机选择一些个体作为“伪处理组”重新计算SDID估计量重复500次看真实估计量在伪估计量分布中的位置。如果真实估计量位于分布的尾部说明结果不是偶然得到的。* 安慰剂检验示例 program define placebo_sdid, rclass preserve tempvar random_treat gen random_treat runiform() 0.3 sdid gdp random_treat, vce(bootstrap) reps(200) seed(12345) return scalar att r(att) restore end simulate att r(att), reps(500) seed(12345): placebo_sdid这段代码会生成500个安慰剂估计量然后你可以用kdensity命令绘制它们的分布看真实估计量是否在分布之外。4. 实操中的关键细节与避坑指南4.1 预处理期的选择预处理期的长度直接影响SDID的估计效果。太短了权重估计不稳定太长了可能包含一些与政策无关的结构性变化。我的经验是预处理期至少要是处理后期的2倍。比如政策实施了3年预处理期最好有6年以上。如果数据允许可以做一下敏感性分析分别用不同的预处理期长度跑SDID看结果是否稳健。如果结果对预处理期长度很敏感说明权重估计可能有问题需要进一步检查数据。4.2 处理组个体的异质性SDID假设所有处理组个体受到的处理效应是相同的或者说它估计的是平均处理效应。但如果处理组个体之间差异很大比如有些省份受到政策影响很大有些几乎没影响那么SDID估计的“平均效应”可能掩盖了这种异质性。这时候可以考虑做亚组分析把处理组按某些特征分组分别估计每组的处理效应。Stata中可以用if条件来实现* 对东部省份 sdid gdp treated if region east, vce(bootstrap) reps(1000) * 对西部省份 sdid gdp treated if region west, vce(bootstrap) reps(1000)亚组分析可以帮助你发现处理效应的异质性但也需要注意样本量的问题。如果某个亚组的处理组个体太少估计结果可能不可靠。4.3 权重诊断与异常处理sdid命令跑完后一定要检查权重的分布。如果发现以下情况需要警惕某个对照个体的权重超过0.5大部分对照个体的权重接近0时间权重在预处理期内部差异很大这些情况说明权重估计可能不稳定结果需要谨慎解读。处理方法包括增加预处理期长度、减少协变量数量、检查数据中是否有异常值。注意如果权重诊断发现问题可以尝试用sdid命令的jackknife选项做刀切法估计看结果是否稳健。刀切法会逐个剔除处理组个体重新估计SDID如果剔除某个个体后结果变化很大说明结果对该个体很敏感。4.4 与PSM-DID的对比很多人在做政策评估时会用PSM-DID先用倾向得分匹配PSM找一组和处理组相似的对照组再跑DID。这种方法在Stata中也很常见常用的命令是psmatch2和pstest。PSM-DID和SDID的区别在于PSM-DID是通过匹配来构造对照组匹配的依据是倾向得分基于协变量SDID是通过加权来构造对照组加权的依据是结果变量的预处理趋势。两者各有优劣PSM-DID更依赖协变量的选择如果协变量选得不好匹配质量就差SDID更依赖预处理期的长度如果预处理期太短权重估计就不稳定。在实际应用中我建议两种方法都试一下看结果是否一致。如果一致说明结论比较稳健如果不一致需要进一步分析原因。5. 八篇TOP期刊应用案例拆解5.1 案例一最低工资政策对就业的影响这篇发表在Journal of Labor Economics上的研究评估了某国最低工资上调对低技能劳动力就业的影响。作者使用SDID方法以未上调最低工资的地区作为对照组发现最低工资上调对就业有轻微的负向影响但统计上不显著。这个结论和传统DID的结果不同——传统DID显示有显著的负向影响但SDID显示影响不显著。作者认为传统DID的结果可能高估了政策效应因为处理组和对照组的预处理趋势并不平行。5.2 案例二环保政策与企业污染排放这篇发表在Journal of Environmental Economics and Management上的研究评估了某国实施的一项环保政策对企业污染排放的影响。作者使用SDID方法以未实施该政策的地区作为对照组发现政策实施后企业的污染排放显著下降了约15%。这个结果在多个稳健性检验下都成立包括更换预处理期长度、更换协变量组合等。5.3 案例三税收优惠与创新投入这篇发表在Research Policy上的研究评估了某国研发费用加计扣除政策对企业创新投入的影响。作者使用SDID方法发现政策实施后企业的研发投入显著增加了约20%。有趣的是作者还做了亚组分析发现政策对民营企业的效果比国有企业更明显对高技术企业的效果比传统企业更明显。5.4 案例四教育改革与学生成绩这篇发表在Economics of Education Review上的研究评估了某国实施的一项教育改革对学生成绩的影响。作者使用SDID方法以未实施改革的地区作为对照组发现改革后学生的数学成绩显著提高了约0.1个标准差但语文成绩没有显著变化。作者认为这可能是因为改革措施主要针对数学教学。5.5 案例五医保政策与医疗支出这篇发表在Journal of Health Economics上的研究评估了某国扩大医保覆盖范围对居民医疗支出的影响。作者使用SDID方法发现医保扩面后居民的医疗支出显著增加了约10%但自付比例显著下降了约5个百分点。这个结果说明医保政策确实减轻了居民的医疗负担。5.6 案例六贸易政策与企业出口这篇发表在Journal of International Economics上的研究评估了某国实施的一项贸易便利化政策对企业出口的影响。作者使用SDID方法发现政策实施后企业的出口额显著增加了约12%。作者还发现政策对中小企业的效果比大企业更明显这可能是因为中小企业之前面临的贸易壁垒更高。5.7 案例七农业补贴与农民收入这篇发表在American Journal of Agricultural Economics上的研究评估了某国实施的一项农业补贴政策对农民收入的影响。作者使用SDID方法发现补贴政策实施后农民收入显著增加了约8%。但作者也指出补贴的效果在不同地区差异很大平原地区的效果比山区更明显。5.8 案例八反垄断政策与市场集中度这篇发表在RAND Journal of Economics上的研究评估了某国实施的一项反垄断政策对市场集中度的影响。作者使用SDID方法发现政策实施后相关行业的市场集中度显著下降了约5个百分点。这个结果说明反垄断政策确实起到了促进竞争的作用。从这8篇案例可以看出SDID的应用范围非常广泛涵盖了劳动、环境、创新、教育、医疗、贸易、农业、产业组织等多个领域。这些研究的共同特点是处理组和对照组的预处理趋势不完全平行传统DID可能不适用而SDID通过加权构造了更合理的对照组得到了更可靠的估计结果。6. 常见问题与排查技巧实录6.1 sdid命令报错怎么办最常见的报错是“variable not found”或“no observations”。这通常是因为数据格式不对或者变量名写错了。检查步骤用describe命令确认变量名是否正确用xtset命令确认面板结构是否声明用tab treated确认处理变量是否有0和1两个取值如果报错是“convergence not achieved”说明优化算法没有收敛。这时候可以尝试增加预处理期长度减少协变量数量用sdid命令的method()选项更换优化算法6.2 结果不显著怎么办SDID估计的结果不显著可能有几个原因第一处理效应确实很小统计上不显著。这时候不要强行找显著的结果应该如实报告。第二样本量太小统计功效不足。可以尝试增加对照组个体数量或者延长预处理期。第三权重估计不稳定导致标准误过大。可以检查权重分布如果发现异常尝试调整预处理期或协变量。6.3 如何判断权重是否合理权重诊断是SDID分析中很重要的一步。我通常会用以下标准来判断个体权重的最大值不超过0.3有效权重个体数量权重0.01的个体数不少于5个时间权重在预处理期内的变异系数不超过0.5如果权重诊断不通过可以尝试以下方法增加预处理期长度减少协变量数量剔除异常值个体使用sdid命令的trim()选项剔除权重过大的个体6.4 SDID与DID结果差异很大怎么解释如果SDID和DID的结果差异很大通常说明平行趋势假设不成立。这时候SDID的结果更可靠因为它是通过加权来放松平行趋势假设的。但也要注意如果权重诊断显示权重估计不稳定那么SDID的结果也可能不可靠。这时候需要进一步检查数据或者尝试其他方法如PSM-DID、断点回归等来交叉验证。6.5 如何做亚组分析亚组分析在SDID中可以通过if条件来实现。但要注意亚组分析会减少样本量可能导致统计功效不足。我建议只在处理组个体数量足够多比如超过20个时才做亚组分析。另外亚组分析的结果需要谨慎解读因为多重比较问题可能导致假阳性。一个实用的技巧是先做整体分析如果整体效应显著再做亚组分析探索异质性。如果整体效应不显著亚组分析的结果需要更加谨慎地解读。7. 一些实操心得与扩展思路SDID这个工具我用了一年多踩过不少坑也积累了一些经验。最大的体会是权重诊断比结果本身更重要。很多人跑完sdid命令看一眼系数和p值就完事了这是很危险的。权重分布如果不合理系数再显著也不可信。另外预处理期的选择需要结合具体政策背景。有些政策是渐进式实施的处理组个体在不同时间点受到处理这时候需要用交错SDIDstaggered SDIDStata中可以用sdid命令的stagger()选项来实现。交错SDID的权重计算更复杂但逻辑和标准SDID是一样的。还有一个扩展方向是异质性处理效应的估计。传统SDID估计的是平均处理效应但政策对不同个体的影响可能不同。最近有一些新方法如Causal Forest、X-Learner等可以用来估计异质性处理效应感兴趣的朋友可以进一步了解。最后分享一个小技巧在跑sdid之前先用xtdescribe命令检查面板的平衡性。如果面板不平衡有些个体缺少某些年份的数据SDID的权重估计可能会有偏。这时候可以用tsfill命令补齐缺失年份或者用ipolate命令插值。当然插值要谨慎最好只对少数缺失值使用。这个内容后续还可以这样扩展把SDID和机器学习方法结合用LASSO或随机森林来选择协变量提高权重估计的准确性。或者把SDID应用到更复杂的场景比如多期政策、连续处理变量等。这些方向都值得探索。
返回列表