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

Скажите, что у меня есть этот 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

Это не дает мне то, чтоЯ хочу в тех случаях, когда человек не поступил осенью следующего года, но вернулся.Может быть, они заболели и пропустили целый учебный год.Как мне это исправить?

1 Ответ

0 голосов
/ 05 ноября 2018

Мне кажется, я понял это:

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
...