2015-12-07 6 views
-1

J'ai 133 variables sur le revenu (chaque variable représente un groupe). Je veux les coefficients de Gini de tous ces groupes, donc j'utilise ineqdeco dans Stata. Je ne peux pas calculer ces coefficients à la main, donc je créé une boucle:Stata: pour la boucle de stockage des valeurs du coefficient de Gini

gen sgini = . 
foreach var of varlist C07-V14 { 
forvalue i=1/133 { 
ineqdeco `var' 
replace sgini[i] = $S_gini 
} 
} 

a également essayé de changer l'ordre:

foreach var of varlist C07-V14 { 
ineqdeco `var' 
forvalue i=1/133 { 
replace sgini[i] = $S_gini 
    } 
} 

et en spécifiant i avance:

gen i = 1 
foreach var of varlist C07-V14 { 
    ineqdeco `var' 
    replace sgini[i] = $S_gini 
    replace i = i+1 
    } 
    } 

I Je ne sais pas si cette dernière méthode fonctionne quand même. Dans tous les cas j'obtiens l'erreur: weight not allowed r(101). Je ne sais pas ce que cela signifie, ou quoi faire. Fondamentalement, je veux calculer le coefficient de Gini de toutes les 133 variables, et stocker ces valeurs dans un vecteur de longueur 133, donc une seule variable avec tous les coefficients qui y sont stockés.

Modifier: J'ai trouvé que l'erreur est liée à la commande replace. Je l'ai remplacé cette ligne avec:

replace sgini = $S_gini in `i' 

Mais maintenant, il ne « boucle », donc je reçois la première valeur dans toutes les entrées de sgini.

+0

Dans quel exemple avez-vous utilisé la commande de remplacement révisée? Je pense que les deux premiers exemples ont d'autres problèmes au-delà de la commande de remplacement. –

+0

Je les ai utilisés dans le premier et le deuxième exemple. Que pensez-vous est faux dans ceux-ci? Parce que je pense que ça va mal dans la varlist, parce qu'elle calcule le Gini de la première variable, et ceci 133 fois, et stocke cela dans ma variable. Donc je suppose que le 'je' est correct? Mais le troisième exemple n'est pas différent lorsque l'on considère la varlist .. –

Répondre

0

Il n'y a pas de raison évidente pour votre boucle interne. Si vous avez plus de variables que les observations, cela pourrait fonctionner:

gen sgini = . 
gen varname = "" 
local i = 1 
foreach var of varlist C07-V14 { 
    ineqdeco `var' 
    replace sgini = $S_gini in `i' 
    replace varname = "`var'" in `i' 
    local i = `i' + 1 
} 

Les problèmes évidents dans votre code (semblent) comprennent:

  1. Confusion entre les variables et macros locales. Si vous avez beaucoup d'expérience avec d'autres langues, il est difficile de briser les vieilles habitudes mentales. (Mata ressemble plus à d'autres langages ici.)

  2. Ne sachant pas qu'une boucle d'observations est automatique. Ou peut-être ne pas voir qu'il n'y a qu'une seule boucle nécessaire ici, la torsion étant que la boucle sur les variables est facile, mais vos observations de boucle concomitantes doivent être organisées avec votre propre code. Mettre un indice sur le LHS d'un replace. La notation [] est réservée aux poids mais est illégale dans tous les cas. Pour en savoir plus sur les poids, search weights ou help weight.

Notez qu'avec cette façon d'enregistrer les résultats, les coefficients de Gini ne sont alignés avec rien d'autre. Une correction de jeton pour cela consiste à enregistrer les noms de variables associés à côté, comme indiqué ci-dessus.

Une version plus avancée de cette solution consisterait à utiliser postfile pour enregistrer dans un nouvel ensemble de données.

+0

Merci !!Cela fonctionne parfaitement. D'abord, j'ai eu le problème d'avoir plus de variables que d'observations, mais c'est résolu! –

+0

Bien. J'ai ajouté quelques détails supplémentaires. –