2010-04-30 46 views
2

我對Stata很新穎。根據不同年份的GDP變量創建「1960年國內生產總值」變量

我對「國家國內生產總值年」的形式有一套觀察。我想創建一個新的變量GDP1960,這給每年每個國家1960年的國內生產總值:

USA  $100m 1960  USA $100m 1960 $100m 
USA  $200m 1965 --> USA $200m 1965 $100m 
Canada $60m 1960  Canada $60m 1960 $60m 

什麼是實現這一目標的正確的語法? (我假設egen是以某種神祕的方式參與的)

回答

1

那麼,我最終找到了解決方案。它依賴於generatereplace以其排序順序處理數據的事實,並且您可以使用_n參考當前觀察值。

gen rank = 100 
replace rank = 50 if year == 1960 

gen gdp60 = . 

sort country rank 
replace gdp60 = cond(iso == iso[_n-1], gdp60[_n-1], gdp[_n]) 

drop rank 

sort country year 
2

你已經發現了-cond(解決方案) - ,但這裏有一些建議,可能使你的造型更容易的數據,並幫助您避免問題的問題,通過創建「等級排序時可能出現「變量(我已經得到了-egen- SOLN你問之下。):

粘貼下面的代碼到您的DO文件編輯器,並運行它:

*---------------------------------BEGIN EXAMPLE 
clear 

inp str20 country str10 gdp year 
"USA"  "$100m" 1960   
"USA"  "$200m" 1965  
"Canada" "$60m" 1960 
"Canada" "$120m" 1965 
"USA"  "$250m" 1970 
"Mexico" "$90m" 1970 
"Canada" "$800m" 1970  
"Mexico" "$160m" 1960 
"Mexico" "$220m" 1965 
"Mexico" "$350m" 1975 
end 

//1. destring gdp so that we can work with it 
destring gdp, ignore("$", "m") replace 

//2. Create GDP for 1960 var: 
    bys country: g x = gdp if year==1960 
    bys country: egen gdp60 = max(x) 
    drop x 

    **you could also create balanced panels to see gaps in your data** 
     preserve 
    ssc install panels 
    panels country year 
    fillin country year 
    li //take a look at the results win. to see how filled panel data would look 
     restore 

//3. create a gdp variable for each year (reshape the dataset) 
    drop gdp60 
    reshape wide gdp, i(country) j(year) 

    **much easier to use this format for modeling 
    su gdp1970 
    **here's a fake "outcome" or response variable to work with** 
    g outcome = 500+int((1000-500+1)*runiform()) 
    anova outcome gdp1960-gdp1970 //or whatever makes sense for your situation 
*---------------------------------END EXAMPLE 

好運。

+0

感謝您的詳細解答:你猜,egen系列正是我想到的。面板代碼看起來非常有用 - 我會看看這個。 – 2010-05-21 19:56:11

0

我想不出什麼比這兩條線較短:

gen temp = gdp if year == 1960 
by country : egen gdp60 = max(temp) 

如果你想每年一個變量(例如,gdp60, gdp61, gdp62,...),那麼你或許應該使用reshape

0

一個單line solution is

egen gdp60 = mean(gdp/(year == 1960)), by(country) 

這裏的訣竅是除以year == 1960這個表達式。 1960年是這樣,在這種情況下,我們除以1,這使得該年的gdp保持不變。對於所有其他年份來說都是錯誤的,在這種情況下,我們除以0.這聽起來很瘋狂,但是每當我們除以零時的結果就是缺失值,這將被egenmean()函數忽略。

您可以使用其他egen函數,因爲在這種情況下,每個國家/地區最多應該有1960個值,例如, max(),min(),total()都應該工作。 (如果一個國家擁有1960年或缺失值沒有價值,我們將結束與缺失,而這恰恰是理所應當的。)

討論在http://www.stata-journal.com/article.html?article=dm0055