从不同年份的GDP变量创建“1960年GDP”变量

时间:2010-04-30 14:32:16

标签: stata

我对Stata很新。

我对“国家GDP年”的形式有一系列的观察。我想创建一个新的变量GDP1960,它给出了每个国家每年1960年的GDP:

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

实现这一目标的正确语法是什么? (我假设egen涉及一些神秘的方式)

4 个答案:

答案 0 :(得分:3)

您已经找到了cond()的解决方案,但是这里有一些建议可以让您更轻松地对数据进行建模,并帮助您避免因排序时可能出现的问题而创建rank变量(我在下面提到了egen解决方案):

将下面的代码粘贴到您的操作文件编辑器中并运行它:

*---------------------------------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

答案 1 :(得分: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

编辑:具有相同风格的更直接的解决方案:

gen wanted = year == 1960
bysort country (wanted) : gen gdp60 = gdp[_N] 
drop wanted 
sort country year 

此处wanted将为1960年为1,否则为0。

答案 2 :(得分:1)

单线解决方案

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

这里的诀窍是表达式year == 1960的除法。这种情况在1960年是正确的,在这种情况下,我们除以1,这使得该年的gdp保持不变。所有其他年份都是假的,在这种情况下我们除以0.这听起来很疯狂,但每当我们除以零时的结果只是缺失值,egen的{​​{1}}将忽略这些值。功能。

您可以使用其他mean()个功能,因为在这种情况下,每个国家/地区最多应有一个1960年的值,例如egenmax()min()也应该都有效。 (如果一个国家没有1960年的价值,或者缺失价值,我们最终会失踪,这正是应该的。)

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

的讨论

答案 3 :(得分:0)

我想不出比这两行短的任何东西:

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

如果您想要每年使用一个变量(例如gdp60, gdp61, gdp62,...),那么您可能应该使用reshape