You are here
Home › Cohorts › NLSY97 › Other Documentation › Codebook Supplement › Appendix 1: Education Variable Creation ›Number of Grades Repeated or Skipped - Appendix 1
Number of Grades Repeated or Skipped - Appendix 1
These variables were last created in round 11.
Variables Created
- CV_GRADES_REPEAT_EVER (NUMREP)
- CV_GRADES_REPEAT_YR (NUMREPj)
- CV_GRADE_SKIPPED_EVER (NUMSKIP)
- CV_GRADE_SKIPPED_YR (NUMSKIPj)
- CVC_GRADES_REPEAT_EVER_2007 (NUMRP_CVC)
- CVC_GRADE_SKIPPED_EVER_2007 (NUMSK_CVC)
This program creates six variables relating to grade progression in school. The first four listed above are single-round variables, providing information about grades repeated/skipped since the date of last interview and ever. The final two are cross-round variables, created for all respondents regardless of round 11 interview status, showing the number of grades ever repeated or skipped.
Variables Used
/**Variable names in program Variable names in Gator**/
e3500r1 YSCH-3500
e3900r1 YSCH-3900
e4000r1 YSCH-4000
e5000r1 YSCH-5000
intmr1 CV_INTERVIEW_DATE 1997
intyr1 CV_INTERVIEW_DATE 1997
NUMREPr1 CV_GRADES_REPEAT_EVER
NUMSKIPr1 CV_GRADE_SKIPPED_EVER
HGCr1_symbol COMPLETED
e3104r2 YSCH-3104
e3061r2 YSCH-3061
intmr2 CV_INTERVIEW_DATE 1998
intyr2 CV_INTERVIEW_DATE 1998
NUMREPr2 CV_GRADES_REPEAT_EVER
NUMREPjr2 CV_GRADES_REPEAT_YR
NUMSKIPr2 CV_GRADE_SKIPPED_EVER
NUMSKIPjr2 CV_GRADE_SKIPPED_YR
e3104r3 YSCH-3104
e3061r3 YSCH-3061
intmr3 CV_INTERVIEW_DATE 1999
intyr3 CV_INTERVIEW_DATE 1999
NUMREPr3 CV_GRADES_REPEAT_EVER
NUMREPjr3 CV_GRADES_REPEAT_YR
NUMSKIPr3 CV_GRADE_SKIPPED_EVER
NUMSKIPjr3 CV_GRADE_SKIPPED_YR
e3104r4 YSCH-3104
e3061r4 YSCH-3061
intmr4 CV_INTERVIEW_DATE 2000
intyr4 CV_INTERVIEW_DATE 2000
NUMREPr4 CV_GRADES_REPEAT_EVER
NUMREPjr4 CV_GRADES_REPEAT_YR
NUMSKIPr4 CV_GRADE_SKIPPED_EVER
NUMSKIPjr4 CV_GRADE_SKIPPED_YR
e3104r5 YSCH-3104
e3061r5 YSCH-3061
intmr5 CV_INTERVIEW_DATE 2001
intyr5 CV_INTERVIEW_DATE 2001
NUMREPr5 CV_GRADES_REPEAT_EVER
NUMREPjr5 CV_GRADES_REPEAT_YR
NUMSKIPr5 CV_GRADE_SKIPPED_EVER
NUMSKIPjr5 CV_GRADE_SKIPPED_YR
e3104r6 YSCH-3104
e3061r6 YSCH-3061
intmr6 CV_INTERVIEW_DATE 2002
intyr6 CV_INTERVIEW_DATE 2002
NUMREPr6 CV_GRADES_REPEAT_EVER
NUMREPjr6 CV_GRADES_REPEAT_YR
NUMSKIPr6 CV_GRADE_SKIPPED_EVER
NUMSKIPjr6 CV_GRADE_SKIPPED_YR
e3104r7 YSCH-3104
e3061r7 YSCH-3061
intmr7 CV_INTERVIEW_DATE 2003
intyr7 CV_INTERVIEW_DATE 2003
NUMREPr7 CV_GRADES_REPEAT_EVER
NUMREPjr7 CV_GRADES_REPEAT_YR
NUMSKIPr7 CV_GRADE_SKIPPED_EVER
NUMSKIPjr7 CV_GRADE_SKIPPED_YR
e3104r8 YSCH-3104
e3061r8 YSCH-3061
intmr8 CV_INTERVIEW_DATE 2004
intyr8 CV_INTERVIEW_DATE 2004
NUMREPr8 CV_GRADES_REPEAT_EVER
NUMREPjr8 CV_GRADES_REPEAT_YR
NUMSKIPr8 CV_GRADE_SKIPPED_EVER
NUMSKIPjr8 CV_GRADE_SKIPPED_YR
e3104r9 YSCH-3104
e3061r9 YSCH-3061
intmr9 CV_INTERVIEW_DATE 2005
intyr9 CV_INTERVIEW_DATE 2005
NUMREPr9 CV_GRADES_REPEAT_EVER
NUMREPjr9 CV_GRADES_REPEAT_YR
NUMSKIPr9 CV_GRADE_SKIPPED_EVER
NUMSKIPjr9 CV_GRADE_SKIPPED_YR
numrpr10_cv CV_GRADES_REPEAT_EVER_2006
numrpr10_yr CV_GRADES_REPEAT_YR_2006
numskr10_cv CV_GRADE_SKIPPED_EVER_2006
numskr10_yr CV_GRADE_SKIPPED_YR_2006
e3061r10 YSCH-3061_2006
numrpR10_cvc CVC_GRADES_REPEAT_EVER_2006_XRND
numskR10_cvc CVC_GRADE_SKIPPED_EVER_2006_XRND
e3103r11 YSCH-3103_2007
e3104r11 YSCH-3104_2007
e2857r11 YSCH-2857_2007
e3010r11 YSCH-3010_2007
e3061r11 YSCH-3061_2007
e3112r11 YSCH-3112_2007
e3113r11 YSCH-3113_2007
e3878r11 YSCH-3878_2007
e8416r11_11 YSCH-8416.01.01_2007
e8416r11_21 YSCH-8416.02.01_2007
e8416r11_31 YSCH-8416.03.01_2007
e8722r11_11 YSCH-8722.01.01_2007
e8722r11_21 YSCH-8722.02.01_2007
e8722r11_31 YSCH-8722.03.01_2007
e8774Mr11_11 YSCH-8774.01.01~M_2007
e8774Yr11_11 YSCH-8774.01.01~Y_2007
e8977r11_11 YSCH-8977.01.01_2007
e8977r11_31 YSCH-8977.03.01_2007
e9131r11_11 YSCH-9131.01.01_2007
e9131r11_21 YSCH-9131.02.01_2007
e9131r11_31 YSCH-9131.03.01_2007
e9335Mr11_11 YSCH-9335.01.01~M_2007
e9335Yr11_11 YSCH-9335.01.01~Y_2007
e9335Mr11_21 YSCH-9335.02.01~M_2007
e9335Yr11_21 YSCH-9335.02.01~Y_2007
e9335Mr11_31 YSCH-9335.03.01~M_2007
e9335Yr11_31 YSCH-9335.03.01~Y_2007
e9589r11_111 YSCH-9589.01.01.01_2007
e9589r11_112 YSCH-9589.01.01.02_2007
e9589r11_113 YSCH-9589.01.01.03_2007
e9589r11_211 YSCH-9589.02.01.01_2007
e9589r11_311 YSCH-9589.03.01.01_2007
e9589r11_312 YSCH-9589.03.01.02_2007
e9589r11_313 YSCH-9589.03.01.03_2007
e9691Mr11_111 YSCH-9691.01.01.01~M_2007
e9691Yr11_111 YSCH-9691.01.01.01~Y_2007
e9691Mr11_112 YSCH-9691.01.01.02~M_2007
e9691Yr11_112 YSCH-9691.01.01.02~Y_2007
e9691Mr11_113 YSCH-9691.01.01.03~M_2007
e9691Yr11_113 YSCH-9691.01.01.03~Y_2007
e9691Mr11_211 YSCH-9691.02.01.01~M_2007
e9691Yr11_211 YSCH-9691.02.01.01~Y_2007
e9691Mr11_311 YSCH-9691.03.01.01~M_2007
e9691Yr11_311 YSCH-9691.03.01.01~Y_2007
e9691Mr11_312 YSCH-9691.03.01.02~M_2007
e9691Yr11_312 YSCH-9691.03.01.02~Y_2007
e9691Mr11_313 YSCH-9691.03.01.03~M_2007
e9691Yr11_313 YSCH-9691.03.01.03~Y_2007
e9946r11_111 YSCH-9946.01.01.01_2007
e9946r11_112 YSCH-9946.01.01.02_2007
e9946r11_113 YSCH-9946.01.01.03_2007
e9946r11_211 YSCH-9946.02.01.01_2007
e9946r11_311 YSCH-9946.03.01.01_2007
e9946r11_312 YSCH-9946.03.01.02_2007
e9946r11_313 YSCH-9946.03.01.03_2007
e10099Mr11_111 YSCH-10099.01.01.01~M_2007
e10099Yr11_111 YSCH-10099.01.01.01~Y_2007
e10099Mr11_112 YSCH-10099.01.01.02~M_2007
e10099Yr11_112 YSCH-10099.01.01.02~Y_2007
e10099Mr11_113 YSCH-10099.01.01.03~M_2007
e10099Yr11_113 YSCH-10099.01.01.03~Y_2007
e10099Mr11_211 YSCH-10099.02.01.01~M_2007
e10099Yr11_211 YSCH-10099.02.01.01~Y_2007
e10099Mr11_311 YSCH-10099.03.01.01~M_2007
e10099Yr11_311 YSCH-10099.03.01.01~Y_2007
e10099Mr11_312 YSCH-10099.03.01.02~M_2007
e10099Yr11_312 YSCH-10099.03.01.02~Y_2007
e10099Mr11_313 YSCH-10099.03.01.03~M_2007
e10099Yr11_313 YSCH-10099.03.01.03~Y_2007
pubid pubid_2007
SAS Code for Variable Creation
** Intermediate variables created in current round: **
** ----------------------------------------------------- **
** ENROLL enrolled at date of interview in current round -- created **
** **
** Intermediate variables created in previous round: **
** ------------------------------------------------------ **
** r10bfrpev Total number of grades repeated ever up to previous round **
** r10bfskev Total number of grades skipped ever up to previous round **
** r10bf2857 HGA reported up to previous round **
** r10bfint The most recent interview date up to previous round (in continuous **
** month scheme) **
** r10bfat1-r10bfat15 The grade attended up to previous round in order **
** r10bfst1-r10bfst15 The starting date for each grade attended up to previous round (in **
** continuous month scheme) **
** r10bfed1-r10bfed15 The ending date for each grade attended up to previous round (in **
** continuous month scheme) **
** r10bfcp1-r10bfcp15 The dummy that each grade is completed or not up to previous round **
data one; set xin11.in_num_grdR11;
** Enroll or not at date of interview for the current round;
data two; set xin11.out_hgcR11;
keep pubid ENROLL ENCAT GRSURV DEGSURV encatP grsurvP HSD GED hsr1
e3500r1 e5000r1 e2857r11 e3103r11 e3104r11 e3010r11 e3112r11 e3878r11 e3061r11
doicmr: scoder11: strtmr11: strtyr11:
stopmr11: stopyr11:;
proc sort; by pubid;
** The data set created from the previous round program;
data thr; set xin.allgrr10_corr;
array vars10 r10bfat1-r10bfat15 r10bfst1-r10bfst15 r10bfed1-r10bfed15
r10bfcp1-r10bfcp15 r10bfrpev r10bfskev r10bf2857 r10bfint;
array varsP PRbfat1-PRbfat15 PRbfst1-PRbfst15 PRbfed1-PRbfed15
PRbfcp1-PRbfcp15 PRbfrpev PRbfskev PRbf2857 PRbfint;
do i=1 to dim(varsP);
varsP(i)=vars10(i);
end;
array varsP1 (*) PRbfat1-PRbfat15;
array varsP2 (*) PRbfcp1-PRbfcp15;
PRHGA=-5; PRHGC=-5;
do i=1 to dim(varsP1);
if varsP1(i)>PRHGA then PRHGA=varsP1(i);
if varsP1(i)>PRHGC & varsP2(i)=1 then PRHGC=varsP1(i);
end;
drop r10:;
data thr; set thr; proc sort; by pubid;
data merged; merge one two thr; by pubid;
PRbfrpev=numrpr10_cvc;
PRbfskev=numskr10_cvc;
***** PROGRAM STARTS;
if e3500r1>=0 then HGAr1=e3500r1;
if e4000r1>=0 then HGAr1=e4000r1;
if e3104r2>-1 then HGAr1=e3104r2;
if e5000r1>=0 then HGCr1=e5000r1;
if HGCr1_symbol>=0 then HGCr1=HGCr1_symbol;
if e3061r2>=0 then HGCr1=e3061r2;
if e3061r2=-5 then do;
if e3061r3>=0 then HGCr1=e3061r3;
if e3061r3=-5 then do;
if e3061r4>=0 then HGCr1=e3061r4;
if e3061r4=-5 then do;
if e3061r5>=0 then HGCr1=e3061r5;
if e3061r5=-5 then do;
if e3061r6>=0 then HGCr1=e3061r6;
if e3061r6=-5 then do;
if e3061r7>=0 then HGCr1=e3061r7;
if e3061r7=-5 then do;
if e3061r8>=0 then HGCr1=e3061r8;
if e3061r8=-5 then do;
if e3061r9>=0 then HGCr1=e3061r9;
if e3061r9=-5 then do;
if e3061r10>=0 then HGCr1=e3061r10;
if e3061r10=-5 then do;
if e3061r11>=0 then HGCr1=e3061r11;
end;
end;
end;
end;
end;
end;
end;
end;
end;
if hsr1>-4 & hgcr1<12 then HGCr1=12;
** Interview dates in cumulative months;
doicm=doicmr11;
** Create new array of start dates for first enrollment in a school depending on whether R corrected
roster data;
array strtm (*) strtmr11_11 strtmr11_12 strtmr11_13 strtmr11_14 strtmr11_15 ; * Start mo from roster;
array strty (*) strtyr11_11 strtyr11_12 strtyr11_13 strtyr11_14 strtyr11_15 ; * Start yr from roster;
array e8722 (*) e8722r11_11 e8722r11_21 e8722r11_31 e8722r11_41 e8722r11_51 ; * Verify start date;
array e8774m (*) e8774mr11_11 e8774mr11_21 e8774mr11_31 e8774mr11_41 e8774mr11_51; * Corrected start mo;
array e8774y (*) e8774yr11_11 e8774yr11_21 e8774yr11_31 e8774yr11_41 e8774yr11_51; * Corrected start yr;
array startm (*) start1m start2m start3m start4m start5m ; * Correct start mo, created;
array starty (*) start1y start2y start3y start4y start5y ; * Correct start yr, created;
numstart=0;
do i=1 to dim(strtm);
if e8774m(i)>0 & e8774y(i)>0 then do;
startm(i)=e8774m(i);
starty(i)=e8774y(i);
end;
else if e8774m(i)<=0|e8774y(i)<=0|e8722(i)=1 then do;
startm(i)=strtm(i);
starty(i)=strty(i);
numstart=numstart+1;
end;
end;
** Create arrays of grades attended, whether they were completed, and start and completion dates;
* Grade attended;
array gr_attd (*) e8416r11_11 e8416r11_21 e8416r11_31
e9589r11_111 e9589r11_112 e9589r11_113
e9589r11_211
e9589r11_311 e9589r11_312 e9589r11_313;
* Completed - yes/no;
array gr_comp (*) e9131r11_11 e9131r11_21 e9131r11_31
e9946r11_111 e9946r11_112 e9946r11_113
e9946r11_211
e9946r11_311 e9946r11_312 e9946r11_313;
* Date of grade enrollment/start - month;
array sdate_m (*) start1m start2m start3m
e9691mr11_111 e9691mr11_112 e9691mr11_113
e9691mr11_211
e9691mr11_311 e9691mr11_312 e9691mr11_313;
* Date of grade enrollment/start - year;
array sdate_y (*) start1y start2y start3y
e9691yr11_111 e9691yr11_112 e9691yr11_113
e9691yr11_211
e9691yr11_311 e9691yr11_312 e9691yr11_313;
* Date of grade completion - month;
array cdate_m (*) e9335mr11_11 e9335mr11_21 e9335mr11_31
e10099mr11_111 e10099mr11_112 e10099mr11_113
e10099mr11_211
e10099mr11_311 e10099mr11_312 e10099mr11_313;
* Date of grade completion - year;
array cdate_y (*) e9335yr11_11 e9335yr11_21 e9335yr11_31
e10099yr11_111 e10099yr11_112 e10099yr11_113
e10099yr11_211
e10099yr11_311 e10099yr11_312 e10099yr11_313;
** Create arrays of all grades attended and completed and their start and complete dates;
* Assign GRA the number of elements in the new grades array to be created.;
GRA=9;
* Grade attended;
array attd (9) attd1-attd9;
* Grade completed;
array comp (9) comp1-comp9;
* Date of grade enrollment/start - month;
array stmo (9) stmo1-stmo9;
* Date of grade enrollment/start - year;
array styr (9) styr1-styr9;
* Date of grade completion - month;
array cpmo (9) cpmo1-cpmo9;
* Date of grade completion - year;
array cpyr (9) cpyr1-cpyr9;
** Set all new array vars to -4;
do i=1 to GRA;
stmo(i)=-4;
styr(i)=-4;
cpmo(i)=-4;
cpyr(i)=-4;
comp(i)=-4;
attd(i)=-4;
end;
** Record all grades completed and their completion dates;
j=1;
do i= 1 to dim(gr_attd);
if gr_comp(i)=1 & gr_attd(i) not in (-4,-5) then do;
comp(j)=gr_attd(i);
cpmo(j)=cdate_m(i);
cpyr(j)=cdate_y(i);
j=j+1;
end;
end;
** Record all grades attended and their start dates;
k=1;
flag1=0;
if e9131r11_11 not in (-4,-5) then do;
if e8416r11_11 not in (-4,-5) then do;
attd(k)=e8416r11_11;
if start1m>0 then stmo(k)=start1m;
if start1y>0 then styr(k)=start1y;
if e8774mr11_11=-4 & e8774yr11_11=-4 & strtmr11_11=-4 & strtyr11_11=-4 then flag1=1;
k=k+1;
end;
do i=2 to dim(gr_attd);
if gr_comp(i)~=-4 & gr_comp(i)~=. then do;
attd(k)=gr_attd(i);
stmo(k)=sdate_m(i);
styr(k)=sdate_y(i);
k=k+1;
end;
end;
end;
** Create date in continuous months for each start and complete date in arrays;
* Date of grade completion in continuous month scheme;
array cpcm (9) cpcm1-cpcm9;
* Date of grade enrollment/start in continuous month scheme;
array stcm (9) stcm1-stcm9;
do i=1 to GRA;
if cpyr(i)>0 & cpmo(i)>0 then cpcm(i)=((cpyr(i)-1980)*12)+cpmo(i);
else if cpyr(i) in (-1, -2, -3)|cpmo(i) in (-1, -2, -3) then cpcm(i)=-3;
else if cpyr(i)=-4|cpmo(i)=-4 then cpcm(i)=-4;
if styr(i)>0 & stmo(i)>0 then stcm(i)=((styr(i)-1980)*12)+stmo(i);
else if styr(i) in (-1, -2, -3)|stmo(i) in (-1, -2, -3) then stcm(i)=-3;
else if styr(i)=-4|stmo(i)=-4 then stcm(i)=-4;
end;
** Create new arrays of started and completed grades that have grades listed only once and in order
- report latest complete date;
* Completed grade and date of grade completion when grades have been listed only once and in order;
array NCOMP (9) NCOMP1-NCOMP9;
array NCDAT (9) NCDAT1-NCDAT9;
NCOMP1=comp1;
NCDAT1=cpcm1;
reorder=0;
** First make sure that the first element in the array is the lowest grade and the latest date for that
grade;
do i=2 to GRA;
if comp(i)>0 then do;
if comp(i)=NCOMP1 & cpcm(i)>NCDAT1 then NCDAT1=cpcm(i);
else if comp(i)<NCOMP1 then do;
NCOMP1=comp(i);
NCDAT1=cpcm(i);
reorder=reorder+1;
end;
end;
end;
do j=2 to GRA;
do i=1 to GRA;
if NCOMP(j-1)~=. then do;
if comp(i)=NCOMP(j-1) & cpcm(i)>NCDAT(j-1) then NCDAT(j-1)=cpcm(i);
else if comp(i)=NCOMP(j-1)+1 then do;
NCOMP(j)=comp(i);
NCDAT(j)=cpcm(i);
end;
else if NCOMP(j)=. & comp(i)>NCOMP(j-1) then do;
NCOMP(j)=comp(i);
NCDAT(j)=cpcm(i);
reorder=reorder+1;
end;
end;
end;
end;
** Create a new array with all grades attended in order and an array with the earliest date each grade
was started;
* Intermediate variables;
array tmpattd (9) tmpattd1-tmpattd9;
array tmpadat (9) tmpadat1-tmpadat9;
* Grades attended and the start dates for enrollment in these grades in proper order;
array NATTD (9) NATTD1-NATTD9;
array NADAT (9) NADAT1-NADAT9;
do i=1 to GRA;
tmpattd(i)=attd(i);
tmpadat(i)=stcm(i);
end;
i=1;
k=1;
do i=1 to GRA;
do j=i+1 to GRA;
if tmpattd(j)~=-4 then do;
if 0<tmpattd(j)<tmpattd(i) then do;
att_temp=tmpattd(i);
dat_temp=tmpadat(i);
tmpattd(i)=tmpattd(j);
tmpadat(i)=tmpadat(j);
tmpattd(j)=att_temp;
tmpadat(j)=dat_temp;
reorder=reorder+1;
end;
end;
end;
if i=1 then do;
NATTD(k)=tmpattd(i);
NADAT(k)=tmpadat(i);
end;
if tmpattd(i)=NATTD(k) then do;
if (0<tmpadat(i)<NADAT(k))|(NADAT(k)=-4 & tmpadat(i)>0) then do;
NADAT(k)=tmpadat(i);
end;
else if tmpadat(i) in (-1,-2,-3)| NADAT(k) in (-1,-2,-3) then NADAT(k)=-3;
end;
else if tmpattd(i)>NATTD(k) then do;
k=k+1;
NATTD(k)=tmpattd(i);
NADAT(k)=tmpadat(i);
end;
end;
** Compute the last enrollment date - stopdate;
* School stop date - month;
array stopm (*) stopmr11_11 stopmr11_21
stopmr11_12
stopmr11_13 stopmr11_23
stopmr11_14
stopmr11_15;
* School stop date - year;
array stopy (*) stopyr11_11 stopyr11_21
stopyr11_12
stopyr11_13 stopyr11_23
stopyr11_14
stopyr11_15;
* School stop date in continuous month scheme;
array stopd (*) stopd11 stopd21
stopd12
stopd13 stopd23
stopd14
stopd15;
* School code;
array scode (*) scoder11_1 scoder11_1
scoder11_2
scoder11_3 scoder11_3
scoder11_4
scoder11_5;
do i=1 to dim(stopm);
if stopy(i)>0 & stopm(i)>0 then stopd(i)=((stopy(i)-1980)*12)+stopm(i);
else if stopy(i)=-5 then stopd(i)=-5;
else if stopy(i) in (-1,-2,-3)|stopm(i) in (-1,-2,-3) then stopd(i)=-3;
end;
if ENROLL=0 then do;
if scoder11_1 in (1,2,3) then stopdate=stopd11;
do i=2 to dim(stopm);
if scode(i) in (1,2,3) & stopd(i)>stopdate then stopdate=stopd(i);
end;
end;
else if ENROLL=1 then stopdate=-4;
** Compute end dates for attended grades. Find the end date for each grade attended
- if R doesn't give a completion date then:
(a) choose the month before they started the next grade,
(b) if there is not another grade and currently enrolled then take the interview date,
(c) if there is not another grade and not currently enrolled then take the last stop date - stopdate,
(d) if the enrollment date for the grade is the last interview date then take the next june.;
** Date of completion/stop attending a grade;
array NEDAT (9) NEDAT1-NEDAT9;
** Flags of grade completion;
array ISCOM (9) ISCOM1-ISCOM9;
do i=1 to GRA;
if NATTD(i)~=. then ISCOM(i)=0;
end;
endimp=0;
do i=1 to GRA;
do j=1 to GRA;
if NATTD(i)=NCOMP(j) & NATTD(i)>0 then do;
NEDAT(i)=NCDAT(j);
ISCOM(i)=1;
end;
end;
if NATTD(i)~=. & NEDAT(i)=. & NADAT(i)~=PRbfint & NADAT(i)~=NADAT(i+1) & NADAT(i+1)~=. then do;
NEDAT(i)=NADAT(i+1)-1;
endimp=1;
end;
else if NATTD(i)~=. & NEDAT(i)=. & NATTD(i+1)=. & ENROLL=1 then do;
NEDAT(i)=doicm;
endimp=2;
end;
else if NATTD(i)~=. & NEDAT(i)=. & NATTD(i+1)=. & ENROLL=0 then do;
NEDAT(i)=stopdate;
endimp=3;
end;
else if NEDAT(i)=. & NADAT(i)=PRbfint then do;
endimp=4;
if NADAT(i)<=210 then NEDAT(i)=210;
else if 211<=NADAT(i)<=222 then NEDAT(i)=222;
else if 223<=NADAT(i)<=234 then NEDAT(i)=234;
else if 235<=NADAT(i)<=246 then NEDAT(i)=246;
else if 247<=NADAT(i)<=258 then NEDAT(i)=258;
else if 259<=NADAT(i)<=270 then NEDAT(i)=270;
else if 271<=NADAT(i)<=282 then NEDAT(i)=282;
else if 283<=NADAT(i)<=294 then NEDAT(i)=294;
else if 295<=NADAT(i)<=306 then NEDAT(i)=306;
else if 307<=NADAT(i)<=318 then NEDAT(i)=318;
else if 319<=NADAT(i)<=330 then NEDAT(i)=330;
else if 331<=NADAT(i)<=342 then NEDAT(i)=342;
else if 343<=NADAT(i)<=354 then NEDAT(i)=354;
end;
end;
** Delete the grades whose information is repeatedly reported in the current round: If a grade is
reported in the previous rounds and was completed, we don't repeat this grade's info. in this round;
* Assign GRB the number of elements in this array of grades.;
GRB=15;
* The grade attended up to the previous round in order;
array PRbfat (15) PRbfat1-PRbfat15;
* Enrollment dates for grade attended up to the previous round in order;
array PRbfst (15) PRbfst1-PRbfst15;
* Stop dates for grade attended up to the previous round in order;
array PRbfed (15) PRbfed1-PRbfed15;
* Flag to indicate whether the grade was completed or not for grades attended up to the previous round
in order;
array PRbfcp (15) PRbfcp1-PRbfcp15;
* Intermediate variables;
array tmp2att (9) tmp2att1-tmp2att9;
do i=1 to GRA;
tmp2att(i)=NATTD(i);
end;
backcut=0;
ncut=0;
backrep=0;
do i=1 to GRA;
do j=1 to GRB;
if 0<tmp2att(i)<13 & tmp2att(i)=PRbfat(j) & PRbfcp(j)=1 then do;
j=GRB;
backcut=1;
ncut=ncut+1;
do k=i+1-ncut to GRA-ncut;
if NATTD(k+1)~=. then do;
NATTD(k)=NATTD(k+1);
NADAT(k)=NADAT(k+1);
NEDAT(k)=NEDAT(k+1);
ISCOM(k)=ISCOM(k+1);
end;
else do;
NATTD(k)=.;
NADAT(k)=.;
NEDAT(k)=.;
ISCOM(k)=0;
k=GRA-ncut;
end;
end;
end;
end;
end;
if 0<NATTD1<13 then do;
do i=1 to GRB;
if PRbfat(i)>=NATTD1 then do;
if PRbfat(i+1)~=. then backrep=1;
if PRbfcp(i)=1 then backrep=2;
end;
end;
end;
** Flag the case where the reported grades are jumping;
badpre=0;
replace=0;
jumprep1=0;
jumprep2=0;
jumpge21=0;
jumpge22=0;
if PRbfat1~=. then do;
do i=1 to (GRB-1);
if PRbfat(i)~=. & PRbfat(i+1)=. then do;
lphigh=PRbfat(i);
lphighst=PRbfst(i);
lphighed=PRbfed(i);
lphighcp=PRbfcp(i);
lpnum=i;
i=GRB;
end;
end;
end;
else lphigh=-5;
if 0<NATTD1<13 then do;
if (lphigh~=-5 & ((NATTD1=lphigh+1 & lphighcp~=1)|NATTD1>lphigh+1)) then jumprep1=1;
if (lphigh=-5 & ((HGCr1>0 & NATTD1>=HGCr1+2)|(HGAr1>0 & NATTD1>=HGAr1+2))) then jumprep2=1;
if (lphigh~=-5 & NATTD1>=lphigh+2) then jumpge21=1;
if (lphigh=-5 & HGCr1>0 & NATTD1>=HGCr1+3) then jumpge22=1;
end;
** Substitute start dates in the previous round for first grade in loops;
if 0<NATTD1<13 & PRbfat1~=. then do;
do i=1 to (GRB-1);
if (PRbfst(i)>PRbfed(i) & PRbfed(i)>0)
or (PRbfed(i)>PRbfst(i+1) & PRbfst(i+1)>0)
or (PRbfst(i+1)>PRbfed(i+1) & PRbfed(i+1)>0) then do;
NADAT1=-3;
badpre=1;
end;
else if PRbfat(i)=NATTD1 & PRbfat(i+1)=. & PRbfcp(i)=0 & badpre~=1 then do;
NADAT1=PRbfst(i);
replace=1;
end;
end;
end;
else if -4<NATTD1<=0 then NADAT1=-3;
***** CREATE THE FINAL VARIABLES;
** Measure the length that a respondent was in each completed grade and count the number of grades
skipped and repeated;
array lengtha (9) length1-length9;
REPEAT=0;
REPEATj=0;
skipleng=0;
skipl_j=0;
SKIP=-16;
SKIPj=-16;
oldstrt=0;
nocomp=0;
do i=1 to (GRA-1);
if 0<NATTD(i)<13 & NEDAT(i)>0 & NADAT(i)>0 then lengtha(i)=NEDAT(i)-NADAT(i);
if 0<NATTD(i)<13 & NADAT(i)<=NEDAT(i)<=NADAT(i+1) & lengtha(i)>13
& NATTD(i+1)-NATTD(i)=1 & REPEAT~=-3 then do;
REPEAT=REPEAT+1;
if i=1 & NADAT(i)<PRbfint then oldstrt=1;
if NEDAT(i)<=330 then REPEATj=REPEATj+1;
end;
else if 0<NATTD(i)<13 & NADAT(i)<=NEDAT(i) & NATTD(i+1)=. & lengtha(i)>13
& REPEAT~=-3 & (ISCOM(i)=1|e2857r11=NATTD(i)) then do;
REPEAT=REPEAT+1;
if i=1 & NADAT(i)<PRbfint then oldstrt=1;
if NEDAT(i)<=330 then REPEATj=REPEATj+1;
end;
else if 0<NATTD(i)<13 & NADAT(i)<=NEDAT(i) & NATTD(i+1)=. & lengtha(i)>13
& REPEAT~=-3 & (ISCOM(i)=0 & e2857r11~=NATTD(i)) then do;
if i=1 & NADAT(i)<PRbfint then oldstrt=1;
REPEAT=-3;
REPEATj=-3;
reason=1;
end;
end;
do i=1 to (GRA-2);
if 0<NATTD(i)<13 & NADAT(i)<NEDAT(i)<NADAT(i+1)<NEDAT(i+1) then do;
if NADAT(i) in (212,213,224,225,236,237,248,249,260,261,272,273,284,285,296,297,308,309,320,321,332,333,344,345)
& NADAT(i)~=PRbfint & NATTD(i+1)-NATTD(i)=1 & ISCOM(i+1)=1
& NEDAT(i+1)-NADAT(i)<=12 & NADAT(i+2)-NEDAT(i+1)<=9 then do;
if (i=1|(i~=1 & NADAT(i)-NEDAT(i-1)<=9)) & skipleng~=-3 then do;
skipleng=skipleng+1;
if NEDAT(i+1)<=330 & skipl_j~=-3 then skipl_j=skipl_j+1;
end;
end;
end;
end;
** Take care of connection between previous round and current round;
connect=0;
if 0<NATTD1<13 & lphigh>0 & NATTD1~=lphigh then do;
if NATTD1-lphigh>1 then connect=1;
if lphighst in (212,213,224,225,236,237,248,249,260,261,272,273,284,285,296,297,308,309,320,321,332,333,344,345)
& NEDAT1>=lphighst & NEDAT1-lphighst<=12 then connect=2;
end;
else if 0<NATTD1<13 & lphigh>0 & NATTD1=lphigh & ISCOM1=1 & lphighcp~=1
& PRbfst(lpnum)>0 then do;
if PRbfst(lpnum) in (212,213,224,225,236,237,248,249,260,261,272,273,284,285,296,297,308,309,320,321,332,333,344,345)
& NEDAT1>=PRbfst(lpnum) & NEDAT1-PRbfst(lpnum)<=12 then connect=3;
end;
** Check for respondents who completely skip (do not attend) a grade;
skipgr=0;
skipgrj=0;
skipgt2=0;
do i=1 to (GRA-1);
if 0<NATTD(i)<13 & NATTD(i+1)-NATTD(i)=2 & NEDAT(i)>0 & NADAT(i+1)>0
& NADAT(i+1)-NEDAT(i)<=9 & skipgr~=-3 then do;
skipgr=skipgr+1;
if NEDAT(i+1)<=330 then skipgrj=skipgrj+1;
end;
else if 0<NATTD(i)<13 & NATTD(i+1)-NATTD(i)=3 & NEDAT(i)>0 & NADAT(i+1)>0
& NADAT(i+1)-NEDAT(i)<=9 then do;
skipgr=skipgr+2;
if NEDAT(i+1)<=330 then skipgrj=skipgrj+2;
end;
else if 0<NATTD(i)<13 & NATTD(i+1)-NATTD(i)>3 & NEDAT(i)>0 & NADAT(i+1)>0
& NADAT(i+1)-NEDAT(i)<=9 then do;
skipgt2=1;
end;
end;
** Set REPEAT and SKIP to -3 if allmess=1 or backrep>0 or jumprep=1 or zerograd=1 or negdate=1;
allmess=0;
do i=1 to (GRA-1);
if 0<NATTD(i)<13 & (
(NADAT(i)>NEDAT(i) & NEDAT(i)>0)
|(NEDAT(i)>NADAT(i+1) & NADAT(i+1)>0)
|(NADAT(i+1)>NEDAT(i+1) & NEDAT(i+1)>0)
) then do;
allmess=1;
end;
end;
zerograd=0;
do i=1 to GRA;
if NATTD(i)=0 then zerogrd=1;
end;
negdate=0;
do i=1 to GRA;
if 0<NATTD(i)<13 & (NEDAT(i) in (-1,-2,-3)|NADAT(i) in (-1,-2,-3)) then negdate=1;
end;
if allmess=1|backrep>0|zerograd=1|jumprep1=1|jumprep2=1|negdate=1 then do;
REPEAT=-3;
REPEATj=-3;
SKIP=-3;
SKIPj=-3;
end;
if allmess=1 then reason=2.1;
if backrep>0 then reason=2.2;
if zerograd=1 then reason=2.3;
if jumprep1=1 then reason=2.4;
if jumprep2=1 then reason=2.5;
if negdate=1 then reason=2.6;
** Flag respondents who reported skipping a grade and those who say they did not skip grade;
array whyskip (*) e8977r11;
skipques=0;
do i=1 to dim(whyskip);
if whyskip(i)=1 then skipques=1;
end;
notskip=0;
do i=1 to dim(whyskip);
if whyskip(i) in (-1,-2,2,999) then notskip=1;
end;
double=0;
if skipgr>0 & skipleng>0 then double=1;
if SKIP~=-3 then do;
if (skipques=0 & skipleng=0 & skipgr=0)|(notskip>=1 & skipques=0) then SKIP=0;
else if skipleng=-3 & (skipgr=0|skipques=0) then do;
SKIP=-3;
reason=3;
end;
else if skipgr=-3 & skipleng=0 then do;
SKIP=-3;
reason=4;
end;
else if skipleng>=1 then SKIP=skipleng;
else if skipques>=1 & skipgr>=1 then SKIP=skipgr;
else if skipques>=1 & skipgr=0 then do;
SKIP=-3;
reason=5;
end;
else if skipques=0 & skipgr>=1 then do;
SKIP=-3;
reason=6;
end;
if skipques=-3|skipgr=-3|skipleng=-3 then do;
SKIP=-3;
reason=7;
end;
end;
if SKIPj~=-3 then do;
if (skipl_j=0 & skipgrj=0)|(notskip>=1 & skipques=0) then SKIPj=0;
else if skipl_j=-3 & (skipgrj=0|skipques=0) then do;
SKIPj=-3;
reason=8;
end;
else if skipgrj=-3 & skipl_j=0 then do;
SKIPj=-3;
reason=9;
end;
else if skipl_j>=1 then SKIPj=skipl_j;
else if skipques>=1 & skipgrj>=1 then SKIPj=skipgrj;
else if skipques>=1 & skipgrj=0 then do;
SKIPj=-3;
reason=10;
end;
else if skipques=0 & skipgrj>=1 then do;
SKIPj=-3;
reason=11;
end;
if SKIP=-3 then do;
SKIPj=-3;
reason=12;
end;
end;
** Take care of the cases whose "repeated grade" could be double counted;
if oldstrt=1 & REPEAT>0 & PRbfrpev>0 & PRbf2857~=-5 then do;
do i=1 to (GRB-1);
if 0<NATTD1<13 & PRbfat(i)=NATTD1 & PRbfat(i+1)=. & (PRbfed(i)-PRbfst(i))>13 &
(PRbfcp(i)=1|PRbf2857=PRbfat(i)) then do;
REPEAT=REPEAT-1;
if NEDAT1<=330 then REPEATj=REPEATj-1;
double_repeat=1;
end;
end;
end;
* Combine previous and current round information.;
if PRbfrpev>=0 & REPEAT>=0 then NUMREP=PRbfrpev+REPEAT;
else if PRbfrpev<0 then NUMREP=PRbfrpev;
else if PRbfrpev>=0 & REPEAT<0 then NUMREP=REPEAT;
if PRbfrpev>=0 & REPEATj>=0 then NUMREPj=PRbfrpev+REPEATj;
else if PRbfrpev<0 then NUMREPj=PRbfrpev;
else if PRbfrpev>=0 & REPEATj<0 then NUMREPj=REPEATj;
if PRbfskev>=0 & SKIP>=0 then NUMSKIP=PRbfskev+SKIP;
else if PRbfskev<0 then NUMSKIP=PRbfskev;
else if PRbfskev>=0 & SKIP<0 then NUMSKIP=SKIP;
if PRbfskev>=0 & SKIPj>=0 then NUMSKIPj=PRbfskev+SKIPj;
else if PRbfskev<0 then NUMSKIPj=PRbfskev;
else if PRbfskev>=0 & SKIPj<0 then NUMSKIPj=SKIPj;
if NUMREP in (-1,-2) then NUMREP=-3;
if NUMREPj in (-1,-2) then NUMREPj=-3;
if NUMSKIP in (-1,-2) then NUMSKIP=-3;
if NUMSKIPj in (-1,-2) then NUMSKIPj=-3;
***** HE;
dontbother=1;
if NUMREP not in (-3,-4) | NUMSKIP not in (-3,-4)
| PRbfrpev not in (-3,-4) | PRbfskev not in (-3,-4) then dontbother=0;
numsk_cvc=numskip;
numrp_cvc=numrep;
if e3104r11=-5 then do;
NUMSKIP=-5;
NUMREP=-5;
NUMSKIPj=-5;
NUMREPj=-5;
numsk_cvc=numskr10_cvc;
numrp_cvc=numrpr10_cvc;
end;
***** GENERATE THE DATA SET containing the carry on variables for the current round - CRbf....;
data carryon; set merged;
** For single variables;
CRbfrpev=NUMREP;
if e3104r11=-5 then CRbfrpev=PRbfrpev;
CRbfskev=NUMSKIP;
if e3104r11=-5 then CRbfskev=PRbfskev;
CRbf2857=e2857r11;
if e3104r11=-5 then CRbf2857=PRbf2857;
CRbfint=doicm;
if e3104r11=-5 then CRbfint=PRbfint;
** For array variables;
array alattd (*) PRbfat1-PRbfat15 NATTD1-NATTD9;
array alstdt (*) PRbfst1-PRbfst15 NADAT1-NADAT9;
array aleddt (*) PRbfed1-PRbfed15 NEDAT1-NEDAT9;
array alcomp (*) PRbfcp1-PRbfcp15 ISCOM1-ISCOM9;
array CRbfat (*) CRbfat1-CRbfat15;
array CRbfst (*) CRbfst1-CRbfst15;
array CRbfed (*) CRbfed1-CRbfed15;
array CRbfcp (*) CRbfcp1-CRbfcp15;
array PRtpat (*) PRtpat1-PRtpat15;
array PRtpst (*) PRtpst1-PRtpst15;
array PRtped (*) PRtped1-PRtped15;
array PRtpcp (*) PRtpcp1-PRtpcp15;
GRC=(GRA+GRB);
j=0;
do i=1 to GRC;
if alattd[i] not in (-4, -5, .) then do;
j=j+1;
CRbfat[j]=alattd[i];
CRbfst[j]=alstdt[i];
CRbfed[j]=aleddt[i];
CRbfcp[j]=alcomp[i];
end;
end;
do i=1 to GRB;
PRtpat[i]=CRbfat[i];
PRtpst[i]=CRbfst[i];
PRtped[i]=CRbfed[i];
PRtpcp[i]=CRbfcp[i];
end;
** If two grades are same with the same start date, we delete the info. with earlier stopping date;
** We also delete the 0 grade info;
cut=0;
numcut=0;
samegrd=0;
do i=1 to (GRB-1);
if (0<PRtpat[i]<13 & PRtpat[i]=PRtpat[i+1] & PRtpst[i]=PRtpst[i+1] & PRtped[i]<=PRtped[i+1]
& (PRtpst[i]~=-3|PRtpst[i+1]~=-3))|PRtpat[i]=0 then do;
cut=1;
numcut=numcut+1;
do k=i+1-numcut to GRB-numcut;
CRbfat[k]=CRbfat[k+1];
CRbfst[k]=CRbfst[k+1];
CRbfed[k]=CRbfed[k+1];
CRbfcp[k]=CRbfcp[k+1];
end;
end;
else if 0<PRtpat[i]<13 & PRtpat[i]=PRtpat[i+1] & PRtpst[i]=PRtpst[i+1] & PRtped[i]>=PRtped[i+1]
& (PRtpst[i]~=-3|PRtpst[i+1]~=-3) then do;
cut=2;
numcut=numcut+1;
do k=i+2-numcut to GRB-numcut;
CRbfat[k]=CRbfat[k+1];
CRbfst[k]=CRbfst[k+1];
CRbfed[k]=CRbfed[k+1];
CRbfcp[k]=CRbfcp[k+1];
end;
end;
else if 0<PRtpat[i]<13 & PRtpat[i]=PRtpat[i+1] & PRtpst[i]~=PRtpst[i+1] then samegrd=1;
end;
** Flag the special cases;
strtneg=0; endneg=0;
do i=1 to GRB;
if 0<CRbfat[i]<13 & CRbfst[i]=-3 then strtneg=1;
if 0<CRbfat[i]<13 & CRbfed[i]=-3 then endneg=1;
if 12<CRbfat[i]<95 then clg=1;
end;
neg3or4=0;
if (CRbfrpev in (-1,-2,-3) & CRbfskev in (-1,-2,-3))|(CRbfrpev=-4 & CRbfskev=-4) then neg3or4=1;
gapbteq=0;
do i=1 to (GRB-2);
do k=i+2 to GRB;
if 0<CRbfat[i]<13 & CRbfat[i]=CRbfat[k] then gapbteq=1;
end;
end;
gapbteqPR=0;
do i=1 to (GRB-2);
do k=i+2 to GRB;
if 0<alattd[i]<13 & alattd[i]=alattd[k] then gapbteqPR=1;
end;
end;
gapbteqCR=0;
do i=(GRB+1) to (GRC-2);
do j=i+2 to GRC;
if 0<alattd(i)<13 & alattd(i)=alattd(j) then gapbteqCR=1;
end;
end;
strtmis=0; endmis=0;
do i=1 to GRB;
if 0<CRbfat[i]<13 & CRbfst[i] in (-4,.) then strtmis=1;
if 0<CRbfat[i]<13 & CRbfed[i] in (-4,.) then endmis=1;
end;
array vars11 r11bfrpev r11bfskev r11bf2857 r11bfint
r11bfat1-r11bfat15 r11bfat1-r11bfat15
r11bfst1-r11bfst15 r11bfst1-r11bfst15
r11bfed1-r11bfed15 r11bfed1-r11bfed15
r11bfcp1-r11bfcp15 r11bfcp1-r11bfcp15;
array varsC CRbfrpev CRbfskev CRbf2857 CRbfint
CRbfat1-CRbfat15 CRbfat1-CRbfat15
CRbfst1-CRbfst15 CRbfst1-CRbfst15
CRbfed1-CRbfed15 CRbfed1-CRbfed15
CRbfcp1-CRbfcp15 CRbfcp1-CRbfcp15;
do over varsC;
vars11=varsC;
end;
endsas;