首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用rangestat从t-k到t-1在Stata观测的滚动等级

使用rangestat从t-k到t-1在Stata观测的滚动等级
EN

Stack Overflow用户
提问于 2018-03-20 14:24:07
回答 1查看 328关注 0票数 0

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

代码语言:javascript
复制
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

..。

代码语言:javascript
复制
2    1      19
2    2      44

..。

我想生成一个名为"Ave_Rank“的新变量,这个变量是在这个方法中得到的:

  1. 对于每一个ID,对于时间> 10的观测,将先前的10 (t-10到t-1)收入排序;最大的(t-10到t-1)收入排名为10,最小的(t-1)为1。
  2. Ave_Rank是t-1,t-3,t-5,t-7,t-9的平均收入等级.

示例:

T= 11 Ave_Rank = (7+9+6+1+2) /5=5

代码语言:javascript
复制
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

代码语言:javascript
复制
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):

代码语言:javascript
复制
tsset ID Time
gen income1 = l.Income
gen income1 = l2.Income

..。

代码语言:javascript
复制
gen income10 = l10.Income

然后从宽到长重新塑造:

代码语言:javascript
复制
reshape long income, i(ID_Time) j(time_lag)

然后为每个ID_Time生成秩:

代码语言:javascript
复制
bys ID_Time: egen income_rank = rank(income)

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

代码语言:javascript
复制
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的组合)来完成任务。

非常感谢你抽出时间。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-03-20 18:54:17

正如尼克所指出的,您可以使用rangerun (来自SSC)来完成这一任务。对于每个观察,rangerun将使用一个数据集运行even_rank程序,该数据集只包含在所需的10周期窗口内的观测。even_rank程序通过income对观测数据进行排序,将数据简化为均匀观测(t-1是第10次观测),然后计算平均值。

代码语言:javascript
复制
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
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/49386843

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档