随机虚构处理组的Stata操作双重差分法(DID)安慰剂检验的一般做法就是随机选取个体作为处理组,重复500次或者1000次,看看“伪政策虚拟变量”的系数是否显著。在石大千等(2018)这篇论文中,处理组有32个城市,控制组有165个城市,所以我们需要从197个城市中随机选取32个城市作为“伪处理组”,假设这32个城市是智慧城市试点,其他城市为控制组,然后生成“伪政策虚拟变量”(交互项)进行回归。重复进行500次,我们就会得到500次回归结果(包含“伪政策虚拟变量”估计系数、标准误和p值),最后我们可以绘制出500个“伪政策虚拟变量”估计系数的分布及相应的p值,直观展示安慰剂检验的结果。说起来很简单,但操作起来还是蛮困难的,我们要解决如下两个关键问题:(1)如何从197个城市中随机选取32个城市作为“伪处理组”,然后生成“伪政策虚拟变量”?因为是面板数据,所以我们首先只保留一期数据,然后使用sample命令从中随机抽取32个样本,保留所抽取样本的id编号,与原数据进行匹配,最终匹配上的就是我们的“伪处理组”样本,未匹配上的就是控制组样本。(2)如何存储500次回归中的估计系数、标准误和p值?在Stata中,我们可以生成三个500行1列的矩阵(矩阵中的元素初始值为0),来分别存储500个“伪政策虚拟变量”的估计系数、标准误和p值。每回归一次,就将估计系数、标准误和p值分别存储到三个矩阵的对应位置。最终代码*-安慰剂检验-虚构处理组
mat b = J(500,1,0) //* 系数矩阵
mat se = J(500,1,0) //* 标准误矩阵
mat p = J(500,1,0) //* P值矩阵
*循环500次
forvalues i=1/500{
use smart_city2018.dta, clear
xtset id year //面板数据声明
keep if year==2005 //保留一期数据
sample 32, count //随机抽取32个城市
keep id //得到所抽取样本的id编号
save match_id.dta, replace //另存id编号数据
merge 1:m id using smart_city2018.dta //与原数据匹配
gen treat = (_merge == 3) //将所抽取样本赋值为1,其余为0,得到政策分组虚拟变量
gen period = (year >= 2012) //生成政策时间虚拟变量
gen did = treat*period
reghdfe lnrso did $xlist ,absorb(id year) vce(cluster id)
* 将回归结果赋值到对应矩阵的对应位置
mat b[`i',1] = _b[did]
mat se[`i',1] = _se[did]
* 计算P值并赋值于矩阵
mat p[`i',1] = 2*ttail(e(df_r), abs(_b[did]/_se[did]))
}