Скажите, что у меня есть этот MWE:
clear all
input str2 person enr_year enr_term
"a" 2000 1
"a" 2000 2
"a" 2000 2
"a" 2000 3
"a" 2000 3
"a" 2001 1
"a" 2001 2
"a" 2001 3
"a" 2002 2
"a" 2002 2
"a" 2003 2
"a" 2006 1
"a" 2006 2
"a" 2008 2
"b" 2000 2
"b" 2001 3
end
label define term 1 "Summer" 2 "Fall" 3 "Spring"
label values enr_term term
Некоторое объяснение в порядке. Это данные о зачислении в школу. person
- это человек, и все нужно делать внутри человека.
enr_year
- учебный год. enr_term
- академический термин. Причина того, что лето и осень предшествуют весне, заключается в том, что это учебный год, а не календарный год.
Каждая строка в данных неявно означает, что человек поступил в данный год и семестр.
Моя задача - создать две индикаторные переменные: enr_this_spring
и enr_next_fall
. Могу успешно получить enr_this_spring
. Я включил свой код для этого на тот случай, если эта логика поможет выяснить, как получить enr_next_fall
.
* Эти индикаторные переменные следует создавать только для наблюдений с падением регистрации.
enr_this_spring
означает, что человек поступил следующей весной. Поскольку мы делаем эту переменную только для осеннего семестра, она будет равна 1, если в том же году будет весеннее наблюдение. В противном случае будет 0, даже если в следующем году будет весеннее наблюдение.
enr_next_fall
будет 1, если в следующем году будет наблюдаться падение. Как будет описано ниже, проблема, которую я не знаю, как преодолеть, возникает, если есть ситуация, в которой ученик зачисляется при падении x, а не при падении x + 1, а снова при падении x + n,
где n> 1.
Если есть два наблюдения за падением в течение одного года (несколько периодов зачисления, возможно, ученик был зачислен в две школы одновременно), они оба принимают одинаковые значения.
Вот что я хочу получить:
clear all
input str2 person enr_year enr_term enr_this_spring enr_next_fall
"a" 2000 1 . . // missing because not Fall
"a" 2000 2 1 1 // 1 b/c a/2000/3; 1 b/c a/2001/2
"a" 2000 2 1 1 // same reasons as line directly above
"a" 2000 3 . . // missing because not Fall
"a" 2000 3 . . // missing because not Fall
"a" 2001 1 . . // missing because not Fall
"a" 2001 2 1 1 // 1 b/c a/2001/3; 1 b/c a/2002/2
"a" 2001 3 . . // missing because not Fall
"a" 2002 2 0 1 // 0 b/c no a/2002/3; 1 b/c a/2003/2
"a" 2002 2 0 1 // same reasons as line directly above
"a" 2003 2 0 0 // 0 b/c no a/2003/2; 0 b/c no a/2004/2
"a" 2006 1 . . // missing because not Fall
"a" 2006 2 0 0 // 0 b/c no a/2006/3; 0 b/c no a/2007/2
"a" 2008 2 0 0 // 0 b/c no a/2008/3; 0 b/c no a/2009/2
"b" 2000 2 0 0 // 0 b/c no a/2000/3; 0 b/c no a/2001/2
"b" 2001 3 . . // missing because not Fall
end
label define term 1 "Summer" 2 "Fall" 3 "Spring"
label values enr_term term
Начиная с исходных данных, я сначала могу успешно получить enr_this_spring следующим образом:
*Create indicators for if the term is spring and if term is fall
gen is_spring = enr_term == 3
gen is_fall = enr_term ==2
*Get the maximum value, within person and year
bys person enr_year: egen enr_this_spring = max(is_spring)
replace enr_this_spring=. if is_fall!=1
Я не знаю, как создать индикатор того, поступит ли другой человек следующей осенью.
Вот что я пробовал, с объяснением, почему это не работает после кода:
*Preserve the data. We are going to process it and merge back on
preserve
*We only are concerned about fall attendance for this part
keep if enr_term==2
*We only want one observation per term, as duplicates mess up the code
bys person enr_year enr_term: keep if _n==1
*Make a variable that is a constant 1
gen one = 1
*Make a variable, enr_next_fall that is 1 if the person enrolled in the fall
* in the following observation. Note that we do this within group and sort
* by enr_year
bys person (enr_year): gen enr_next_fall = one[_n+1]
* Replace missing with 0. This only affects the final observation within group
replace enr_next_fall = 0 if missing(enr_next_fall)
*Create temporary file, to be merged on
tempfile a
save `a'
restore
*Merge on the temporary file
merge m:1 person enr_year enr_term using `a'
drop is_spring is_fall one _merge
Это не дает мне того, что я хочу в тех случаях, когда человек не записался осенью следующего года, но вернулся. Может, они заболели и пропустили целый учебный год. Как мне это исправить?
Думаю, я разобрался:
clear all
input str2 person enr_year enr_term
"a" 2000 1
"a" 2000 2
"a" 2000 2
"a" 2000 3
"a" 2000 3
"a" 2001 1
"a" 2001 2
"a" 2001 3
"a" 2002 2
"a" 2002 2
"a" 2003 2
"a" 2006 1
"a" 2006 2
"a" 2008 2
"b" 2000 2
"b" 2001 3
end
label define term 1 "Summer" 2 "Fall" 3 "Spring"
label values enr_term term
*Create indicators for if the term is spring and if term is fall
gen is_spring = enr_term == 3
gen is_fall = enr_term ==2
*Get the maximum value, within person and year
bys person enr_year: egen enr_this_spring = max(is_spring)
replace enr_this_spring=. if is_fall!=1
*Create enr_next_fall variable. Merge back on
preserve
keep if enr_term==2
bys person enr_year: keep if _n==1
bys person (enr_year): gen next = enr_year[_n+1]
replace next = next - 1
gen enr_next_fall = enr_year==next
drop next
tempfile fall
save `fall'
restore
merge m:1 person enr_year using `fall'
drop _merge
replace enr_next_fall = . if enr_term!=2