2014-04-01 28 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