En utilisant si qualificatif avec egen dans Stata
Je suis à l'aide de Stata, et je suis en train de calculer le prix moyen des entreprises " les concurrents dans un marché. J'ai des données qui ressemble à:
Market Firm Price
----------------------
1 1 100
1 2 150
1 3 125
2 1 50
2 2 100
2 3 75
3 1 100
3 2 200
3 3 200
Et je suis en train de calculer le prix moyen de chaque entreprise à ses rivaux, donc je veux générer un nouveau champ, qui est la moyenne des valeurs des autres entreprises dans un marché. Il devrait ressembler à:
Market Firm Price AvRivalPrice
------------------------------------
1 1 100 137.2
1 2 150 112.5
1 3 125 125
2 1 50 87.5
2 2 100 62.5
2 3 75 75
3 1 100 200
3 2 200 150
3 3 200 150
À faire la moyenne par groupe, je pourrais utiliser le egen commande:
egen AvPrice = mean(price), by(Market)
Mais qui ne serait pas exclure la firme de prix dans la moyenne, et au meilleur de ma connaissance, à l'aide de la if
qualificatif ne ferait que changer les observations qu'il a opéré, pas les groupes qu'il était en moyenne de plus de. Est-il un moyen simple de faire cela, ou dois-je besoin pour créer des boucles et de générer chaque moyenne à la main?
Je l'ai fait (le tableau de données est l'exemple de ce que j'ai).
Le
if
d'être parlé n'est pas le if
commande, mais le if
qualificatif. J'ai modifié en conséquence.OriginalL'auteur prototoast | 2012-03-06
Vous devez vous connecter pour publier un commentaire.
C'est un chemin qui évite explicite boucles, même si cela prend plusieurs lignes de code:
Market
. Il doit êtrebysort
, au moins dans le premier cas.OriginalL'auteur onestop
C'est un vieux thread encore de l'intérêt, de sorte que les matériaux et les techniques négligé la première fois continuent de s'appliquer.
La plus générale de la technique est de travailler avec les totaux. Dans sa plus simple expression, le total des autres = nombre total de tous - cette valeur. Dans un
egen
cadre qui va ressemblerLa
total()
fonction deegen
ignore les valeurs manquantes dans son argument. Si il y a des valeurs manquantes, nous ne voulons pas de les inclure dans le décompte, mais nous pouvons utiliser!missing()
qui donne 1 si ne manquent pas et 0 s'il est manquant.egen
'scount()
est une autre façon de le faire.Code donné précédemment donne la mauvaise réponse si missings sont présents car ils sont inclus dans le décompte
_N
.Même si une valeur est manquante, à la moyenne des autres valeurs encore un sens.
Si aucune valeur n'est manquante, la dernière ligne ci-dessus se simplifie à
Jusqu'à présent, cette possibilité semble comme rien de plus qu'une petite variante sur le code précédent, mais il ne s'étendent facilement à l'aide de poids. Sans doute, nous voulons une moyenne pondérée des autres prix donné quelques
weight
. On peut exploiter le fait quetotal()
travaux sur les expressions, qui peut être plus compliqué que de simplement les noms de variables. En effet, le code ci-dessus fait déjà, mais il est souvent négligé.Comme avant, si
price
ouweight
est toujours manquant, vous avez besoin de plus de code compliqué, ou juste pour s'assurer que vous exclure de telles observations des calculs.Voir aussi le logiciel Stata FAQ
Comment puis-je créer des variables résumant pour chaque individu, les propriétés des autres membres d'un groupe?
http://www.stata.com/support/faqs/data-management/creating-variables-recording-properties/
pour une plus large discussion.
(Si les nombres sont grands, travailler avec
double
s).EDIT 2 Mars 2018 Qui a été un nouveau post dans un vieux thread, qui à son tour nécessite une mise à jour.
rangestat
(SPC) peut être utilisé ici, et donne une ligne de solutions. Il n'est pas surprenant, l'optionexcludeself
a été explicitement ajoutée pour ces types de problème. Mais alors que la solution pour le moyen est facile à l'aide d'une identitémoyenne pour les autres = (total de la valeur pour l'auto) /count - 1)
de nombreuses autres mesures sommaires de ne pas céder à un semblable, un truc simple et, dans ce sens
rangestat
comprend beaucoup plus générales de codage.OriginalL'auteur Nick Cox
Voici une solution plus courte avec moins de lignes que le genre de combine votre pensée originale et @guichet unique de la solution:
C'est tout bon pour un recensement des entreprises. Si vous avez un échantillon de firmes, et vous avez besoin d'appliquer le poids, je ne suis pas sûr qu'une bonne solution serait. On peut discuter si nécessaire.
OriginalL'auteur StasK