program define tri syntax varlist [fweight iweight] [,global test(int 2) all] preserve local nbvar:word count `varlist' tokenize `varlist' /*forvalues i=1/`nbvar' { qui su ``i'' [`weight'`exp'] qui replace ``i''=(``i''-r(mean))/r(sd) } */ /*METHOD GLOBAL */ /* COVARIANCE OR CORRELATION MATRIX*/ if "`global'"!="" { tempname Cov W qui matrix accum `Cov'=`varlist' [`weight'`exp'],nocons dev qui matrix `Cov'=`Cov'/(`nbind'-1) matrix `W'=J(2,`nbvar',0) local newlist tempvar centroid genscore `varlist',mean score(`centroid') forvalues i=1/`nbvar' { qui corr ``i'' `centroid' [`weight'`exp'] matrix `W'[1,`i']=`r(rho)' } forvalues c=1/`nbvar'{ local corrmin=2 local var=0 forvalues i=1/`nbvar' { if `W'[1,`i']<`corrmin'&`W'[2,`i']==0 { local corrmin=`W'[1,`i'] local var=`i' } } matrix `W'[2,`var']=`c' } matrix list `W' forvalues c=1/`nbvar' { forvalues i=1/`nbvar' { if `W'[2,`i']==`c' { local newlist `newlist' ``i'' } } } local varlist "`newlist'" tokenize `varlist' } if "`all'"=="" { local time=1 } else { local time=`nbvar' } local maxc=-99 local part forvalues t=1/`time' { tempname W matrix `W'=J(1,`nbvar',0) matrix `W'[1,`t']=1 forvalues iter=1/`nbvar' { local dejaselect forvalues i=1/`nbvar' { if `W'[1,`i']!=0 { local dejaselect `dejaselect' ``i'' } } tempvar centroid qui genscore `dejaselect',score(`centroid') standardized local maxr=-2 local maxi=0 forvalues i=1/`nbvar' { if `W'[1,`i']==0 { qui corr `centroid' ``i'' local r=r(rho) if `r'>`maxr' { local maxr=`r' local maxi=`i' } } } if `maxi'!=0 { matrix `W'[1,`maxi']=`iter'+1 } } local list forvalues class=1/`nbvar' { forvalues i=1/`nbvar' { if `W'[1,`i']==`class' { local list `list' ``i'' } } } di "`list'" forvalues i=0/`nbvar' { local j=`nbvar'-`i' if `test'>2 { local jb `j' } else { local jb 0 } forvalues k=0/`jb' { local l=`nbvar'-`i'-`k' if `test'>3 { local lb=`l' } else { local lb=0 } forvalues m=0/`lb' { local n=`nbvar'-`i'-`k'-`m' qui di "compart `list',part(`i' `k' `m' `n')" di "`i' `k' `m' `n'" if `i'>=0&`k'>=0&`m'>=0&`n'>=0 { di " compart `list',part(`i' `k' `m' `n')" qui compart2 `list',part(`i' `k' `m' `n') local c=r(compart) di "`c'" if `c'>`maxc' { local maxc=`c' local part=r(part) local savlist `list' *di "Best : `c'" } } } } } } di "The best partition in two groups is `part'" di "for `savlist'" di "COMPART=`maxc'" restore end