我有一个面板数据集用于多个波浪(13),每年大约有10,000个人,人们在不同的时间点进入和退出。我感兴趣的是随着时间的推移人们被诊断患有某种疾病会发生什么。因此,我需要,使之成为t=0
第一波确诊时,则t=1
是明年等等,让我所有的个体都具有可比性(我猜-1
为t-1
等)重新编写时间变量。不过,我不确定如何在stata
中解决这个问题。任何人都可以建议吗?非常感谢stata中的时间对齐变量
回答
简单但不是最佳解决方案
假设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
是year
当diagnosis
是1并且否则失踪。如果没有诊断,这会产生缺少的值,这是应该的。
然后你减去它得到一个新的时间变量。
gen time2 = time - time_diagnosis
总之,我认为你可以在两个语句中处理面板结构。
更新
@Richard赫伦问为什么要用egen
与by()
,而不仅仅是
gen time_diagnosis = time * diagnosis
这方面的一个限制是“正确”的价值仅仅包含在这些意见对于这diagnosis
是1;该值仍然必须“传播”到其他值相同的id
。但这正是egen
在这里所做的。在最简单的情况下,对于一次诊断,总共time * diagnosis
只是time * 1
或time
,因为任何零对总和没有影响。
我知道必须有一种方法来获得'time_diagnosis'没有'merge'!但为什么'egen time_diagnosis = total(诊断*年),按(id)'而不是'generate time_diagnosis = diagnosis * year'?这只是为了更清楚地说明您的多个诊断示例吗?还是需要“全部”?谢谢。 –
查看上面的额外细节。 –
提供测试数据通常很有帮助,但在这里它们很容易生成。诀窍是找到每个人的第一年(我的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
每人
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
s与该参考年份。有关系统变量(如_N
)的详细信息,请参见help _variables
。
每人多个诊断的情况下
如果几个诊断是每人做,但我们只关心(根据year
)第一次出现,我们可以这样做:
gsort id diag -year
by id: gen time = year - year[_N]
很好的把戏! –
我同意@Richard Herron。这是'by:'的一个很好的用法,并且偶然地回应了'egen'在底层做的事情。请注意,强调最多只发生一次诊断的假设是很好的;并且对于事件可能重复发生的技巧也很好,但兴趣是第一次。 –
非常感谢您的帮助:) – user3481829
- 1. 对齐变量
- 2. 平衡面板数据中的时间趋势变量,Stata
- 3. 在Stata中结合日期和时间变量
- 4. 类变量 - 对齐
- 5. Stata:变量的元素
- 6. 在变量中使用变量之间的“或”运算符在Stata中循环
- 7. Stata to Excel:保持时间变量正确
- 8. 如何使用Stata或Excel创建时间变量?
- 9. Stata:变量之间的比较,但个人之间的比较
- 10. 利用Stata中变量的名称
- 11. Stata中变量的唯一组合
- 12. 多个变量不对齐
- 13. Stata - 根据变量中的值分配不同的变量
- 14. 在Stata中创建指示器变量
- 15. Stata:在宏中检索变量标签
- 16. 在Stata中生成相关变量
- 17. Excel中未对齐的时间戳
- 18. bacon.js中的对齐时间序列
- 19. 对齐R中的时间网格
- 20. 对齐时间戳值到时间轴
- 21. Stata:通过变量数量扩展
- 22. 在Stata中使用循环成对加入字符串变量
- 23. Bash - 将变量$ @保存在变量中时对空间安全
- 24. Stata:检查组内不同变量间的平等
- 25. 如何在组合的Stata条形图中对齐x轴?
- 26. 从中间对齐
- 27. 带反引号的Stata变量定义
- 28. 循环变量作为Stata的上限
- 29. Stata:字符串变量的排列
- 30. 使用Stata检查变量的存在
有关未来的问题,请提供您以代码形式提出的尝试。你的帖子中没有显示研究成果。请参阅http://stackoverflow.com/help上的**请求**部分。 –
同意罗伯托 –
为此,我原本得到“通过id:gen t = _n”道歉,然后试图找到一种方法来操纵_n和年,但是挣扎。尽管如此,将提供进一步的用途,谢谢。 – user3481829