*! version 3.1.1 13/10/93 sg29: STB-23 program define smr version 3.1 local in "opt" local if "opt" local varlist "req ex min(2) max(2) " local options /* */ "Level(integer $S_level) ICD(string) Rowlab(string) Total Sumonly" parse "`*'" parse "`varlist'", parse(" ") if `level'<10 | `level'>99 { di in red "level() invalid" exit 198 } tempvar obs expec quietly { gen `obs'=`1' gen `expec'=`2' count `if' `in' local nobs = _result(1) if `nobs'<1 { noisily di "No observations" exit } if "`icd'"=="" {local icd "`rowlab'"} if "`icd'"!="" { local sitelbl : var lab `icd' if "`sitelbl'" == "" {local sitelbl "`icd'"} } else {local sitelbl ""} local obslbl : var lab `1' if "`obslbl'" == "" { local obslbl " Obs"} local explbl : var lab `2' if "`explbl'" == "" { local explbl " Exp"} noisily di in gr _col(51) "-- Poisson Exact --" local i1 1 local i2 `nobs' * Only necessary to sort the data if `if' filter in use ... if "`if'"!="" & `nobs'<_N { tempvar touse row gen long `row' = _n gen byte `touse' = 1 `if' `in' sort `touse' `row' } * ... otherwise, just parse the `in' macro to get case limits. else if "`in'"!="" { parse "`in'", parse("/ ") local i1 `2' local i2 `4' } #delimit ; noisily di in gr "`sitelbl'" _col(13) "| `obslbl' `explbl' O/E (%)" _col(51) "[`level'% Conf. Interval]" _n "------------+" _dup(61) "-" ; #delimit cr local i `i1' if ("`sumonly'"!="") { local i =`i2' local j =`i2' } while `i'<=`i2' { if "`j'"!="" { replace `obs'=sum(`obs') in `i1'/`i2' replace `expec'=sum(`expec') in `i1'/`i2' } local o=`obs'[`i'] local e=`expec'[`i'] if "`icd'" != ""{ local site " `icd'[`i'] "} if "`j'"!="" {local site ""Total""} capture confirm integer number `o' if _rc==0 { _crccip `o' `level' local l=100*($S_1/`e') local u=100*($S_2/`e') local r=100*(`o'/`e') local emark "" } else { local l=. local u=. local r=. local emark "&" local aemark "&" } if(`o'==0 & `e'!=0) { local mark "+" local amark "+" } else local mark "" local star "" local p 1 if `l'>100 { local p = gammap(`o',`e')} else if `u'<100 { local p = 1-gammap(`o'+1,`e')} if `p'<.0005 { local star "***" local s3 "*" } else if `p'<.005 { local star "**" local s2 "*" } else if `p'<.025 { local star "*" local s1 "*" } #delimit ; noisily di in gr `site' _col(13) "| " in yel %8.0f `o' _col(24) %9.4f `e' _col(35) %9.1f `r' "`star'" _col(51) %7.0f `l' _col(60) %7.0f `u' in gr "`mark'" "`emark'"; #delimit cr if `i'==`i2' & "`total'"!="" & "`j'"=="" { local i=`i2'-1 local j=`i2' noisily di in gr "------------+" _dup(61) "-" } local i = `i'+1 } } /* ends quietly */ di _n if "`amark'"!="" { di in gr "(+) one-tail, " 100-(100-`level')/2 /* */ "% confidence interval" } if "`s1'"!="" {di in gr "(*) Twice 1-sided p<.05"} if "`s2'"!="" { di in gr "(**) Twice 1-sided p<.01"} if "`s3'"!="" { di in gr "(***) Twice 1-sided p<.001"} if "`if'"!="" & `nobs'<_N { sort `row' } if "`aemark'"!="" { di in gr "(&) Observed count must be an integer." } end