* tfr2 ***************************** * Author : Bruno Schoumaker (UCL) * * bruno.schoumaker@uclouvain.be * * May 17, 2013 * * * * version 1.2.1 * ************************************ use "C:\stillbirth\NPIR60FL.DTA" program tfr2, byable(recall) version 10.0 syntax [varlist(default=none)] [if] [pweight] [, /* */ BVar(varlist) LENgth(integer 3) DATes(string) /* */ WBirth(varname) AGeg(integer 5) CLuster(varname) /* */ TRend(integer 9999) AWF(varname) MINage(integer 15) (MAXage(integer 49)/* */ ENTRy(varname) MAC noRates CYears noTFR ONLYTab/* */ SAVETAB(string) SAVERates(string) SAVETRend(string) SAVESChed(string) GT GR SE Level(cilevel)/* */ ENDy(integer 9999) /* */ INput(string) FRM ADJExp DV] *-------------------------- *------- error messages *-------------------------- *------- error message if single age group local max2=int(`maxage'/`ageg')*`ageg' if `max2'==`minage' & ("`varlist'"==""& (`trend'==9999|`trend'==`length')) { di as error "tfr2 does not allow computing rates for a single age group. Use at least two age groups, or use the command tabexp." error 198 exit } *-------- error message for input format if ("`input'" != "wide" & "`input'"!="" & "`input'"!="table") { di as error "input format must be wide or table (default is wide)." error 198 exit } *-------- error message for se without graph or save if ("`se'"=="se" & ("`gr'"=="" & "`gt'"=="" & "`saverates'"=="" & "`savetrend'"=="")) { di as error "se is only allowed with gr, gt, saverates and savetrend." error 198 exit } *-------- error message for savetr with saver if ("`savetrend'"!="" & "`saverates'"!="") { di as error "savetrend can not be combined with saverates." error 198 exit } *-------- select TREND equal to LENgth as default if `trend' == 9999 { local trend=`length' } *------- error message for savesched without trend if `trend'==`length' & ("`savesched'"!="") { di as error "savesched can only be used if trend=`length' { local title "ASFRs - TFR" if "`rates'"=="norates" & "`tfr'"=="notfr" { local title="" } if "`rates'"=="norates" & "`tfr'"!="notfr" { local title="TFR" } if "`rates'"!="norates" & "`tfr'"=="notfr" { local title="ASFRs" } if "`mac'"=="mac" { local title="`title' - Mean age at childbearing (MAC)" } di in smcl "{bf:`title'}" } } *--- if "`rates'"=="norates" { local rate_all "" } if "`tfr'"=="notfr" { local TFR_all "" } if "`mac'"=="" { local MAC_all "" } *--------------------------------------------------- *** --- display results (ASFRS, TFR and MAC) ******* *--------------------------------------------------- quietly : nlcom `rate_all' `TFR_all' `MAC_all', post level(`level') nlcom, level(`level') *---------------------- *-------- saving rates *---------------------- if "`saverates'" !="" { matrix c=e(b)' svmat c, name(rates) matrix d=vecdiag(e(V))' svmat d, names(se) quietly : replace se=sqrt(se) if "`se'"=="se" { keep rates se } if "`se'"=="" { keep rates } gene age=`agemin'+((_n-1)*`ageg')+`ageg'/2 local nline=_N-1 if "`tfr'"=="notfr" { local nline=`nline'+1 } if "`mac'"=="mac" { local nline=`nline'-1 } quietly : replace age=. if rates==. | _n>`nline' quietly: keep if rates!=. order age gene date=`centry' if "`rates'"=="norates"{ drop age } save `saverates' `replace_r' } *------------------------------- *--------display graph rates *** *------------------------------- if "`gr'" !="" { quietly{ matrix c=e(b)' svmat c, name(rates) matrix d=vecdiag(e(V))' svmat d, names(se) quietly : replace se=sqrt(se) keep rates se gene age=`agemin'+((_n-1)*`ageg')+`ageg'/2 local nbageg=(`agemax'-`agemin')/`ageg'+1 keep if _n<=`nbageg' } if "`se'"=="se" { tempvar level2 z scalar `level2'=1-((100-`level')/200) scalar `z'=invnorm(`level2') gene low=rates-`z'*se gene hi=rates+`z'*se twoway (rarea low hi age) (line rates age), title("Age-Specific Fertility Rates") xtitle(Age) ytitle("RATE") subtitle() note("Rates computed by `trend'-year period") legend(ring(0) pos(1) order(1 "`level'% CI" 2 "Rates") cols(1) size(small)) } if "`se'"=="" { twoway (line rates age) , title("Age-Specific Fertility Rates") xtitle(Age) ytitle("RATE") subtitle() note("Rates computed by `trend'-year period") legend(ring(0) pos(1) order(1 "Rate") cols(1) size(small)) } } *------------------------------- *--------display rate ratios *** *------------------------------- local Age _A* if `agemax'==`agemin' { local Age "" } if "`varlist'"!=""{ di in smcl "{bf:Rate ratios of explanatory variables - Assumption of constant age fertility schedule}" quietly : estimates restore Rate_ratios estimates table, drop(_cons `COEFA_all') eform star(.10 .05 .01) } *----------------------- *-------- Trend model*** *----------------------- if `trend'<`length' { if "`cluster'" == "" { quietly : xi, prefix(_A) i.`age_g' local Age _A* if `agemax'==`agemin' { local Age "" } quietly : xi: poisson events `Age' i.`period', exposure(`exposy') level(`level') } if "`cluster'" != "" { quietly : xi, prefix(_A) i.`age_g' local Age _A* if `agemax'==`agemin' { local Age "" } quietly : xi : jackknife, cluster("`cluster'") : poisson events `Age' i.`period', exposure(`exposy') level(`level') } *--------------------------------------------- *-------- computation of TFRs from the model *--------------------------------------------- *-------- TFR of first year local TFR_0 "`TFR'" local TFR_all (TFR_0:`TFR_0') local lmax=`length'-1 *-------- TFR for other years forval i=`trend'(`trend')`lmax' { local p`i'=`i' local TFR_`i' "`TFR_0'*exp(_b[_I`period'_`p`i''])" local TFR_all `TFR_all' (TFR_`i':`TFR_`i'') } if "`savesched'" !="" { quietly : nlcom `TFR_all' `rate_all', post level(`level') } if "`savesched'" =="" { quietly : nlcom `TFR_all', post level(`level') } di in smcl "{bf:TFRs by `trend'-year periods - Assumption of constant age fertility schedule}" nlcom, level(`level') *------------------------- *-------- saving schedule *------------------------- if "`savesched'" !="" { tempfile temp_pp quietly : save `temp_pp', replace matrix c=e(b)' svmat c, name(rates) matrix d=vecdiag(e(V))' svmat d, names(se) quietly : replace se=sqrt(se) if "`se'"=="se" { keep rates se } if "`se'"=="" { keep rates } keep if _n>`length' quietly: gene age=`agemin'+((_n-1)*`ageg')+`ageg'/2 quietly : replace age=. if rates==. quietly: keep if rates!=. order age quietly : save `savesched' `replace_s' use `temp_pp', clear } *------------------- *------saving trend *------------------- if "`savetrend'" !="" { tempfile temp_pp quietly : save `temp_pp', replace quietly : nlcom, level(`level') matrix c=e(b)' svmat c, name(TFR) matrix d=vecdiag(e(V))' svmat d, names(se) quietly : replace se=sqrt(se) if "`se'"=="se" { keep TFR se } if "`se'"=="" { keep TFR } quietly: keep if _n<=`length' gene date=`centry'-(`length'/2)+((_n-1)*`trend')+(`trend'/2) quietly : replace date=. if TFR==. order date save `savetrend' `replace_tr' use `temp_pp', clear } *------------------------------------- *-------- Graph of results - TRENDS *------------------------------------- if "`gt'" !="" { tempfile temp_pp quietly : save `temp_pp', replace quietly: nlcom, level(`level') matrix c=e(b)' svmat c, name(TFR) matrix d=vecdiag(e(V))' svmat d, names(se) quietly : replace se=sqrt(se) keep TFR se if "`savesched'" !="" { keep if _n<=`length' } quietly : gene date=`centry'-(`length'/2)+((_n-1)*`trend')+(`trend'/2) quietly : replace date=. if TFR==. if "`se'"=="" { twoway (line TFR date) , title("Total Fertility Rates (`minage'-`maxage')") xtitle(Period) ytitle("TFR(`minage'-`maxage')") subtitle() note("Rates computed by `trend'-year periods - Assumption of constant age fertility schedule") legend(ring(0) pos(1) order(1 "TFR") cols(1) size(small)) } if "`se'"=="se" { tempvar level2 z scalar `level2'=1-((100-`level')/200) scalar `z'=invnorm(`level2') quietly : gene low=TFR-`z'*se quietly : gene hi=TFR+`z'*se twoway (rarea low hi date) (line TFR date) , title("Total Fertility Rates (`minage'-`maxage')") xtitle(Period) ytitle("TFR(`minage'-`maxage')") subtitle() note("Rates computed by `trend'-year periods - Assumption of constant age fertility schedule") legend(ring(0) pos(1) order(1 "`level'% CI" 2 "TFR") cols(1) size(small)) use `temp_pp', clear } } } *------------------------------------- *-------- Restore original data *-------------------------------------