对面板数据中的聚合值进行排名
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 的评论一致,最大的两个可能无法在存在联系的情况下唯一识别。
我有一个不平衡的面板数据集,每天的数据与此类似,适用于 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 的评论一致,最大的两个可能无法在存在联系的情况下唯一识别。