【问题标题】:Ranking aggregated values in panel data对面板数据中的聚合值进行排名
【发布时间】:2015-08-31 13:52:17
【问题描述】:

我有一个不平衡的面板数据集,其中包含 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 产生错误排名)

【问题讨论】:

  • 第 6 列告诉我们,第一季度,id 1 排名第一,id 2 排名第二。而在第二节,id 1 和 id 2 并列第一,id 3 排名第三(因为 id 1 和 id 2 都排在它之上)。
  • 是的,确实如此。这里的关键是,trade_quarterly 不会在一个 id 内变化,但 id 可能与该变量绑定。

标签: panel stata ranking


【解决方案1】:

最后一行语法

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

【讨论】:

  • 非常感谢尼克。但是,我最初对每日级别的 id 数据感兴趣,我在上面的数据细分中没有充分显示。我已经相应地编辑了我的问题。有没有办法解决它?
  • 我不明白原则上有什么不同。显然,您可以在 trade 旁边使用 collapse 其他变量。
  • 一旦我在任何变量上使用collapse,我将聚合 i,这不是目的。应保留数据的日常结构。该过程的唯一目标是过滤掉 x 个交易最多的 id。
猜你喜欢
  • 1970-01-01
  • 2020-09-19
  • 1970-01-01
  • 2023-03-08
  • 2017-02-22
  • 2021-01-04
  • 2017-08-15
  • 1970-01-01
  • 2021-03-30
相关资源
最近更新 更多