查找组的滞后平均值

时间:2017-02-28 20:01:13

标签: stata

我正在尝试从三维面板数据集创建工具,如下所示:

input firm  year    market  price   comp_avg
1   2000    10  1   .
3   2000    10  2   .
3   2001    10  3   .
1   2002    10  4   .
3   2002    10  5   .
1   2000    20  6   .
3   2000    20  7   .
1   2001    20  8   .
2   2001    20  9   .
3   2001    20  10  .
1   2002    20  20  .
2   2002    20  30  .
3   2002    20  40  .
2   2000    30  50  .
1   2001    30  60  .
2   2001    30  70  .
1   2002    30  80  .
2   2002    30  90  .
end

我试图创建的工具是公司在特定年份运营的每个市场中竞争对手(同一市场的竞争对手)的平均价格滞后(第1年)。

目前,我有一些代码可以完成这项工作,但我希望我遗漏了一些东西,并且能够以更清晰或有效的方式做到这一点。

以下是代码:

// for each firm
qui levelsof firm, local(firms)
qui foreach f in `firms' {

    // find all years for that firm
    levelsof year if firm == `f', local(years)
    foreach y in `years' {

        // skip first year (because there is no lagged data)
        if `y' == 2000 {
            continue
        }

        // find all markets in that year
        levelsof market if firm == `f' & year == `y', local(mkts)
        local L1 = `y'-1
        foreach m in `mkts' {

            // get average of all compeitors in that market in the year prior
            gen temp = firm != `f' & year == `L1' & market == `m'
            su price if temp
            replace comp_avg = r(mean) if firm == `f' & market == `m' & year == `y'
            drop temp

        }
    }
}

我正在使用的数据相当大(约100万个障碍物),因此越快越好。

1 个答案:

答案 0 :(得分:1)

clear 
input firm  year    market  price   
1   2000    10  1   
3   2000    10  2   
3   2001    10  3   
1   2002    10  4   
3   2002    10  5   
1   2000    20  6   
3   2000    20  7   
1   2001    20  8   
2   2001    20  9   
3   2001    20  10  
1   2002    20  20  
2   2002    20  30  
3   2002    20  40  
2   2000    30  50  
1   2001    30  60  
2   2001    30  70  
1   2002    30  80  
2   2002    30  90  
end

bysort firm market (year) : gen Lprice = price[_n-1] if year - year[_n-1] == 1 

bysort market year : egen total = total(Lprice) 
bysort market year : egen count = count(Lprice) 

gen mean_others = (total - cond(missing(Lprice), 0, Lprice)) /// 
/ (count - cond(missing(Lprice), 0, 1)) 

sort market year 

list market year firm price Lprice mean_others total count, sepby(market year) 

     +--------------------------------------------------------------------------+
     | market   year   firm   price   Lprice   price   mean_o~s   total   count |
     |--------------------------------------------------------------------------|
  1. |     10   2000      1       1        .       1          .       0       0 |
  2. |     10   2000      3       2        .       2          .       0       0 |
     |--------------------------------------------------------------------------|
  3. |     10   2001      3       3        2       3          .       2       1 |
     |--------------------------------------------------------------------------|
  4. |     10   2002      1       4        .       4          3       3       1 |
  5. |     10   2002      3       5        3       5          .       3       1 |
     |--------------------------------------------------------------------------|
  6. |     20   2000      3       7        .       7          .       0       0 |
  7. |     20   2000      1       6        .       6          .       0       0 |
     |--------------------------------------------------------------------------|
  8. |     20   2001      2       9        .       9        6.5      13       2 |
  9. |     20   2001      3      10        7      10          6      13       2 |
 10. |     20   2001      1       8        6       8          7      13       2 |
     |--------------------------------------------------------------------------|
 11. |     20   2002      1      20        8      20        9.5      27       3 |
 12. |     20   2002      3      40       10      40        8.5      27       3 |
 13. |     20   2002      2      30        9      30          9      27       3 |
     |--------------------------------------------------------------------------|
 14. |     30   2000      2      50        .      50          .       0       0 |
     |--------------------------------------------------------------------------|
 15. |     30   2001      2      70       50      70          .      50       1 |
 16. |     30   2001      1      60        .      60         50      50       1 |
     |--------------------------------------------------------------------------|
 17. |     30   2002      2      90       70      90         60     130       2 |
 18. |     30   2002      1      80       60      80         70     130       2 |
     +--------------------------------------------------------------------------+

我的方法将其分解:

  1. 计算同一公司和市场的先前价格。 (#1也可以通过宣布一个(公司,市场)对来完成。)

  2. 同一市场和年份中其他值(此处为先前价格)的平均值是(其他人的总和减去此价格)除以(其他人数减1)。

  3. #2需要修改,好像缺少这个价格,你需要从分子和分母中减去0。 Stata的正常规则会使MINUS缺失缺失,但该公司之前的价格可能未知,但同一市场中的其他价格可能已知价格。

  4. 注意:加速代码的方法很简单,但这应该更快(只要它是正确的)。

    编辑:使用rangestat的另一个解决方案(2行)(必须使用ssc inst rangestat安装):

    bysort firm market (year) : gen Lprice = price[_n-1] if year - year[_n-1] == 1 
    rangestat Lprice, interval(year 0 0) by(market) excludeself