use itp, clear set more off *generate the age group cut points generate int cutp3 = 426 generate int cutp4 = 487 generate int cutp5 = 548 generate int cutp6 = 609 generate int cutp7 = 670 *number of age group cut points local nage = 5 *generate the exposure group cut points generate int cutp8 = mmr - 1 generate int cutp9 = mmr + 14 generate int cutp10 = mmr + 28 generate int cutp11 = mmr + 42 drop mmr *create a comma separated list of age group cut points local a=cutp3 local b=`nage'+2 while `b'>3{ local c = cutp`b' local d = ",`c'`d'" local b = `b' - 1 } local a = "`a'`d'" foreach var of varlist cutp*{ replace `var' = cutp1 if `var' < cutp1 replace `var' = cutp2 if `var' > cutp2 } compress sort indiv eventday reshape long cutp, i(indiv eventday) j(type) sort indiv eventday cutp type *number of adverse events within each interval by indiv: generate int nevents = 1 if eventday > cutp[_n-1]+0.5 & eventday <= cutp[_n]+0.5 collapse (sum) nevents, by(indiv cutp type) *intervals by indiv: generate int interval = cutp[_n] - cutp[_n-1] *age groups by indiv: generate int agegr = irecode(cutp, `a') *exposure groups generate exgr = type-`nage'-3 if type>`nage'+2 count if exgr>=. local nmiss = r(N) local nchange = 1 while `nchange'>0{ by indiv: replace exgr = exgr[_n+1] if exgr>=. count if exgr>=. local nchange = `nmiss'-r(N) local nmiss = r(N) } replace exgr = 0 if exgr==. drop cutp* type drop if interval ==0 | interval==. generate loginterval = log(interval) *fit model xi: xtpoisson nevents i.exgr i.agegr, fe i(indiv) offset(loginterval) irr