2017-02-20 53 views
0

我有一個「原始」數據集,我正在嘗試清理。該數據集由2000年至2010年間變量爲age的個體組成。數據集中存在大約20000個具有相同問題的個體。如何使用foreach/forv以遞增順序替換重複項

變量age在2004 - 2006年沒有增加。例如,對於一個個體,它看起來像這樣:

2000: 16, 
2001: 17, 
2002: 18, 
2003: 19, 
2004: 19, 
2005: 19, 
2006: 19, 
2007: 23, 
2008: 24, 
2009: 25, 
2010: 26, 

到目前爲止,我已經試過產生變量的最大年齡和最大年份:

bysort id: egen last_year=max(year) 
bysort id: egen last_age=max(age) 

然後用foreach與滯後相結合,嘗試更換age變量遞減的順序,這樣,當新的變量last_age(現在在所有年份中26),而像這樣:

2010: 26 
2009: 25 (26-1) 
2008: 24 (26-2) , and so on. 

但是,我發現爲這個問題尋找正確的代碼有一些問題。

回答

1

假設每一個人的年齡第一個值是不缺的,是正確的,這樣的事情可能會奏效

bysort id (year): replace age = age[1]+(year-year[1]) 

另外,如果假定是準確的時代的最後一個值,

bysort id (year): replace age = age[_N]-(year[_N]-year) 

或者,剛修好的時代裏沒有年齡觀察到觀察變化

bysort id (year): replace age = age[_n-1]+(year-year[_n-1]) if _n>1 & age==age[_n-1] 

在沒有樣本數據的情況下,這些都沒有經過測試。

+0

謝謝您的答覆。備選方案2工作:) –

0

威廉的代碼是非常重要的,但一些額外的評論將不容易放入評論。

假設我們有age已經和產生其他兩個估計前進和後退,他建議:

bysort id (year): gen age2 = age[1] + (year - year[1]) 
bysort id (year): gen age3 = age[_N] - (year[_N] - year) 

現在,如果所有三個同意,我們是很好的,如果三分之二的同意,我們可能會使用多數票。無論哪種方式,這是中位數;對於3個值,中值將是MINUS最小MINUS最大值的總和。

gen median = (age + age2 + age3) - max(age, age2, age3) - min(age, age2, age3) 

如果我們得到三個不同的估計,我們應該仔細看看。

edit age* if max(age, age2, age3) > median & median > min(age, age2, age3) 

最終的測試是中位數是否以同樣的方式隨着歲月:

bysort id (year) : assert (median - median[_n-1]) == (year - year[_n-1]) if _n > 1