La creación de “PIB en 1960” variable a partir de variables del PIB de distintos años

StackOverflow https://stackoverflow.com/questions/2745202

  •  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)

¿Fue útil?

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

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top