Question

J'obtiens un comportement étrange (il ne génère que les valeurs manquantes) à partir de la boucle suivante -

  

foreach x du nom de varlist {egen   totalcap x '= total (cap) si unité! = 0 & amp;   name == " x '", par (année)}

Mais si je devais faire juste

  

egen totalcapSOMENAME = total (cap) si   unité! = 0 & amp; name == "SOMENAME", par (année)

alors il calcule les nombres qu'il est supposé calculer.

Il s’agit d’un jeu de données de panel, l’unité désignant le nombre au sein d’un groupe électrogène d’une unité génératrice particulière (les unités numérotées 0 sont des observations au niveau de l’usine). La variable cap est la capacité installée. La variable de nom identifie la plante. C’est compliqué d’expliquer pourquoi j’ai besoin de cette boucle, mais le problème tient clairement à la façon dont STATA interprète foreach.

Était-ce utile?

La solution

Vous avez quelques problèmes ici. Plus important encore, votre première boucle évalue le mot "nom". à la place de " x " tout au long de votre boucle. Donc, vous exécutez votre commande -egen- comme:

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

Je doute que ce soit ce que vous souhaitiez réellement. Je pense que vous souhaitez qu'il soit évalué en fonction de chaque élément (observation) de votre " nom " variable puisque vous avez utilisé l'instruction if nom == " x" " ;. Vous devez donc vous débarrasser des guillemets autour du " x '" dans votre -ifinstruction OU, configurez une macro locale et définissez la boucle egen à évaluer pour chaque élément de votre "nom". variable.

La deuxième erreur que je vois dans votre code est qu'il vous manque la citation en avant ou à gauche pour le signe "x". dans la boucle - il convient de lire "x" " , pas "x '".

Voici un exemple de ce que je pense que vous voulez exécuter. À des fins d’illustration, j’utilise le fichier "auto.dta" intégré à Stata. ensemble de données pour exécuter votre boucle & amp; standalone -egen- statement ... s'il vous plaît noter que je renomme les variables dans le auto.dta aux noms de vos 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)
***********

Essayez d’exécuter cet exemple dans un fichier Stata. En outre, lorsque vous rencontrez ce type de problèmes (où la boucle crée un résultat différent de celui de la commande autonome), essayez toujours de taper -set trace on pour voir comment Stata évalue votre boucle.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top