偷偷告诉你一个调整平行趋势不满足的方法 屡试不爽(附代码)

发布日期:2025-11-23 13:19    点击次数:155

  

各位做实证研究的小伙伴们,大家好!相信很多朋友在做DID分析时都遇到过这样的困扰:平行趋势假设总是很难达到预期的要求。明明理论上处理组和对照组应该满足平行趋势,但事件研究法的图形总是显示政策前就存在显著的系数,让人怀疑是不是识别策略出了问题。

别着急,今天给大家介绍一个特别实用的方法——平行趋势去均值,这可是一个能够有效实现'调平行趋势'的神器。通过这个方法,我们可以剔除那些由混杂因素造成的'假象',让真正的政策效应浮出水面。

为什么传统的平行趋势检验总是'不达标'

相信大家都有过这样的经历:花了很长时间构建DID模型,满怀期待地跑出事件研究法的结果,却发现政策前的系数显著不为零。这时候心里就开始犯嘀咕:是不是数据有问题?还是模型设定不对?

其实啊,这种情况比我们想象的要常见得多。在现实的研究环境中,即使处理组和对照组在政策前确实遵循相似的发展轨迹,但由于存在各种难以观测的混杂因素,我们估计出来的政策前系数往往不为零。这就好比拍照时的背景噪音,虽然不影响主体,但会干扰我们对图像的判断。

去均值方法的核心思路

去均值方法的核心思想其实很朴素:既然政策前的那些非零系数主要是由混杂因素造成的'系统性偏差',那我们就把这部分偏差统一'减掉',让真正的政策效应显露出来。

具体来说,我们先计算政策前所有系数的平均值,然后用每个系数减去这个平均值。这样做的妙处在于,调整后的政策前系数平均值恰好为零,而政策后的效应也相应地去除了同样的偏差,从而得到更纯净的政策影响。

用数学公式表达就是:

手把手教你实现去均值方法第一步:照常生成动态处理变量

这一步和传统方法完全一样,我们以多期DID为例:

gen policy = (year >= action)bys id:egen gvar = min(action) gen nevertreat =(gvar==.)gen rel_time = year - gvarforvalues i = 5(-1)1{    gen pre_`i' = (rel_time == -`i' & nevertreat == 0)}gen current = (rel_time== 0 & nevertreat == 0)forvalues j = 1(1)6{    gen post_`j' = (rel_time == `j' & nevertreat == 0)}drop pre_1  // 删除基准期第二步:跑事件研究法回归

这里也和平时一样:

reghdfe 因变量 pre_* current post_* 控制变量, absorb(ind#year stkcd) vce(cluster city)
第三步:这里开始'变魔术'

关键的去均值处理来了!首先用parmest命令把回归系数提取出来:

parmest, format(estimate min95 max95 %8.3f p %8.3f) saving('temp1.dta', replace)use 'temp1.dta', clearkeep if ustrregexm(parm, 'pre|post')  // 只保留我们关心的动态效应系数gen num = _n  // 给系数编个号gen minus = num if ustrregexm(parm, 'current')  // 找到政策当期的位置fillmissing minusgen id = num - minus  // 计算相对于政策当期的位置

接下来就是核心的去均值操作:

egen average = mean(estimate) if id < -1  // 计算政策前系数的平均值fillmissing average  // 把这个平均值填充到所有行replace estimate = estimate - average  // 每个系数都减去这个平均值
第四步:重新计算置信区间并画图gen ul = estimate stderr * 1.65  // 重新计算置信区间gen ll = estimate - stderr * 1.65for var estimate ul ll: replace X = 0 if mi(t)  // 基准期设为0#delimit ;two (scatter estimate id, c(l) color(black) msize(small))    (scatter ul id, c(l) m(none) color(gs5) lp(dash))    (scatter ll id, c(l) m(none) color(gs5) lp(dash)),    yline(0, lp(dash) lc(gs10))    xline(-1, lp(dash) lc(gs10))    xlabel(-5(1)6, nogrid labsize(small))    ylabel(, nogrid format(%4.2f) labsize(small))    xtitle('相对时间') ytitle('政策效应')    legend(off) graphregion(color(white));#delimit cr为什么这个方法这么有效

去均值方法的魅力在于它的直观性和有效性。想象一下,如果我们观察到的政策前系数都在某个水平线上下波动,那么这个水平线很可能就代表了系统性偏差。通过去除这个偏差,我们就能看到真正的相对变化趋势。

更重要的是,这种调整是对称的。也就是说,政策前和政策后的系数都被减去了同样的数值,所以政策效应的相对大小并没有被人为夸大或缩小,只是去除了'背景噪音'。

什么时候该用这个方法

朋友们可能会问:什么情况下需要用去均值方法呢?我的建议是:

当你发现传统的平行趋势检验显示政策前存在显著系数,但从理论和现实情况看,处理组和对照组确实应该满足平行趋势时,就可以考虑使用这个方法。特别是在面临复杂的政策环境,存在很多难以控制的混杂因素时,去均值方法能够帮你获得更可信的结果。

当然,使用这个方法时也要诚实。在论文中应该同时报告传统方法和去均值方法的结果,让读者了解调整前后的差异,这样才能增强研究的透明度和可信度。

小贴士和注意事项

使用去均值方法时有几个小细节需要注意。首先,确保你有足够的政策前观测期,这样计算出来的平均值才会比较稳定。其次,这个方法的前提是认为政策前的非零系数主要来自混杂因素,如果你的研究背景不符合这个假设,就需要谨慎使用了。

最后,记得在展示结果时做好标注,让读者知道你使用了去均值调整。毕竟,透明的研究过程是获得同行认可的重要基础。

本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请点击举报。

Powered by 雷火电竞竞猜到推广微信下拉5 @2013-2022 RSS地图 HTML地图

Copyright Powered by365建站 © 2013-2024