本来打算把DID讲一讲,结果网页上一搜,讲DID的还是挺多的,另外DID相对于RD好理解得多,也没有什么需要着重解释的东西,所以就直接写写平行性趋势检验和安慰剂检验over。第一次写博客,这个专栏断断续续两个多月才完成,总体来说我还是挺满意的,哈哈哈哈。以后stata也没啥好讲的,有机会用这个博客写写数据分析的随笔(当然也要看我input怎么样)。Stata系列最后一篇,完结撒花~~
然后使用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 11000 g x = new_post*treat reg 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_post duplicates drop _b_new_post, force save 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=0 forvalue j=1/28{ //指定28个个体为treatment group replace new_treat=1 if citycode==random_digit1[`j'] } //citycode是我有285个个体(城市),依然通过encode为它们生成的数字变量) * 合并,回归,提取系数 * set matsize 11000 g x = post*new_treat reg 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_treat duplicates drop _b_new_treat, force save 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官方文档