You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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完全符合预期:

unityeartreatmentdif_year
120000-2
120010-1
1200210
1200301
120040-1
1200510
120060-1
120070-2

规则说明

如果你的事件研究窗口需要调整(比如从前后2年改成前后3年),只需要修改dist_last <= 1中的阈值即可,对应前后3年的场景将阈值改为2就可以适配。

内容的提问来源于stack exchange,提问作者krasnapolsky

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.07 02:12:00