0

这个问题twoway lineby()选项有关,但我认为更大的问题是如何识别第二个(以及所有后续)事件窗口,而无需先验地知道每个事件窗口。

下面我生成了 1990 年代和 2000 年代五个国家的一些数据。在所有国家,1995 年都会发生事件,而在加拿大,只有 2005 年事件会重复发生。我想以outcome每个国家的每个事件为中心绘制五年。如果我使用twoway lineand执行此操作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)

手动解决方案添加一个occurrence变量,该变量按国家/地区对每个事件发生进行编号,然后添加occurrenceby()选项中。

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)

这在比赛数据中效果很好,但在我的真实数据中,有更多的国家和更多的赛事。我可以手动编码这个occurrence变量,但这很乏味(现在我真的很好奇是否有一个有效的工具或逻辑:))。

是否有自动识别窗口的逻辑?或者至少可以使用的一种twoway line?谢谢!

4

1 回答 1

2

您已经在窗口中生成了一个 -2 .. 2 的变量time_to_event,否则会丢失。您可以tsspell从 SSC 使用,由安装

  ssc inst tsspell 

标记此类窗口。窗口由所有不缺少的观察的咒语或运行定义time_to_event

  tsspell, cond(time_to_event < .) 

tsspell需要先验tsset并生成其帮助中解释的三个变量。然后,您可以使用这些变量之一对窗口重新编号_seq(拼写中的序列号,向上编号 1)

  gen _spell2 = (_seq > 0) * sum(_seq == 1) 

然后通过使用country和每个法术的法术标识符来清楚地标记法术_spell,另一个变量由 产生tsspell

  egen gspell = group(country _spell) if _spell2, label

我的代码假设窗口是不相交的并且不能重叠,但这似乎也是您的假设之​​一。http://www.stata-journal.com/sjpdf.html?articlenum=dm0029给出了一些处理法术的技术,那篇文章没有提到tsspell,本质上是其原理的实现。我开始解释这些原理,但这篇文章已经够长了,我还没来得及解释这个程序。由于 的帮助tsspell非常详细,我怀疑是否需要续篇论文,或者至少会写出来。

(稍后)此代码还假定窗口不触摸。解决该问题提出了一种更直接的方法,根本不涉及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
于 2013-06-02T23:08:10.390 回答