You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
292 lines
7.7 KiB
Plaintext
292 lines
7.7 KiB
Plaintext
program define compart,rclass
|
|
version 8
|
|
syntax varlist [if] [in] [fweight iweight] [,part(numlist) Matrix(string) type(string) DETails noSTANDardized VARiables SQUare]
|
|
|
|
preserve
|
|
unab varlist:`varlist'
|
|
di "`varlist'"
|
|
tokenize `varlist'
|
|
marksample touse
|
|
local nbvar:word count `varlist'
|
|
qui count
|
|
local nbind=r(N)
|
|
tempname p
|
|
qui gen `p'=1
|
|
qui su `p' [`weight'`exp'] if `touse'
|
|
local nbind=r(N)
|
|
if "`square'"=="" {
|
|
local quad=1
|
|
}
|
|
else {
|
|
local quad=2
|
|
}
|
|
|
|
if "`type'"!=""&"`type'"!="polychoric" {
|
|
di in red "The type of the matrix is not authorized. Please correct your {hi:type} option."
|
|
error 198
|
|
}
|
|
if "`type'"!=""&"`matrix'"!="" {
|
|
di in red "You cannot define in the same time the {hi:type} and the {hi:matrix} options"
|
|
error 198
|
|
}
|
|
|
|
/* DEFINITION OF THE PARTITION OF THE VARIABLES*/
|
|
|
|
local newpart
|
|
foreach i in `part' {
|
|
if `i'!=0 {
|
|
local newpart `newpart' `i'
|
|
}
|
|
}
|
|
local part `newpart'
|
|
local meme=0
|
|
local diff=0
|
|
local nbpart:word count `part'
|
|
forvalues i=1/`nbpart' {
|
|
local iti:word `i' of `part'
|
|
local meme=`meme'+`iti'*(`iti'-1)/2
|
|
forvalues j=`=`i'+1'/`nbpart' {
|
|
local itj:word `j' of `part'
|
|
local diff=`diff'+`iti'*`itj'
|
|
}
|
|
}
|
|
|
|
local perc=`meme'/(`meme'+`diff')
|
|
di "meme: `meme' ; diff: `diff' ; perc: `perc'"
|
|
|
|
|
|
local test=0
|
|
local last0=0
|
|
forvalues i=1/`nbpart' {
|
|
local first`i'=`last`=`i'-1''+1
|
|
local size`i':word `i' of `part'
|
|
local last`i'=`first`i''+`size`i''-1
|
|
local test=`test'+`size`i''
|
|
local list`i'
|
|
forvalues j=`first`i''/`last`i'' {
|
|
local list`i' `list`i'' ``j''
|
|
}
|
|
}
|
|
if `test'!=`nbvar' {
|
|
di in red "{p}The described partition of the variables is composed of a number of variables different of the number of variables of varlist.{p_end}"
|
|
exit 198
|
|
}
|
|
|
|
/* BY DEFAULT, STANDARDIZATION*/
|
|
if "`standardized'"=="" {
|
|
forvalues i=1/`nbvar' {
|
|
qui su ``i'' [`weight'`exp']
|
|
qui replace ``i''=(``i''-r(mean))/r(sd)
|
|
}
|
|
}
|
|
|
|
tempname Cov W
|
|
if "`matrix'"==""&"`type'"!="polychoric" {
|
|
/* COVARIANCE OR CORRELATION MATRIX*/
|
|
qui matrix accum `Cov'=`varlist' [`weight'`exp'],nocons dev
|
|
qui matrix `Cov'=`Cov'/(`nbind'-1)
|
|
}
|
|
else if "`type'"=="polychoric" {
|
|
qui polychoric `varlist'
|
|
qui matrix `Cov'=r(R)
|
|
}
|
|
else {
|
|
qui matrix `Cov'=`matrix'
|
|
}
|
|
/* WE SAVE THE MATRIX AND WE COMPUTE THE AVERAGE COVARIANCE */
|
|
qui matrix `W'=`Cov'
|
|
local sum=0
|
|
forvalues i=1/`nbvar' {
|
|
forvalues j=`=`i'+1'/`nbvar' {
|
|
local sum=`sum'+ `W'[`i',`j']^`quad'
|
|
}
|
|
}
|
|
|
|
/* WE SAVE THE DATA AND WE COMPUTES THE USED PERCENTILES OF THE COVARIANCE*/
|
|
|
|
tempfile compartfile
|
|
qui save `compartfile',replace
|
|
|
|
drop _all
|
|
set obs `=`nbvar'*(`nbvar'-1)'
|
|
local n=1
|
|
qui gen i=.
|
|
qui gen j=.
|
|
qui gen corr=.
|
|
forvalues i=1/`nbvar' {
|
|
forvalues j=`=`i'+1'/`nbvar' {
|
|
qui replace i=`i' in `n'
|
|
qui replace j=`j' in `n'
|
|
qui replace corr=`W'[`i',`j']^`quad' in `n'
|
|
local ++n
|
|
}
|
|
}
|
|
matrix list `W'
|
|
su corr
|
|
sort corr
|
|
centile corr,centile(`=100-`perc'*100')
|
|
local centile=r(c_1)
|
|
if `diff'!=0 {
|
|
local perc2=(`meme'+1)/(`meme'+`diff')
|
|
centile corr,centile(`=100-`perc2'*100')
|
|
local centile2=r(c_1)
|
|
local centile=(`centile'+`centile2')/2
|
|
}
|
|
qui use `compartfile',clear
|
|
|
|
/***************************************************/
|
|
|
|
if `nbpart'==1 {
|
|
local mean=0
|
|
* local mean=(2*`sum')/(`nbvar'*(`nbvar'-1))
|
|
}
|
|
else {
|
|
local mean=(2*`sum')/(`nbvar'*(`nbvar'-1))
|
|
local mean=0
|
|
*local mean=`centile'
|
|
}
|
|
|
|
/*THE MATRIX IS CENTERED*/
|
|
|
|
forvalues i=1/`nbvar' {
|
|
matrix `W'[`i',`i']=0
|
|
forvalues j=`=`i'+1'/`nbvar' {
|
|
matrix `W'[`i',`j']=(`W'[`i',`j']^`quad'-`mean')
|
|
matrix `W'[`j',`i']=`W'[`i',`j']
|
|
}
|
|
}
|
|
|
|
/*WE COMPUTE THE INDEX D*/
|
|
local C=0
|
|
local C1=0
|
|
local C2=0
|
|
local minrho=2
|
|
local summeme=0
|
|
local sumdiff=0
|
|
if "`square'"!="" {
|
|
local maxrho=0
|
|
}
|
|
else {
|
|
local maxrho=-2
|
|
}
|
|
*set trace on
|
|
forvalues i=1/`nbpart' {
|
|
forvalues j=1/`nbpart' {
|
|
forvalues k=`first`i''/`last`i'' {
|
|
forvalues l=`first`j''/`last`j'' {
|
|
if `i'!=`j' {
|
|
if `k'>`l' {
|
|
local sumdiff=`sumdiff'+`Cov'[`k',`l']
|
|
}
|
|
if (`Cov'[`k',`l'])^`quad'>(`maxrho')^`quad' {
|
|
local maxrho=(`Cov'[`k',`l'])
|
|
}
|
|
matrix `W'[`k',`l']=-(`W'[`k',`l'])
|
|
}
|
|
else if (`Cov'[`k',`l'])^`quad'<(`minrho')^`quad'&`k'!=`l' {
|
|
local minrho=`Cov'[`k',`l']
|
|
}
|
|
if `i'==`j'&`k'>`l' {
|
|
local summeme=`summeme'+`Cov'[`k',`l']
|
|
}
|
|
local C=`C'+`W'[`k',`l']
|
|
local C1=`C1'+abs(`W'[`k',`l'])
|
|
if `W'[`k',`l']>+0 {
|
|
local ++C2
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
if `meme'!=0 {
|
|
local summeme=`summeme'/`meme'
|
|
}
|
|
if `diff'!=0 {
|
|
local sumdiff=`sumdiff'/`diff'
|
|
}
|
|
local diffsum=`summeme'-`sumdiff'
|
|
set trace off
|
|
di "Summeme: `summeme' ; Sumdiff: `sumdiff'"
|
|
|
|
local minrho=(`minrho')^(`quad')
|
|
local maxrho=(`maxrho')^(`quad')
|
|
|
|
local C=sign(`C')*(abs(`C'))^(1/`quad')/(`nbvar'*(`nbvar'-1))+`mean'
|
|
local C1=(`C1')^(1/`quad')/(`nbvar'*(`nbvar'-1))
|
|
local C2=(`C2')/(`nbvar'*(`nbvar'-1))*100
|
|
return local Pcov=`=`C'/`C1''
|
|
return local Pel=`=`C2'/100'
|
|
|
|
if `nbpart'==1 {
|
|
local C=`C'*(`nbvar'+1)/`nbvar'
|
|
}
|
|
|
|
*di "C:" `C' " C1: " `C1' " C2: " `C2'
|
|
if `nbpart'==1 {
|
|
local maxrho=0
|
|
}
|
|
if `nbpart'==`nbvar' {
|
|
local minrho=0
|
|
}
|
|
di " C=(`meme'*`minrho'-`diff'*`maxrho')/(`meme'+`diff')"
|
|
local C=(`meme'*`minrho'-`diff'*`maxrho')/(`meme'+`diff')
|
|
di in green "{hline 80}"
|
|
di in green "Number of individuals: " _col(71) in ye %8.0f `nbind'
|
|
di in green "Number of variables: " _col(71) in ye %8.0f `nbvar'
|
|
di in green "COMPART index: " _col(71) in ye %8.6f `C'
|
|
di in green "Proportion of the covariances explained by the COMPART index: " _col(73) in ye %6.2f `=abs(`C')/`C1'*100' "%"
|
|
di in green "Proportion of positive elements in the matrix: " _col(73) in ye %6.2f `C2' "%"
|
|
di in green "Minimum correlation coefficient for 2 variables of the same group: " _col(74) in ye %5.2f `minrho'
|
|
di in green "Maximum correlation coefficient for 2 variables of two different groups: " _col(74) in ye %5.2f `maxrho'
|
|
di in green "Average correlation coefficient: " _col(74) in ye %5.2f `mean'
|
|
di in green "{hline 80}"
|
|
di
|
|
if "`details'"!="" {
|
|
di in green "Matrix of the coefficients"
|
|
di in green "{hline 26}"
|
|
matrix list `W' ,noheader format(%7.4f)
|
|
di
|
|
}
|
|
if "`variables'"!="" {
|
|
di in green "Details for each variable"
|
|
di in green "{hline 26}"
|
|
di
|
|
di in green "{hline 80}"
|
|
di in green "Items" _col(17) "COMPART" _col(26) "Problematic items"
|
|
di in green "{hline 80}"
|
|
tempname Cvar
|
|
matrix `Cvar'=J(1,`nbvar',0)
|
|
forvalues i=1/`nbvar' {
|
|
local C`i'=0
|
|
local pourri`i'
|
|
forvalues j=1/`nbvar' {
|
|
local C`i'=`C`i''+`W'[`i',`j']
|
|
if `W'[`i',`j']<0 {
|
|
local pourri`i' `pourri`i'' ``j''
|
|
}
|
|
}
|
|
local C`i'=`C`i''/(`nbvar'-1)
|
|
matrix `Cvar'[1,`i']=`C`i''
|
|
di in ye abbrev("``i''",14) _col(15) %9.6f `C`i'' _c
|
|
if "`pourri`i''"!="" {
|
|
di in ye _col(26) "`pourri`i''"
|
|
}
|
|
else {
|
|
di
|
|
}
|
|
}
|
|
di in green "{hline 80}"
|
|
matrix colnames `Cvar'=`varlist'
|
|
matrix rownames `Cvar'=Compart
|
|
return matrix Cvar=`Cvar'
|
|
}
|
|
local test=`maxrho'-`minrho'
|
|
local diffsum=(`summeme'*`meme'-`diff'*`sumdiff')/(`meme'+`diff')
|
|
local diffsum=`summeme'/*-`sumdiff'*/
|
|
return local compart `C'
|
|
return local mean `mean'
|
|
return local list `varlist'
|
|
return local part `part'
|
|
restore
|
|
end
|