9

私はStataを使用しており、市場における企業のライバルの平均価格を計算しようとしています。次のようなデータがあります。

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

また、各企業のライバルの平均価格を計算しようとしているので、市場の他の企業の平均値である新しいフィールドを生成したいと思います。次のようになります。

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

グループごとの平均を行うには、egenコマンドを使用できます。

egen AvPrice = mean(price), by(Market)

しかし、それは平均で会社自身の価格を除外するものではなく、私の知る限り、if修飾子を使用すると、平均したグループではなく、操作した観測値のみが変更されます。これを行う簡単な方法はありますか、それともループを作成して各平均を手動で生成する必要がありますか?

4

3 に答える 3

9

これはまだ興味深い古いスレッドであるため、最初のラウンドで見落とされていた材料と技術が引き続き適用されます。

より一般的な手法は、合計を処理することです。最も単純な場合、他の合計=すべての合計-この値。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を生成するを使用できます。はこれを行う別の方法ですegencount()

カウントに含まれているため、欠落が存在する場合、前に示したコードは間違った答えを示します_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/

幅広い議論のために。

(数値が大きくなる場合は、doublesを使用してください。)

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 |
     +----------------------------------+
于 2013-02-20T10:52:21.197 に答える
7

これは、明示的なループを回避する方法ですが、数行のコードが必要です。

by Market: egen Total = total(Price)
replace Total = Total - Price
by Market: gen AvRivalPrice = Total / (_N-1)
drop Total
于 2012-03-06T11:29:47.493 に答える
5

これは、元の考えと@onestopのソリューションを組み合わせた、行数の少ない短いソリューションです。

      egen AvPrice = mean(price), by(Market)
      bysort Market: replace AvPrice = (AvPrice*_N - price)/(_N-1)

これはすべて、企業の国勢調査に適しています。あなたが会社のサンプルを持っていて、あなたが重みを適用する必要があるならば、私は良い解決策が何であるかわかりません。必要に応じてブレインストーミングを行うことができます。

于 2012-03-07T02:46:20.707 に答える