使用rangestat

时间:2018-03-20 14:24:08

标签: stata

我有一个如下所示的面板数据集:

ID   Time   Income
1    1      20
1    2      15
1    3      30
1    4      10
1    5      40
1    6      22
1    7      18
1    8      35
1    9      16
1    10     26
1    11     50
1    12     17
1    13     18

...

2    1      19
2    2      44

...

我想生成一个名为" Ave_Rank"的新变量,它是用这种方法获得的:

  1. 对于每个ID,对于Time with>的观察; 10,排名前10(t-10 至t-1)收入;最大的等级为10,最小 获得等级1.
  2. Ave_Rank是收入的平均排名     t-1,t-3,t-5,t-7,t-9。
  3. 示例:

    在t = 11 [Ave_Rank =(7 + 9 + 6 + 1 + 2)/ 5 = 5]

    ID   Time   Income   Rank   Ave_Rank
    1    1      20       5       
    1    2      15       2
    1    3      30       8
    1    4      10       1
    1    5      40       10
    1    6      22       6
    1    7      18       4
    1    8      35       9
    1    9      16       3
    1    10     26       7
    1    11     50              5     
    

    t = 12 [Ave_Rank =(10 + 3 + 4 + 9 + 7)/ 5 = 6.6]

    ID   Time   Income   Rank   Ave_Rank     
    1    2      15       2
    1    3      30       7
    1    4      10       1
    1    5      40       9
    1    6      22       5
    1    7      18       4
    1    8      35       8
    1    9      16       3
    1    10     26       6
    1    11     50       10          
    1    12     17              6.6   
    

    我知道一个(冗长的)方法可以使用以下方法生成滞后(从1到10):

    tsset ID Time
    gen income1 = l.Income
    gen income1 = l2.Income
    

    ...

    gen income10 = l10.Income
    

    然后从长到长重塑:

    reshape long income, i(ID_Time) j(time_lag)
    

    然后为每个ID_Time生成排名:

    bys ID_Time: egen income_rank = rank(income)
    

    最后,生成所需的Ave_Rank变量:

    by ID_Time: egen Ave_Rank = mean(income_rank) if time_lag == 1 | time_lag == 3 | time_lag == 5 |time_lag == 7 |time_lag == 9
    

    但我想知道是否有办法使用rangestat(或Mata和rangestat的组合)完成任务。

    非常感谢你的时间。

1 个答案:

答案 0 :(得分:1)

正如尼克指出的那样,你可以用rangerun(来自SSC)来做到这一点。对于每次观察,rangerun将使用仅包含所需10个周期窗口内的观察的数据集运行even_rank程序。 even_rank程序按income命令观察,将数据减少到偶数观察(t-1是第10次观察),然后计算平均值。

clear all

* Example generated by -dataex-. To install: ssc install dataex
clear
input byte(id time income)
1  1 20
1  2 15
1  3 30
1  4 10
1  5 40
1  6 22
1  7 18
1  8 35
1  9 16
1 10 26
1 11 50
1 12 17
1 13 18
end
isid id time, sort

program even_rank
    if _N < 10 exit
    sort income time
    gen rank = _n
    sort time
    keep if mod(_n,2) == 0
    sum rank, meanonly
    gen Ave_Rank = r(mean)
    drop rank
end
rangerun even_rank, by(id) interval(time -10 -1) verbose