這是一條仍然感興趣的舊線索,因此第一次忽略的材料和技術仍然適用。
更一般的技術是使用總計。最簡單的是,其他人的總數=總數 - 這個值。在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)
的egen
的total()
功能在其論調忽略遺漏值。如果有缺失值,我們不希望將它們包括在計數中,但我們可以使用!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
是不斷丟失,你需要更復雜的代碼,或只是爲了確保您排除從計算這樣的觀察。
又見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 |
+----------------------------------+
你可以給我一個很小的例子,我的計算...它的wud很清楚 – Teja 2012-03-06 04:19:27
我做了(數據表是我的例子)。 – prototoast 2012-03-06 04:31:14
正在討論的'if'不是'if'命令,而是'if'限定符。我已經編輯過。 – 2014-10-28 23:24:49