La creazione di “PIL nel 1960” variabile da variabili PIL per diversi anni

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

  •  02-10-2019
  •  | 
  •  

Domanda

Sono abbastanza nuovo per Stata.

Ho una serie di osservazioni del tipo "Paese PIL dell'anno". Voglio creare un nuovo GDP1960 variabile, che dà il Pil nel 1960 di ciascun paese per ogni anno:

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

Qual è la sintassi corretta per rendere questo accada? (Presumo egen è coinvolto in qualche modo misterioso)

È stato utile?

Soluzione 3

Bene, ho trovato una soluzione alla fine. Essa si basa sul fatto che generate e il lavoro replace base dei dati in suo modo ordinato, e che è possibile fare riferimento all'osservazione corrente 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 soluzione più diretto con lo stesso sapore:

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

Qui wanted sarà 1 per il 1960 e 0 altrimenti.

Altri suggerimenti

Hai trovato una soluzione con cond(), ma ecco un paio di suggerimenti che potrebbero rendere la modellazione dei dati più facile e consentono di evitare problemi con problemi che potrebbero verificarsi durante l'ordinamento per la creazione la variabile rank (e ho il egen soluzione che hai chiesto di seguito):

Incollare il codice qui sotto nel vostro editor di do-file ed eseguirlo:

*---------------------------------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 soluzione one-linea è

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

Il trucco qui è la divisione per l'year == 1960 espressione. Questo è vero per il 1960, nel qual caso dividiamo per 1, che lascia il gdp per quell'anno invariato. È falso per tutti gli altri anni, nel qual caso dividiamo per 0. che suona folle, ma la conseguenza ogni volta che ci divisione per zero è solo manca valori, che saranno ignorati dalla funzione egen di mean().

È possibile utilizzare altre funzioni egen, come in questo caso ci dovrebbe essere al massimo un valore per il 1960 per ogni paese, in modo ad esempio max(), min(), total() dovrebbe lavorare tutti troppo. (Se un paese non ha alcun valore per il 1960, o un valore mancante, finiremo con il presente, che è precisamente come dovrebbe essere.)

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

Non riesco a pensare a qualcosa di più breve di queste due righe:

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

Se si desidera una variabile per ogni anno (ad esempio, gdp60, gdp61, gdp62,...) allora probabilmente dovrebbe usare reshape

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top