如何用Stata完成(shui)一篇经济学论文(十五):平行性趋势检验与安慰剂检验
目录
- 平行性趋势检验
- 安慰剂检验
本来打算把DID讲一讲,结果网页上一搜,讲DID的还是挺多的,另外DID相对于RD好理解得多,也没有什么需要着重解释的东西,所以就直接写写平行性趋势检验和安慰剂检验over。第一次写博客,这个专栏断断续续两个多月才完成,总体来说我还是挺满意的,哈哈哈哈。以后stata也没啥好讲的,有机会用这个博客写写数据分析的随笔(当然也要看我input怎么样)。Stata系列最后一篇,完结撒花~~
平行性趋势检验
- 时间趋势图
平行性趋势检验最简单粗暴的方法就是画时间趋势图,将控制组和对照组随着时间的趋势在同一张图中表现出来,如果事件前两组趋势平行,事件后,两组的趋势开始产生差异,说明DID的前提性假设成立。具体如何画图请参考画线性图。
这里需要注意的一点是,如果你的数据频率比较高,时间跨度大(如日度数据,持续三年),最好将原始数据以月份或者季度为单位取均值,这样图形看起来比较清晰,从而不会被误会没有进行平行性趋势检验(别问我怎么知道的)。 - 画系数与置信区间图
这个方法更为科学令人信服,依然用我们前面说的日度数据、持续三年举例子,如果政策实施时间点为最后一年,那么我们使用季度(或者半年度)的虚拟时间变量与treatment group产生交互,形成一个具有多个交互项的回归式。
我们传统的DID模型是这样:
y c t = β 0 + β 1 p o s t c + β 2 t r e a t t + δ p o s t c × t r e a t t + λ X c t + ξ c t y_{ct}=\beta_{0}+\beta_{1}post_{c}+\beta_{2}treat_{t}+\delta post_{c}\times treat_{t}+\lambda X_{ct}+\xi_{ct} yct=β0+β1postc+β2treatt+δpostc×treatt+λXct+ξct
在这里我们需要画图的DID模型变成这样:
y c t = β 0 + ∑ i = 0 N β 1 i t i m e i + β 2 t r e a t t + ∑ i = 0 N δ i t i m e i × t r e a t t + λ X c t + ξ c t y_{ct}=\beta_{0}+\sum_{i=0}^N \beta_{1i}time_{i}+\beta_{2}treat_{t}+\sum_{i=0}^N \delta_{i} time_{i}\times treat_{t}+\lambda X_{ct}+\xi_{ct} yct=β0+i=0∑Nβ1itimei+β2treatt+i=0∑Nδitimei×treatt+λXct+ξct
最终我们需要画出的就是 δ i \delta_{i} δi以及它的置信区间图。结果中,如果在政策实施前, δ i \delta_{i} δi的值为0或者置信区间包括0,政策后,该值不为0,则假设成立。
如何完成这幅图,首先我们要先写出回归公式(参照第二个回归方程),这里大家就根据自己的模型去写,这里要注意的是,在回归前,我们需要把交互项先乘出来,不要直接在reg里写i.post#i.treat
* inter_*表示treat和time_*的交互项 *
reg y i.treat i.time_* inter_*
然后使用coefplot画出置信区间和系数图
coef, keep(inter_*) vertical addplot(line @b @at)
vertical的意思是回归系数在Y轴上表示,addplot选项是把各回归系数的点用直线连接起来,addplot里的选项照抄就行。最后画出来的图是这样,我这个图的结果根本就不好,只是给大家一个图形范例。
安慰剂检验
相信大家都碰到300+次随机取post(或treat)进行反事实检验,将关注变量的回归系数画成分布图,这个分布图的结果通常分布在0附近,与文章本身基准回归结果存在较大差异,从而证明基准回归结果的得出不是偶然。
** 这是随机指定post(政策执行时间)的代码 **
forvalue i=1/LOOP_TIME{ //loop_time处填入你要进行安慰剂检验的次数use "simdid.dta", clear //调入数据,自己去看你的数据路径drop post //去掉原来DID中的post变量gen random_digit=ceil(runiform(1,1028)) //我的数据时间是1028天,根据自己的数据填,通过encode来生成数字化时间变量replace random_digit = random_digit[1]g new_post= (date>random_digit[1])set matsize 11000g x = new_post*treatreg y i.new_post i.treat x ,vce(cluster citycode)g _b_new_post= _b[x] //提取x的回归系数g _se_new_post= _se[x] //提取x的标准误keep_b_new_post _se_new_postduplicates drop _b_new_post, forcesave placebo`i', replace //把第i次placebo检验的系数和标准误存起来
}* 纵向合并loop_time次的系数和标准误 *
use placebo1, clear
forvalue i=2/LOOP_TIME{append using placebo`i' //纵向合并1000次回归的系数及标准误
} gen tvalue= _b_new_post/ _se_new_post
kdensity tvalue, xtitle("t值") ytitle("分布") tline(-17.805 , lp(dash) lc(black) ) tlabel(-17.805 , add labsize(*.75)) //-17.805是我基准回归中的系数,这里也改成你基准回归中系数* 删除临时文件 *
forvalue i=1/loop_time{erase placebo`i'.dta
}
save 123.dta
** 这是随机指定treat变量的代码 **
forvalue i=1/LOOP_TIME{ //loop_time处填入你要进行安慰剂检验的次数use "simdid.dta", clear //调入数据drop treat //去掉原来DID中的post变量gen random_digit1=ceil(runiform(1,285)) //生成随机数,我这里treat+control group共有285个个体g new_treat=0forvalue j=1/28{ //指定28个个体为treatment groupreplace new_treat=1 if citycode==random_digit1[`j']} //citycode是我有285个个体(城市),依然通过encode为它们生成的数字变量)* 合并,回归,提取系数 *set matsize 11000g x = post*new_treatreg y i.post i.new_treat x,vce(cluster citycode)g _b_new_treat = _b[x] //提取x的回归系数g _se_new_treat = _se[x] //提取x的标准误keep _b_new_treat _se_new_treatduplicates drop _b_new_treat, forcesave placebo`i', replace //把第i次placebo检验的系数和标准误存起来
}* 纵向合并loop_time次的系数和标准误 *
use placebo1, clear
forvalue i=2/loop_time{append using placebo`i' //纵向合并1000次回归的系数及标准误
} gen tvalue= _b_new_treat/ _se_new_treat
kdensity tvalue, xtitle("t值") ytitle("分布") tline(-15.253 , lp(dash) lc(black) ) tlabel(-15.253 , add labsize(*.75)) // 我基准回归的值为-15.253* 删除临时文件 *
forvalue i=1/loop_time{erase placebo`i'.dta
}
save 123.dta,replace
代码不是我原创,是我根据Stata如何做1000次安慰剂检验改编,可能会更适合DID。
References
https://zhuanlan.zhihu.com/p/136685666
https://zhuanlan.zhihu.com/p/53906368
coefplot官方文档
如何用Stata完成(shui)一篇经济学论文(十五):平行性趋势检验与安慰剂检验相关推荐
- 【Stata】利用Stata快速完成一篇实证论文的模板(代码分享)
目录:利用Stata快速完成一篇实证论文的模板 一.数据整理 二.描述性统计 三.相关性分析 四.共线性诊断 五.模型选择检验 六.检验结果,应该选择固定效应回归分析 七.滞后效应 八.分组回归 九. ...
- LINUX学习基础篇(三十五)日志管理
LINUX学习基础篇(三十五)日志管理 日志管理 系统中常见的日志文件 日志文件格式 rsyslogd服务的配置文件 日志轮替 logrotate配置文件 配置文件夹 /etc/logrotate.d ...
- 如何用Stata完成(shui)一篇经济学论文(九):画线性图
目录 普通线性图 多图并列 一图多线 什么?为什么只讲线形图?因为我只用过线形图- 言归正传,我的确只用过线形图(说了跟没说一样-).Stata画图给我的感觉一直都是很复杂.很多命令,我觉得好像也没有 ...
- 如何用Stata完成(shui)一篇经济学论文(四):数字相关
文章目录 数字的运算 生成随机数 数据导入Stata后,我们的第一件事就是打开数据面板看一眼,在命令栏输入"bro"后按回车键或点击菜单栏下的这个图标查看数据. 可以看到我的数据列 ...
- 如何用Stata完成(shui)一篇经济学论文(十二):描述性统计、回归与结果保存
文章目录 描述性统计 回归命令 结果保存 描述性统计 描述性统计的命令我一般使用summerize,用法为summerize加上你所想要总结的变量名称,如果summerize后什么都不加,则表示描述所 ...
- 如何用Stata完成(shui)一篇经济学论文(十三):断点回归(上)
目录 连续性检验:检验配置变量 断点处变化的唯一性:前定变量的检验 断点回归涉及的知识点挺多的,相关文章介绍也很详细了,相信香樟的[经典回顾]运用断点回归设计做研究的规定动作大家都已经看过(没看过赶紧 ...
- 如何用Stata完成(shui)一篇经济学论文(一):软件安装与语法规范
目录 Stata软件的安装 语法规范 Stata软件的安装 Stata软件的安装途径:1.学校一般会买正版软件:2.自行搜索,网上很多,随便下一个就行,听说15.1以上支持中文,不过我觉得影响不大,反 ...
- 深度学习核心技术精讲100篇(六十五)-万字长文从ReLU到GELU通讲神经网络激活函数
前言 在计算每一层的激活值时,我们要用到激活函数,之后才能确定这些激活值究竟是多少.根据每一层前面的激活.权重和偏置,我们要为下一层的每个激活计算一个值.但在将该值发送给下一层之前,我们要使用一个激活 ...
- R语言实战应用精讲50篇(二十五)-时空数据统计模型:确定性预测模型
前言 本章的主要目的是详细讨论时空统计建模的三个目标: 在给定时空数据的空间新位置进行预测 用时空数据进行参数推断 预测未来的新值 我们还强调了在我们的预测.参数估计和预测中量化不确定性的重要性.我们 ...
最新文章
- Pymol | Pymol绘制GridBox图
- buildPyramid函数
- 实现局部动态的3种建议
- 白盒测试中几种逻辑覆盖法及其优缺点
- Python使用RSA+MD5实现数字签名
- js模块封装示例_AngularJS模块教程示例
- 科技部:中国131家独角兽企业 名单文字版
- 在线把pdf文件转换成word详细教程
- 百面机器学习03-经典算法
- google提示这个不是私密连接
- 划词翻译脚本--AutoHotkey
- Kali/Ubuntu GVM (openvas)安装及使用
- 〖Python 数据库开发实战 - Python与MySQL交互篇③〗- MySQL Connector的事务控制与异常处理
- 最常用算法汇总(一)
- 百度语音合成模型Deep Voice3
- FaceBook中国程序员之死,38岁跳楼轻生,压力让他生不如死!
- 办公用计算机的配置,各取所需硬道理 办公用电脑配置如何选
- 阿里云客户案例——周大福珠宝集团
- 带你揭秘学习编程的7大优势!还有可以提升文化课的成绩?
- Mac 下截图聚焦、局部放大、按键 GIF 录屏的最佳实践