2012-03-06 15 views
9

我使用Stata,我試圖計算一個市場上公司的競爭對手的平均價格。我有一個看起來像數據:在Stata中使用egen中的限定符

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限定符只會改變它所操作的觀測值,而不會改變它的平均值。有沒有簡單的方法來做到這一點,或者我需要創建循環並手動生成每個平均值?

+0

你可以給我一個很小的例子,我的計算...它的wud很清楚 – Teja 2012-03-06 04:19:27

+0

我做了(數據表是我的例子)。 – prototoast 2012-03-06 04:31:14

+0

正在討論的'if'不是'if'命令,而是'if'限定符。我已經編輯過。 – 2014-10-28 23:24:49

回答

7

這是避免顯式循環的方式,但它需要幾行代碼:

by Market: egen Total = total(Price) 
replace Total = Total - Price 
by Market: gen AvRivalPrice = Total/(_N-1) 
drop Total 
+0

如果數據未按「市場」排序,則會產生錯誤消息。至少在第一種情況下,它必須「排序」。 – StasK 2012-03-07 02:48:08

5

下面是用更少的線較短的解決方案,一種結合了原來的想法和@一站式的解決方案:

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

這對所有公司的普查都是有益的。如果你有一個公司樣本,並且你需要應用權重,我不確定什麼是一個好的解決方案。如果需要,我們可以集思廣益。

+0

謝謝,我能夠處理修改,將其轉換爲樣本(多了幾行),但這讓我想到了正確的方向。 – prototoast 2012-03-07 16:51:46

8

這是一條仍然感興趣的舊線索,因此第一次忽略的材料和技術仍然適用。

更一般的技術是使用總計。最簡單的是,其他人的總數=總數 - 這個值。在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) 

egentotal()功能在其論調忽略遺漏值。如果有缺失值,我們不希望將它們包括在計數中,但我們可以使用!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) 

如前所述,如果priceweight是不斷丟失,你需要更復雜的代碼,或只是爲了確保您排除從計算這樣的觀察。

又見Stata的常見問題

如何創建變量總結爲一組的其他成員的每個單獨的屬性?

http://www.stata.com/support/faqs/data-management/creating-variables-recording-properties/

對於較寬範圍的討論。

(如果數字變大,與double的工作。)

編輯2018 3月2日這是一個古老的線程,而這又需要更新一個新的職位。 rangestat(SSC)可以在這裏使用,並提供單線解決方案。毫不奇怪,選項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 | 
    +----------------------------------+