Как ранжировать наблюдения в панельных данных?

У меня есть набор данных панели в 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)

Однако я не могу добиться желаемого результата.


person gicanzo    schedule 01.06.2020    source источник
comment
См. Также statalist.org/forums/help#spelling.   -  person Nick Cox    schedule 01.06.2020


Ответы (1)


Спасибо за пример данных. В вашем коде есть две проблемы. Во-первых, поскольку вы хотите ранжировать от самого высокого до самого низкого, вам нужно отрицать аргумент 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 
person Nick Cox    schedule 01.06.2020