*! version 1.0.0. 22 Jan 1997 STB-36 sbe14 /* Calculate odds ratios and CIs for logistic model with interaction terms */ /* 01/22/97 J.M.Garrett (garrettj@med.unc.edu) */ /* Form: effmod d e, cov(covlist) int(interactions and stratum values) */ /* Options: ediff, model, limit */ program define effmod version 5.0 #delimit ; local options "COVariate(string) INTeract(string) EDiff(real 1) MODel Level(real 95) *" ; #delimit cr local varlist "req ex min(2) max(2)" local if "opt" parse "`*'" parse "`varlist'", parse(" ") preserve local d="`1'" local e="`2'" if "`covariate'"=="" | "`interact'"=="" { disp " " disp in blue " Both the cov() and int() options must be specified" exit } * Read in interaction terms and stratum values for odds ratios parse "`interact'", parse(" ") local i=1 while "`1'"~="" { local int`i'="`1'" local intlist `intlist' `int`i'' macro shift if "`1'"=="" | "`1'">"9999999" { disp " " disp in bl " You must enter stratum values in the int() option" disp in bl " Example: int(serxage 70 serxsex 1)" exit } local strat`i'="`1'" local i=`i'+1 macro shift } local numint=`i'-1 * If model estimates not available, run logistic regression model local modvar "`d' `e' `covariate' `intlist'" if "$S_E_vl"=="`modvar'" & "`model'"=="model" { logistic } if "$S_E_vl"~="`modvar'" { if "`model'"~="" { logistic `modvar ' } else {quietly logistic `modvar'} } * Get beta estimates, calculate l local beta=_b[`e'] local i=1 local l=`beta' while `i'<=`numint' { local delta`i'=_b[`int`i''] * `strat`i'' local l=`l' + `delta`i'' local i=`i'+1 } if `ediff'~=1 {local l=`ediff'*`l'} * Get estimates from vce matrix; multiply by specified stratum values matrix V=get(VCE) mat vare=V["`e'","`e'"] local vare=vare[1,1] local i=1 local coveint=0 while `i'<=`numint' { mat varint`i'=V["`int`i''","`int`i''"] local varint`i'=(`strat`i'')^2*varint`i'[1,1] local varint=`varint'+`varint`i'' mat cveint`i'=V["`e'","`int`i''"] local cveint`i'=2*`strat`i''*cveint`i'[1,1] local coveint=`coveint'+`cveint`i'' local i=`i'+1 } * If more than 1 interaction, get interaction covariances local i=1 local j=1 local covint=0 while `j'<`numint' { local k=2 while `k'<=`numint' { if `j'~=`k' { mat covint`i'=V["`int`j''","`int`k''"] local covint`i'=2*`strat`j''*`strat`k''*covint`i'[1,1] local covint=`covint'+`covint`i'' local i=`i'+1 } local k=`k'+1 } local j=`j'+1 } * Calculate odds ratio, variance of l and confidence intervals local varl=`vare'+`varint'+`coveint'+`covint' local se=sqrt(`varl') local or=exp(`l') local z=invnorm((1-`level'/100)/2) if `ediff'>=0 { local upper=round(exp(`l'-`z'*`ediff'*`se'),.001) local lower=round(exp(`l'+`z'*`ediff'*`se'),.001) } if `ediff'<0 { local upper=exp(`l'+`z'*`ediff'*`se') local lower=exp(`l'-`z'*`ediff'*`se') } * Display results disp " " disp in green "OR and `level'% CI for a Logistic Regression Model " /* */ "with Interaction" disp in green "---------------------------------------------------" /* */ "-----------" disp " " disp in green " Disease: " in yellow "`d'" disp in green " Exposure: " in yellow "`e'" in gr " disp in green " Confounders: " in yellow "`covariate'" disp in green " Interaction Terms and Stratum Values:" local i=1 while `i'<=`numint' { disp " `int`i'': " in white "`strat`i''" local i=`i'+1 } disp in green " Exposed-Unexposed= " in white `ediff' disp " " disp in green " l= " in yellow `l' disp in green " Var(l)= " in yellow `varl' disp " " #delimit ; disp in gr " Odds Ratio (`level'% CI) for " in yel "`d'" in gr " vs. " in yel "`e'" in gr ": " in wh %5.3f `or' in gr " (" in wh %5.3f `lower' ", " %5.3f `upper' in green ")"; #delimit cr end