stata中的时间对齐变量

时间:2014-04-01 11:51:14

标签: panel stata

我有一个针对多个波浪的面板数据集(13),每年大约有10,000个人,人们在不同的时间点进入和退出。我感兴趣的是随着时间的推移人们被诊断患有疾病。因此,我需要重新编码时间变量,以便在诊断时成为t=0第一波,然后t=1是明年,依此类推,以便我的所有人都具有可比性(我猜{ {1}} -1等。但是我不确定如何在t-1中解决这个问题。有人能建议吗?非常感谢

3 个答案:

答案 0 :(得分:2)

每人一次诊断的情况

clear all
set more off

*----- example data -----

set obs 100
set seed 2357

generate id = _n
generate year = floor(10 * runiform()) + 1990
expand 5

bysort id: replace year = year + _n
bysort id (year): generate diag = cond(_n == 3, 1, 0)

list in 1/20, sepby(id)

*----- what you seek -----

bysort id (diag): gen time = year - year[_N]

sort id year
list in 1/20

我假设与@RichardHerron具有相同的数据结构并使用他的示例。 diag是一个指示变量,在诊断时取值为1,否则为0(每个人只考虑一次诊断)。

bysort完成排序至关重要。持有诊断时间的观察结果被推送到数据库的末尾(由id组),然后剩下要做的就是将所有year与该参考年份进行比较(减去)。有关系统变量的详细信息,请参阅help _variables,例如_N

每人多次诊断的情况

如果每人进行多次诊断,但我们只关心第一次出现(根据year),我们可以这样做:

gsort id diag -year
by id: gen time = year - year[_N]

答案 1 :(得分:1)

提供测试数据通常很有帮助,但在这里它们很容易生成。诀窍是找到每个人的第一年(我的fyear),我将min()来自egen。然后,我将从实际年份中减去第一年fyear,找到相对于诊断的年份ryear

/* generate panel */
clear
set obs 10000
generate id = _n
generate year = floor(10 * runiform()) + 1990
expand 10
bysort id: replace year = year + _n
sort id year
list in 1/20

/* generate relative year */
bysort id: egen fyear = min(year)
generate ryear = year - fyear
list in 1/20

如果小组的第一年没有诊断,那么只需根据诊断标准构建fyear


编辑:在这方面考虑更多,也许它是您最后一部分遇到困难的时期(即,确定从日历年中减去的诊断年份)。这就是我要做的事。

bysort id (year): generate diagnosis = cond(_n == 5, 1, 0)
preserve
tempfile diagnosis
keep if (diagnosis == 1)
rename year dyear
keep id dyear
save `diagnosis'
restore
merge m:1 id using `diagnosis', nogenerate
generate ryear2 = year - dyear

答案 2 :(得分:1)

简单但不是最佳解决方案

假设diagnosis在诊断时为1(每人最多一次),否则为0。 然后诊断的时间是最简单的

 egen time_diagnosis = total(diagnosis * year), by(id) 

但你需要忽略任何零。拼出来,

 replace time_diagnosis = . if time_diagnosis == 0 

更好的替代方案

更复杂但更可取的替代方案可以处理多个诊断:

 egen time_diagnosis = min(year / diagnosis), by(id) 
year / diagnosis为1时,yeardiagnosis,否则为{}。如果没有诊断,则会产生缺失值,这应该是应有的。

然后你减去它以得到一个新的时间变量。

 gen time2 = time - time_diagnosis 

简而言之,我认为你可以在两个声明中完成这个,处理面板结构。

<强>更新

@Richard Herron问为什么将egenby()一起使用,而不仅仅是

 gen time_diagnosis = time * diagnosis 

其局限性在于,“正确”值仅包含在diagnosis为1的观察值中;该值仍然必须“传播”到同一id的其他值。但这正是egen在这里所做的。在最简单的情况下,通过一次诊断,time * diagnosis的总数仅为time * 1time,因为任何零对总和没有影响。