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