如何对面板数据中的观察结果进行排名?
How to rank observations in panel data?
我在 Stata 中有一个面板数据集,其中包含多个国家和每个国家包含组。我想根据变量 var1
.
按国家/地区对组进行排名
我的数据集结构如下(排名列是我想实现的)。请注意,var1 在组内确实是常数(它只是另一个变量的组内平均值)。
--country--|--groupId--|---time----|---var1----|---rank---
1 | 1 | 1 | 50 | 3
1 | 1 | 2 | 50 | 3
1 | 1 | 3 | 50 | 3
1 | 2 | 1 | 90 | 1
1 | 2 | 2 | 90 | 1
1 | 2 | 3 | 90 | 1
1 | 3 | 1 | 60 | 2
1 | 3 | 2 | 60 | 2
1 | 3 | 3 | 60 | 2
2 | 4 | 1 | 15 | 2
2 | 4 | 2 | 15 | 2
2 | 4 | 3 | 15 | 2
2 | 5 | 1 | 10 | 3
2 | 5 | 2 | 10 | 3
2 | 5 | 3 | 10 | 3
2 | 6 | 1 | 80 | 1
2 | 6 | 2 | 80 | 1
2 | 6 | 3 | 80 | 1
我试过的选项有:
sort country groupId
by country (groupId): egen rank = rank(var1)
然而,我并没有达到想要的效果。
感谢您提供数据示例。您的代码有两个问题。一是因为要从高到低排序,需要对rank()
的论证取反。第二个是给定重复次数,您只需要对一次进行排名,然后将这些排名复制到其他时间。
这适用于您的数据示例,此处编辑为 input
代码。 (有关该原则,另请参阅 Stata 标签维基。)
clear
input country groupId time var1 rank
1 1 1 50 3
1 1 2 50 3
1 1 3 50 3
1 2 1 90 1
1 2 2 90 1
1 2 3 90 1
1 3 1 60 2
1 3 2 60 2
1 3 3 60 2
2 4 1 15 2
2 4 2 15 2
2 4 3 15 2
2 5 1 10 3
2 5 2 10 3
2 5 3 10 3
2 6 1 80 1
2 6 2 80 1
2 6 3 80 1
end
bysort country : egen wanted = rank(-var) if time == 1
bysort country groupId (time) : replace wanted = wanted[1]
assert rank == wanted
我在 Stata 中有一个面板数据集,其中包含多个国家和每个国家包含组。我想根据变量 var1
.
我的数据集结构如下(排名列是我想实现的)。请注意,var1 在组内确实是常数(它只是另一个变量的组内平均值)。
--country--|--groupId--|---time----|---var1----|---rank---
1 | 1 | 1 | 50 | 3
1 | 1 | 2 | 50 | 3
1 | 1 | 3 | 50 | 3
1 | 2 | 1 | 90 | 1
1 | 2 | 2 | 90 | 1
1 | 2 | 3 | 90 | 1
1 | 3 | 1 | 60 | 2
1 | 3 | 2 | 60 | 2
1 | 3 | 3 | 60 | 2
2 | 4 | 1 | 15 | 2
2 | 4 | 2 | 15 | 2
2 | 4 | 3 | 15 | 2
2 | 5 | 1 | 10 | 3
2 | 5 | 2 | 10 | 3
2 | 5 | 3 | 10 | 3
2 | 6 | 1 | 80 | 1
2 | 6 | 2 | 80 | 1
2 | 6 | 3 | 80 | 1
我试过的选项有:
sort country groupId
by country (groupId): egen rank = rank(var1)
然而,我并没有达到想要的效果。
感谢您提供数据示例。您的代码有两个问题。一是因为要从高到低排序,需要对rank()
的论证取反。第二个是给定重复次数,您只需要对一次进行排名,然后将这些排名复制到其他时间。
这适用于您的数据示例,此处编辑为 input
代码。 (有关该原则,另请参阅 Stata 标签维基。)
clear
input country groupId time var1 rank
1 1 1 50 3
1 1 2 50 3
1 1 3 50 3
1 2 1 90 1
1 2 2 90 1
1 2 3 90 1
1 3 1 60 2
1 3 2 60 2
1 3 3 60 2
2 4 1 15 2
2 4 2 15 2
2 4 3 15 2
2 5 1 10 3
2 5 2 10 3
2 5 3 10 3
2 6 1 80 1
2 6 2 80 1
2 6 3 80 1
end
bysort country : egen wanted = rank(-var) if time == 1
bysort country groupId (time) : replace wanted = wanted[1]
assert rank == wanted