La creación de “PIB en 1960” variable a partir de variables del PIB de distintos años
-
02-10-2019 - |
Pregunta
Soy bastante nuevo en Stata.
Tengo un conjunto de observaciones de la forma "País Año PIB". Quiero crear un nuevo GDP1960 variable, lo que le da al PIB en 1960 de cada país para cada año:
USA $100m 1960 USA $100m 1960 $100m
USA $200m 1965 --> USA $200m 1965 $100m
Canada $60m 1960 Canada $60m 1960 $60m
¿Cuál es la sintaxis correcta para que esto suceda? (Supongo egen
está implicado de alguna manera misteriosa)
Solución 3
Bueno, he encontrado una solución en el final. Se basa en el hecho de que generate
y el trabajo replace
en los datos en su orden clasificado, y que se puede hacer referencia a la observación actual con _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
EDIT: Una solución más directa con el mismo sabor:
gen wanted = year == 1960
bysort country (wanted) : gen gdp60 = gdp[_N]
drop wanted
sort country year
Aquí wanted
será 1 para 1960 y 0 en caso contrario.
Otros consejos
Usted ha encontrado una solución con cond()
, pero aquí hay un par de sugerencias que podrían hacer que el modelado de datos más fácil y ayuda a evitar problemas con los problemas que pueden surgir cuando se ordenan mediante la creación de la variable de rank
(y yo tengo la egen
solución que le preguntó acerca de abajo):
Pegue el código siguiente en su editor de do-archivo y ejecutarlo:
*---------------------------------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
Una solución de una línea es
egen gdp60 = mean(gdp / (year == 1960)), by(country)
El truco aquí es la división por el year == 1960
expresión. Esto es cierto para 1960, en cuyo caso dividimos por 1, lo que deja al gdp
para ese año sin cambios. Es falso para todos los demás años, en cuyo caso se divide por 0. Esto suena loco, pero la consecuencia cada vez que dividir por cero está valores, que serán ignorados por la función de egen
mean()
simplemente desaparecido.
Usted podría utilizar otras funciones egen
, como en este caso no debe haber como máximo un valor de 1,960 para cada país, por lo que, por ejemplo, max()
, min()
, total()
debería funcionar también. (Si un país no tiene ningún valor para el 1960, o un valor que falta, vamos a terminar con la falta, que es precisamente como debe ser.)
discusión en http://www.stata-journal.com/article. html? article = dm0055
No se me ocurre nada más corta que estas dos líneas:
gen temp = gdp if year == 1960
by country : egen gdp60 = max(temp)
Si desea una variable para cada año (por ejemplo, gdp60, gdp61, gdp62,...
), entonces probablemente debería utilizar reshape