* make a fake data file clear input id month var1 1 1 0 1 2 0 1 3 1 1 4 0 1 5 0 1 6 0 1 7 1 1 8 1 1 9 1 1 10 0 1 11 1 1 12 1 1 13 0 1 14 0 1 15 0 1 16 1 1 17 1 1 18 1 1 19 1 1 20 1 2 1 0 2 2 0 2 3 1 2 4 1 2 5 1 2 6 1 2 7 1 2 8 1 2 9 1 2 10 0 2 11 1 2 12 1 2 13 0 2 14 0 2 15 0 2 16 1 2 17 1 2 18 1 2 19 1 2 20 1 3 1 0 3 2 0 3 3 0 3 4 0 3 5 0 3 6 0 3 7 0 3 8 0 3 9 1 3 10 1 3 11 1 3 12 1 3 13 1 3 14 1 3 15 1 3 16 1 3 17 1 3 18 1 3 19 1 3 20 1 4 1 0 4 2 0 4 3 0 4 4 0 4 5 0 4 6 0 4 7 1 4 8 0 4 9 1 4 10 1 4 11 0 4 12 1 4 13 1 4 14 1 4 15 1 4 16 1 4 17 1 4 18 1 4 19 1 4 20 1 end * set line where spell must start by local line = 6 * set minimum spell length (for it to be a spell) local minspel = 2 * can do find and replace to change these variable names * id variable is named "id" * month variable is named "month" * binary variable is called "var1" sort id month * make f_id which is 0/1 if first id of group generate f_id = 0 quietly by id : replace f_id=1 if _n == 1 * make l_id which is 0/1 if last id of group generate l_id = 0 quietly by id : replace l_id=1 if _N == _n * initialize variables gen sp_strt = 0 /* start of spell */ gen sp_end = 0 /* end of spell */ gen sp_len = 0 /* spell length */ * cycle through obs, 1 to _N, examining spells local obs = 1 while (`obs' <= _N) { * initialize vars at start of ID if f_id[`obs']==1 { local start = 0 /* macro var with start of spell */ local stop = 0 /* macro var with end of spell */ local inspel = 0 /* 0/1 if in spell */ local hadspel = 0 /* 0/1 if already found a spell for this id */ } * if 1, try to identify start of spell if var1[`obs'] == 1 { * start of spell if (`inspel' == 0) & (`hadspel' == 0) { local inspel = 1 local start = month[`obs'] replace sp_strt = 1 in `obs' } } * if 0, try to identify end of spell if var1[`obs'] == 0 { * are we in a spell if (`inspel' == 1) & (`hadspel' == 0) { replace sp_end = -1 in `obs' * does the spell start after the line, * or end after the line, and is spell long enough if ( (`start' >= `line') | (month[`obs'-1] >= `line') ) & /// ((month[`obs'-1]-`start'+1) >= `minspel') { local stop = month[`obs'-1] replace sp_end = 1 in `obs' local hadspel = 1 } else { * otherwise, reset spell info local inspel = 0 local start = 0 } } } * if at last observation for id if (l_id[`obs'] == 1) { * check to see if in a spell not completed if (`inspel' == 1) & (`hadspel' == 0) { local stop = month[`obs'] } * store spell info in last observation for id replace sp_strt = `start' in `obs' replace sp_end = `stop' in `obs' replace sp_len = `stop' - `start' + 1 in `obs' } * add 1 to obs local obs = `obs' + 1 } * have a look at results to see if OK clist month var1 sp* * keep just last obs quietly by id: keep if _N == _n keep id sp* * look at final values clist