研究设计完全可行,核心逻辑是:外生政策冲击(DID变量)作为调节变量,影响连续自变量 ( x ) 对连续因变量 ( y ) 的作用强度;机制检验用多时点DID验证政策如何通过调节 ( x ) 进而影响 ( y )。以下分点拆解核心问题、可行性依据、操作细节和代码实现:
一、核心结论:DID变量可以作为调节变量,且符合计量逻辑二、具体模型设定(关键!决定后续检验和代码)1. 基准调节效应模型(多元回归+DID调节变量)针对多时点DID(政策分批实施),核心模型为:
- 变量定义
- ( D_{it} ):多时点DID的核心变量,若个体 ( i ) 在时期 ( t ) 及之后受政策冲击,则 ( D_{it}=1 ),否则为0;
- ( D_{it} \times x_{it} ):调节效应核心项,系数 ( \beta_3 ) 显著则说明政策冲击改变了 ( x ) 对 ( y ) 的影响;
- ( \mu_i )/( \lambda_t ):个体/时间固定效应,必须控制,避免遗漏变量偏误;
- ( Controls_{it} ):其他控制变量。
- 系数解读
- ( \beta_1 ):政策实施前,( x ) 对 ( y ) 的基准效应;
- ( \beta_3 ):政策实施后,( x ) 对 ( y ) 的效应变化量(总效应变为 ( \beta_1+\beta_3 ))。
2. 机制检验的多时点DID模型为验证“政策→调节 ( x )→影响 ( y )”的机制,可构建两步DID:
- 第一步:检验政策冲击 ( D_{it} ) 对中介变量 ( x_{it} ) 的影响系数 ( \theta ) 显著,说明政策确实会影响 ( x ) 的水平。
- 第二步:将 ( x_{it} ) 和 ( D_{it} \times x_{it} ) 同时纳入基准模型,观察 ( D_{it} ) 的系数是否显著下降,验证中介效应。
三、关键检验要求:必须做平行趋势、安慰剂等DID检验因为调节变量 ( D_{it} ) 是DID构造的,所有DID的核心检验都必须做,否则审稿人会质疑政策冲击的外生性和因果识别的有效性:
- 平行趋势检验这是DID的灵魂,必须验证处理组和对照组在政策实施前的趋势是否平行。
- 做法:将多时点DID的连续型相对时间变量 ( Rel_time ) 拆分为一系列虚拟变量(政策前 ( k ) 期、政策当期、政策后 ( m ) 期),回归后检验政策前各期系数是否不显著。
- 安慰剂检验
- 方法1:随机分配处理组,重复1000/5000次回归,观察核心调节系数 ( \beta_3 ) 的分布是否集中在0附近;
- 方法2:虚构政策时间,假设政策在更早的时间实施,检验核心系数是否显著。
- 其他稳健性检验
- 更换控制变量集;
- 缩尾处理(1%/5%);
- 更换聚类标准误(企业/城市层面聚类)。
四、Stata代码实现(多时点DID+调节效应,附修改说明)1. 数据预处理(关键:生成多时点DID变量)假设数据有个体id(id)、时间(year)、政策冲击时间(treat_year,处理组为政策实施年份,对照组为.):
* 1. 定义处理组:treat=1为处理组,0为对照组gen treat = (treat_year!=.)* 2. 生成相对时间变量:rel_time = year - treat_yeargen rel_time = year - treat_year* 3. 生成多时点DID核心变量D:政策实施及之后为1,之前为0gen D = (year >= treat_year & treat==1)replace D = 0 if treat==0* 4. 生成调节项:D*xgen D_x = D * x
2. 基准调节效应回归(用reghdfe吸收固定效应)* 核心回归:控制个体+时间固定效应,城市层面聚类标准误reghdfe y x D D_x i.industry, absorb(id year) vce(cluster city)est store base_reg
- 说明:i.industry 是行业固定效应(可选);vce(cluster city) 必须加,解决异方差和序列相关问题。
3. 平行趋势检验代码* 1. 生成相对时间虚拟变量:政策前3期及更早、政策前2期、政策前1期、政策当期(0)、政策后1期...政策后3期及更晚forvalues k = 3(1)5 { gen rel_neg`k' = (rel_time == -`k' & treat==1)}gen rel_neg_gt3 = (rel_time < -3 & treat==1)gen rel_0 = (rel_time == 0 & treat==1)forvalues k = 1(1)3 { gen rel_pos`k' = (rel_time == `k' & treat==1)}gen rel_pos_gt3 = (rel_time > 3 & treat==1)* 2. 平行趋势回归:剔除政策前1期作为基准组(系数为0)reghdfe y x i.industry rel_neg_gt3 rel_neg5 rel_neg4 rel_neg3 rel_0 rel_pos1 rel_pos2 rel_pos3 rel_pos_gt3, absorb(id year) vce(cluster city)* 3. 绘图(平行趋势图,关键!)coefplot, keep(rel_neg_gt3 rel_neg5 rel_neg4 rel_neg3 rel_0 rel_pos1 rel_pos2 rel_pos3 rel_pos_gt3) vertical xlabel(-5(1)3) xline(-0.5, lcolor(red)) title(Parallel Trend Test)
- 关键判断:政策前各期(rel_neg*)的系数需不显著,说明平行趋势假设成立。
4. 安慰剂检验(随机分配处理组)* 定义安慰剂检验次数local n = 1000* 存储真实核心系数quietly reghdfe y x D D_x, absorb(id year) vce(cluster city)scalar true_coef = _b[D_x]* 初始化系数存储矩阵matrix coef_mat = J(`n',1,0)* 循环随机分配处理组forvalues i = 1(1)`n' { * 随机打乱treat变量 gen treat_rand = runiform() < (sum(treat)/_N) * 重新生成D和D_x gen D_rand = (year >= treat_year & treat_rand==1) replace D_rand = 0 if treat_rand==0 gen D_x_rand = D_rand * x * 回归并存储系数 quietly reghdfe y x D_rand D_x_rand, absorb(id year) vce(cluster city) matrix coef_mat[`i',1] = _b[D_x_rand] * 删除临时变量 drop treat_rand D_rand D_x_rand}* 将系数矩阵转为数据集并绘图svmat coef_mat, name(coef)hist coef1, normal title(Placebo Test: Coefficient Distribution) xline(true_coef, lcolor(red))
- 关键判断:安慰剂系数分布应集中在0附近,且真实系数位于分布的尾部(说明真实效应不是随机产生的)。
五、PSM匹配与样本选择的关键问题六、核心提醒- 你的设计不是“纯DID”,而是“调节效应+DID外生冲击”,论文中要明确说明模型的创新点(用外生政策解决调节变量内生性)。
- 不能省略DID的核心检验(平行趋势、安慰剂),否则会被审稿人质疑因果识别的可靠性。
可把上述代码整合成一套完整的Stata do文件模板,里面会包含数据预处理、基准回归、平行趋势检验、安慰剂检验的全套代码。