Computed theoretical power for N=100 and N=200 scenarios
This commit is contained in:
297
Modules/ado/plus/b/brant.ado
Normal file
297
Modules/ado/plus/b/brant.ado
Normal file
@ -0,0 +1,297 @@
|
||||
*! version 1.6.0 3/29/01
|
||||
|
||||
capture program drop brant
|
||||
program define brant, rclass
|
||||
version 6
|
||||
tempvar touse
|
||||
tempname bout d pvals ivchi ivout step1 step2 ologit
|
||||
tempname XpWmmX iXpWmmX XpWmlX XpWllX iXpWllX DB DBp iDvBDp
|
||||
syntax [, detail]
|
||||
|
||||
if "`e(cmd)'"!="ologit" {
|
||||
di in r "brant can only be used after ologit"
|
||||
exit
|
||||
}
|
||||
|
||||
*to make output stata 6 or stata 7 compatible
|
||||
cap version 7
|
||||
if _rc!=0 {
|
||||
local vers7 "no"
|
||||
local smcl ""
|
||||
local dash "-"
|
||||
local vline "|"
|
||||
local plussgn "+"
|
||||
local topt "-"
|
||||
local bottomt "-"
|
||||
}
|
||||
else { local vers7 "yes"
|
||||
local smcl "in smcl "
|
||||
local dash "{c -}"
|
||||
local vline "{c |}"
|
||||
local plussgn "{c +}"
|
||||
local topt "{c TT}"
|
||||
local bottomt "{c BT}"
|
||||
}
|
||||
version 6.0
|
||||
|
||||
local ocmd "`e(cmd)'"
|
||||
if "`ocmd'"=="ologit" { local bcmd "logit" }
|
||||
local depvar "`e(depvar)'"
|
||||
gen `touse' = e(sample)
|
||||
local wtis ""
|
||||
if "`e(wtype)'"!="" {
|
||||
di in r "-brant- does not work with ologit models with weights"
|
||||
error 999
|
||||
}
|
||||
_perhs
|
||||
local rhsnms "`r(rhsnms)'"
|
||||
local nrhs "`r(nrhs)'"
|
||||
_pecats
|
||||
local numcats = `r(numcats)'
|
||||
local catvals "`r(catvals)'"
|
||||
local catnms "`r(catnms)'"
|
||||
local catnms8 "`r(catnms8)'"
|
||||
estimates hold `ologit'
|
||||
|
||||
*** estimate series of binary logits
|
||||
local i = 1
|
||||
while `i' <= `numcats'-1 {
|
||||
local splitat : word `i' of `catvals'
|
||||
tempvar dummy
|
||||
quietly gen `dummy' = 0 if `depvar' <= `splitat' & `touse'==1
|
||||
quietly replace `dummy' = 1 if `depvar' > `splitat' & `touse'==1
|
||||
quietly `bcmd' `dummy' `rhsnms' `wtis' if `touse' == 1
|
||||
_perhs
|
||||
local binnrhs = "`r(nrhs)'"
|
||||
if `nrhs' != `binnrhs' {
|
||||
di in r "not all independent variables can be retained in all binary logits"
|
||||
di in r "brant test cannot be computed"
|
||||
exit 999
|
||||
}
|
||||
tempvar prob`i'
|
||||
quietly predict `prob`i''
|
||||
tempname b`i' V`i' bc`i'
|
||||
mat `b`i'' = e(b)
|
||||
mat `b`i'' = `b`i''[1, 1..`nrhs']
|
||||
mat `V`i'' = e(V)
|
||||
mat `V`i'' = `V`i''[1..`nrhs', 1..`nrhs']
|
||||
mat `bc`i'' = e(b) /* with constant--for detail output only */
|
||||
mat `bc`i'' = `bc`i'''
|
||||
local outname "y>`splitat'"
|
||||
local outname = substr("`outname'", 1, 8)
|
||||
mat colnames `bc`i'' = "`outname'"
|
||||
mat `bout' = nullmat(`bout'), `bc`i''
|
||||
local i = `i' + 1
|
||||
}
|
||||
|
||||
*** make variables for W(ml) matrices
|
||||
local i = 1
|
||||
while `i' <= `numcats'-1 {
|
||||
local i2 = `i'
|
||||
while `i2' <= `numcats'- 1 {
|
||||
tempvar w`i'_`i2'
|
||||
quietly gen `w`i'_`i2'' = `prob`i2'' - (`prob`i''*`prob`i2'')
|
||||
local i2 = `i2' + 1
|
||||
}
|
||||
local i = `i' + 1
|
||||
}
|
||||
|
||||
*** calculate variance Bm, Bl
|
||||
local i = 1
|
||||
while `i' <= `numcats'-1 {
|
||||
local i2 = `i'
|
||||
while `i2' <= `numcats'- 1 {
|
||||
quietly {
|
||||
* inverse(X'W(mm)X)
|
||||
matrix accum `XpWmmX' = `rhsnms' [iw=`w`i'_`i''] if `touse'==1
|
||||
matrix `iXpWmmX' = inv(`XpWmmX')
|
||||
* X'W(ml)X
|
||||
matrix accum `XpWmlX' = `rhsnms' [iw=`w`i'_`i2''] if `touse'==1
|
||||
* inverse(X'W(ll)X)
|
||||
matrix accum `XpWllX' = `rhsnms' [iw=`w`i2'_`i2''] if `touse'==1
|
||||
matrix `iXpWllX' = inv(`XpWllX')
|
||||
* product of three matrices
|
||||
matrix `step1' = `iXpWmmX' * `XpWmlX'
|
||||
tempname vb`i'_`i2'
|
||||
matrix `vb`i'_`i2'' = `step1' * `iXpWllX'
|
||||
}
|
||||
mat `vb`i'_`i2''= `vb`i'_`i2''[1..`nrhs',1..`nrhs']
|
||||
local i2 = `i2' + 1
|
||||
}
|
||||
local i = `i' + 1
|
||||
}
|
||||
|
||||
* define var(B) matrix
|
||||
local i = 1
|
||||
while `i' <= `numcats'-1 {
|
||||
tempname row`i'
|
||||
local i2 = 1
|
||||
while `i2' <= `numcats'- 1 {
|
||||
quietly {
|
||||
if `i'==`i2' { mat `row`i'' = nullmat(`row`i''), `V`i'' }
|
||||
if `i'<`i2' { mat `row`i'' = nullmat(`row`i'') , `vb`i'_`i2'' }
|
||||
if `i'>`i2' { mat `row`i'' = nullmat(`row`i'') , `vb`i2'_`i''' }
|
||||
}
|
||||
local i2 = `i2' + 1
|
||||
}
|
||||
local i = `i' + 1
|
||||
}
|
||||
|
||||
* combine matrices
|
||||
tempname varb
|
||||
local i = 1
|
||||
while `i' <= `numcats'-1 {
|
||||
mat `varb' = nullmat(`varb') \ `row`i''
|
||||
local i = `i' + 1
|
||||
}
|
||||
* make beta vector
|
||||
tempname bstar
|
||||
local i = 1
|
||||
while `i' <= `numcats'-1 {
|
||||
mat `bstar' = nullmat(`bstar') , `b`i''
|
||||
local i = `i' + 1
|
||||
}
|
||||
mat `bstar' = `bstar''
|
||||
|
||||
* create design matrix for wald test; make I, -I, and 0 matrices
|
||||
tempname id negid zero
|
||||
local dim = `nrhs'
|
||||
mat `id' = I(`dim')
|
||||
mat rownames `id' = `rhsnms'
|
||||
mat colnames `id' = `rhsnms'
|
||||
mat `negid' = -1*`id'
|
||||
mat rownames `negid' = `rhsnms'
|
||||
mat colnames `negid' = `rhsnms'
|
||||
mat `zero' = J(`dim', `dim', 0)
|
||||
mat rownames `zero' = `rhsnms'
|
||||
mat colnames `zero' = `rhsnms'
|
||||
* dummy matrix
|
||||
local i = 1
|
||||
while `i' <= `numcats'-2 {
|
||||
tempname drow`i'
|
||||
local i2 = 1
|
||||
while `i2' <= `numcats'- 1 {
|
||||
quietly {
|
||||
tempname feed
|
||||
if `i2'==1 { mat `feed' = `id' }
|
||||
else if `i2'-`i'==1 { mat `feed' = `negid' }
|
||||
else { mat `feed' = `zero' }
|
||||
mat `drow`i'' = nullmat(`drow`i'') , `feed'
|
||||
}
|
||||
local i2 = `i2' + 1
|
||||
}
|
||||
local i = `i' + 1
|
||||
}
|
||||
|
||||
* combine matrices
|
||||
local i = 1
|
||||
while `i' <= `numcats'-2 {
|
||||
mat `d' = nullmat(`d') \ `drow`i''
|
||||
local i = `i' + 1
|
||||
}
|
||||
|
||||
* terms of wald test
|
||||
mat `DB' = `d' * `bstar'
|
||||
mat `DBp' = `DB''
|
||||
mat `step1' = `d'*`varb'
|
||||
mat `step2' = `step1' * (`d'')
|
||||
mat `iDvBDp' = inv(`step2')
|
||||
|
||||
*** calculate wald stat
|
||||
tempname step1 wald waldout pout dfout
|
||||
mat `step1' = `DBp' * `iDvBDp'
|
||||
mat `wald' = `step1' * `DB'
|
||||
sca `waldout' = `wald'[1,1]
|
||||
sca `dfout' = `nrhs'*(`numcats'-2)
|
||||
sca `pout' = chiprob(`dfout', `waldout')
|
||||
tempname dtemp vbtemp bstemp
|
||||
local i = 1
|
||||
while `i' <= `nrhs' {
|
||||
tempname d`i' vb`i' bstar`i'
|
||||
local i2 = 1
|
||||
while `i2' <= `numcats'-1 {
|
||||
local row = ((`nrhs')*(`i2'-1)) + (`i')
|
||||
tempname drow vbrow
|
||||
local i3 = 1
|
||||
while `i3' <= `numcats'-1 {
|
||||
local column = ((`nrhs')*(`i3'-1)) + (`i')
|
||||
if (`i2'<`numcats'-1) {
|
||||
mat `dtemp' = `d'[`row',`column']
|
||||
mat `drow' = nullmat(`drow') , `dtemp'
|
||||
}
|
||||
mat `vbtemp' = `varb'[`row',`column']
|
||||
mat `vbrow' = nullmat(`vbrow') , `vbtemp'
|
||||
local i3 = `i3' + 1
|
||||
}
|
||||
if (`i2'<`numcats'-1) { mat `d`i'' = nullmat(`d`i'') \ `drow' }
|
||||
mat `vb`i'' = nullmat(`vb`i'') \ `vbrow'
|
||||
mat `bstemp' = `bstar'[`row', 1]
|
||||
mat `bstar`i'' = nullmat(`bstar`i'') \ `bstemp'
|
||||
local i2 = `i2' + 1
|
||||
}
|
||||
local i = `i' + 1
|
||||
}
|
||||
|
||||
*** wald test for each independent variable
|
||||
tempname waldiv
|
||||
local i = 1
|
||||
while `i' <= `nrhs' {
|
||||
tempname DB DBp iDvBDp step1 step2
|
||||
mat `DB' = `d`i'' * `bstar`i''
|
||||
mat `DBp' = `DB''
|
||||
mat `step1' = `d`i''*`vb`i''
|
||||
mat `step2' = `step1' * (`d`i''')
|
||||
mat `iDvBDp' = inv(`step2')
|
||||
tempname step1 wald`i'
|
||||
mat `step1' = `DBp' * `iDvBDp'
|
||||
mat `wald`i'' = `step1' * `DB'
|
||||
mat `waldiv' = nullmat(`waldiv') \ `wald`i''
|
||||
local i = `i' + 1
|
||||
}
|
||||
|
||||
if "`detail'"!="" {
|
||||
di _n in gr "Estimated coefficients from j-1 binary regressions"
|
||||
mat list `bout', noheader
|
||||
}
|
||||
|
||||
di _n in g "Brant Test of Parallel Regression Assumption"
|
||||
di _n `smcl' in g " Variable `vline' chi2 p>chi2 df"
|
||||
di `smcl' _dup(13) in g "`dash'" "`plussgn'" _dup(26) in g "`dash'"
|
||||
di `smcl' in g " All `vline'" in y /*
|
||||
*/ %10.2f `waldout' %9.3f `pout' %6.0f `dfout'
|
||||
di `smcl' _dup(13) in g "`dash'" "`plussgn'" _dup(26) in g "`dash'"
|
||||
* calculate p for individual wald tests
|
||||
mat `pvals' = J(`nrhs', 1, 0)
|
||||
local i = 1
|
||||
local df = `numcats'-2
|
||||
while `i' <= `nrhs' {
|
||||
sca `ivchi' = `waldiv'[`i',1]
|
||||
if `ivchi' >= 0 {
|
||||
mat `pvals'[`i',1] = chiprob(`df',`ivchi')
|
||||
}
|
||||
if `ivchi' < 0 {
|
||||
mat `pvals'[`i',1] = -999
|
||||
}
|
||||
local vnm : word `i' of `rhsnms'
|
||||
|
||||
*added for stata 7 compatibility
|
||||
local printnm "`vnm'"
|
||||
if "`vers7'"=="yes" { local printnm = abbrev("`printnm'", 12) }
|
||||
|
||||
di `smcl' in g %12s "`printnm'" _col(14) "`vline'" in y /*
|
||||
*/ %10.2f `ivchi' %9.3f `pvals'[`i',1] %6.0f `df'
|
||||
local i = `i' + 1
|
||||
}
|
||||
di `smcl' _dup(13) in g "`dash'" "`bottomt'" _dup(26) in g "`dash'"
|
||||
di _n in g /*
|
||||
*/ "A significant test statistic provides evidence that the parallel"
|
||||
di in g "regression assumption has been violated."
|
||||
mat `ivout' = `waldiv', `pvals'
|
||||
mat rownames `ivout' = `rhsnms'
|
||||
mat colnames `ivout' = chi2 p>chi2
|
||||
estimates unhold `ologit'
|
||||
return scalar chi2 = `waldout'
|
||||
return scalar p = `pout'
|
||||
return scalar df = `dfout'
|
||||
return matrix ivtests `ivout'
|
||||
end
|
Reference in New Issue
Block a user