在Stata中将if限定符与egen一起使用

在Stata中将if限定符与egen一起使用,stata,Stata,我使用的是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 2

我使用的是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
限定符只会改变它所操作的观察结果,而不会改变它所平均的群体。有没有一种简单的方法可以做到这一点,或者我需要创建循环并手动生成每个平均值?

这是一种避免显式循环的方法,尽管它需要几行代码:

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

下面是一个简短的解决方案,它结合了您的原始想法和@onestop的解决方案,行数更少:

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

这对公司的普查都有好处。如果你有一个公司的样本,你需要应用权重,我不确定什么是好的解决方案。如果需要,我们可以集思广益。

这是一个仍感兴趣的老话题,所以第一轮讨论中忽略的材料和技术仍然适用

更通用的技术是使用总计。最简单的情况是,total of others=total of all-此值。在一个
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()
是另一种方法

如果遗漏包含在计数中,则前面给出的代码给出了错误的答案

即使缺少一个值,其他值的平均值仍然有意义

如果不缺少任何值,则上面的最后一行将简化为

gen avprice = (total - price) / (n - 1) 
到目前为止,这看起来可能只不过是以前代码的一个小变体,但它确实很容易扩展到使用权重。假设我们希望在给定一些权重的情况下,得到其他价格的加权平均值。我们可以利用
total()
作用于表达式这一事实,表达式可能比变量名更复杂。事实上,上面的代码已经做到了这一点,但它经常被忽略

egen wttotal = total(weight * price), by(market) 
egen sumwt = total(weight), by(market) 
gen avprice = (wttotal - price * weight) / (sumwt - weight) 
如前所述,如果
price
weight
丢失,则需要更复杂的代码,或者只是为了确保将这些观察结果从计算中排除

另请参见Stata常见问题解答

如何为组中其他成员的每个单独属性创建变量

进行更广泛的讨论

(如果数字变大,请使用
double
s。)

编辑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 |
     +----------------------------------+

你能举一个你计算的小例子吗。。。我所做的非常清楚(数据表就是我所做的)。讨论的
if
不是
if
命令,而是
if
限定符。我已进行了相应的编辑。如果数据未按
市场
排序,则会生成错误消息。它必须是
bysort
,至少在第一种情况下是这样。谢谢,我能够处理修改以将其转换为一个示例(多了几行),但这让我朝着正确的方向思考。