Один путь в Стате:
clear all
set more off
*----- example data -----
input ///
country year law
1 1996 235
1 1997 25
1 1998 6445
2 1996 436
2 1997 2356
2 1998 224
3 1996 3129
3 1997 735
3 1998 836
end
list, sepby(country)
*----- what you want -----
sort year law
by year: gen ahead = _N - _n
by year: gen behind = _n - 1
sort country year
list, sepby(country)
Некоторые предположения сделаны, конечно.
редактировать
Стратегия действительно проста. Сортировать данные по year law
. Результат:
. list, sepby(year)
+-----------------------+
| country year law |
|-----------------------|
1. | 1 1996 235 |
2. | 2 1996 436 |
3. | 3 1996 3129 |
|-----------------------|
4. | 1 1997 25 |
5. | 3 1997 735 |
6. | 2 1997 2356 |
|-----------------------|
7. | 2 1998 224 |
8. | 3 1998 836 |
9. | 1 1998 6445 |
+-----------------------+
Теперь нам нужно только осознать, что в каждой year
группе первое наблюдение (т.е. наблюдения 1, 4 и 7) опережает два других наблюдения (т. Е. Obs 1 опережает 2, 3; obs 4 опережает 5, 6 и obs 7 опережает 8, 9). Это означает, что есть два наблюдения, которые ahead
наблюдения 1, 4, 7.
Далее, за каждый year
группе второе наблюдение (то есть наблюдения 2, 5 и 8) перегнать один другого наблюдения. Это означает, что ahead
наблюдениями 2, 5, 8 стоит одно наблюдение.
Наконец, для каждой year
группы третье наблюдение (т.е. наблюдения 3, 6 и 9) опережает ноль других наблюдений. Это означает, что ahead
наблюдениями 3, 6, 9 наблюдаются нулевые наблюдения.
Итак, теперь мы видим, что после соответствующей sort
данных по year
группе нам просто нужно создать последовательность два, один, ноль, для переменной ahead
. Это можно сделать несколькими способами. Я решил сделать это, используя подписку (см. Справку по help subscripting
) и системные переменные _n
и _N
(см. help _variables
). _N
- общее количество наблюдений на группу (3), а _n
- текущее наблюдение на группу. Пример: для наблюдения 1 вычисление составляет 3-1 = 2
. Для наблюдения 2 это 3-2 = 1
и так далее.
behind
переменная вычисляется аналогично.
Результат:
+----------------------------------------+
| country year law ahead behind |
|----------------------------------------|
1. | 1 1996 235 2 0 |
2. | 2 1996 436 1 1 |
3. | 3 1996 3129 0 2 |
|----------------------------------------|
4. | 1 1997 25 2 0 |
5. | 3 1997 735 1 1 |
6. | 2 1997 2356 0 2 |
|----------------------------------------|
7. | 2 1998 224 2 0 |
8. | 3 1998 836 1 1 |
9. | 1 1998 6445 0 2 |
+----------------------------------------+
В моем коде после вычисления новых переменных я снова sort
чтобы представить данные в исходном порядке сортировки (год country year
).