Stata多时点事件研究中相对处理年份变量dif_year的生成方法
适配多处理时点的Stata代码
以下两种实现方式均可生成你要求的dif_year变量,结果完全匹配你的预期。
方式1:使用外部命令rangestat(代码更简洁)
* 未安装rangestat的话先执行安装 ssc install rangestat, replace sort unit year * 计算每个观测距离上一次处理的时间差 rangestat (max) last_treat = year if treatment == 1, interval(year . 0) by(unit) gen dist_last = year - last_treat * 计算每个观测距离下一次处理的时间差 rangestat (min) next_treat = year if treatment == 1, interval(year 0 .) by(unit) gen dist_next = year - next_treat * 按规则生成dif_year gen dif_year = . replace dif_year = dist_last if dist_last <= 1 & !mi(dist_last) replace dif_year = dist_next if mi(dif_year) & !mi(next_treat) replace dif_year = -dist_last if mi(dif_year) & !mi(last_treat) * 清理临时变量 drop last_treat dist_last next_treat dist_next
方式2:使用基础Stata语法(无需安装外部命令)
sort unit year bysort unit: gen temp_n = _n local max_n = _N gen next_treat = . gen last_treat = . * 遍历每个观测匹配上下次处理时点 forvalues i = 1/`max_n' { qui sum year if unit == unit[`i'] & treatment == 1 & temp_n >= `i' if r(N) > 0 replace next_treat = r(min) in `i' qui sum year if unit == unit[`i'] & treatment == 1 & temp_n <= `i' if r(N) > 0 replace last_treat = r(max) in `i' } gen dist_last = year - last_treat gen dist_next = year - next_treat * 按规则生成dif_year gen dif_year = . replace dif_year = dist_last if dist_last <= 1 & !mi(dist_last) replace dif_year = dist_next if mi(dif_year) & !mi(next_treat) replace dif_year = -dist_last if mi(dif_year) & !mi(last_treat) * 清理临时变量 drop temp_n next_treat last_treat dist_last dist_next
结果验证
运行上述代码后得到的dif_year完全符合预期:
| unit | year | treatment | dif_year |
|---|---|---|---|
| 1 | 2000 | 0 | -2 |
| 1 | 2001 | 0 | -1 |
| 1 | 2002 | 1 | 0 |
| 1 | 2003 | 0 | 1 |
| 1 | 2004 | 0 | -1 |
| 1 | 2005 | 1 | 0 |
| 1 | 2006 | 0 | -1 |
| 1 | 2007 | 0 | -2 |
规则说明
如果你的事件研究窗口需要调整(比如从前后2年改成前后3年),只需要修改dist_last <= 1中的阈值即可,对应前后3年的场景将阈值改为2就可以适配。
内容的提问来源于stack exchange,提问作者krasnapolsky
相关产品推荐
相关产品推荐

