2012-03-06 157 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 | 
    +----------------------------------+