对面板数据中的聚合值进行排名

时间:2015-08-31 13:52:17

标签: panel stata ranking

我有一个不平衡的面板数据集,其中包含与此类似的日常数据,适用于n个国家/地区:

quarter date id trade trade_quarterly rank       i
 1       1    1    1    2               1        10
 1       2    1    1    2               1        17
 1       1    2    1    1               2        12

 2       1    1    0    1               1        5
 2       2    1    1    1               1        9
 2       1    2    0    1               1        14
 2       2    2    1    1               1        8
 2       2    3    0    0               3        6

鉴于前4列。

对信息感兴趣i,我现在只想保留每季度 2交易最多的ID 。我用

汇总了季度交易
bysort quarter id: egen trade_quarterly =sum(trade) 

获取第5列。

要计算第6列,我尝试使用

bysort quarter id : egen xx =rank(trade_quarterly), "option" 

似乎没有产生正确的解决方案。

(请注意,由于值在ids 中与rank(xx), field排名,因此会产生以下内容的错误排名。

1 个答案:

答案 0 :(得分:0)

语法的最后一行

bysort quarter id : egen xx =rank(trade_quarterly), option 

不合法,因为文字option本身不是一种选择。更一般地说,egen, rank()无法帮助您处理当前的数据结构。

但考虑到这一点,只需collapse总和(总计),然后在交叉组合中只保留最大的两个(排序后的最后两个):

clear 
input quarter date id trade 
 1       1    1    1    2   
 1       2    1    1    2   
 1       1    2    1    1   
 2       1    1    0    1   
 2       2    1    1    1   
 2       1    2    0    1   
 2       2    2    1    1   
 2       2    3    0    0   
end 
collapse (sum) trade, by(quarter id) 
bysort quarter (trade) : keep if (_N - _n) < 2 
list, sepby(id quarter) 

     +----------------------+
     | quarter   id   trade |
     |----------------------|
  1. |       1    2       1 |
     |----------------------|
  2. |       1    1       2 |
     |----------------------|
  3. |       2    1       1 |
     |----------------------|
  4. |       2    2       1 |
     +----------------------+

如果您不想collapse,那么额外的技巧就是在排名时仅标记每个id - quarter对。

clear 
input quarter date id trade 
 1       1    1    1    2   
 1       2    1    1    2   
 1       1    2    1    1   
 2       1    1    0    1   
 2       2    1    1    1   
 2       1    2    0    1   
 2       2    2    1    1   
 2       2    3    0    0   
end 
egen sum = total(trade), by(quarter id) 
egen tag = tag(quarter id) 
bysort tag quarter (trade) : gen tokeep = tag & (_N - _n) < 2 
bysort quarter id (tokeep) : replace tokeep = tokeep[_N] 
list if tokeep, sepby(quarter) 

     +--------------------------------------------------+
     | quarter   date   id   trade   sum   tag   tokeep |
     |--------------------------------------------------|
  1. |       1      2    1       1     2     0        1 |
  2. |       1      1    1       1     2     1        1 |
  3. |       1      1    2       1     1     1        1 |
     |--------------------------------------------------|
  4. |       2      2    1       1     1     0        1 |
  5. |       2      1    1       0     1     1        1 |
  6. |       2      2    2       1     1     0        1 |
  7. |       2      1    2       0     1     1        1 |
     +--------------------------------------------------+

请注意,与@William Lisowski的评论一致,最大的两个在关系存在时可能无法识别。