*! v1.0.0 CFB from pwcorr
*! version 3.0.12 30jun2008
program define pwcorr2, rclass byable(recall)
        version 6, missing
        syntax [varlist(min=2 ts)] [if] [in] [aw fw] [, /* 
                */ Bonferroni Obs Print(real -1) SIDak SIG /*
                */ STar(real -1) LISTwise CASEwise]
        tempvar touse
        mark `touse' `if' `in'          /* but do not markout varlist */

        if "`listwise'" != "" | "`casewise'" != "" {
                markout `touse' `varlist'
        } 

        tokenize `varlist'

		local en : word count `varlist'
		mat C = J(`en', `en', .)
		mat Cp = J(`en', `en', .)
		mat Cn = J(`en', `en', .)
        local i 1
        while "``i''" != "" { 
                capture confirm str var ``i''
                if _rc==0 { 
                        di in gr "(``i'' ignored because string variable)"
                        local `i' " "
                }
                local i = `i' + 1
        }
        local varlist `*'
        tokenize `varlist'
        local nvar : word count `varlist'
        if `nvar' < 2 { error 102 } 

        local weight "[`weight'`exp']"
        local nvar : word count `varlist'
        local adj 1
        if "`bonferr'"!="" | "`sidak'"!="" {
                if "`bonferr'"!="" & "`sidak'"!="" { error 198 }
                local nrho=(`nvar'*(`nvar'-1))/2
                if "`bonferr'"!="" { local adj `nrho' }
        }
        if (`star'>=1) {
                local star = `star'/100
                if `star'>=1 {
                        di in red "star() out of range"
                        exit 198
                }
        }
        if (`print'>=1) {
                local print = `print'/100
                if `print'>=1 {
                        di in red "print() out of range"
                        exit 198
                }

        }
                
        local j0 1
        while (`j0'<=`nvar') {
                di
                local j1=min(`j0'+6,`nvar')
                local j `j0'
                di in smcl in gr _skip(13) "{c |}" _c
                while (`j'<=`j1') {
                        di in gr %9s abbrev("``j''",8) _c
                        local j=`j'+1
                }
                local l=9*(`j1'-`j0'+1)
                di in smcl in gr _n "{hline 13}{c +}{hline `l'}"

                local i `j0'
                while `i'<=`nvar' {
                        di in smcl in gr %12s abbrev("``i''",12) " {c |} " _c
                        local j `j0'
                        while (`j'<=min(`j1',`i')) {
                                cap corr ``i'' ``j'' if `touse' `weight'
                                if _rc == 2000 {
                                        local c`j' = .
                                }
                                else { 
                                        local c`j'=r(rho)
                                        mat C[`i', `j'] = r(rho)
                                        mat C[`j', `i'] = r(rho)
                                }              
                                local n`j'=r(N)
                                local p`j'=min(`adj'*tprob(r(N)-2,/*
                                */ r(rho)*sqrt(r(N)-2)/ /*
                                */ sqrt(1-r(rho)^2)),1)
                                if (r(rho)>=1) {
                                        local p`j'=0
                                }
                                if "`sidak'"!="" {
                                        local p`j'=min(1,1-(1-`p`j'')^`nrho')
                                }
                                mat Cp[`i', `j'] = `p`j''
                                mat Cp[`j', `i'] = `p`j'' 
                                mat Cn[`i', `j'] = `n`j''
                                mat Cn[`j', `i'] = `n`j''
                                local j=`j'+1
                        }
                        local j `j0'
                        while (`j'<=min(`j1',`i')) {
                                if `p`j''<=`star' & `i'!=`j' { 
                                        local ast "*" 
                                }
                                else local ast " "
                                if `p`j''<=`print' | `print'==-1 |`i'==`j' {
                                        di " " %7.4f `c`j'' "`ast'" _c
                                }
                                else    di _skip(9) _c
                                local j=`j'+1
                        }
                        di
                        if "`sig'"!="" {
                                di in smcl in gr _skip(13) "{c |}" _c
                                local j `j0'
                                while (`j'<=min(`j1',`i'-1)) {
                                        if `p`j''<=`print' | `print'==-1 {
                                                di "  " %7.4f `p`j'' _c
                                        }
                                        else    di _skip(9) _c
                                        local j=`j'+1
                                }
                                di
                        }
                        if "`obs'"!="" {
                                di in smcl in gr _skip(13) "{c |}" _c
                                local j `j0'
                                while (`j'<=min(`j1',`i')) {
                                        if `p`j''<=`print' | `print'==-1 /*
                                        */ |`i'==`j' {
                                                di "  " %7.0g `n`j'' _c
                                        }
                                        else    di _skip(9) _c
                                        local j=`j'+1
                                }
                                di
                        }
                        if "`obs'"!="" | "`sig'"!="" {
                                di in smcl in gr _skip(13) "{c |}" 
                        }
                        local i=`i'+1
                }
                local j0=`j0'+7
        }
        ret mat C = C
        ret mat Cp = Cp
        ret mat Cn = Cn
end