楼主: smztsmzt
30776 24

[学习心得] 双重差分DID平行趋势检验中 完全共线性及coefplot画图问题 解决方法   [推广有奖]

  • 0关注
  • 9粉丝

硕士生

3%

还不是VIP/贵宾

-

威望
0
论坛币
2932 个
通用积分
405.1016
学术水平
73 点
热心指数
72 点
信用等级
62 点
经验
1206 点
帖子
51
精华
0
在线时间
129 小时
注册时间
2011-4-7
最后登录
2024-4-1

楼主
smztsmzt 在职认证  发表于 2018-12-10 22:24:10 |只看作者 |坛友微信交流群|倒序 |AI写论文
相似文件 换一批

+2 论坛币
k人 参与回答

经管之家送您一份

应届毕业生专属福利!

求职就业群
赵安豆老师微信:zhaoandou666

经管之家联合CDA

送您一个全额奖学金名额~ !

感谢您参与论坛问题回答

经管之家送您两个论坛币!

+2 论坛币
如何解决 双重差分DID平行趋势检验中 完全共线性及coefplot画图问题

按照目前网上推荐的常见做法进行DID平行趋势检验时,如果数据库(平衡面板数据)所有时点均编码且参与模型运算会出现共线性问题,如果指定某一时点不纳入模型会在后期使用coefplot命令绘制图形无法加入该时点,以下给出另外一种思路进行平行趋势检验,同时解决相关问题。如有不当,请指正。
  1. /*
  2. 如何解决 双重差分DID平行趋势检验中 完全共线性 及 coefplot绘制被剔除变量的问题
  3. 以 爬虫俱乐部 2017-06-02 的帖子数据为例
  4. Author:ypp
  5. Date:2018-12-10
  6. */

  7. // 生成平衡面板数据
  8. clear
  9. set more off
  10. set obs 200
  11. set seed 123456789

  12. gen Treat=(uniform()<=0.6)

  13. //bysort Treat: gen int group=(uniform()+0.2)*90+Treat*90+1 // 原帖此处生成的是非平衡面板
  14. gen group=_n // 以下生成平衡面板数据
  15. gen test=10 // 每个个体10年的记录
  16. expand test
  17. sort Treat group
  18. drop test

  19. bysort group: gen year=2016-_n+1 // 2007年-2016年

  20. gen Post=(year>=2012) // 2012年 实验组 Treat=1 受到一个外生政策影响
  21. gen y=ln(1+uniform()*100)
  22. replace y=y + ln(uniform()*10+rnormal()*3) if Treat==1 & Post==1 // 受rnormal影响有缺失值
  23. gen x1=rnormal()*3
  24. gen x2=rnormal()+uniform()

  25. gen Dyear=year-2012

  26. // 方法一:以下代码按照网络推荐的普遍做法 将Dyear与Treat=1设置交互项 数据库里所有年份都设置
  27. gen Before5=(Dyear==-5 & Treat==1) // 2007年
  28. lab var Before5 "5 Year Prior"

  29. gen Before4=(Dyear==-4 & Treat==1) // 2008年
  30. lab var Before4 "4 Year Prior"

  31. gen Before3=(Dyear==-3 & Treat==1) // 2009年
  32. lab var Before3 "3 Year Prior"

  33. gen Before2=(Dyear==-2 & Treat==1) // 2010年
  34. lab var Before2 "2 Year Prior"

  35. gen Before1=(Dyear==-1 & Treat==1) // 2011年
  36. lab var Before1 "1 Year Prior"

  37. gen Current=(Dyear==0 & Treat==1) // 2012年
  38. lab var Current "Year of Adoption"

  39. gen After1=(Dyear==1 & Treat==1) // 2013年
  40. lab var After1 "1 Year After"

  41. gen After2=(Dyear==2 & Treat==1) // 2014年
  42. lab var After2 "2 Year After"

  43. gen After3=(Dyear==3 & Treat==1) // 2015年
  44. lab var After3 "3 Year After"

  45. gen After4=(Dyear==4 & Treat==1) // 2016年
  46. lab var After4 "4 Year After"

  47. xtset group year

  48. // After4因为完全共线性被自动剔除 2016年因为完全共线性被自动剔除
  49. // Treat为个体异质性不随时间变化被自动剔除
  50. xi:xtreg y Treat Post Before5 Before4 Before3 Before2 Before1 Current ///
  51. After1 After2 After3 After4 x1 x2 i.year,fe vce(robust)
  52. est store reg1_1

  53. // 不包含Current在模型,After4不因为完全共线性被自动剔除 其他变量自动剔除原因同上模型
  54. // 没有包含在模型的Current在后续coefplot绘图中难以绘制 被模型自动剔除的可以绘制
  55. xi:xtreg y Treat Post Before5 Before4 Before3 Before2 Before1 ///
  56. After1 After2 After3 After4 x1 x2 i.year,fe vce(robust)
  57. est store reg1_2

  58. // 方法二:以下方法可以解决coefplot绘制时无法加入current的问题 结果同reg1_2
  59. // 这种方法适用于平衡面板,所有时间全部编码并参与模型运算

  60. tabulate Dyear,gen(ytest)
  61. replace ytest6=0 // 2012年 对应上述方法的Current当Treat=1时
  62. tabulate ytest6 Current if Treat==1,m

  63. // 参考本论坛《倍差法(双重差分 DID)的推导与扩展》帖子中的多期两组DID模型推导
  64. // 与标准的DID模型一致 纳入Treat Time Treat#Time 普通DID模型中Time为两期,在平行趋势检验中Time为多期
  65. // 1.ytest6作为参照组被自动剔除 ytest6#Treat作为参照组被自动剔除
  66. xtreg y i.Treat /// // Treat为组别变量 标示干预组 对照组
  67. i.ytest1 i.ytest2 i.ytest3 i.ytest4 i.ytest5 i.ytest6 i.ytest7 i.ytest8 i.ytest9 i.ytest10 /// // ytest为干预时点变量 标示干预前后每个时点 包含干预当期 不需纳入Post变量
  68. i.ytest1#i.Treat i.ytest2#i.Treat i.ytest3#i.Treat i.ytest4#i.Treat i.ytest5#i.Treat /// // ytest和Treat的交互项 干预每个时点和组别的交互项
  69. i.ytest6#i.Treat i.ytest7#i.Treat i.ytest8#i.Treat i.ytest9#i.Treat i.ytest10#i.Treat ///
  70. x1 x2 /// // 其他控制的协变量
  71. ,fe vce(robust)
  72. est store reg2

  73. /*
  74. 比较模型reg1_2和reg2
  75. reg2中ytest1#Treat的系数与标准误 与 reg1_2中的Before1完全一致 都是-1.686,0.204
  76. 同理,reg2中其他ytest?#Treat的交互项 与 reg1_2中对应的Before或者After完全一致
  77. 两个模型 x1 x2 估计结果也一致
  78. reg2中1.ytest? 与 reg1_2对应的年份估计结果不一致 因为参照标准不一样 且 除对照年份外其他年份没有被剔除
  79. re2中无需纳入Post变量,reg1_2中不纳入Post变量,其他参数估计结果也无变化
  80. */

  81. // 在轴属性中查看"编辑或添加单个刻度和标签" ,可以看见所有的干预时点都在图形中包括参照组
  82. 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) ///
  83. vertical recast(connect) yline(0) omitted

  84. /*
  85. 综上,按照多期两组模型来检验平行趋势更好 参考本论坛《倍差法(双重差分 DID)的推导与扩展》
  86. 一是便于理解 与 普通两期两组模型理解完全一致
  87. 二是不会出现共线性问题
  88. 三是方便绘制图形
  89. */
