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

Ranking aggregated values in panel data

我有一个不平衡的面板数据集,每天的数据与此类似,适用于 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 的排名会为以下 id 产生错误的排名)

最后一行语法

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 的评论一致,最大的两个可能无法在存在联系的情况下唯一识别。