Comportamento dispari STATA foreach loop
Domanda
Ricevo un comportamento strano (genera solo valori mancanti) dal seguente ciclo -
foreach x of varlist name {egen totalcap
x '= total (cap) se unit! = 0 & amp; nome == "
x '" ;, entro (anno)}
Ma se dovessi fare solo
egen totalcapSOMENAME = total (cap) if unit! = 0 & amp; nome == " SOMENAME " ;, entro (anno)
quindi calcola i numeri che dovrebbe calcolare.
Questo è un set di dati del pannello, unità indica il numero all'interno di un gruppo motopropulsore di un particolare generatore (le unità numerate 0 sono osservazioni a livello di impianto). La variabile cap è la capacità installata. La variabile name identifica la pianta. È complicato spiegare perché ho bisogno di questo ciclo, ma il problema è chiaramente nel modo in cui STATA interpreta foreach.
Soluzione
Hai un paio di problemi qui. Ancora più importante, il tuo primo ciclo sta valutando la parola " nome " al posto di " x " per tutto il ciclo. Quindi sta eseguendo il tuo comando -egen- come:
foreach x of varlist name {
egen totalcapname = total(cap) if unit!=0 and name=="name", by(year)
}
Dubito che questo sia ciò che vuoi davvero - penso che tu voglia che valuti per ogni elemento (osservazione) nel tuo "nome". poiché hai usato l'istruzione if name == " x '" ;. Pertanto, devi eliminare le doppie virgolette attorno a "
x '" nell'istruzione -if- OPPURE imposta una macro locale e imposta il ciclo egen per valutare per ogni elemento nel tuo "nome"; variabile.
Il secondo errore che vedo nel tuo codice è che ti manca la citazione in avanti o a sinistra per la " x " nel ciclo - dovrebbe leggere " `x '" , non " x '" ;.
Ecco un esempio di ciò che PENSO tu voglia eseguire. A scopo illustrativo, sto utilizzando lo Stata incorporato "auto.dta" set di dati per eseguire il tuo loop & amp; istruzione indipendente -egen- ... tieni presente che ho rinominato le variabili in auto.dta con i nomi delle variabili:
***********
clear
sysuse auto
**
//this section renames the auto.dta variables to the name of your variables//
gen year = [_n]
rename mpg cap
rename price unit
rename make name
**NOTE: your "SOMENAME" will be "Subaru" in this example!**
**
//here's the loop you should be running//
foreach x of varlist name {
egen totalcap`x'=total(cap) if unit!=0 & name==`x', by(year)
}
//without the loop//
egen totalcapSOMENAME=total(cap) if unit!=0 & name=="Subaru", by(year)
//Display the results//
li name unit cap totalcap* if !missing(totalcapSOMENAME)
***********
Prova a eseguire questo esempio in un do-file Stata. Inoltre, quando hai questo tipo di problemi (in cui il ciclo crea un risultato diverso rispetto al comando autonomo), prova sempre a digitare -set trace on- in modo da poter vedere come Stata sta valutando il tuo loop.