我有一个不平衡的面板数据集,其中包含与此类似的日常数据,适用于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
排名,因此会产生以下内容的错误排名。
答案 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的评论一致,最大的两个在关系存在时可能无法识别。