我有一个如下所示的面板数据集:
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"的新变量,它是用这种方法获得的:
示例:
在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的组合)完成任务。
非常感谢你的时间。
答案 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