如何对面板数据中的观察结果进行排名?

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