按照目前网上推荐的常见做法进行DID平行趋势检验时,如果数据库(平衡面板数据)所有时点均编码且参与模型运算会出现共线性问题,如果指定某一时点不纳入模型会在后期使用coefplot命令绘制图形无法加入该时点,以下给出另外一种思路进行平行趋势检验,同时解决相关问题。如有不当,请指正。
- /*
- 如何解决 双重差分DID平行趋势检验中 完全共线性 及 coefplot绘制被剔除变量的问题
- 以 爬虫俱乐部 2017-06-02 的帖子数据为例
- Author:ypp
- Date:2018-12-10
- */
- // 生成平衡面板数据
- clear
- set more off
- set obs 200
- set seed 123456789
- gen Treat=(uniform()<=0.6)
- //bysort Treat: gen int group=(uniform()+0.2)*90+Treat*90+1 // 原帖此处生成的是非平衡面板
- gen group=_n // 以下生成平衡面板数据
- gen test=10 // 每个个体10年的记录
- expand test
- sort Treat group
- drop test
- bysort group: gen year=2016-_n+1 // 2007年-2016年
- gen Post=(year>=2012) // 2012年 实验组 Treat=1 受到一个外生政策影响
- gen y=ln(1+uniform()*100)
- replace y=y + ln(uniform()*10+rnormal()*3) if Treat==1 & Post==1 // 受rnormal影响有缺失值
- gen x1=rnormal()*3
- gen x2=rnormal()+uniform()
- gen Dyear=year-2012
- // 方法一:以下代码按照网络推荐的普遍做法 将Dyear与Treat=1设置交互项 数据库里所有年份都设置
- gen Before5=(Dyear==-5 & Treat==1) // 2007年
- lab var Before5 "5 Year Prior"
- gen Before4=(Dyear==-4 & Treat==1) // 2008年
- lab var Before4 "4 Year Prior"
- gen Before3=(Dyear==-3 & Treat==1) // 2009年
- lab var Before3 "3 Year Prior"
- gen Before2=(Dyear==-2 & Treat==1) // 2010年
- lab var Before2 "2 Year Prior"
- gen Before1=(Dyear==-1 & Treat==1) // 2011年
- lab var Before1 "1 Year Prior"
- gen Current=(Dyear==0 & Treat==1) // 2012年
- lab var Current "Year of Adoption"
- gen After1=(Dyear==1 & Treat==1) // 2013年
- lab var After1 "1 Year After"
- gen After2=(Dyear==2 & Treat==1) // 2014年
- lab var After2 "2 Year After"
- gen After3=(Dyear==3 & Treat==1) // 2015年
- lab var After3 "3 Year After"
- gen After4=(Dyear==4 & Treat==1) // 2016年
- lab var After4 "4 Year After"
- xtset group year
- // After4因为完全共线性被自动剔除 2016年因为完全共线性被自动剔除
- // Treat为个体异质性不随时间变化被自动剔除
- xi:xtreg y Treat Post Before5 Before4 Before3 Before2 Before1 Current ///
- After1 After2 After3 After4 x1 x2 i.year,fe vce(robust)
- est store reg1_1
- // 不包含Current在模型,After4不因为完全共线性被自动剔除 其他变量自动剔除原因同上模型
- // 没有包含在模型的Current在后续coefplot绘图中难以绘制 被模型自动剔除的可以绘制
- xi:xtreg y Treat Post Before5 Before4 Before3 Before2 Before1 ///
- After1 After2 After3 After4 x1 x2 i.year,fe vce(robust)
- est store reg1_2
- // 方法二:以下方法可以解决coefplot绘制时无法加入current的问题 结果同reg1_2
- // 这种方法适用于平衡面板,所有时间全部编码并参与模型运算
- tabulate Dyear,gen(ytest)
- replace ytest6=0 // 2012年 对应上述方法的Current当Treat=1时
- tabulate ytest6 Current if Treat==1,m
- // 参考本论坛《倍差法(双重差分 DID)的推导与扩展》帖子中的多期两组DID模型推导
- // 与标准的DID模型一致 纳入Treat Time Treat#Time 普通DID模型中Time为两期,在平行趋势检验中Time为多期
- // 1.ytest6作为参照组被自动剔除 ytest6#Treat作为参照组被自动剔除
- xtreg y i.Treat /// // Treat为组别变量 标示干预组 对照组
- i.ytest1 i.ytest2 i.ytest3 i.ytest4 i.ytest5 i.ytest6 i.ytest7 i.ytest8 i.ytest9 i.ytest10 /// // ytest为干预时点变量 标示干预前后每个时点 包含干预当期 不需纳入Post变量
- i.ytest1#i.Treat i.ytest2#i.Treat i.ytest3#i.Treat i.ytest4#i.Treat i.ytest5#i.Treat /// // ytest和Treat的交互项 干预每个时点和组别的交互项
- i.ytest6#i.Treat i.ytest7#i.Treat i.ytest8#i.Treat i.ytest9#i.Treat i.ytest10#i.Treat ///
- x1 x2 /// // 其他控制的协变量
- ,fe vce(robust)
- est store reg2
- /*
- 比较模型reg1_2和reg2
- reg2中ytest1#Treat的系数与标准误 与 reg1_2中的Before1完全一致 都是-1.686,0.204
- 同理,reg2中其他ytest?#Treat的交互项 与 reg1_2中对应的Before或者After完全一致
- 两个模型 x1 x2 估计结果也一致
- reg2中1.ytest? 与 reg1_2对应的年份估计结果不一致 因为参照标准不一样 且 除对照年份外其他年份没有被剔除
- re2中无需纳入Post变量,reg1_2中不纳入Post变量,其他参数估计结果也无变化
- */
- // 在轴属性中查看"编辑或添加单个刻度和标签" ,可以看见所有的干预时点都在图形中包括参照组
- coefplot reg2, drop (0.ytest6 1.ytest1 1.ytest2 1.ytest3 1.ytest4 1.ytest5 1.ytest7 1.ytest8 1.ytest9 1.ytest10 x1 x2 1.Treat _cons) ///
- vertical recast(connect) yline(0) omitted
- /*
- 综上,按照多期两组模型来检验平行趋势更好 参考本论坛《倍差法(双重差分 DID)的推导与扩展》
- 一是便于理解 与 普通两期两组模型理解完全一致
- 二是不会出现共线性问题
- 三是方便绘制图形
- */