Как сгенерировать индикатор, если значение переменной наблюдается в двух разных периодах в Stata - PullRequest
0 голосов
/ 01 апреля 2020

У меня есть набор данных, содержащий различные лекарства и даты их поставки. Я хотел бы создать индикаторную переменную DIBP, которая принимает значение 1, если один и тот же препарат вводился как в период 1, так и в период 2 данного года, и ноль в противном случае. Период 1 - с 1 апреля по 30 июня, а период 2 - с 1 октября по 31 декабря.

Я написал следующий код:

. input id month day year str10 drug 

            id      month        day       year        drug
  1. 1 5  1 2003 aspirin
  2. 1 11 1 2003 aspirin
  3. 1 6  1 2004 aspirin
  4. 1 5  1 2005 aspirin
  5. 1 11 1 2005 aspirin
  6. end

. 
. gen date = mdy(month,day,year)

. format date %d

. 
. gen     period = 1 if inlist(month,4,5,6)
(2 missing values generated)

. replace period = 2 if inlist(month,10,11,12)
(2 real changes made)

. 
. label define plab 1"1 April to 30 June" 2"1 October to 31 December"

. label value period plab

. 
. * Generate indicator
. gen DIBP = 0

. label var DIBP "Drug In Both Periods"

. 
. bysort id year: replace DIBP = 1 if drug[period==1] == "aspirin" & drug[period==2] == "aspirin"
(0 real changes made)

. 
. list

     +---------------------------------------------------------------------------------+
     | id   month   day   year      drug        date                     period   DIBP |
     |---------------------------------------------------------------------------------|
  1. |  1       5     1   2003   aspirin   01may2003         1 April to 30 June      0 |
  2. |  1      11     1   2003   aspirin   01nov2003   1 October to 31 December      0 |
  3. |  1       6     1   2004   aspirin   01jun2004         1 April to 30 June      0 |
  4. |  1       5     1   2005   aspirin   01may2005         1 April to 30 June      0 |
  5. |  1      11     1   2005   aspirin   01nov2005   1 October to 31 December      0 |
     +---------------------------------------------------------------------------------+

Я ожидаю, что DIBP примет значение 1 для наблюдений 1,2,3 и 4 (потому что они принимали аспирин в течение обоих периодов для 2003 и 2005 годы) и нулевое значение для наблюдения 3 (поскольку аспирин принимался только в течение одного периода в 2004 году), но это не так. Куда я иду не так? Спасибо.

1 Ответ

1 голос
/ 01 апреля 2020

Возникла проблема с использованием подписчиков. Вы, кажется, предполагаете, что нижний индекс может использоваться для выбора других наблюдений, что действительно может быть сделано индивидуально. Но то, что вы попробовали, законно, но не то, что вы хотите.

Выражения, используемые в качестве индексов

period == 1 

period == 2 

, будут оцениваться как true (1) или false (0) в соответствии со значением period в текущем наблюдении . Затем будет использоваться либо наблюдение 0 (которое всегда считается имеющим пропущенные значения), либо наблюдение 1 (первое в каждой группе наблюдений). Иначе говоря, индексы оцениваются как числа наблюдения, а не как определяющие подмножества данных.

Существует еще одна загадка, потому что даже для одного и того же человека и года кажется, что в принципе period 1 или period 2 могут означать несколько наблюдений. В приведенном примере лекарство в любом случае является постоянным, но что вы ожидаете от кода, если оно будет другим? Суть, наиболее очевидная для меня, состоит в том, чтобы различать флаг для любых рецептов определенного препарата и все рецепты этого препарата за период. Больше на этом FAQ .

В противном случае этот код может помочь. Расширение до нескольких лекарств оставлено в качестве упражнения.

clear 
input id month day year str10 drug 
1 5  1 2003 aspirin
1 11 1 2003 aspirin
1 6  1 2004 aspirin
1 5  1 2005 aspirin
1 11 1 2005 aspirin
end

generate date = mdy(month,day,year)
format date %td

* code needs modification if any month is 1, 2, 3, 7, 8, 9 

generate period = 1 if inlist(month,4,5,6)
replace period = 2 if inlist(month,10,11,12)
label define plab 1"1 April to 30 June" 2"1 October to 31 December"
label value period plab

bysort id year period (date): egen all_aspirin = min(drug == "aspirin") 
by id year period: egen any_aspirin = max(drug == "aspirin") 
by id year : gen both_all_aspirin = period[1] == 1 & period[_N] == 2 & all_aspirin[1] & all_aspirin[_N]
by id year : gen both_any_aspirin = period[1] == 1 & period[_N] == 2 & any_aspirin[1] & any_aspirin[_N]

list id date drug *aspirin 

     +----------------------------------------------------------------------+
     | id        date      drug   all_as~n   any_as~n   b~ll_a~n   b~ny_a~n |
     |----------------------------------------------------------------------|
  1. |  1   01may2003   aspirin          1          1          1          1 |
  2. |  1   01nov2003   aspirin          1          1          1          1 |
  3. |  1   01jun2004   aspirin          1          1          0          0 |
  4. |  1   01may2005   aspirin          1          1          1          1 |
  5. |  1   01nov2005   aspirin          1          1          1          1 |
     +----------------------------------------------------------------------+

В качестве заметки о стиле рассмотрим этот пример

 generate dummy = 0 
 replace dummy = 1 if frog == 42 

Опытные программисты Stata обычно просто пишут

 generate dummy = frog == 42 

См. Также этот FAQ

...