2009-10-24 8 views
1

je reçois un comportement étrange (il génère manque que des valeurs) de la boucle suivante -STATA boucle foreach comportement étrange

foreach x du nom de varlist {Egen totalcap x'=total(cap) if unit!=0 & name==" x ' », par (an) }

Mais si je devais le faire

Egen totalcapSOMENAME = totale (cap) si l'unité ! = 0 & name == "SOMENAME", par (année)

puis il calcule les nombres qu'il est censé calculer.

Ceci est un ensemble de données de panel, l'unité désigne le nombre dans un groupe motopropulseur 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 de plafond est la capacité installée. La variable name identifie la plante. C'est compliqué d'expliquer pourquoi j'ai besoin de cette boucle, mais le problème est clairement lié à la façon dont STATA interprète foreach.

Répondre

1

Vous avez quelques problèmes ici. Plus important encore, votre première boucle évalue le mot «nom» à la place de «x» dans votre boucle. Donc, son exécution de 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 voulez vraiment - je pense que vous voulez évaluer par chaque élément (observation) dans la variable « name » depuis que vous avez utilisé la if statement name == "x'". So, you need to either get rid of the double quotes around the " x '" dans votre instruction -if- OU configurez une macro locale et définissez la boucle egen à évaluer pour chaque élément de votre variable "name".

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

Voici un exemple de ce que JE PENSE que vous voulez exécuter. À des fins d'illustration, j'utilise le jeu de données intégré "auto.dta" Stata pour exécuter votre boucle & standalone -egen- déclaration ... notez que je renommer les variables dans le fichier auto.dta en noms de vos variables: Essayez d'exécuter cet exemple dans un fichier de type Stata. En outre, lorsque vous rencontrez ce type de problème (où la boucle crée un résultat différent de la commande autonome), essayez toujours de taper -set trace sur- afin de voir comment Stata évalue votre boucle.

+0

Une chose que j'ai oublié de mettre en évidence (mais qui est incluse dans l'extrait de code fourni) - vous n'avez pas besoin des guillemets autour de x dans la boucle, juste des guillemets simples ... donc ça devrait être == 'x ', pas == "x". –