If you have two populations with different prevalences of an outcome,
but that also have different prevalences of covariates (confounders) -
how do you compare these fairly?
Logistic regression will adjust for the differences, and will give you
an adjusted odds ratio for the differences between populations. But how
about prevalences ? The traditional method is via standardization but
this cannot handle continuous variables which is a weakness. The
-adjust- command and variants will adjust the prevalences so that they
are comparable, but the population that it adjusts to is a not so simple
meta-population with funny values for covariates [shown in previous
post]. How to adjust to one of the populations ?
Let prevA be the unadjusted prevalence in population A, and prevB be the
unadjusted prevalence in population B. We want prevalences adjusted to
population A. Naturally, the prevalence in population A is adjusted to
itself, and hence unchanged. But how to get the prevalence in population
B ? It seems intuitive to me that the right way is simply to use the
adjusted odds ratio. Convert the unadjusted prevalence in population B
to an odds, multiply by the adjusted odds ratio, and convert back to a
prevalence - the adjusted prevalence. This makes sense. If you really
believe that the adjusted odds ratio is the true odds ratio, due to the
removal of confounding by other covarites, then the adjusted prevalence
in population B represent that prevalence you would have observed if
population B had the same distribution of covariates as population A.
This program will calculate adjusted prevalences with the above method.
It was a quick hack. Can anybody help in getting confidence intervals
from this program, too ? It needs documentation (short) but I don't
write SMCL.
*! 1.0.0 Jan Brogger [email protected] 28aug2002
capture program drop adjust2
program define adjust2 , rclass
version 7.0
syntax , by(varname) coeff(string)
preserve
qui {
tempname eb matcoeff
tab `by'
if `r(r)'!=2 {
di as err "Error in adjust: by variable `by'
must have only two levels."
}
*First, get the two levels of the -by- variable
summ `by'
local levelA `r(min)'
local levelB `r(max)'
*Convert the target population prevalence to an odds
summ `e(depvar)' if `by'==`levelA' , meanonly
local prevA=`r(mean)'
local adjprevA=`prevA'
local oddsA=`prevA'/(1-`prevA')
*Get the unadjusted prevalence of population B
summ `e(depvar)' if `by'==`levelB' , meanonly
local prevB=`r(mean)'
*Get the odds ratio
matrix `eb'=e(b)
mat `matcoeff'=`eb'["y1","`coeff'"]
local coeff2=`matcoeff'[1,1]
local oddsratio=exp(`coeff2')
*Adjust the odds with the odds ratio and convert back
local oddsB=`oddsA'*`oddsratio'
local adjprevB=`oddsB'/(`oddsB'+1)
}
*Display this nicely
di as text "Unadjusted" _col(40) "Adjusted"
di "prevalences" _col(20) "Odds ratio" _col(40) "prevalences"
di as res "`levelA'" _col(10) "`levelB'" _col(40) "`levelA'"
_col(50) "`levelB'"
di as text _dup(55) "-"
di as res %4.3f `prevA' _col(10) %4.3f `prevB' _col(20) %4.3f
`oddsratio' /*
*/ _col(40) %4.3f `adjprevA' _col(50) %4.3f `adjprevB'
return local unadjprevA = `prevA'
return local unadjprevB = `prevB'
return local oddsratio = `oddsratio'
return local adjprevA = `adjprevA'
return local adjprevB = `adjprevB'
restore
end
*Theoretical example
*The adjusted prevalences should be the same
*whereas the crude are not
*This is due to (extreme) confounding by gender
clear
input time sex asthma freq
0 0 0 450
0 0 1 50
0 1 0 300
0 1 1 200
1 0 0 810
1 0 1 90
1 1 0 60
1 1 1 40
end
expand freq
tab sex time , col nofreq
bysort time: tab asthma sex , col nofreq
logistic asthma time sex
*adjust sex , by(time) pr format(%16.15f)
adjust2 , by(time) coeff(time)
ret li
Yours sincerely,
Jan Brogger, Institute of Medicine, University of Bergen, Norway
*
* For searches and help try:
* http://www.stata.com/support/faqs/res/findit.html
* http://www.stata.com/support/statalist/faq
* http://www.ats.ucla.edu/stat/stata/