我对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
涉及一些神秘的方式)
答案 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)
好吧,我最终找到了解决方案。它依赖于generate
和replace
以排序顺序处理数据的事实,并且您可以使用_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年的值,例如egen
,max()
,min()
也应该都有效。 (如果一个国家没有1960年的价值,或者缺失价值,我们最终会失踪,这正是应该的。)
答案 3 :(得分:0)
我想不出比这两行短的任何东西:
gen temp = gdp if year == 1960
by country : egen gdp60 = max(temp)
如果您想要每年使用一个变量(例如gdp60, gdp61, gdp62,...
),那么您可能应该使用reshape