2014-04-01 98 views
-2

我有一个面板数据集用于多个波浪(13),每年大约有10,000个人,人们在不同的时间点进入和退出。我感兴趣的是随着时间的推移人们被诊断患有某种疾病会发生什么。因此,我需要,使之成为t=0第一波确诊时,则t=1是明年等等,让我所有的个体都具有可比性(我猜-1t-1等)重新编写时间变量。不过,我不确定如何在stata中解决这个问题。任何人都可以建议吗?非常感谢stata中的时间对齐变量

+1

有关未来的问题,请提供您以代码形式提出的尝试。你的帖子中没有显示研究成果。请参阅http://stackoverflow.com/help上的**请求**部分。 –

+0

同意罗伯托 –

+0

为此,我原本得到“通过id:gen t = _n”道歉,然后试图找到一种方法来操纵_n和年,但是挣扎。尽管如此,将提供进一步的用途,谢谢。 – user3481829

回答

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/diagnosisyeardiagnosis是1并且否则失踪。如果没有诊断,这会产生缺少的值,这是应该的。

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

gen time2 = time - time_diagnosis 

总之,我认为你可以在两个语句中处理面板结构。

更新

@Richard赫伦问为什么要用egenby(),而不仅仅是

gen time_diagnosis = time * diagnosis 

这方面的一个限制是“正确”的价值仅仅包含在这些意见对于这diagnosis是1;该值仍然必须“传播”到其他值相同的id。但这正是egen在这里所做的。在最简单的情况下,对于一次诊断,总共time * diagnosis只是time * 1time,因为任何零对总和没有影响。

+0

我知道必须有一种方法来获得'time_diagnosis'没有'merge'!但为什么'egen time_diagnosis = total(诊断*年),按(id)'而不是'generate time_diagnosis = diagnosis * year'?这只是为了更清楚地说明您的多个诊断示例吗?还是需要“全部”?谢谢。 –

+0

查看上面的额外细节。 –

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

每人

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组),然后所有剩下要做的就是比较(减去)所有years与该参考年份。有关系统变量(如_N)的详细信息,请参见help _variables

每人多个诊断的情况下

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

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

很好的把戏! –

+0

我同意@Richard Herron。这是'by:'的一个很好的用法,并且偶然地回应了'egen'在底层做的事情。请注意,强调最多只发生一次诊断的假设是很好的;并且对于事件可能重复发生的技巧也很好,但兴趣是第一次。 –

+0

非常感谢您的帮助:) – user3481829