2015-08-25 120 views
0

我想計算具有相同ID的觀測值的Stata增長率。我的數據看起來像這樣簡化的方式:Stata:計算具有相同ID的觀測值的增長率

ID year a b c d e f 
10 2010 2 4 9 8 4 2 
10 2011 3 5 4 6 5 4 
220 2010 1 6 11 14 2 5 
220 2011 6 2 12 10 5 4  
334 2010 4 5 4 6 1 4 
334 2011 5 5 4 4 3 2 

現在我想計算從AF變量每個ID增長率2010至2011年:

對於例如ID 10和可變一個它將是:(3-2)/ 2,對於變量b:(5-4)/ 4等並將結果存儲在新變量中(例如growth_a,growth_b等)。

由於我有超過120K的觀察值和大約300個變量,有沒有一種有效的方式來做到這一點(循環)?

我的代碼如下所示(簡化):

local variables "a b c d e f" 
foreach x in local variables { 
bys ID: g `x'_gr = (`x'[_n]-`x'[_n-1])/`x'[_n-1] 
} 

FYI:變量A-F是數字。

但Stata說:'本地找不到',我不確定代碼是否正確。我還必須先排序一年嗎?

+0

你試過什麼代碼?想要代碼和沒有不是堆棧溢出編程問題。 –

+0

感謝您的提醒。我把它放到原來的帖子中。 –

回答

3

特定的錯誤在

local variables "a b c d e f" 
foreach x in local variables { 
    bys ID: g `x'_gr = (`x'[_n]-`x'[_n-1])/`x'[_n-1] 
} 

是在foreach語法,在這裏希望類似語法foreach x of local variables一個錯誤,因爲你之前使用本地宏。使用關鍵字in,foreach從字面上取詞local,此處查找具有該名稱的變量:因此爲錯誤消息。這是基本的foreach語法:請參閱它的幫助。

由於其他原因,此代碼有問題。

  1. 排序上ID不通過year保證正確的排序順序,在這裏時間順序,爲每個不同的ID。如果觀察值在ID內混雜,結果將是垃圾。

  2. 該代碼假定所有時間值都存在;否則觀測值之間的時間差可能不相等。

一個更清潔的方式來獲得的增長率是

tsset ID year 
foreach x in a b c d e f { 
    gen `x'_gr = D.`x'/L.`x' 
} 

一旦你有tsset(或xtset)時間序列運營商可以不用擔心使用:正確的排序是自動的,經營者都聰明數據中的差距(例如年度數據從1982年到1984年的跳躍)。

更多變量的環可以是

foreach x of var <whatever> { 
    gen `x'_gr = D.`x'/L.`x' 
} 

其中<whatever>可以是一個普通(數字)varlist中。

編輯:這個問題自第一次發佈以來就已經發生了變化,並且僅在2010年至2011年間計算增長率時聲明瞭利息,這個例子中的含義僅表示這些年份存在。上述更通用的代碼自然會對計算這些增長率起作用。