2014-11-09 2515 views
0

我想計算我所在組中所有成員的平均值,但不包括我自己的平均值。假設組變量被稱爲group,我想取val1的平均值Group,排除我自己。我希望創建的新列是avg。數據看起來如下(輸入正確的值avg,這樣你就可以看到我的意思了)。Stata - 除當前觀察值外,計算組中每個人的平均值

Obs Group val1 avg 
1  A  6  8 
2  A  8  6 
3  B  10  13 
4  C  4  4 
5  C  2  5 
6  C  6  3 
7  B  12  12 
8  B  14  11 

如果我想將自己納入計算中,那將很簡單。我只是這樣做:

bysort Group: egen avg = mean(val1) 

但是我如何實現這個與我不包括自己的皺紋?

+1

請嘗試查看現有資源。這是自2001年以來的常見問題解答(http://www.stata.com/support/faqs/data-management/creating-variables-recording-properties/),因此可通過「搜索」找到答案。 – 2014-11-09 09:39:38

+0

問題和答案與**排序**無關,因此標記已被刪除。 – 2014-11-09 09:41:08

+1

另請參見http://stackoverflow.com/questions/9577808/using-if-qualifier-with-egen-in-stata關於查看現有資源的相同點.... – 2014-11-09 09:59:57

回答

4

一種方式是通過所有觀測循環:

clear 
set more off 

*----- example data ----- 

input /// 
Obs str1 Group val1 avg 
1  A  6  8 
2  A  8  6 
3  B  10  13 
4  C  4  4 
5  C  2  5 
6  C  6  3 
7  B  12  12 
8  B  14  11 
end 

list, sepby(Group) 

*----- what you want ----- 

encode Group, gen(group) 

gen avg2 = . 

forvalues j = 1/`=_N' { 

    summarize val1 if group == group[`j'] & _n != `j', meanonly    
    replace avg2 = r(mean) in `j' 
} 

list, sepby(group) 

另一種方法是使用egen功能:

<snip>  

*----- what you want ----- 

encode Group, gen(group) 

bysort group: egen totval = total(val1) 
by group: egen cval = count(val1) 
generate avg2 = (totval - val1)/(cval - 1) 

list, sepby(group) 

還有就是網絡上有一個很好的文章,涵蓋這個話題:

The Stata Journal(2014) 14,Number 2,pp.432-444, Spea國王Stata:自己和其他人,通過 Nicholas J. Cox。

+1

關鍵是,每個其他值的平均值是(總數 - 這個數值)/(全數 - 1),但是錯誤會使這個變得複雜,所以小心。 – 2014-11-09 10:55:59