复制代码


二维码

扫码加我 拉你入群

请注明:姓名-公司-职位

以便审核进群资格,未注明则拒绝

关键词:共线性

已有 6 人评分经验 论坛币 学术水平 热心指数 信用等级 收起 理由
村口翠花 + 5 + 1 + 1 精彩帖子
Sunknownay + 3 + 3 + 3 鼓励积极发帖讨论
水十早月 + 1 + 1 精彩帖子
rhapsodyr + 3 + 3 热心帮助其他会员
txje + 2 + 2 + 2 精彩帖子
我的素质低 + 100 + 20 + 2 + 2 + 2 精彩帖子

总评分: 经验 + 100  论坛币 + 25  学术水平 + 12  热心指数 + 12  信用等级 + 7   查看全部评分

沙发
ww19930125 发表于 2019-3-21 20:26:56 |只看作者 |坛友微信交流群
楼主好,请问如何指定stata omit掉给定的一期呢?感觉它是随机omit的

使用道具

藤椅
smztsmzt 在职认证  发表于 2019-3-28 15:46:43 |只看作者 |坛友微信交流群
ww19930125 发表于 2019-3-21 20:26
楼主好,请问如何指定stata omit掉给定的一期呢?感觉它是随机omit的
可以通过操作i. 符号去掉指定的一期,就是不包括进方程即可,自动应该是第一期或最后一期

使用道具

板凳
造化5 发表于 2019-7-3 11:13:21 |只看作者 |坛友微信交流群
Treat 被 omit 是不是因为 fe 已经包含了所有的处理组对照组?

使用道具

报纸
smztsmzt 在职认证  发表于 2019-7-20 18:16:06 |只看作者 |坛友微信交流群
造化5 发表于 2019-7-3 11:13
Treat 被 omit 是不是因为 fe 已经包含了所有的处理组对照组?
是的,应该是这个理解

使用道具

地板
aannan 发表于 2019-8-7 14:38:35 |只看作者 |坛友微信交流群
smztsmzt 发表于 2019-3-28 15:46
可以通过操作i. 符号去掉指定的一期,就是不包括进方程即可,自动应该是第一期或最后一期
你好可以告诉一下具体命令吗?刚学stata不知道怎么写?谢谢,摆脱了

使用道具

7
littleecho123 发表于 2019-8-10 19:17:25 |只看作者 |坛友微信交流群
我按照你的方法做出来后,(1)系数不太一样;(2)画图后,多重共线仍然存在,没有处理掉多重共线omit呢

使用道具

8
LWFISS 发表于 2019-11-19 13:10:30 |只看作者 |坛友微信交流群
造化5 发表于 2019-7-3 11:13
Treat 被 omit 是不是因为 fe 已经包含了所有的处理组对照组?
你好,我也遇到了这个问题,怎么解决呢,只能用reg回归吗

使用道具

9
造化5 发表于 2019-11-20 19:24:31 |只看作者 |坛友微信交流群
LWFISS 发表于 2019-11-19 13:10
你好,我也遇到了这个问题,怎么解决呢,只能用reg回归吗
不加Treat就好

使用道具

10
震震果实 发表于 2019-11-20 23:12:01 来自手机 |只看作者 |坛友微信交流群
码住细看

使用道具

您需要登录后才可以回帖 登录 | 我要注册

本版微信群
加好友,备注jltj
拉您入交流群

京ICP备16021002-2号 京B2-20170662号 京公网安备 11010802022788号 论坛法律顾问:王进律师 知识产权保护声明   免责及隐私声明

GMT+8, 2024-4-26 13:44