Stata - 计算除当前观察外的每个人的平均值

时间:2014-11-09 03:38:52

标签: stata

我想计算我所在群体中所有成员的平均值,但不包括我自己的平均值。假设组变量被称为group,我希望val1Group的平均值,不包括我自己。我想要创建的新列是avg。数据看起来如下(正确的avg值被输入,这样你就可以看到我的意思了)。

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 个答案:

答案 0 :(得分: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, Speaking Stata:Self and others ,by Nicholas J. Cox。