2

我对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

4 回答 4

3

您已经找到了一个解决方案cond(),但这里有一些建议可能会使您的数据建模更容易,并帮助您避免通过创建rank变量进行排序时可能出现的问题(我已经得到了egen您在下面询问的解决方案):

将下面的代码粘贴到您的 do-file 编辑器中并运行它:

*---------------------------------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
于 2010-05-18T20:53:27.483 回答
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 

1960wanted年为 1,否则为 0。

于 2010-05-01T08:29:56.533 回答
1

单线解决方案是

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

这里的诀窍是表达式除法year == 1960。对于 1960 年也是如此,在这种情况下,我们除以 1,该gdp年的值保持不变。对于所有其他年份都是错误的,在这种情况下我们除以 0。这听起来很疯狂,但是每当我们除以零时的结果就是缺失值,这将被egen'smean()函数忽略。

您可以使用其他egen函数,因为在这种情况下,每个国家/地区最多应该有一个 1960 的值,因此,例如max(), min()total()应该也都可以工作。(如果一个国家没有 1960 年的值,或者缺失值,我们最终会得到缺失,这正是应该的。)

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

于 2013-06-29T18:58:08.957 回答
0

我想不出比这两行更短的东西了:

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

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

于 2010-11-03T21:49:08.027 回答