我有一個面板數據集用於多個波浪(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