Нахождение наблюдений - PullRequest
2 голосов
/ 17 мая 2019

У меня есть данные ниже в Stata:

* Example generated by -dataex-. To install: ssc install dataex
clear
input float(id year paint)
1000789 2012 1
1000789 2013 1
1000789 2014 2
1000789 2015 2
1000789 2016 3
1000789 2017 2
1000790 2012 1
1000790 2013 1
1000790 2014 2
1000790 2015 3
1000790 2016 1
1000790 2017 2
1000790 2018 1
1000791 2012 1
1000791 2013 2
1000791 2014 1
1000791 2015 1
1000791 2016 3
1000791 2017 3
1000791 2018 2
end

Как мне найти наблюдения для первых paint со значением, меньшим или равным 1 или 2 или 3?

Например:

Когда paint == 1:

 1 7 14

Когда paint == 2:

1 2 3 7 8 9 14 15

Когда paint == 3:

1 2 3 4 5 7 8 9 10 14 15 16 17 18

Я также хотел бы хранить каждый набор результатов в локальном макросе.

1 Ответ

2 голосов
/ 17 мая 2019

У меня работает следующее:

generate obs = _n
bysort id (year): generate tag = (paint == 2) // CHANGE THIS NUMBER
bysort id (year): list if sum(tag) <= 1 & sum(tag[_n-1]) == 0

Это покажет все наблюдения, когда значение переменной paint равно 2:

---------------------------------------------------------------------------------------------
-> id = 1000789

     +------------------------------------+
     |      id   year   paint   obs   tag |
     |------------------------------------|
  1. | 1000789   2012       1     1     0 |
  2. | 1000789   2013       1     2     0 |
  3. | 1000789   2014       2     3     1 |
     +------------------------------------+


---------------------------------------------------------------------------------------------
-> id = 1000790

     +------------------------------------+
     |      id   year   paint   obs   tag |
     |------------------------------------|
  1. | 1000790   2012       1     7     0 |
  2. | 1000790   2013       1     8     0 |
  3. | 1000790   2014       2     9     1 |
     +------------------------------------+


---------------------------------------------------------------------------------------------
-> id = 1000791

     +------------------------------------+
     |      id   year   paint   obs   tag |
     |------------------------------------|
  1. | 1000791   2012       1    14     0 |
  2. | 1000791   2013       2    15     1 |
     +------------------------------------+

Чтобы сохранить каждый их набор в локальном макросе, вы можете сделать следующее:

forvalues i = 1 / 3 {
    preserve
    generate obs = _n
    bysort id (year): generate tag = (paint == `i')
    bysort id (year): keep if sum(tag) <= 1 & sum(tag[_n-1]) == 0
    quietly levelsof obs, local(obs`i')
    restore
}

. display "`obs1'"
1 7 14

. display "`obs2'"
1 2 3 7 8 9 14 15

. display "`obs3'"
1 2 3 4 5 7 8 9 10 14 15 16 17 18
...