Pregunta

Obtengo un comportamiento extraño (solo genera valores faltantes) del siguiente bucle -

  

foreach x del nombre varlist {egen   totalcap x '= total (límite) si la unidad! = 0 & amp;   nombre == " x '" ;, por (año)}

Pero si tuviera que hacer simplemente

  

egen totalcapSOMENAME = total (cap) si   unidad! = 0 & amp; nombre == " SOMENAME " ;, por (año)

luego calcula los números que se supone que debe calcular.

Este es un conjunto de datos de panel, la unidad denota el número dentro de una central eléctrica de una unidad generadora en particular (las unidades numeradas 0 son observaciones a nivel de planta). La variable cap es la capacidad instalada. La variable de nombre identifica la planta. Es complicado explicar por qué necesito este bucle, pero el problema está claramente en la forma en que STATA interpreta para cada uno.

¿Fue útil?

Solución

Tienes un par de problemas aquí. Lo más importante es que su primer ciclo está evaluando la palabra " nombre " en lugar de " x " a lo largo de su bucle. Así que está ejecutando su comando, por ejemplo:

foreach x of varlist name {
     egen totalcapname = total(cap) if unit!=0 and name=="name", by(year)
}

Dudo que esto sea lo que realmente quieres. Creo que quieres que lo evalúe cada elemento (observación) en tu " nombre " variable desde que usaste el nombre de la sentencia if == " x '" ;. Por lo tanto, debe eliminar las comillas dobles alrededor de " x '" en su declaración -if- O configure una macro local y configure el bucle egen para evaluar cada elemento en su " nombre " variable.

El segundo error que veo en su código es que falta la comilla hacia adelante o hacia la izquierda para la " x " en el bucle - debería leer " `x '" , no " x '" ;.

Aquí hay un ejemplo de lo que PIENSO que quieres ejecutar. Para fines de ilustración, estoy usando el Stata integrado " auto.dta " conjunto de datos para ejecutar su bucle & amp; declaración independiente ... por favor, tenga en cuenta que cambio el nombre de las variables en auto.dta a los nombres de sus variables:

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

Intente ejecutar este ejemplo en un archivo Do de Stata. Además, cuando tenga este tipo de problemas (donde el bucle crea un resultado diferente al del comando independiente), intente siempre teclear -set trace on, de modo que pueda ver cómo Stata está evaluando su bucle.

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