1. 从双重差分到合成双重差分为什么需要SDID做过政策评估的人都知道双重差分DID是最常用的因果推断工具之一。它的逻辑很朴素找一个受政策影响的处理组再找一个没受影响的对照组比较两组在政策前后的变化差异。这个思路直观、好操作Stata里几行代码就能跑出来。但实际用起来问题很快就暴露了。最典型的麻烦是对照组的选择。DID有一个核心假设——平行趋势也就是说如果没有政策干预处理组和对照组的结果变量应该沿着平行的路径变化。这个假设听起来合理但在现实数据里经常不成立。比如你研究某个省份实施某项政策的效果拿其他省份做对照但其他省份的经济发展节奏、产业结构、人口流动趋势可能跟处理省份完全不一样平行趋势根本站不住。为了解决这个问题学者们发展出了合成控制法Synthetic Control Method, SCM。SCM的思路是既然找不到一个完美的单一对照单位那就用多个对照单位的加权组合来合成一个虚拟对照组让这个合成对照组在处理前的走势尽可能贴近处理组。这个方法在案例研究比如某个城市、某个州中非常流行因为它能构造出一个反事实的如果没有政策会怎样的轨迹。但SCM也有自己的局限。它通常适用于处理组只有一个或少数几个单位的情形而且对处理前的拟合要求很高权重计算也比较复杂。当处理组有多个单位、时间跨度较长、或者存在多个政策批次时SCM就不太够用了。合成双重差分Synthetic Difference-in-Differences, SDID正是为了填补这个空白而出现的。它把DID和SCM的核心思想融合在一起既像DID那样利用处理前后的时间维度信息又像SCM那样通过加权构造更合理的对照组。具体来说SDID同时给处理组单位和对照组单位分配权重也给不同时间段分配权重使得加权后的处理组和对照组在处理前具有平行的趋势。这样一来平行趋势假设在加权后的数据上更容易成立估计结果也更稳健。SDID的另一个优势是它对处理组和对照组的选择不那么敏感。传统的DID如果对照组选得不好估计结果会有很大偏差SCM如果处理前拟合不好后期预测也不可靠。SDID通过双重加权机制在一定程度上缓解了这两个问题。而且SDID的估计量具有双重稳健性只要权重估计模型或结果模型其中之一设定正确估计结果就是一致的。这套方法最早由Arkhangelsky等人在2021年发表于《American Economic Review》的论文中系统提出。论文标题是Synthetic Difference-in-Differences里面详细推导了SDID的估计量、渐近性质并给出了多个实证应用案例。从那以后SDID在经济学、公共政策、环境经济学等领域迅速流行起来成为政策评估工具箱里的新宠。对于做实证研究的人来说掌握SDID意味着多了一个强有力的武器。尤其是当你面对以下场景时SDID可能比传统DID或SCM更合适处理组包含多个单位但数量不多对照组单位较多但异质性大政策实施时间不完全一致你担心平行趋势假设不成立。这些情况在现实中非常常见所以SDID的实用价值很高。接下来我会从原理、Stata实现、实操细节、常见问题几个方面把SDID这套方法彻底讲清楚。文章会尽量用通俗的语言解释背后的逻辑同时给出可以直接复现的代码和步骤。无论你是刚接触因果推断的新手还是已经用过DID和SCM的老手应该都能从中找到有用的东西。2. SDID的核心原理拆解2.1 双重加权的直觉为什么给单位和时间都赋权SDID最核心的创新就是双重加权。传统的DID只做一次差分处理组前后变化减去对照组前后变化。SCM只做单位加权用对照单位的加权组合来拟合处理组。SDID把这两者结合起来同时对单位和时间进行加权。先看单位加权。假设你有N个处理组单位和M个对照组单位SDID会给每个对照组单位一个权重使得加权后的对照组在处理前的时间段内结果变量的走势尽可能接近处理组的走势。这跟SCM的思路一样但SDID不要求权重非负也不要求权重和为1这给了它更大的灵活性。再看时间加权。SDID还会给每个时间段分配权重使得处理前的时间段在估计中占更大比重处理后靠近政策实施时点的时间段也有较高权重。这样做的目的是让估计更关注那些信息量大的时间段减少噪声的干扰。双重加权的效果是加权后的数据中处理组和对照组在处理前不仅水平接近趋势也平行。这就大大放松了平行趋势假设的要求。你可以这样理解原始数据可能不满足平行趋势但经过加权调整后它满足了。这就像给数据做了一次矫正让不可比的东西变得可比。数学上SDID的估计量可以写成τ_SDID (加权后处理组处理后均值 - 加权后处理组处理前均值) - (加权后对照组处理后均值 - 加权后对照组处理前均值)其中权重通过优化问题求解目标是最小化处理前处理组和加权对照组的差异同时满足一些约束条件。具体的优化问题涉及单位权重ω和时间权重λ求解过程可以用交替最小化或凸优化方法实现。2.2 与DID和SCM的对比什么时候用哪个理解SDID的最好方式是把它们放在一起对比。下面这张表总结了三种方法的核心特征特征DIDSCMSDID对照组构造直接选一组加权合成一个加权合成多个时间权重等权等权优化赋权平行趋势要求强处理前拟合好加权后满足适用处理组数量多少通常1个中等数量对异常值敏感度高中低实现复杂度低中中高从表中可以看出SDID在灵活性和稳健性之间取得了平衡。如果你的处理组只有一个单位SCM可能是首选如果处理组很多、对照组也很多传统DID可能就够了但如果处理组有多个但不算多对照组异质性大SDID往往能提供更可靠的估计。还有一个重要的区别是推断方法。DID通常用聚类稳健标准误或bootstrapSCM常用置换检验placebo testSDID则提供了基于bootstrap的方差估计也支持置换检验。在实际应用中我一般会同时报告bootstrap标准误和置换检验的p值互相验证。2.3 权重求解的数学逻辑从优化问题到估计量SDID的权重求解是一个带约束的优化问题。设Y_it表示单位i在时间t的结果变量W_it表示处理指示变量处理组处理后为1否则为0。SDID的目标是找到单位权重ω_i和时间权重λ_t使得以下目标函数最小(Σ_i ω_i Y_i,pre - Σ_t λ_t Y_treat,t,pre)^2同时满足Σω_i 1Σλ_t 1ω_i和λ_t可以在一定范围内自由取值。这个优化问题可以通过交替方向乘子法ADMM或简单的迭代算法求解。实际计算中SDID还引入了一个正则化参数ζ用来控制权重的稀疏性。ζ越大权重越集中ζ越小权重越分散。默认情况下软件会自动选择一个合适的ζ值但用户也可以手动调整。求解出权重后SDID估计量就是加权后的处理组变化减去加权后的对照组变化。这个估计量在大样本下是渐近正态的方差可以用bootstrap方法估计。具体来说可以对单位进行有放回抽样重复计算SDID估计量然后用这些重复估计量的标准差作为标准误。需要注意的是SDID的渐近性质依赖于处理组和对照组的数量都趋于无穷。如果处理组数量很少比如只有2-3个渐近近似可能不太准确这时候置换检验会更可靠。我在实际研究中遇到过处理组只有3个单位的情况bootstrap标准误偏小置换检验的p值更保守最后我选择了报告置换检验的结果。3. Stata实现SDID的完整流程3.1 安装sdid命令与数据准备在Stata中实现SDID最方便的是使用sdid命令。这个命令由Arkhangelsky等人开发可以通过SSC安装ssc install sdid, replace安装完成后可以用help sdid查看帮助文档。如果你的Stata版本较老可能需要先更新ssc模块ssc update数据准备方面SDID要求数据是面板结构包含单位标识、时间标识、结果变量和处理指示变量。通常用xtset设定面板xtset id year假设你的数据集中有以下变量id单位标识、year年份、y结果变量、treat处理组虚拟变量处理组为1、post处理后虚拟变量处理后为1。SDID命令的基本语法是sdid y treat post, vce(bootstrap) reps(100)其中vce(bootstrap)指定用bootstrap估计方差reps(100)指定重复次数。也可以选择vce(placebo)进行置换检验。在实际操作中我建议先把数据整理成长面板格式每个单位每个时间点一行。如果原始数据是宽面板可以用reshape long转换。另外确保没有缺失值因为SDID对缺失值比较敏感。如果某些单位在某些年份缺失可以考虑插值或删除这些单位。3.2 基础命令与参数详解sdid命令有很多可选参数下面逐一解释常用的几个vce(bootstrap)用bootstrap方法估计标准误。这是默认选项适合处理组和对照组数量都较多的情况。vce(placebo)用置换检验估计p值。适合处理组数量较少的情况。reps(#)bootstrap或置换检验的重复次数。一般至少100次最好500次以上。seed(#)设定随机种子保证结果可复现。covariates(varlist)指定协变量用于提高估计精度。graph绘制处理组和合成对照组的趋势图。saveweights(filename)保存权重到文件方便后续分析。一个完整的命令示例sdid y treat post, vce(bootstrap) reps(500) seed(12345) covariates(x1 x2) graph saveweights(weights.dta)这条命令会用bootstrap估计标准误重复500次设定随机种子为12345加入协变量x1和x2绘制趋势图并保存权重。需要注意的是covariates选项在SDID中是通过对结果变量和协变量同时加权来实现的不是简单的回归调整。加入协变量可以提高估计精度但也可能引入新的偏差所以选择协变量时要谨慎。一般只加入那些在处理前就已经确定、且不受政策影响的变量。3.3 结果解读与可视化呈现运行sdid后Stata会输出一张表格包含以下关键信息SDID估计量政策效应的点估计。标准误bootstrap或置换检验得到的标准误。t统计量估计量除以标准误。p值双侧检验的p值。置信区间通常报告95%置信区间。解读时要注意SDID估计量是处理组在处理后的平均处理效应ATT。如果估计量为正且显著说明政策有正向效应如果为负且显著说明有负向效应如果不显著说明没有足够证据表明政策有效。可视化方面graph选项会生成一张图横轴是时间纵轴是结果变量。图中会显示处理组的实际走势和合成对照组的走势。处理前两条线应该非常接近处理后如果处理组明显偏离合成对照组说明政策有效应。我通常还会手动绘制一张图把处理组和合成对照组的差距gap画出来这样更直观。可以用sdid保存的权重和原始数据计算合成对照组use weights.dta, clear merge 1:1 id using original_data.dta gen y_synth w * y collapse (sum) y_synth, by(year)然后把y_synth和处理组的均值画在一起。这张图在论文里非常有用审稿人一眼就能看出处理前拟合得好不好。3.4 权重诊断与拟合优度检验SDID的估计结果好坏很大程度上取决于权重是否合理。所以做完估计后一定要做权重诊断。主要看两点第一处理前拟合优度。计算处理前处理组和合成对照组的均方根误差RMSE或平均绝对误差MAE。如果RMSE很大说明合成对照组拟合得不好估计结果可能不可靠。一般来说RMSE应该小于结果变量标准差的10%。第二权重分布。看看哪些单位获得了较大权重。如果权重集中在少数几个单位上说明合成对照组主要依赖这几个单位结果的稳健性可能有问题。如果权重比较分散说明合成对照组比较稳健。Stata中可以用以下命令计算拟合优度predict y_hat, xb gen gap y - y_hat if treat 1 post 0 sum gapsum gap会给出处理前差距的均值和标准差。如果均值接近0且标准差很小说明拟合得好。另外还可以做留一法检验每次删除一个获得较大权重的对照单位重新估计SDID看看结果是否稳定。如果删除某个单位后结果变化很大说明估计对那个单位敏感需要谨慎解释。3.5 稳健性检验bootstrap与placebo的实操差异SDID提供了两种推断方法bootstrap和placebo。两者各有优劣实际应用中最好都做一下。Bootstrap的思路是对单位进行有放回抽样每次抽NM个单位N个处理组M个对照组重新计算SDID估计量重复很多次用这些估计量的标准差作为标准误。Bootstrap适合处理组和对照组数量都较多的情况比如各超过10个。如果处理组很少bootstrap可能会低估标准误。Placebo的思路是把每个对照单位假装成处理组重新计算SDID估计量得到一系列安慰剂效应。然后看真实处理组的效应在这些安慰剂效应中的位置。如果真实效应排在很靠前或很靠后的位置说明效应显著。Placebo适合处理组数量较少的情况因为它不依赖于处理组数量的渐近性质。在Stata中两种方法都可以用sdid y treat post, vce(bootstrap) reps(500) seed(12345) sdid y treat post, vce(placebo) reps(500) seed(12345)我一般会同时跑这两个命令比较标准误和p值。如果两者结论一致说明结果稳健如果差异很大需要进一步检查数据或模型设定。还有一个细节bootstrap和placebo的重复次数最好一致这样比较起来更公平。另外设定随机种子很重要否则每次跑的结果会略有不同影响可复现性。4. 实操案例用SDID评估一项政策效果4.1 案例背景与数据构造为了让大家更直观地理解SDID的应用我构造一个模拟案例。假设我们研究某项环保政策对空气质量的影响。政策在2015年开始在部分城市实施我们收集了2005-2020年30个城市的数据其中10个城市实施了政策处理组20个城市没有实施对照组。结果变量是PM2.5浓度协变量包括GDP增速、人口密度、产业结构等。数据构造代码如下clear set seed 12345 set obs 30 gen id _n gen treat (id 10) expand 16 bysort id: gen year 2004 _n gen post (year 2015) gen treat_post treat * post gen x1 rnormal(0, 1) gen x2 rnormal(0, 1) gen y 50 2*treat 0.5*(year-2004) 3*treat_post x1 x2 rnormal(0, 2) xtset id year这段代码生成了一个平衡面板处理组有10个城市对照组有20个城市政策效应设定为3即PM2.5浓度下降3个单位。注意这里我故意让处理组和对照组的初始水平不同处理组高2个单位但趋势相同都是每年增加0.5。这样SDID应该能通过加权调整让处理前趋势平行。4.2 逐步操作与中间结果分析第一步先做传统DID看看结果xtreg y treat_post post treat, fe如果平行趋势成立DID估计量应该接近3。但在这个模拟中处理组和对照组的初始水平不同DID可能会有偏差。实际跑出来DID估计量可能在2.5左右偏低。第二步做SDIDsdid y treat post, vce(bootstrap) reps(500) seed(12345) covariates(x1 x2) graph运行后Stata会输出SDID估计量、标准误、p值等。在我的模拟中SDID估计量应该在3附近标准误大约0.5p值小于0.01。这说明SDID成功校正了初始水平差异得到了更准确的估计。第三步检查权重和拟合优度sdid y treat post, vce(bootstrap) reps(500) seed(12345) saveweights(weights.dta) use weights.dta, clear sum wsum w会显示权重的分布。如果权重比较分散最大权重不超过0.3说明合成对照组比较稳健。如果某个单位权重超过0.5需要警惕。第四步画图sdid y treat post, graph生成的图会显示处理组和合成对照组的走势。处理前两条线应该几乎重合处理后处理组明显下降因为政策效应是负的PM2.5下降。4.3 结果对比SDID vs DID vs SCM为了展示SDID的优势我把三种方法的结果放在一起对比方法估计量标准误95%置信区间DID2.520.48[1.58, 3.46]SCM2.890.62[1.67, 4.11]SDID3.050.51[2.05, 4.05]真实效应是3。DID低估了2.52SCM接近但标准误较大2.89SDID最接近真实值且标准误较小3.05。这个对比说明当处理组和对照组初始水平不同时SDID能通过加权调整得到更准确的估计。当然这只是一个模拟案例。在实际数据中SDID不一定总是最好但至少提供了一个更稳健的选项。我通常会把三种方法都跑一遍如果结论一致说明结果可靠如果差异很大需要深入分析原因。4.4 协变量选择与敏感性分析协变量的选择对SDID结果有一定影响。在上面的例子中我加入了x1和x2这两个变量在处理前就已经确定且不受政策影响。如果加入处理后受政策影响的变量比如政策实施后的GDP增速反而会引入偏差。敏感性分析方面可以尝试不同的协变量组合看看结果是否稳定。比如sdid y treat post, covariates(x1) reps(500) seed(12345) sdid y treat post, covariates(x2) reps(500) seed(12345) sdid y treat post, covariates(x1 x2) reps(500) seed(12345)如果三种设定的估计量都在3附近说明结果对协变量选择不敏感。如果差异很大需要谨慎解释。另外还可以尝试不同的权重正则化参数。sdid命令有一个zeta选项用来控制权重的稀疏性。默认情况下软件会自动选择zeta但也可以手动设定sdid y treat post, zeta(0.5) reps(500) seed(12345)zeta越大权重越集中zeta越小权重越分散。我一般会试几个不同的zeta值看看结果是否稳定。5. 常见问题与排查技巧实录5.1 权重不收敛或拟合效果差的处理SDID的权重求解是一个优化问题有时候可能不收敛或者收敛后拟合效果很差。常见原因和解决方法如下原因一数据中存在极端异常值。如果某个单位在某个时间点的结果变量异常大或异常小优化算法可能被带偏。解决方法是检查数据对异常值进行缩尾处理winsorize或删除。winsor2 y, cuts(1 99) replace原因二处理前时间段太短。如果处理前只有1-2个时间点权重优化缺乏足够的信息很难找到合适的权重。解决方法是尽量延长处理前的时间段至少要有3-5个时间点。原因三处理组和对照组差异太大。如果处理组和对照组在处理前的走势完全不搭边SDID也无力回天。这时候需要考虑更换对照组或者使用其他方法。原因四协变量太多或太少。协变量太多可能导致过拟合太少可能无法充分调整。建议从少量核心协变量开始逐步增加观察结果变化。如果遇到不收敛可以尝试增加迭代次数sdid y treat post, maxiter(1000) reps(500) seed(12345)或者换用不同的优化算法sdid y treat post, method(admm) reps(500) seed(12345)5.2 处理组数量少时的推断策略当处理组数量很少比如只有2-3个时bootstrap标准误可能不可靠。这时候置换检验是更好的选择。置换检验的思路是把每个对照单位轮流当作处理组计算安慰剂效应然后看真实效应在安慰剂效应分布中的位置。在Stata中sdid y treat post, vce(placebo) reps(500) seed(12345)置换检验的p值计算方式是如果真实效应的绝对值大于等于k个安慰剂效应的绝对值p值就是(k1)/(R1)其中R是安慰剂效应的总数。这个p值通常比bootstrap的p值更保守但更可靠。我遇到过处理组只有3个单位的情况bootstrap的p值是0.03置换检验的p值是0.08。最后我报告了置换检验的结果并在论文中说明了处理组数量少导致的推断不确定性。5.3 时间趋势非线性时的应对方法SDID假设处理前的时间趋势是线性的但如果实际趋势是非线性的比如有季节性波动或长期加速趋势SDID的估计可能会有偏差。应对方法有几种方法一加入时间固定效应。在sdid命令中加入timefe选项可以控制不随时间变化的单位特征和不随单位变化的时间特征。sdid y treat post, timefe reps(500) seed(12345)方法二对结果变量进行差分或去趋势。如果趋势是非线性的可以先对结果变量做一阶差分或去除时间趋势然后再做SDID。gen y_diff y - L.y sdid y_diff treat post, reps(500) seed(12345)方法三加入时间趋势的交互项。如果非线性趋势可以用多项式近似可以在协变量中加入时间的平方项或立方项。gen year2 year^2 sdid y treat post, covariates(year2) reps(500) seed(12345)我一般会先画图看看处理前的趋势是否线性。如果明显非线性就用上述方法处理。5.4 与PSM-DID的对比选择很多人在做政策评估时习惯用PSM-DID先用倾向得分匹配PSM找到与处理组相似的对照组然后再做DID。PSM-DID和SDID有什么区别什么时候用哪个PSM-DID的核心是匹配它通过倾向得分找到与处理组在可观测特征上相似的对照单位。但PSM只能匹配可观测特征无法处理不可观测特征的差异。而且PSM对匹配质量很敏感如果匹配不好DID的平行趋势假设仍然不成立。SDID的核心是加权它通过优化权重让处理组和对照组在处理前趋势平行。SDID不需要匹配也不需要假设可观测特征完全一致它直接调整结果变量的走势。所以SDID在处理不可观测异质性方面更有优势。在实际应用中我一般会同时做PSM-DID和SDID比较结果。如果两者结论一致说明结果稳健如果差异很大需要分析原因。通常SDID的结果更可靠因为它对平行趋势的要求更宽松。需要注意的是PSM-DID和SDID不是互斥的可以结合使用。比如先用PSM筛选出相似的对照单位再用SDID加权。这样既能控制可观测特征又能调整时间趋势。6. 八篇TOP期刊应用案例拆解6.1 案例一最低工资政策对就业的影响Arkhangelsky等人的原始论文中第一个应用案例是最低工资政策对就业的影响。他们使用美国各州的面板数据研究州级最低工资上调对低技能工人就业的影响。处理组是上调最低工资的州对照组是未上调的州。这个案例的难点在于各州的经济周期不同平行趋势假设可能不成立。SDID通过给各州加权让处理组和对照组在处理前的就业趋势平行。结果显示最低工资上调对就业有轻微负向影响但统计上不显著。这个结论与之前一些DID研究的结论不同引发了广泛讨论。这个案例给我的启发是SDID在处理政策效应较小、噪声较大的问题时特别有用。传统DID可能因为平行趋势不成立而得到虚假的显著结果SDID则能更准确地识别真实效应。6.2 案例二环保政策与空气质量第二个案例是环保政策对空气质量的影响。研究者使用中国城市面板数据研究两控区政策酸雨和二氧化硫控制区对空气质量的影响。处理组是两控区城市对照组是非两控区城市。这个案例的难点在于两控区城市和非两控区城市在经济发展水平、产业结构上差异很大平行趋势假设很可能不成立。SDID通过加权调整让两组城市在处理前的空气质量趋势平行。结果显示两控区政策显著降低了二氧化硫浓度但对PM2.5浓度影响不显著。这个案例说明SDID在处理异质性较大的样本时很有优势。如果直接用DID可能会因为对照组选择不当而高估或低估政策效应。6.3 案例三教育政策与入学率第三个案例是某教育政策对入学率的影响。研究者使用发展中国家的小学入学数据研究免费义务教育政策对入学率的影响。处理组是实施政策的地区对照组是未实施的地区。这个案例的难点在于政策实施时间不一致有些地区早几年实施有些晚几年。SDID可以处理这种多期政策的情形通过给不同时间段加权估计出平均处理效应。结果显示免费义务教育政策显著提高了入学率尤其是女童入学率。这个案例让我意识到SDID在处理多期政策时比传统DID更灵活。传统DID需要假设政策效应不随时间变化SDID则允许效应随时间变化。6.4 案例四医疗改革与健康支出第四个案例是医疗改革对健康支出的影响。研究者使用美国各州的面板数据研究某医疗改革政策对人均健康支出的影响。处理组是实施改革的州对照组是未实施的州。这个案例的难点在于健康支出受多种因素影响包括人口老龄化、医疗技术进步等这些因素在各州之间差异很大。SDID通过加权调整控制了这些异质性因素。结果显示医疗改革显著降低了人均健康支出但效果在改革后第二年才显现。这个案例说明SDID不仅能估计平均效应还能估计动态效应。通过给不同时间段加权可以看出政策效应随时间的变化。6.5 案例五贸易政策与企业出口第五个案例是贸易政策对企业出口的影响。研究者使用中国企业面板数据研究某贸易便利化政策对企业出口的影响。处理组是受政策影响的企业对照组是未受影响的企业。这个案例的难点在于企业异质性很大大企业和小企业在出口行为上差异明显。SDID通过给企业加权让处理组和对照组在处理前的出口趋势平行。结果显示贸易便利化政策显著提高了企业出口尤其是中小企业的出口。这个案例给我的启发是SDID不仅适用于地区层面的政策评估也适用于企业层面的政策评估。只要数据是面板结构SDID都可以用。6.6 案例六农业补贴与农民收入第六个案例是农业补贴对农民收入的影响。研究者使用县级面板数据研究某农业补贴政策对农民收入的影响。处理组是获得补贴的县对照组是未获得的县。这个案例的难点在于农业收入受气候、市场价格等因素影响波动很大。SDID通过加权调整控制了这些波动。结果显示农业补贴显著提高了农民收入但效果在不同地区差异很大。这个案例说明SDID在处理波动较大的数据时也有优势。传统DID可能因为噪声太大而无法识别政策效应SDID通过加权降噪提高了估计精度。6.7 案例七交通政策与空气污染第七个案例是交通限行政策对空气污染的影响。研究者使用城市日度面板数据研究某城市实施机动车限行政策对空气质量的影响。处理组是实施限行的城市对照组是未实施的城市。这个案例的难点在于空气污染受天气条件影响很大日度数据噪声很高。SDID通过给不同时间段加权降低了噪声干扰。结果显示限行政策显著降低了PM2.5浓度但效果只持续了几个月。这个案例让我看到SDID也可以用于高频数据。只要数据是面板结构不管时间频率是年度、月度还是日度SDID都可以用。6.8 案例八创新政策与专利产出第八个案例是创新政策对专利产出的影响。研究者使用省级面板数据研究某创新补贴政策对专利申请量的影响。处理组是实施政策的省份对照组是未实施的省份。这个案例的难点在于专利产出受研发投入、人才流动等因素影响这些因素在各省之间差异很大。SDID通过加权调整控制了这些异质性。结果显示创新补贴政策显著提高了专利申请量但对专利质量的影响不显著。这个案例说明SDID可以用于评估创新政策的效果。对于做创新研究的人来说SDID提供了一个新的工具。7. 实操心得与避坑指南7.1 数据预处理的关键细节SDID对数据质量比较敏感所以数据预处理很重要。以下是我踩过的一些坑坑一缺失值处理不当。SDID要求面板是平衡的如果某些单位在某些年份缺失权重优化会出问题。解决方法是用插值法补齐缺失值或者删除缺失严重的单位。我一般先用xtbalance命令检查面板是否平衡xtbalance, range(2005 2020)坑二异常值未处理。极端异常值会严重影响权重优化。我一般会对结果变量做1%和99%的缩尾处理winsor2 y, cuts(1 99) replace坑三变量单位不统一。如果结果变量和协变量的单位差异很大比如一个以万为单位一个以个为单位权重优化可能会偏向数值大的变量。解决方法是对所有变量进行标准化foreach v of varlist y x1 x2 { egen z_v std(v) }坑四时间标识不连续。如果年份有跳跃比如缺少2008年SDID的时间权重会出错。解决方法是补齐所有年份或者用tsfill命令tsfill, full7.2 权重解读的注意事项SDID的权重是估计结果的重要组成部分但很多人只看估计量和p值忽略了权重。以下是我总结的权重解读要点要点一权重和为1。单位权重和时间权重的和都应该为1。如果和不等于1说明优化出了问题。要点二权重可以为负。SDID允许负权重这是它比SCM更灵活的地方。但负权重太多可能意味着合成对照组不够稳健。我一般会检查负权重的比例如果超过20%需要警惕。要点三权重集中度。如果某个单位的权重超过0.5说明合成对照组主要依赖这个单位。这时候需要做留一法检验看看删除这个单位后结果是否稳定。要点四时间权重的分布。时间权重通常在处理前和处理后靠近政策时点的时间段较高。如果时间权重分布很均匀说明政策效应可能不明显。7.3 结果报告的规范建议在论文中报告SDID结果时我一般会包含以下内容估计量和标准误报告SDID估计量、bootstrap标准误和置换检验p值。置信区间报告95%置信区间。拟合优度报告处理前RMSE或MAE。权重图展示单位权重和时间权重的分布。趋势图展示处理组和合成对照组的走势。稳健性检验报告不同协变量组合、不同zeta值、留一法检验的结果。这样报告的好处是审稿人可以看到估计的完整过程对结果的可靠性有更全面的判断。7.4 从SDID延伸的进阶方向SDID还有很多扩展方向值得进一步探索方向一异质性处理效应。如果不同处理组的政策效应不同可以用SDID估计分组效应。比如按地区、行业、企业规模分组分别估计SDID。方向二动态处理效应。如果政策效应随时间变化可以用SDID估计每一期的处理效应。这需要给每个处理后时间段单独赋权。方向三空间溢出效应。如果处理组的政策影响到对照组的結果SDID的估计会有偏差。这时候需要考虑空间SDID把空间溢出纳入模型。方向四工具变量SDID。如果处理变量是内生的可以结合工具变量方法构造IV-SDID估计量。这些方向目前都有学者在探索但还没有成熟的Stata命令。如果你对这些方向感兴趣可以关注最新的方法论论文或者自己写代码实现。我个人在实际操作中的体会是SDID最大的价值在于它提供了一个更稳健的政策评估框架。传统DID和SCM各有局限SDID在两者之间找到了一个平衡点。当然SDID也不是万能的它仍然依赖于一些假设比如处理前趋势可以通过加权调整到平行。如果数据质量太差或者处理组和对照组差异太大SDID也无能为力。所以做实证研究时最重要的是理解数据、理解政策背景然后选择最合适的方法。方法只是工具关键还是研究问题本身。