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.
364 lines
7.6 KiB
Plaintext
364 lines
7.6 KiB
Plaintext
8 months ago
|
capture program drop cfa
|
||
|
program cfa,rclass
|
||
|
syntax varlist, PARTition(numlist integer >0) [SCOrename(string) CFAMethod(string) CFAStand]
|
||
|
|
||
|
|
||
|
local C = 0
|
||
|
foreach z in `partition' {
|
||
|
local C = `C' + `z'
|
||
|
}
|
||
|
|
||
|
local nbvars : word count `varlist'
|
||
|
if `C' != `nbvars' {
|
||
|
di in red "The sum of the numbers in the partition option is different from the number of variables precised in varlist"
|
||
|
exit
|
||
|
}
|
||
|
|
||
|
local P:word count `partition'
|
||
|
if "`scorename'" !="" {
|
||
|
local S:word count `scorename'
|
||
|
if `P'!=`S' {
|
||
|
di in red "The number of score names given is different from the number of dimensions in the partition option"
|
||
|
exit
|
||
|
}
|
||
|
}
|
||
|
|
||
|
local i = 1
|
||
|
foreach x in `varlist' {
|
||
|
local var`i' = "`x'"
|
||
|
local `++i'
|
||
|
}
|
||
|
|
||
|
local name
|
||
|
local nname
|
||
|
if "`scorename'"=="" {
|
||
|
forvalues i = 1/`P' {
|
||
|
local name "Dim`i'"
|
||
|
local nname `nname' `name'
|
||
|
}
|
||
|
local scorename = "`nname'"
|
||
|
}
|
||
|
|
||
|
local upscorename = upper("`scorename'")
|
||
|
|
||
|
*capture calcscore `varlist', scorename(`upscorename') partition(`partition')
|
||
|
|
||
|
local i = 0
|
||
|
local y = 1
|
||
|
tokenize `upscorename'
|
||
|
foreach x in `partition' {
|
||
|
local `i++'
|
||
|
if `i' == 1 local s = `x'
|
||
|
else local s = `s' +`x'
|
||
|
|
||
|
local liste = ""
|
||
|
forvalues w = `y'/`s' {
|
||
|
local liste `liste' `var`w''
|
||
|
}
|
||
|
|
||
|
local a = "(``i'' -> `liste')"
|
||
|
local z `z' `a'
|
||
|
|
||
|
local y = `s'+1
|
||
|
}
|
||
|
/*
|
||
|
local cpt = 0
|
||
|
if "`cfa_ml'" != "" {
|
||
|
local method = "ml"
|
||
|
local cpt `cpt' + 1
|
||
|
}
|
||
|
if "`cfa_mlmv'" != "" {
|
||
|
local method = "mlmv"
|
||
|
local cpt `cpt' + 1
|
||
|
}
|
||
|
if "`cfa_adf'" != "" {
|
||
|
local method = "adf"
|
||
|
local cpt `cpt' + 1
|
||
|
}
|
||
|
else local method = "ml"
|
||
|
if `cpt'>1 {
|
||
|
di in red "You must choose between cfa_ml, cfa_mlmv or cfa_adf (the options are exclusive)"
|
||
|
exit 119
|
||
|
}
|
||
|
*/
|
||
|
|
||
|
|
||
|
if "`cfamethod'" == "" local cfamethod = "ml"
|
||
|
|
||
|
if "`cfamethod'" != "ml" & "`cfamethod'" != "mlmv" & "`cfamethod'" != "adf" {
|
||
|
di "`cfamethod'"
|
||
|
di in red "option cfamethod incorrectly specified (choose among ml, mlmv and adf)"
|
||
|
error 198
|
||
|
}
|
||
|
|
||
|
|
||
|
if "`cfastand'" != "" local cfastand = "stand"
|
||
|
|
||
|
di as result "{hline}"
|
||
|
di "{bf:Confirmatory factor analysis}"
|
||
|
di as result "{hline}"
|
||
|
di
|
||
|
|
||
|
qui sem `z', method(`cfamethod') `cfastand'
|
||
|
|
||
|
/*
|
||
|
sem (HA -> ioc1-ioc4) (PSE -> ioc5-ioc8) (W -> ioc9-ioc15) ///
|
||
|
(BCC -> ioc16-ioc18) (AC -> ioc19-ioc21) (AE -> ioc22-ioc25) ///
|
||
|
(LI -> ioc26-ioc32) (MOC -> ioc33-ioc37)
|
||
|
,stand
|
||
|
cov(e.ioc36*e.ioc37
|
||
|
e.ioc28*e.ioc29 e.ioc14*e.ioc15 e.ioc23*e.ioc25 e.ioc33*e.ioc34 ///
|
||
|
e.ioc9*e.ioc10 e.ioc6*e.ioc8 e.ioc5*e.ioc7) // method(mlmv)
|
||
|
*/
|
||
|
|
||
|
/* factor loadings */
|
||
|
|
||
|
matrix r = r(table)
|
||
|
matrix r = r[1,1...]
|
||
|
matrix r = r'
|
||
|
local n = `nbvars'*2
|
||
|
|
||
|
matrix a = r[1,1]
|
||
|
forvalues i=3(2)`n' {
|
||
|
matrix b = r[`i',1]
|
||
|
matrix a = a\b
|
||
|
}
|
||
|
|
||
|
/* standard error */
|
||
|
|
||
|
matrix r = r(table)
|
||
|
matrix r = r[2,1...]
|
||
|
matrix r = r'
|
||
|
local n = `nbvars'*2
|
||
|
|
||
|
matrix se = r[1,1]
|
||
|
forvalues i=3(2)`n' {
|
||
|
matrix b = r[`i',1]
|
||
|
matrix se = se\b
|
||
|
}
|
||
|
|
||
|
|
||
|
/* intercepts */
|
||
|
|
||
|
matrix r = r(table)
|
||
|
matrix r = r[1,1...]
|
||
|
matrix r = r'
|
||
|
local n = `nbvars'*2
|
||
|
|
||
|
matrix a2 = r[2,1]
|
||
|
forvalues i=4(2)`n' {
|
||
|
matrix b = r[`i',1]
|
||
|
matrix a2 = a2\b
|
||
|
}
|
||
|
|
||
|
/* variances des erreurs */
|
||
|
|
||
|
local m = `n'+1
|
||
|
matrix r = r(table)
|
||
|
matrix r = r[1,`m'...]
|
||
|
matrix r = r'
|
||
|
|
||
|
matrix a3 = r[1,1]
|
||
|
forvalues i=2/`nbvars' {
|
||
|
matrix b = r[`i',1]
|
||
|
matrix a3 = a3\b
|
||
|
}
|
||
|
|
||
|
/* variance des dimensions*/
|
||
|
|
||
|
matrix r = r(table)
|
||
|
local n = `nbvars'*3+1
|
||
|
matrix r = r[1,`n'...]
|
||
|
matrix r = r'
|
||
|
|
||
|
matrix var = r[1,1]
|
||
|
forvalues i=2/`P' {
|
||
|
matrix b = r[`i',1]
|
||
|
matrix var = var\b
|
||
|
}
|
||
|
|
||
|
|
||
|
local i = 1
|
||
|
foreach v in `varlist' {
|
||
|
local var`i' = abbrev("`v'",10)
|
||
|
local `++i'
|
||
|
}
|
||
|
|
||
|
|
||
|
local i = 1
|
||
|
foreach s in `scorename' {
|
||
|
local s`i' = abbrev("`s'",10)
|
||
|
local sc `sc' `s`i''
|
||
|
local `++i'
|
||
|
|
||
|
}
|
||
|
|
||
|
local max = 10
|
||
|
local dec = `max'+5
|
||
|
|
||
|
local max2 = 10
|
||
|
|
||
|
local dec2 = `dec'+`max2'+5
|
||
|
|
||
|
local a = e(N)
|
||
|
di "{text:Number of used individuals: `a'}"
|
||
|
di
|
||
|
di _col(`=`dec2'+17+4') "{bf:Estimation:}"
|
||
|
|
||
|
|
||
|
di as result "{bf:Item}" _c
|
||
|
di _col(`dec') "{bf:Dimension}" _c
|
||
|
*local col = `dec'+17
|
||
|
di _col(`dec2') "{bf:Factor}" _c
|
||
|
*local col = `dec2'+17
|
||
|
di _col(`=`dec2'+14') "{bf:Standard}" _c
|
||
|
*local col = `col'+17
|
||
|
di _col(`=`dec2'+28') "{bf:Intercept}" _c
|
||
|
*local col = `col'+13
|
||
|
|
||
|
|
||
|
if "`cfastand'" == "" {
|
||
|
di _col(`=`dec2'+42') "{bf:Variance of}" _c
|
||
|
di _col(`=`dec2'+56') "{bf:Variance of}"
|
||
|
|
||
|
di _col(`dec2') "{bf:loading}" _c
|
||
|
*local col = `dec2'+17
|
||
|
di _col(`=`dec2'+14') "{bf:error}" _c
|
||
|
*local col = `col'+30
|
||
|
|
||
|
di _col(`=`dec2'+42') "{bf:error}" _c
|
||
|
di _col(`=`dec2'+56') "{bf:dimension}"
|
||
|
local h = `dec2'+66
|
||
|
}
|
||
|
else {
|
||
|
di _col(`=`dec2'+42') "{bf:Variance of}"
|
||
|
|
||
|
di _col(`dec2') "{bf:loading}" _c
|
||
|
*local col = `dec2'+17
|
||
|
di _col(`=`dec2'+14') "{bf:error}" _c
|
||
|
*local col = `col'+30
|
||
|
|
||
|
di _col(`=`dec2'+42') "{bf:errors}"
|
||
|
local h = `dec2'+52
|
||
|
}
|
||
|
|
||
|
|
||
|
di "{hline `h'}"
|
||
|
|
||
|
local i = 1
|
||
|
local y = 1
|
||
|
foreach x in `partition' {
|
||
|
if `i' == 1 local s = `x'
|
||
|
else local s = `s' +`x'
|
||
|
|
||
|
forvalues z = `y'/`s' {
|
||
|
tokenize `sc'
|
||
|
di "{bf:`var`z''}"_c
|
||
|
di _col(`dec') "{bf:``i''}" _c
|
||
|
local t = a[`z',1]
|
||
|
local t : di %7.2f `t'
|
||
|
*local col = `dec'+17
|
||
|
di _col(`dec2') "{text:`t'}" _c
|
||
|
|
||
|
local t = se[`z',1]
|
||
|
local t : di %8.2f `t'
|
||
|
*local col = `dec2'+9
|
||
|
di _col(`=`dec2'+14') "{text:`t'}" _c
|
||
|
|
||
|
local t = a2[`z',1]
|
||
|
local t : di %9.2f `t'
|
||
|
*local col = `col'+17
|
||
|
di _col(`=`dec2'+28') "{text:`t'}" _c
|
||
|
|
||
|
local t = a3[`z',1]
|
||
|
local t : di %11.2f `t'
|
||
|
*local col = `col'+13
|
||
|
|
||
|
|
||
|
if "`cfastand'" == "" & `z' == `y'{
|
||
|
di _col(`=`dec2'+42') "{text:`t'}" _c
|
||
|
local t = var[`i',1]
|
||
|
local t : di %11.2f `t'
|
||
|
*local col = `dec2'+17+17+13+14
|
||
|
di _col(`=`dec2'+56') "{text:`t'}"
|
||
|
}
|
||
|
else di _col(`=`dec2'+42') "{text:`t'}"
|
||
|
}
|
||
|
di
|
||
|
local `i++'
|
||
|
local y = `s'+1
|
||
|
}
|
||
|
|
||
|
qui estat gof, stats(all)
|
||
|
|
||
|
local chi2 = r(chi2_ms)
|
||
|
local p = r(p_ms)
|
||
|
local ddl = r(df_ms)
|
||
|
local ratio = `chi2'/`ddl'
|
||
|
local rmsea = r(rmsea)
|
||
|
local lb = r(lb90_rmsea)
|
||
|
local ub = r(ub90_rmsea)
|
||
|
local nfi = 1-(r(chi2_ms)/r(chi2_bs))
|
||
|
local rni = 1-(r(chi2_ms)-r(df_ms))/(r(chi2_bs)-r(df_bs))
|
||
|
local cfi = r(cfi)
|
||
|
local ifi = (r(chi2_bs)-r(chi2_ms))/(r(chi2_bs)-r(df_ms))
|
||
|
local mci = exp(-0.5*((r(chi2_ms)-r(df_ms))/(e(N)-1)))
|
||
|
local srmr = r(srmr)
|
||
|
|
||
|
di
|
||
|
di "{bf:Goodness of fit}"
|
||
|
di
|
||
|
|
||
|
di as result _col(4) "chi2" _c
|
||
|
di as result _col(20) "ddl" _c
|
||
|
di as result _col(28) "chi2/ddl" _c
|
||
|
di as result _col(42) "RMSEA [90% CI]" _c
|
||
|
di as result _col(64) "SRMR" _c
|
||
|
di as result _col(74) "NFI" _c
|
||
|
di as result _col(84) "RNI" _c
|
||
|
di as result _col(94) "CFI" _c
|
||
|
di as result _col(104) "IFI" _c
|
||
|
di as result _col(114) "MCI"
|
||
|
|
||
|
*di as result "`P' dimensions" _c
|
||
|
|
||
|
local t : di %7.2f `chi2'
|
||
|
di "{text:`t'}" _c
|
||
|
local t : di %3.0f `ddl'
|
||
|
di _col(20) "{text:`t'}" _c
|
||
|
local t : di %7.1f `ratio'
|
||
|
di _col(29) "{text:`t'}" _c
|
||
|
local t : di %5.3f `rmsea'
|
||
|
local l : di %5.3f `lb'
|
||
|
local u : di %5.3f `up'
|
||
|
di _col(40) "{text:`t' [`l' ; `u']}" _c
|
||
|
local t : di %5.3f `srmr'
|
||
|
di _col(63) "{text:`t'}" _c
|
||
|
local t : di %5.3f `nfi'
|
||
|
di _col(72) "{text:`t'}" _c
|
||
|
local t : di %5.3f `rni'
|
||
|
di _col(82) "{text:`t'}" _c
|
||
|
local t : di %5.3f `cfi'
|
||
|
di _col(92) "{text:`t'}" _c
|
||
|
local t : di %5.3f `ifi'
|
||
|
di _col(102) "{text:`t'}" _c
|
||
|
local t : di %5.3f `mci'
|
||
|
di _col(112) "{text:`t'}"
|
||
|
local p : di %5.3f `p'
|
||
|
di "{text:(p-value = `p')}"
|
||
|
di as result
|
||
|
|
||
|
|
||
|
/*
|
||
|
matrix ind = (`chi2',`ddl',`ratio',`rmsea',`nfi',`rni',`cfi',`ifi',`srmr')
|
||
|
matrix colnames ind = "chi2" "ddl" "chi2/ddl" "RMSEA" "NFI" "RNI" "CFI" "IFI" "SRMR"
|
||
|
matrix rownames ind = ""
|
||
|
di
|
||
|
di "{bf:Goodness of fit}"
|
||
|
matrix list ind, format(%6.3f) noheader
|
||
|
*/
|
||
|
end
|
||
|
|
||
|
*cfa ioc1-ioc37, partition(4 4 7 3 3 4 7 5) scorename(HAaaaaaaaaaaaaaaaaaaaaaaaaaz PSE W BCC AC AE LI MOC) cfamethod(ml) //cfastand
|
||
|
*cfa x1-x40, partition(5 5 5 5 5 5 5 5) cfastand
|