我有一个针对多个波浪的面板数据集(13),每年大约有10,000个人,人们在不同的时间点进入和退出。我感兴趣的是随着时间的推移人们被诊断患有疾病。因此,我需要重新编码时间变量,以便在诊断时成为t=0
第一波,然后t=1
是明年,依此类推,以便我的所有人都具有可比性(我猜{ {1}} -1
等。但是我不确定如何在t-1
中解决这个问题。有人能建议吗?非常感谢
答案 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时,year
为diagnosis
,否则为{}。如果没有诊断,则会产生缺失值,这应该是应有的。
然后你减去它以得到一个新的时间变量。
gen time2 = time - time_diagnosis
简而言之,我认为你可以在两个声明中完成这个,处理面板结构。
<强>更新强>
@Richard Herron问为什么将egen
与by()
一起使用,而不仅仅是
gen time_diagnosis = time * diagnosis
其局限性在于,“正确”值仅包含在diagnosis
为1的观察值中;该值仍然必须“传播”到同一id
的其他值。但这正是egen
在这里所做的。在最简单的情况下,通过一次诊断,time * diagnosis
的总数仅为time * 1
或time
,因为任何零对总和没有影响。