DID手册(3)--培根分解、事件研究图和安慰剂检验代码+操作
本文我们接着最近流行的DID手册:传统DID模型、TWFE、Bacon分解、合成DID等 (qq.com)来给大家介绍一下具体操作:
最近流行的DID手册:传统DID模型、TWFE、Bacon分解、合成DID等 (qq.com)
DID手册:动态 DID 与交错DID估计方法汇总 (qq.com)
使用的回归命令包括
xtdidregress
,一个内置的 Stata 命令,用于对面板数据运行 DID 回归。使用它后,我们可以使用它来创建趋势图并进行一些基本测试。xtreg
, , 最初是为运行固定效应模型而编写的,但也可以很容易地应用于运行 DID 回归。areg
与reghdfe
命令也可以进行DID估计sdid
,用于运行 SDID 的外部命令。通过method( )选项,我们还可以使用它来运行标准 DID 和综合控制法。xthdidregress
,这是 Stata 18 中引入的用于估计异质ATT 的命令。
1、培根分解
要使用的数据集可以通过运行以下代码加载到 Stata 中:
use "bacon_example.dta", clear
面板数据包含 49 年至 1964 年美国 1996 个州(包括Washington, D.C,但不包括Alaska 和Hawaii)的州级信息(特别是无过错离婚起始年份和自杀死亡率)。它们最初由Stevenson & Wolfers(2006)用于估计无过错(或单边)离婚对女性自杀率的影响。
在这里,我首先对无过错离婚改革的女性自杀(交错处理)运行静态TWFE DID规范:
来自以下所有命令的估计系数应相同(但由于算法不同,标准误差和 R 平方不同)。
xtdidregress (asmrs pcinc asmrh cases) (post), group(stfips) time(year) vce(cluster stfips)
xtreg asmrs post pcinc asmrh cases i.year, fe vce(cluster stfips)
areg asmrs post pcinc asmrh cases i.year, absorb(stfips) vce(cluster stfips)
reghdfe asmrs post pcinc asmrh cases, absorb(stfips year) cluster(stfips)
asmrs
是自杀死亡率,post
是处理虚拟变量,所有其他变量都是控制变量。Stata 报告的 DID 系数水平为 -2.516(标准误差为 2.283)。
然后我们可以将培根分解定理应用于TWFE DID模型。
bacondecomp asmrs post pcinc asmrh cases, ddetail
它报告数据集中有 14 个随时间变化的组别,包括一个从未处理的组和一个始终处理的组。最大权重分配给始终处理组和随时间变化组之间的比较。
我们还可以使用xtdidregress
估计后,进行分解。
xtdidregress (asmrs pcinc asmrh cases) (post), group(stfips) time(year) vce(cluster stfips)
estat bdecomp, graph
请记住,培根分解是一种诊断工具,而不是补救措施。分解告诉我们 DID 模型中“错误比较”的严重性,但它无法治愈它。
动态DID--平行趋势检验/事件研究
我运行的下一个回归是相应的动态 DID。我使用该命令是因为它可以同时运行模型并生成绘图。此命令允许一些基本的回归(e.g., and);为了绘制高级 DID 回归的结果,我推荐该包(将在下一个示例中详细介绍)。要使用 ,必须安装 两个软件包和 。eventdd``xtreg``reghdfe``event_plot``eventdd``eventdd``matsort
平行趋势检验代码汇总
*** Event Study Plots *****************************************************
gen rel_time = year - _nfd
* install "eventdd" and "matsort"
选择方法为 "xtreg".
eventdd asmrs pcinc asmrh cases i.year, ///
timevar(rel_time) method(fe, cluster(stfips)) ///
noline graph_op( ///
xlabel(-20(5)25, nogrid) ///
xline(0, lpattern(dash) lcolor(gs12) lwidth(thin)) ///
legend(order(1 "Point Estimate" 2 "95% CI") size(*0.8) position(6) rows(1) region(lc(black))) ///
)
选择方法为 "xtreg"."reghdfe".
eventdd asmrs pcinc asmrh cases, ///
timevar(rel_time) method(hdfe, cluster(stfips) absorb(stfips year)) ///
noline graph_op( ///
xlabel(-20(5)25, nogrid) ///
xline(0, lpattern(dash) lcolor(gs12) lwidth(thin)) ///
legend(order(1 "Point Estimate" 2 "95% CI") size(*0.8) position(6) rows(1) region(lc(black))) ///
)
* Only balanced periods in which all units have data are shown in the plot.
eventdd asmrs pcinc asmrh cases i.year, ///
timevar(rel_time) method(hdfe, cluster(stfips) absorb(stfips year)) balanced ///
noline graph_op( ///
xlabel(, nogrid) ///
xline(0, lpattern(dash) lcolor(gs12) lwidth(thin)) ///
legend(order(1 "Point Estimate" 2 "95% CI") size(*0.8) position(6) rows(1) region(lc(black))) ///
)
* Only specified periods are shown in the plot; periods beyond the window are accumulated.
eventdd asmrs pcinc asmrh cases i.year, ///
timevar(rel_time) method(hdfe, cluster(stfips) absorb(stfips year)) ///
accum leads(5) lags(10) ///
noline graph_op( ///
xlabel(, nogrid) ///
xline(0, lpattern(dash) lcolor(gs12) lwidth(thin)) ///
legend(order(1 "Point Estimate" 2 "95% CI") size(*0.8) position(6) rows(1) region(lc(black))) ///
)
3、安慰剂试验
最后,我通过随机和重复选择安慰剂处理时间并进行重复安慰剂测检验,并运行TWFE回归1000次。这项工作是通过使用 Stata 内置命令完成的。检验结果显示,我上面的估计可能不是来自不可观察的时间趋势。推荐使用permute
与dpplot
命令
* Randomly select a placebo treatment time and run TWFE regression for 1000 times
permute post coefficient=_b[post], reps(1000) seed(1) saving("placebo_test.dta", replace): reghdfe asmrs post pcinc asmrh cases, absorb(stfips year) cluster(stfips)
use "placebo_test.dta", clear
* install "dpplot"
dpplot coefficient, ///
xline(-2.516, lc(red) lp(dash)) xline(0, lc(gs12) lp(solid)) ///
xtitle("Effect estimate") ytitle("Density of distribution") ///
xlabel(-3(1)2 -2.516, nogrid labsize(small)) ///
ylabel(, labsize(small)) caption("")