Stata 确定每个单独事件的后续事件窗口(或事件)

Stata 确定每个单独事件的后续事件窗口(或事件),stata,Stata,这个问题是在带有by()选项的two-way line的上下文中,但我认为更大的问题是如何识别第二个(以及所有后续)事件窗口,而不事先知道每个事件窗口 下面,我将提供20世纪90年代和21世纪初五个国家的一些数据。在所有国家,1995年都会举办一次活动,而在加拿大,只有2005年才会重演。我想以每个国家的每个事件为中心,描绘五年来的结果。如果使用twowayline和by()执行此操作,则Canada将在同一绘图窗口中绘图两次 clear set obs 100 generate year =

这个问题是在带有
by()
选项的
two-way line
的上下文中,但我认为更大的问题是如何识别第二个(以及所有后续)事件窗口,而不事先知道每个事件窗口

下面,我将提供20世纪90年代和21世纪初五个国家的一些数据。在所有国家,1995年都会举办一次活动,而在加拿大,只有2005年才会重演。我想以每个国家的每个事件为中心,描绘五年来的结果。如果使用
twowayline
by()
执行此操作,则Canada将在同一绘图窗口中绘图两次

clear
set obs 100
generate year = 1990 + mod(_n, 20)
generate country = "United Kingdom" in 1/20
replace country = "United States" in 21/40
replace country = "Canada" in 41/60
replace country = "Australia" in 61/80
replace country = "New Zealand" in 81/100
generate event = (year == 1995) ///
    | ((year == 2005) & (country == "Canada"))
generate time_to_event = 0 if (event == 1)
generate outcome = runiform()

encode country, generate(countryn)
xtset countryn year
forvalue i = 1/2 {
    replace time_to_event = `i' if (l`i'.event == 1)
    replace time_to_event = -`i' if (f`i'.event == 1)
}

twoway line outcome time_to_event, ///
    by(country) name(orig, replace)
手动解决方案添加一个
事件
变量,该变量按国家/地区对每个事件事件进行编号,然后将
事件
添加到
by()
选项中

generate occurrence = 1 if !missing(time_to_event)
replace occurrence = 2 if ///
    (inrange(year, 2005 - 2, 2005 + 2) & (country == "Canada"))

twoway line outcome time_to_event, ///
    by(country occurrence) name(attempt, replace)
这在游戏数据中非常有效,但在我的真实数据中,有更多的国家和更多的事件。我可以手动编写这个
事件
变量,但这很乏味(现在我真的很好奇是否有一个工具或逻辑可以工作:)


是否有自动识别窗口的逻辑?或者至少能与双向线路一起工作的线路?谢谢

您已经生成了一个变量
time\u to\u event
,它是-2。。窗口中有2个,否则会丢失。您可以使用SSC的
TSSpill
,由安装

  ssc inst tsspell 
为此类窗口添加标签。窗口由该
时间\u到\u事件中所有未丢失的观察值的拼写或运行来定义:

  tsspell, cond(time_to_event < .) 
然后使用
country
\u-spell
中每个拼写的拼写标识符(另一个由
tsspell
生成的变量)清楚地标记拼写:

  egen gspell = group(country _spell) if _spell2, label
我的代码假设窗口是不相交的,不能重叠,但这似乎也是您的假设之一。这篇文章给出了一些处理咒语的技巧,但没有提到
tsspell
,它本质上是其原理的实现。我开始解释这些原则,但在我解释程序之前,这篇文章已经足够长了。由于
tsspell
的帮助相当详细,我怀疑是否需要一篇续集论文,或者至少它是否会被写出来

(稍后)此代码还假定windows不接触。解决这个问题需要一种更直接的方法,根本不涉及
tsspell

  bysort country (year) : gen w_id  = (time_to_event < .) * sum(time_to_event == -2)

  egen w_label = group(country w_id) if w_id, label
bysort country(年份):gen w_id=(事件发生时间<)*总和(事件发生时间==-2)
egen w_label=组(国家w_id),如果w_id,则为标签

感谢您的课程!
sum(time\u to\u event==-2)
技巧非常有用。我也会看看你在Stata杂志上的文章。谢谢。那么,你的窗户能重叠吗?还是触摸?两者都可以。我每年都会举办活动来定义windows。这些事件可以是连续几年发生的,这会产生重叠窗口。这些事件也可能相隔五年,这会产生令人触动的窗口。我完成了你的文章,它有我需要的所有工具。谢谢至于重叠窗口,我认为我应该只使用窗口中的第一个事件,而不是用复杂的方式编码来跟踪这些窗口。
  bysort country (year) : gen w_id  = (time_to_event < .) * sum(time_to_event == -2)

  egen w_label = group(country w_id) if w_id, label