La creazione di “PIL nel 1960” variabile da variabili PIL per diversi anni
-
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)
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