PSM与DID的结合是一段“孽缘”
许久以来,很多朋友都希望我出一期有关双重差分倾向得分匹配方法(PSM-DID)的内容,但我一直迟迟没有动笔。事实上,我个人并不喜欢这一方法,也并不推荐大家使用这一方法,因为 PSM-DID压根就不是什么“灵丹妙药”,在应用中问题颇多 。也许你在一些top期刊上经常看到PSM-DID的身影,但这并不意味着它就没有问题。
双重差分倾向得分匹配方法(PSM-DID)是倾向得分匹配(PSM)与双重差分法(DID)的有机结合(DID是主,PSM是次),但是这一结合事实上就是一段“孽缘”。我们的理想很美好,PSM模型负责寻找与处理组尽可能相似的控制组(根据倾向得分),DID模型负责评估政策带来的影响。
图片来源:谢申祥、范鹏飞和宛圆渊(2021)论文《传统PSM-DID 模型的改进与应用》
然而现实很残酷, PSM模型适用于截面数据,而DID适用于面板数据 。二者适用的数据类型不同,如何在面板数据中应用PSM模型就成了PSM-DID模型无法回避的问题,为了解决这一问题,学者们一般有两种解决方案, 一种是将面板数据当做横截面数据进行处理(混合匹配),另一种是在面板数据的每期截面上进行逐期匹配 。事实上,这两种方案都并不完善,下面我将分别阐述它们在应用中所存在的问题。
混合匹配
混合匹配是将面板数据当做横截面数据进行处理,为处理组的每条观测值匹配一条控制组的观测值。接下来,我就使用石大千等(2018)发表在《中国工业经济》上的论文《智慧城市建设能否降低环境污染》使用的数据,给大家展示一下混合匹配的Stata操作以及混合匹配带来的问题。
原文信息
石大千,丁海,卫平,刘建江.智慧城市建设能否降低环境污染[J].中国工业经济,2018(06):117-135.
首先,我们需要产生随机数,对样本进行排序。为了保证结果可复现,我就设定种子值为
20210415
。
set seed 20210415
gen tmp=runiform()
sort tmp
接下来,我们可以使用
psmatch2
命令(外部命令需要安装
ssc install psmatch2, replace
)进行倾向得分匹配,我选择的匹配方法是一对一近邻匹配。其中,
du
是处理组虚拟变量;
$xlist
是协变量(控制变量);选择项
out()
用来指定结果变量
y
,这里填入DID模型的被解释变量即可;选择项
logit
表示使用logit模型来估计倾向得分,默认方法是probit;选择项
common
表示仅对共同取值范围内个体进行匹配;选择项ate表示同时汇报ATE、ATU和ATT。
. psmatch2 du $xlist , out(lnrso) logit neighbor(1) common ate //近邻匹配
打开数据编辑窗口,我们会发现软件自动生成了几个新变量。其中
_pscore
是每个观测值对应的倾向得分;
_treated
表示某个对象是否处理组;
_support
表示观测对象是否在共同取值范围内;
_weight
是观测对象用于匹配的频率,如果
_weight
为空值,那就说明虽然你看上了对方(会有一个匹配对象),但是你并没有被对方看上(对方匹配上的不是你);
_id
是自动生成的每一个观测对象唯一的ID;
_n1
表示的是他被匹配到的对照对象的
_id
(如果是1:3匹配,还会生成_n2, _n3);
_pdif
表示一组匹配了的观察对象他们概率值的差。
最后,我们只需去掉匹配不成功的样本(即
_weight
为空值的样本),然后再用DID方法去进行估计就可以了。PSM-DID估计结果显示,交互项
dudt
的系数为-0.1781016,表明智慧城市建设显著降低了约17.81%的人均废气排放量。
. drop if _weight==.
(1,467 observations deleted)
. reghdfe lnrso dudt $xlist ,absorb(c year) vce(cluster c) //DID估计
(dropped 21 singleton observations)
(MWFE estimator converged in 7 iterations)
HDFE Linear regression Number of obs = 1,207
Absorbing 2 HDFE groups F( 7, 218) = 2.12
Statistics robust to heteroskedasticity Prob > F = 0.0423
R-squared = 0.8880
Adj R-squared = 0.8608
Within R-sq. = 0.0350
Number of clusters (c) = 219 Root MSE = 0.4147
(Std. Err. adjusted for 219 clusters in c)
------------------------------------------------------------------------------
| Robust
lnrso | Coef. Std. Err. t P>|t| [95% Conf. Interval]
-------------+----------------------------------------------------------------
dudt | -.1781016 .0834432 -2.13 0.034 -.3425604 -.0136429
lnrgdp | 2.101315 1.207922 1.74 0.083 -.2793847 4.482014
lntgdp | -.0910883 .0572348 -1.59 0.113 -.2038928 .0217162
lninno | .1235118 .0676161 1.83 0.069 -.009753 .2567767
lnurb | .1283764 .064476 1.99 0.048 .0013002 .2554525
lnopen | .0317352 .0459506 0.69 0.491 -.0588291 .1222995
lnss | -.1781226 .3485232 -0.51 0.610 -.865029 .5087837
_cons | -13.93434 6.665826 -2.09 0.038 -27.07205 -.7966249
------------------------------------------------------------------------------
Absorbed degrees of freedom:
-----------------------------------------------------+
Absorbed FE | Categories - Redundant = Num. Coefs |
-------------+---------------------------------------|
c | 219 219 0 *|
year | 11 0 11 |
-----------------------------------------------------+
* = FE nested within cluster; treated as redundant for DoF computation
不过,这一估计结果并不可信,因为混合匹配存在“时间错配”的问题,即某一期的处理组观测对象,可能与不同期的控制组观测对象相匹配。例如,你会惊奇的发现,2006年的遵义市居然匹配上的是2014年的佳木斯市,时隔八年,还有什么可比性呢?这种“时间错配”现象在混合匹配中是一种常态,它带来的后果就是我们无法有效控制时间固定效应,从而使得DID估计产生偏差。
. list c year city prov _treated _id _n1 if _id==379|_id==1915
+------------------------------------------------------------+
| c year city prov _treated _id _n1 |
|------------------------------------------------------------|
1. | 61 2014 佳木斯市 黑龙江省 Untreated 379 1915 |
1220. | 242 2006 遵义市 贵州省 Treated 1915 379 |
+------------------------------------------------------------+
很多中文论文在使用PSM-DID方法时,对于匹配的细节都“缄口不言”,加之又没有要求公布数据和代码,所以我们并不知道哪些中文文献使用了这种“糟糕的”匹配方案,但我估计应该不在少数。我们不能说混合方案就是错的,毕竟也算是一种匹配的“野路子”,但我还是建议大家不要使用混合匹配!
逐期匹配
逐期匹配是在面板数据的每期截面上都进行一次匹配。逐期匹配能够较好地解决“时间错配”问题,但这种匹配方案也存在缺陷——对照组的不稳定性(逐期匹配不能为DID模型筛选到稳定的对照组,处理组个体
i
在每期的匹配对象可能均不相同,混合匹配当然也存在这一问题)。对于同一个处理组个体,其对照对象如果在政策时点前后发生较大改变,将会导致个体固定效应的估计出现偏差,进而影响到DID模型的稳定性。除此之外,逐期匹配存在着其他问题,大家有兴趣可以去阅读《传统PSM-DID模型的改进与应用》这篇论文。
参考资料(推荐阅读)
谢申祥,范鹏飞,宛圆渊.传统PSM-DID模型的改进与应用[J].统计研究,2021,38(02):146-160.
相比混合匹配,逐期匹配算是一种差强人意的解决方案,也是top期刊论文使用较多的匹配方案。逐期匹配的Stata操作其实也很简单,首先分年份进行匹配,然后保存每一年的匹配结果,最后合并各个年份的匹配结果就好(借用循环很方便)!
forvalues i = 2005/2015{
use smart_city2018.dta,clear
keep if year==`i'
set seed 20210415
gen tmp=runiform()
sort tmp
psmatch2 du $xlist , out(lnrso) logit neighbor(1) common ate
drop if _weight==.
save psmdid_`i',replace