これはまだ興味深い古いスレッドであるため、最初のラウンドで見落とされていた材料と技術が引き続き適用されます。
より一般的な手法は、合計を処理することです。最も単純な場合、他の合計=すべての合計-この値。egen
次のようなフレームワークで
egen total = total(price), by(market)
egen n = total(!missing(price)), by(market)
gen avprice = (total - cond(missing(price), 0, price)) / cond(missing(price), n, n - 1)
のtotal()
関数はegen
、引数の欠落値を無視します。欠落している値がある場合、それらをカウントに含めたくありませんが、欠落していない!missing()
場合は1、欠落している場合は0を生成するを使用できます。はこれを行う別の方法ですegen
。count()
カウントに含まれているため、欠落が存在する場合、前に示したコードは間違った答えを示します_N
。
値が欠落している場合でも、他の値の平均は意味があります。
欠落している値がない場合、上記の最後の行は次のように簡略化されます。
gen avprice = (total - price) / (n - 1)
これまでのところ、これは前のコードの小さな変形にすぎないように見えるかもしれませんが、ウェイトの使用に簡単に拡張できます。おそらく、他の人の価格の加重平均が必要ですweight
。式で機能するという事実を利用total()
できます。式は、単なる変数名よりも複雑になる可能性があります。確かに、上記のコードはすでにそれを行っていますが、見過ごされがちです。
egen wttotal = total(weight * price), by(market)
egen sumwt = total(weight), by(market)
gen avprice = (wttotal - price * weight) / (sumwt - weight)
以前と同様に、price
またはweight
欠落している場合は、より複雑なコードが必要です。または、そのような観測値を計算から除外するためだけに使用する必要があります。
StataFAQも参照してください
グループの他のメンバーの個々のプロパティを要約する変数を作成するにはどうすればよいですか?
http://www.stata.com/support/faqs/data-management/creating-variables-recording-properties/
幅広い議論のために。
(数値が大きくなる場合は、double
sを使用してください。)
2018年3月2日編集それは古いスレッドの新しい投稿であり、更新が必要です。rangestat
(SSC)はここで使用でき、1行のソリューションを提供します。当然のことながら、excludeself
この種の問題に対してオプションが明示的に追加されました。しかし、手段の解決策はアイデンティティを使用して簡単ですが
他の人の平均=(合計-自己の値)/(カウント-1)
他の多くの要約メジャーは、同様の単純なトリックにはなりません。その意味でrangestat
、はるかに一般的なコーディングが含まれます。
clear
input 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
end
rangestat (mean) Price, interval(Firm . .) by(Market) excludeself
list, sepby(Market)
+----------------------------------+
| Market Firm Price Price_~n |
|----------------------------------|
1. | 1 1 100 137.5 |
2. | 1 2 150 112.5 |
3. | 1 3 125 125 |
|----------------------------------|
4. | 2 1 50 87.5 |
5. | 2 2 100 62.5 |
6. | 2 3 75 75 |
|----------------------------------|
7. | 3 1 100 200 |
8. | 3 2 200 150 |
9. | 3 3 200 150 |
+----------------------------------+