2017-02-28 86 views
1

集團我試圖從一個三維面板數據創建工具,如下包括:查找滯後平均

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 

     } 
    } 
} 

我一起工作的數據是相當大的(〜百萬OBS),所以速度越快越好。

回答

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. 計算之前的價格爲同一家公司和市場。 (也可以通過宣佈一個(公司,市場)對面板來完成。)

  2. 在同一市場和年份中其他值的平均值(這裏是之前的價格)是(其他值的總和) )除以(其他MINUS 1的數量)。

  3. #2需要修改,就好像缺少這個價格一樣,您需要從分子和分母都減去0。 Stata的正常規則會使MINUS失蹤,但這家公司以前的價格可能是未知的,但其他人在同一個市場可能已知價格。

注意:加速代碼的方法有很多,但速度應該更快(只要它是正確的)。

編輯:使用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 
+0

感謝您的回答!這是一個很大的加速和更清晰。不知道爲什麼我無法繞過創造滯後的價格變量我的頭 –

+0

@EricHB另一個解決方案提供。一線解決方案歡迎。 –

+0

看來你的第一個解決方案在我的機器上還是比較快,但是rangestat命令有非常明確的語法,這總是一個加號 –