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.

È stato utile?

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.

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