Возникла проблема с использованием подписчиков. Вы, кажется, предполагаете, что нижний индекс может использоваться для выбора других наблюдений, что действительно может быть сделано индивидуально. Но то, что вы попробовали, законно, но не то, что вы хотите.
Выражения, используемые в качестве индексов
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