我有一个面板数据集,如下所示:
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的组合)来完成任务。
非常感谢你抽出时间。
发布于 2018-03-20 18:54:17
正如尼克所指出的,您可以使用rangerun (来自SSC)来完成这一任务。对于每个观察,rangerun将使用一个数据集运行even_rank程序,该数据集只包含在所需的10周期窗口内的观测。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) verbosehttps://stackoverflow.com/questions/49386843
复制相似问题