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.

2209 lines
50 KiB
Plaintext

/*
Regarder si les modèles convergent dans la partie 1
Prévoir le cas du cross loading (=> numéro des contraintes, etc)
*/
capture program drop rsoortBP
program define rsoortBP,rclass
syntax varlist(min=2 numeric) [if] [in], PARTition(numlist) [lt(string) METHod(string) UNIFormrecalibration(varlist) NONUNIFormrecalibration(varlist) REPrioritization(varlist) noSearch CFARmsea(real -999) CFACfi(real -999) CFAOR iterate(integer 100) onlycovl Test Hierarchical sb adjust Group(varlist) trace *]
version 15
preserve
//rename *, lower
local P:word count `partition'
local S:word count `lt'
if "`lt'" != "" {
if `P'!=`S' {
di in red "The number of arguments in lt() must be equal to the number of arguments in partition()"
exit 119
}
else {
tokenize `lt'
forvalues i = 1/`S' {
local ltname`i' = "``i''"
}
}
}
else {
forvalues i = 1/`P' {
local ltname`i' = "LT`i'"
}
}
order `varlist'
if "`trace'" != "" {
local qui ""
}
else {
local qui "qui"
}
if "`if'"!=""|"`in'"!="" {
qui keep `if' `in'
}
tokenize `varlist'
local nbitems:word count `varlist'
*di "`varlist'"
local varlist
forvalues i=1/`nbitems' {
//di "``i''"
capture rename ``i'', lower
local low = lower("``i''")
local var`i' = `low'
local varlist `varlist' `low'
}
tokenize `varlist'
*di "`varlist'"
/*
local i = 1
foreach x in `varlist' {
local var`i' = lower("`x'")
di "ok"
rename `x' `var`i''
local ++i
}
*/
local nbitems:word count `varlist'
local mod=mod(`nbitems',2)
if `mod'!=0 {
di in red "You must enter an even number of items : the first half of the items represents the items in time 1 and the second half the items in time 2"
error
}
local nbitems=`nbitems'/2
local nbdims:word count `partition'
local C = 0
foreach z in `partition' {
local C = `C' + `z'
}
if `C' != `nbitems' {
di in red "The sum of the numbers in the partition option is different from the number of variables specified in varlist"
exit 119
}
if `cfarmsea' == -999{
local cfarmsea
}
if `cfacfi' == -999{
local cfacfi
}
if "`method'"=="" {
local method "ml"
}
local i = 1
local j = 0
foreach p in `partition' {
local part`i' = `p'+`j'
local ++i
local j = `j'+`p'
}
if "`sb'" != "" {
local sb = "vce(sbentler)"
}
di as result _col(20) "{hline 35}"
di as text _col(20) "Time 1" _col(40) "Time 2"
di as text _col(20) "{hline 35}"
local j = 1
forvalues i=1/`nbitems' {
*set trace on
if (!missing("`part`j''")) {
if (`i' ==1|`i'==`=`part`j''+1') {
if `i'!=1 local ++j
di _col(20) "`ltname`j''" _col(40) "`ltname`j''"
}
}
*set trace off
di _col(20) "``i''" _col(40) "``=`i'+`nbitems'''"
}
di as result _col(20) "{hline 35}"
/**************************************************************************************************************
DIF time 1 (if "group" is option specified)
***************************************************************************************************************/
/**************************************************************************************************************
DIF : Model A
***************************************************************************************************************/
if "`group'" !="" {
tokenize `varlist'
local ii = 1
local s
local stop = 0
local i = 1
foreach x in `varlist' {
local var`i' = "`x'"
local ++i
}
local i = 1
foreach x in `partition' {
local part`i' = `x'
}
//tokenize `varlist'
forvalues i=1/`nbitems' {
local cov12b `cov12b' e.``i''*e.``=`i'+`nbitems'''
}
//di "`varlist'"
local k = 1
local i = 1
local j = 0
local pp = 0
foreach p in `partition' {
local pp = `pp'+`p'
while (`j'<`pp') {
local bloca`k' `bloca`k'' `var`i''
local blocb`k' `blocb`k'' `var`=`i'+`nbitems'''
//di "`var`i''"
local i = `i'+1
local j = `j'+1
}
//di in red `j'
//order `var`j''-`var`pp''
//order `var`=`j'+`nbitems'''-`var`=`pp'+`nbitems'''
local ++k
}
di "`bloca1'"
di "`bloca2'"
di "`blocb1'"
di "`blocb2'"
local i = 1
local j = 1
local pp = 0
foreach p in `partition' {
local pp = `pp'+`p'
local s `s' (L`i'_1 -> `bloca`i'')
local cl `cl' means(L`i'_1@0) var(L`i'_1@1)
forvalues k = 1/`=`nbdims'-1' {
if (`=`i'+`k''<=`nbdims') {
local covl `covl' L`i'_1*L`=`i'+`k''_1
}
}
local j = `pp'+1
local i = `i'+1
}
local z "`s', `cl' iterate(`iterate') method(`method') `sb' group(`group') ginvariant(covex)"
di in red "DIF : model A (without search for modification indices)"
di as text "sem `z' "
sem `z'
est store modelAwo
if "`cfarmsea'"!="" {
local stoprmsea=0
while `stoprmsea'==0 {
qui estat gof
di in red "rmsea="round(`r(rmsea)',0.001)
if r(rmsea)<`cfarmsea' {
local stoprmsea = 1
}
else {
estat mindices, showpclass(merrvar)
tempvar rname chi df p ccovnum
mat m = r(mindices)
matrix m2 = m[.,1..3]
svmat2 m2 , rnames(`rname') names(`chi' `df' `p') full
gsort -`chi'
local nrows = rowsof(m2)
gen `ccovnum' = _n
list `ccovnum' `rname' `chi' in 1/`nrows'
local num = `ccovnum'[1]
constraint get `num'
local c`num' = r(contents)
di "`c`num''"
constraint drop `num'
*if (même dimension) {
local coverror = `rnames'[1]
di "`coverror'"
*}
constraint 1001 [/]cov(L1_1,L2_1)#0bn.grp_v1 - [/]cov(L1_1,L2_1)#1.grp_v1 = 0
}
}
stop
}
/**************************************************************************************************************
DIF : Model B
***************************************************************************************************************/
levelsof `group', local(levs)
tokenize `levs'
local length = wordcount("`levs'")
forvalues l = 1/`length' {
local level`l' = ``l''
}
local l
local i = 1
local j = 1
local pp = 0
local s
local cl
foreach p in `partition' {
local l = 1
local pp = `pp'+`p'
local s `s' (L`i'_1 -> `bloca`i'')
local cl `cl' means(`level1':L`i'_1@0) var(`level1':L`i'_1@1)
forvalues k = 1/`=`nbdims'-1' {
if (`=`i'+`k''<=`nbdims') {
local covl `covl' L`i'_1*L`=`i'+`k''_1
}
}
local j = `pp'+1
local i = `i'+1
}
/* définition des contraintes */
constraint drop _all
tokenize `varlist'
local c = 1
local i = 1
local j = 1
local pp = 0
foreach p in `partition' {
local pp = `pp'+`p'
while `j'<= `pp' {
constraint `c' [``j'']`level1'bn.`group'#c.L`i'_1 - [``j'']`level2'.`group'#c.L`i'_1 = 0
local ++j
local ++c
}
local ++i
}
local i = 1
foreach v of varlist `varlist' {
if `i'<=`nbitems' {
constraint `c' [``i'']`level1'bn.`group' - [``i'']`level2'bn.`group' = 0
local ++c
local ++i
}
}
local i = 1
foreach v of varlist `varlist' {
if `i'<=`nbitems' {
constraint `c' [/]var(e.``i'')#`level1'bn.`group' - [/]var(e.``i'')#`level2'bn.`group' = 0
local ++c
local ++i
}
}
constraint list
//local z "`s', `cl' iterate(`iterate') method(`method') `sb' group(`group') ginvariant(mcoef mcons merrvar) noanchor forcenoanchor"
//local z "`s', `cl' iterate(`iterate') method(`method') `sb' group(`group') ginvariant(covex) constraints(1/`=`nbitems'*3')"
//local z "`s', `cl' iterate(`iterate') method(`method') `sb' group(`group') ginvariant(mcoef mcons merrvar ) constraints(`=`nbitems'+1'/`=`nbitems'*3') noanchor forcenoanchor"
local z "`s', `cl' iterate(`iterate') method(`method') `sb' group(`group') ginvariant(mcoef) noanchor forcenoanchor"
di in red "DIF : model B"
di as text "sem `z' constraints(`=`nbitems'+1'/`=`nbitems'*3') "
sem `z' constraints(1/`=`nbitems'*3')
est store modelB
est store modelBref
lrtest modelA modelB
if r(p) < 0.05 {
local stop = 0
while (`stop'!=1) {
estat ginvariant, showpclass(mcoef mcons merrvar)
qui ret li
matrix m = r(test)
matrix m2 = m[.,4..6]
tempvar number rname chi df p
svmat2 m2, rnames(`rname') names(`chi' `df' `p') full
gen `number' = .
local c = 1
forvalues i = 1(2)`=`nbitems'*2' {
qui replace `number' = `c' in `i'
local ++c
}
local c = `=`nbitems'+1'
forvalues i = 2(2)`=`nbitems'*2' {
qui replace `number' = `c' in `i'
local ++c
}
local c = `=`nbitems'*2+1'
forvalues i = `=`nbitems'*2+1'/`=`nbitems'*3' {
qui replace `number' = `c' in `i'
local ++c
}
qui sort `p'
list `number' `rname' `chi' `df' `p' in 1/`=`nbitems'*3'
//list `number' `p'
local num = `number'[1]
//di `num'
constraint get `num'
local c`num' = r(contents)
di "`c`num''"
constraint drop `num'
constraint list _all
di in red "Modèle après avoir retiré `c`num''"
sem `z' constraints(1/`=`nbitems'*3')
est store modelBtest
lrtest modelBref modelBtest
if r(p) >= 0.05 {
local stop = 1
}
else {
est store modelBref
di in red "donc on retire `c`num''"
}
*estat ginvariant, showpclass(mcoef mcons merrvar)
}
} // fin if LRT < 0.05
/*************************************************************************************************************
Model 1
**************************************************************************************************************/
stop
} // fin if(group)
/*************
Response-Shift
*************/
/**************************************************************************************************************
Model 1
***************************************************************************************************************/
tokenize `varlist'
local ii = 1
local s
local stop = 0
local i = 1
foreach x in `varlist' {
local var`i' = "`x'"
local ++i
}
local i = 1
foreach x in `partition' {
local part`i' = `x'
}
forvalues i=1/`nbitems' {
local cov12b `cov12b' e.``i''*e.``=`i'+`nbitems'''
}
local k = 1
local i = 1
local j = 0
local pp = 0
local cl
foreach p in `partition' {
local pp = `pp'+`p'
while (`j'<`pp') {
local bloca`k' `bloca`k'' `var`i''
local blocb`k' `blocb`k'' `var`=`i'+`nbitems'''
//di "`var`i''"
local i = `i'+1
local j = `j'+1
}
//di in red `j'
//order `var`j''-`var`pp''
//order `var`=`j'+`nbitems'''-`var`=`pp'+`nbitems'''
local ++k
}
local i = 1
local j = 1
local pp = 0
local s
foreach p in `partition' {
local pp = `pp'+`p'
local s `s' (L`i'_1 -> `bloca`i'') (L`i'_2 -> `blocb`i'')
local cl `cl' means(L`i'_1@0) means(L`i'_2@0) var(L`i'_1@1) var(L`i'_2@1)
local covl `covl' L`i'_1*L`i'_2
forvalues k = 1/`=`nbdims'-1' {
if (`=`i'+`k''<=`nbdims') {
local covl `covl' L`i'_1*L`=`i'+`k''_1 L`i'_2*L`=`i'+`k''_2 // uniquement même trait latent ou même temps
//local covl `covl' L`i'_1*L`=`i'+`k''_1 L`i'_2*L`=`i'+`k''_2 L`i'_1*L`=`i'+`k''_2
}
}
local j = `pp'+1
local i = `i'+1
}
if "`onlycovl'" != "" {
local z "`s', covstruct(_lexogenous, diagonal) `cl' cov(`cov12b' `covl') iterate(`iterate') method(`method') `sb'"
}
else {
local z "`s', `cl' cov(`cov12b') iterate(`iterate') method(`method') `sb'"
}
//local z1 "`s', covstruct(_lexogenous, diagonal) cov(`cov12b' `covl') iterate(`iterate') method(`method') `sb'"
`qui' di "sem `z'"
di as result "Step 1: Measurement model"
di as text "Model 1 estimation..."
qui sem `z'
//ll
qui est store model1
//local s "sem (T1->`1'-``nbitems'')(T2->``=`nbitems'+1''-``=`nbitems'*2''), var(T1@1) var(T2@1) means(T1@0) means(T2@0) method(`method') cov(`cov12b' `covs')"
//sem (T1->`1'-``nbitems'')(T2->``=`nbitems'+1''-``=`nbitems'*2''), var(T1@1) var(T2@1) means(T1@0) means(T2@0) method(`method') cov(`cov12b' `covs') iterate(`iterate') nolog
//estat gof, stat(all)
if ("`cfarmsea'"!="" | "`cfacfi'"!="") {
while (`ii' == 1 | "`e'" != "") & `stop'!=1 {
if `ii' == 1 & ("`cfarmsea'"!="" | "`cfacfi'"!="") {
di
di _n "{bf:step 1:} {text:(model 1 without auto-search of modification indices)}"
}
if "`covs'" != "" & ("`cfarmsea'"!="" | "`cfacfi'"!=""){
di _n "{bf:step `ii':} {text:`covsi'}"
}
local covsi
/* Model 1 without covariances between errors */
qui sem `z' cov(`covs')
est store model1
//qui sem (T1->`1'-``nbitems'')(T2->``=`nbitems'+1''-``=`nbitems'*2''), var(T1@1) var(T2@1) means(T1@0) means(T2@0) method(`method') cov(`cov12b' `covs') iterate(`iterate') nolog
qui estat gof, stat(all)
/* Looking for modification indices */
if ("`cfarmsea'"!="" | "`cfacfi'"!="") {
local stoprmsea = 0
local stopcfi = 0
if "`cfarmsea'"!="" {
qui estat gof
di "rmsea =" round(r(rmsea),0.001)
if r(rmsea)<=`cfarmsea' {
local stoprmsea = 1
}
//else local stoprmsea = 0
}
else local stoprmsea = 1
if "`cfacfi'"!="" {
qui estat gof
di "cfi =" round(r(cfi),0.001)
if r(cfi)>=`cfacfi' {
local stopcfi = 1
}
//else local stopcfi = 0
}
else local stopcfi = 1
/* OR */
if "`cfaor'"!="" {
if `stoprmsea'==1 | `stopcfi'==1 {
local stop = 1
}
}
/* AND */
if "`cfaor'"=="" {
if `stoprmsea'==1 & `stopcfi'==1 {
local stop = 1
}
}
}
if ("`cfarmsea'"!="" | "`cfacfi'"!="") & `stop'!=1 {
qui estat mindices, showpclass(mcons merrvar)
tempname mm nomcol
mat `mm' = r(mindices)
//mat li `mm'
svmat2 `mm' , r(`nomcol') full
gsort - `mm'1
local nrows = rowsof(`mm')
local y = 1
local i = 0
//local partition `nbitems' `nbitems'
foreach x of numlist `partition' {
local ++i
if `i' == 1 local s = `x'
else local s = `s' +`x'
forvalues w = `y'/`s' {
local class_`var`w'' = `i'
local class_`var`=`w'+`nbitems''' = `i'+`nbitems'
*di "`var`w''"
*di "`class_`var`w'''"
*di "`var`=`w'+`nbitems'''"
*di "`class_`var`=`w'+`nbitems''''"
}
local y = `s'+1
}
local f1b
local f2b
local f
local f1
local f2
forvalues i = 1/`nrows' {
local tmp3=`nomcol'[`i']
lstrfun e, subinstr("`tmp3'","cov(","",.)
lstrfun e, subinstr("`e'","/","",.)
lstrfun e, subinstr("`e'",")","",.)
lstrfun e, subinstr("`e'",":_cons","",.)
lstrfun e, subinstr("`e'",",","*",.)
lstrfun d, subinstr("`e'",","," ",.)
lstrfun d, subinstr("`d'","e.","",.)
lstrfun d, subinstr("`d'","*"," ",.)
qui replace `nomcol' = "`d'" in `i'
local d = `nomcol'[`i']
//tokenize "`d'"
local v1 = substr("`d'",1,strpos("`d'", " "))
local v2 = substr("`d'",strpos("`d'", " ")+1,.)
if ("`class_`v1''" != "`class_`v2''") /*| (`class_`v1'' > `nbitems') */ { /*** enlever le | si on cherche aussi au temps2 ***/
qui replace `nomcol' = "" in `i'
}
local tmp3=`nomcol'[`i']
if "`tmp3'" != "" {
//di in red "`tmp3'"
local e1 = substr("`tmp3'",1,strpos("`tmp3'", " ")-1)
local e2 = substr("`tmp3'",strpos("`tmp3'", " ")+1,.)
local ni = `nbitems'*2
forvalues jj = 1/`ni' {
if `jj' <= `nbitems' {
if "`e1'" == "``jj''" {
local f1 = "``jj''"
local f1b = "``=`jj'+`nbitems'''"
}
if "`e2'" == "``jj''" {
local f2 = "``jj''"
local f2b = "``=`jj'+`nbitems'''"
}
}
else if `jj' > `nbitems' { /*** remettre si on cherche aussi au temps2 ***/
if "`e1'" == "``jj''" {
local f1 = "``jj''"
local f1b = "``=`jj'-`nbitems'''"
//di in red "`f1b'"
}
if "`e2'" == "``jj''" {
local f2 = "``jj''"
local f2b = "``=`jj'-`nbitems'''"
}
}
}
if "`f1b'"!="" & "`f2b'"!="" {
local f = "e.`f1b'*e.`f2b'"
//di in red "`f' en plus de `e'"
}
continue, break
}
else {
local e
local f
local f1b
local f2b
}
}
local covsi "`e' (`f') "
local covs `covs' `e' `f'
local f
drop `mm'1-`nomcol'
}
//if e(converged) == 0 di in red "Warning : model did not converge after 50 iterations"
local ++ii
}
}
/* Model 1 final */
//di "{bf:Model 1 (step 1):}"
//local s "sem (T1->`1'-``nbitems'')(T2->``=`nbitems'+1''-``=`nbitems'*2''), var(T1@1) var(T2@1) means(T1@0) means(T2@0) method(`method') cov(`cov12b' `covs') "
//di as text "`s'"
//di "sem `z' cov(`covs')"
local sem1 `z' cov(`covs')
//sem
//est replay model1
qui estat gof, stats(all)
local tli1=r(tli)
local cfi1=r(cfi)
local srmr1=r(srmr)
local rmsea1=r(rmsea)
local ubrmsea1=r(ub90_rmsea)
local lbrmsea1=r(lb90_rmsea)
local chi21=r(chi2_ms)
local df1=r(df_ms)
local dfc1=6*`nbitems'+1
local p1=r(p_ms)
local bic1=r(bic)
if "`sb'" != "" {
local cmodel1 = e(sbc_ms)
//local chi21=r(chi2_ms)
}
//di in red `chi21'
*di as text "End of step 1"
/**************************************************************************************************************
Model 2
***************************************************************************************************************/
di
if "`test'" != "" {
di as result "Step 2: Overall test of response shift"
}
else {
di as result "Step 2: Estimation of ""no response shift"" model (no overall test is performed because the ""test"" option was not specified)"
}
di as text "Model 2 estimation..."
local i = 1
local j = 1
local pp = 0
local s
local k = 1
local var
local cl
local covl
foreach p in `partition' {
local pp = `pp'+`p'
while `j'<= `pp' {
local s `s' (L`i'_1@load`k' _cons@int`k' -> `var`j'') (L`i'_2@load`k' _cons@int`k' -> `var`=`j'+`nbitems''')
local var `var' var(e.`var`j''@var`k') var(e.`var`=`j'+`nbitems'''@var`k')
local ++j
local ++k
}
local cl `cl' means(L`i'_1@0) var(L`i'_1@1) var(L`i'_2) means(L`i'_2)
local covl `covl' L`i'_1*L`i'_2
forvalues g = 1/`=`nbdims'-1' {
if (`=`i'+`g''<=`nbdims') {
//di in red `g'
local covl `covl' L`i'_1*L`=`i'+`g''_1 L`i'_2*L`=`i'+`g''_2
}
}
local ++i
}
local z "`s', `var' covstruct(_lexogenous, diagonal) `cl' cov(`cov12b' `covl' `covs') iterate(`iterate') method(`method') `sb'"
//di "sem `z'"
//di "model 2"
qui sem `z'
local m2 = e(cmdline)
//qui `m2' stand
est store model2
est store model2init
/*
tempname b V
matrix `b'=r(table)
matrix `V'=e(V)
//mat li `V'
local i = 1
foreach p in `partition' {
local truechange_L`i'=`b'[1,`=`nbitems'*4+`i'']
local Vtruechange_L`i'=`V'[`=`nbitems'*4+`i'',`=`nbitems'*4+`i'']
//di `Vtruechange_L`i''
local ++i
}
//estat gof
qui estat gof, stat(all)
local iter2=e(ic)
local tli2=r(tli)
local cfi2=r(cfi)
local srmr2=r(srmr)
local rmsea2=r(rmsea)
local ubrmsea2=r(ub90_rmsea)
local lbrmsea2=r(lb90_rmsea)
local pclose2=r(pclose)
local chi22=r(chi2_ms)
local df2=r(df_ms)
local dfc2=3*`nbitems'+3
local p2=r(p_ms)
local bic2=r(bic)
local convergence2=e(converged)
if "`sb'" != "" {
local cmodel2 = e(sbc_ms)
//local chi22=r(chi2_ms)
}
ereturn matrix b2=`b'
ereturn scalar iter2=`iter2'
ereturn scalar tli2=`tli2'
ereturn scalar cfi2=`cfi2'
ereturn scalar srmr2=`srmr2'
ereturn scalar rmsea2=`rmsea2'
ereturn scalar ubrmsea2=`ubrmsea2'
ereturn scalar lbrmsea2=`lbrmsea2'
ereturn scalar pclose2=`pclose2'
ereturn scalar chi22=`chi22'
ereturn scalar df2=`df2'
ereturn scalar dfc2=`dfc2'
ereturn scalar p2=`p2'
ereturn scalar bic2=`bic2'
ereturn scalar convergence2=`convergence2'
local i = 1
foreach p in `partition' {
ereturn scalar truechange_L`i'=`truechange_L`i''
ereturn scalar Vtruechange_L`i'=`Vtruechange_L`i''
ereturn scalar setruechange_L`i'=`=sqrt(`Vtruechange_L`i'')'
ereturn scalar ztruechange_L`i'=`=`truechange_L`i''/sqrt(`Vtruechange_L`i'')'
ereturn scalar ptruechange_L`i'=`=2-2*normal(abs(`truechange_L`i'')/sqrt(`Vtruechange_L`i''))'
local ++i
}
*/
/**************************************************************************************************************
Autre syntaxe
***************************************************************************************************************/
constraint drop _all
tokenize `varlist'
local all
local i = 1
local j = 1
//local moins = 0
foreach v of varlist `varlist' {
if `i'<=`nbitems' {
local current [/]var(e.``i'') - [/]var(e.``=`i'+`nbitems''') = 0
if !strpos("`all'","`current'") {
constraint `j' [/]var(e.``i'') - [/]var(e.``=`i'+`nbitems''') = 0
//local moins = 0
local ++j
}
/*else {
local moins = 1
}*/
local all `all' [/]var(e.``i'') - [/]var(e.``=`i'+`nbitems''') = 0
local ++i
}
}
local all
local i = 1
foreach v of varlist `varlist' {
if `i'<=`nbitems' {
local current [/]var(e.``i'') - [/]var(e.``=`i'+`nbitems''') = 0
if !strpos("`all'","`current'") {
constraint `j' [``i'']_cons - [``=`i'+`nbitems''']_cons = 0
local ++j
}
local all `all' [/]var(e.``i'') - [/]var(e.``=`i'+`nbitems''') = 0
local ++i
}
}
local c = `j'
local i = 1
local j = 1
local pp = 0
foreach p in `partition' {
local pp = `pp'+`p'
while `j'<= `pp' {
constraint `c' [``j'']L`i'_1 - [``=`j'+`nbitems''']L`i'_2 = 0
//local s `s' (L`i'_1@load`k' _cons@int`k' -> `var`j'') (L`i'_2@load`k' _cons@int`k' -> `var`=`j'+`nbitems''')
local ++j
local ++c
//local ++k
}
local ++i
}
//constraint list
//di "Model 2 (step 2)" // "Model 2 (autre syntaxe)"
//di "`sem1'"
`qui' di "sem `sem1' `cl' constraints(1/`=`nbitems'*3')"
//local sem2 "`s', covstruct(_lexogenous, diagonal) cov(`cov12b' `covl') iterate(`iterate') method(`method') constraints(1/`=`nbitems'*3')"
//di "`sem2'"
set matsize 11000
qui sem `sem1' `cl' constraints(1/`=`nbitems'*3')
est store model2
est store model2init
/*
local m2 = e(cmdline)
qui `m2' stand
est store model2init
*/
if "`sb'" != "" {
local cmodel2 = e(sbc_ms)
//local chi22=r(chi2_ms)
}
tempname b V
matrix `b'=r(table)
matrix `V'=e(V)
//mat li `V'
local i = 1
foreach p in `partition' {
local truechange_L`i'=`b'[1,`=`nbitems'*4+`i'']
local Vtruechange_L`i'=`V'[`=`nbitems'*4+`i'',`=`nbitems'*4+`i'']
local setruechange_L`i'=`=sqrt(`Vtruechange_L`i'')'
local ztruechange_L`i'=`=`truechange_L`i''/sqrt(`Vtruechange_L`i'')'
local ptruechange_L`i'=`=2-2*normal(abs(`truechange_L`i'')/sqrt(`Vtruechange_L`i''))'
local ++i
}
//estat gof
qui estat gof, stat(all)
local iter2=e(ic)
local tli2=r(tli)
local cfi2=r(cfi)
local srmr2=r(srmr)
local rmsea2=r(rmsea)
local ubrmsea2=r(ub90_rmsea)
local lbrmsea2=r(lb90_rmsea)
local pclose2=r(pclose)
local chi22=r(chi2_ms)
local df2=r(df_ms)
local dfc2=3*`nbitems'+3
local p2=r(p_ms)
local bic2=r(bic)
local convergence2=e(converged)
/*
ereturn matrix b2=`b'
ereturn scalar iter2=`iter2'
ereturn scalar tli2=`tli2'
ereturn scalar cfi2=`cfi2'
ereturn scalar srmr2=`srmr2'
ereturn scalar rmsea2=`rmsea2'
ereturn scalar ubrmsea2=`ubrmsea2'
ereturn scalar lbrmsea2=`lbrmsea2'
ereturn scalar pclose2=`pclose2'
ereturn scalar chi22=`chi22'
ereturn scalar df2=`df2'
ereturn scalar dfc2=`dfc2'
ereturn scalar p2=`p2'
ereturn scalar bic2=`bic2'
ereturn scalar convergence2=`convergence2'
*/
local i = 1
foreach p in `partition' {
return scalar truechange_L`i'_2=`truechange_L`i''
return scalar Vtruechange_L`i'_2=`Vtruechange_L`i''
return scalar setruechange_L`i'_2=`=sqrt(`Vtruechange_L`i'')'
return scalar ztruechange_L`i'_2=`=`truechange_L`i''/sqrt(`Vtruechange_L`i'')'
return scalar ptruechange_L`i'_2=`=2-2*normal(abs(`truechange_L`i'')/sqrt(`Vtruechange_L`i''))'
local ++i
}
/*
local i = 1
foreach p in `partition' {
di as text "Observed change (i.e. without accounting for response shift) for `ltname`i'' is " %4.3f `truechange_L`i'' " (p = " %4.3f `ptruechange_L`i'' ")"
local ++i
}
*/
if "`test'"!="" {
if "`sb'"=="" {
local chi221=`chi22'-`chi21'
local df21=`df2'-`df1'
local p21=1-chi2(`df21',`chi221')
local cmodel1= 1
local cmodel2 = 1
}
else {
local cd=(`df2'*`cmodel2'-`df1'*`cmodel1')/(`df2'-`df1')
local df21=`df2'-`df1'
local chi221=(`chi22'-`chi21')/`cd'
local p21 = 1-chi2(`df21',`chi221')
//local adjust = " (sb)"
}
//di in red `chi21'
//di in red `chi22'
if (`p21'>0.05) {
local testno=" no"
}
else {
//local p21 = round(`p21',0.001)
//if `p21'<0.001 {
//local p21 = "< 0.001"
//}
local testno = ""
}
di "{hline 51}"
di in gr /*_col(39) "Test of global Response-Shift " _col(79) "Comparison with model 1"*/
di in gr "Models" _col(18) "Chi-square" _col(32) "df" _col(36) "p-value" _col(48) "BIC" /*_col(39) "Chi-square" _col(54) "df" _col(59) "p-value" *_col(79) "Chi-square" _col(94) "df" _col(99) "p-value"*/
di "{hline 51}"
di in gr "Model 1" _col(20) %8.2f `=`chi21'/`cmodel1'' _col(30) %4.0f `df1' _col(37) %6.4f `p1' _col(45) %7.2f `bic1'
di in gr "Model 2" _col(20) %8.2f `=`chi22'/`cmodel2'' _col(30) %4.0f `df2' _col(37) %6.4f `p2' _col(45) %7.2f `bic2' /*_col(40) %8.2f `=abs(`chi22'-`chi21')' _col(50) %6.0f `df21' %6.4f _col(60) `=1-chi2(`df21',abs(`chi22'-`chi21'))' *_col(82) %8.2f `=`=abs(`chi22'-`chi21')'' _col(90) %6.0f `df21' _col(100) %6.4f `=1-chi2(`df21',abs(`chi22'-`chi21'))'*/
di "{hline 51}"
di "chi2 = " %4.2f `chi221' " (`df21')"
di "p-value of global test = " %4.3f `p21'
//di "=> `no' Step 3"
}
else local testno = ""
if "`testno'"=="" {
}
else {
di as text "We skip step 3 because the overall test for response shift is non significant"
}
*di as text "End of step 2"
/*** Etape 3 ***/
forvalues i = 1/`=`nbitems'*3' {
constraint get `i'
local c`i' = r(contents)
//local csave`i' = r(contents)
}
matrix numcont = J(1,`=`nbitems'*3',.)
forvalues i = 1/`=`nbitems'*3'{
if `i'<=`nbitems' {
local noms "`noms' NUR_``i''"
}
else if `i' > `nbitems' & `i'<=`=`nbitems'*2' {
local noms "`noms' UR_``=`i'-`nbitems'''"
}
else if `i' > `=`nbitems'*2' {
local noms "`noms' REP_``=`i'-2*`nbitems'''"
}
}
matrix colnames numcont = `noms'
if "`hierarchical'" != "" & "`testno'" !=" no"{
/**************************************************************************************************************
Model 3 / Non Uniform recalibration
***************************************************************************************************************/
di
di as result "Step 3 --Non Uniform recalibration--"
timer clear 20
timer on 20
local nbsign = 0
di as text "Iteration 1 running"
local pbconv = 0
local o = 1
local k = 1
local j = 1
local stop = 0
//local nonunif
while (`j'<=`nbitems' & `stop'!=1) {
local max = -1
local c = 0
local stop = 0
timer clear 10
timer on 10
forvalues i = 1/`nbitems' {
constraint get `i'
if r(defined)== 1 {
constraint drop `i'
qui sem `sem1' `cl' constraints(1/`=`nbitems'*3') forcenoanchor
//constraint list
constraint `i' `c`i''
//constraint list
//di "Après avoir enlevé `c`i'' : "
if "`adjust'" != "" {
local nbtest = `nbitems'-`j'+1
}
else local nbtest = 1
//di "nbtest = `nbtest'"
qui eret li
if e(converged) == 1 {
est store model3
if "`sb'" == "" {
`qui' lrtest model2 model3
if r(p) < `=0.05/`nbtest'' {
local nbsign = `nbsign'+1
}
if r(chi2) > `max' & r(p) < `=0.05/`nbtest'' {
local max = r(chi2)
local c = `i'
}
}
else {
qui estat gof, stats(all)
local df3=r(df_ms)
local cmodel3 = e(sbc_ms)
local chi23=r(chi2sb_ms)
local cd=(`df2'*`cmodel2'-`df3'*`cmodel3')/(`df2'-`df3')
local df23=`df2'-`df3'
local chi223=(`chi22'-`chi23')/`cd'
local p23 = 1-chi2(`df23',`chi223')
//di "lr(sb) = `chi223'"
//di "p = `p23'"
if `p23' < `=0.05/`nbtest'' {
local nbsign = `nbsign'+1
}
if `chi223' > `max' & `p23' < `=0.05/`nbtest'' {
local max = `chi223'
local c = `i'
}
}
}
else {
local ++pbconv
//`qui' di "model did not converge (`pbconv' in total)"
}
}
}
//local mmax = `max'
//di `mmax'
//local cc`j' = `c'
//di `cc`j''
if `c' == 0 {
//matrix numcont[1,`c']=0
local stop = 1
//di "stop"
}
if `c'!=0 {
constraint get `c'
matrix numcont[1,`c']=1
//di "donc on retire"
//di r(contents)
local reprio`k' = r(contents)
local ordre_reprio_`k' = `o'
local ++o
constraint drop `c'
local c`c'
local ++k
}
qui sem `sem1' `cl' constraints(1/`=`nbitems'*3')
qui est store model2
if "`sb'" != "" {
qui estat gof, stats(all)
local df2=r(df_ms)
local cmodel2 = e(sbc_ms)
local chi22=r(chi2_ms)
}
timer off 10
qui timer list 10
local ++j
if `j'==2 {
if (`nbsign'==0) local nbsign=1
di as text "Iteration `j' running" " (Based on the results of the first iteration, step 3 --non-uniform recalibration-- should last approximately " `=round(`r(t10)'*`nbsign')' " seconds)"
}
else {
di as text "Iteration `j' running"
}
}
di as text "Constraints removed (non-uniform recalibration): "
forvalues i = 1/`nbitems' {
if "`nonunif`i''"!="" di "`nonunif`i''"
}
/**************************************************************************************************************
Model 3 / Uniform recalibration
***************************************************************************************************************/
di
di as result "Step 3 --Uniform recalibration--"
timer clear 20
timer on 20
local nbsign = 0
di as text "Iteration 1 running..."
local pbconv = 0
local o = 1
local k = 1
local j = 1
local stop = 0
//local nonunif
while (`j'<=`nbitems' & `stop'!=1) {
local max = -1
local c = 0
local stop = 0
timer clear 10
timer on 10
forvalues i = `=`nbitems'+1'/`=`nbitems'*2' {
constraint get `i'
if r(defined)== 1 {
constraint drop `i'
qui sem `sem1' `cl' constraints(1/`=`nbitems'*3') forcenoanchor
//constraint list
constraint `i' `c`i''
//constraint list
//di "Après avoir enlevé `c`i'' : "
if "`adjust'" != "" {
local nbtest = `nbitems'-`j'+1
}
else local nbtest = 1
//di "nbtest = `nbtest'"
qui eret li
if e(converged) == 1 {
est store model3
if "`sb'" == "" {
`qui' lrtest model2 model3
if r(p) < `=0.05/`nbtest'' {
local nbsign = `nbsign'+1
}
if r(chi2) > `max' & r(p) < `=0.05/`nbtest'' {
local max = r(chi2)
local c = `i'
}
}
else {
qui estat gof, stats(all)
local df3=r(df_ms)
local cmodel3 = e(sbc_ms)
local chi23=r(chi2sb_ms)
local cd=(`df2'*`cmodel2'-`df3'*`cmodel3')/(`df2'-`df3')
local df23=`df2'-`df3'
local chi223=(`chi22'-`chi23')/`cd'
local p23 = 1-chi2(`df23',`chi223')
//di "lr(sb) = `chi223'"
//di "p = `p23'"
if `p23' < `=0.05/`nbtest'' {
local nbsign = `nbsign'+1
}
if `chi223' > `max' & `p23' < `=0.05/`nbtest'' {
local max = `chi223'
local c = `i'
}
}
}
else {
local ++pbconv
//`qui' di "model did not converge (`pbconv' in total)"
}
}
}
//local mmax = `max'
//di `mmax'
//local cc`j' = `c'
//di `cc`j''
if `c' == 0 {
//matrix numcont[1,`c']=0
local stop = 1
//di "stop"
}
if `c'!=0 {
constraint get `c'
matrix numcont[1,`c']=1
//di "donc on retire"
//di r(contents)
local reprio`k' = r(contents)
local ordre_reprio_`k' = `o'
local ++o
constraint drop `c'
local c`c'
local ++k
}
qui sem `sem1' `cl' constraints(1/`=`nbitems'*3')
qui est store model2
if "`sb'" != "" {
qui estat gof, stats(all)
local df2=r(df_ms)
local cmodel2 = e(sbc_ms)
local chi22=r(chi2_ms)
}
timer off 10
qui timer list 10
local ++j
if `j'==2 {
if (`nbsign'==0) local nbsign=1
di as text "Iteration `j' running..." " (Based on the results of the first iteration, step 3 --uniform recalibration-- should last approximately " `=round(`r(t10)'*`nbsign')' " seconds)"
}
else {
di as text "Iteration `j' running..."
}
}
di as text "Constraints removed (uniform recalibration): "
forvalues i = 1/`=`nbitems'*3' {
if "`unif`i''"!="" di "`unif`i''"
}
/**************************************************************************************************************
Model 3 / Reprioritization
***************************************************************************************************************/
di
di as result "Step 3 --Reprioritization--"
timer clear 20
timer on 20
local nbsign = 0
di as text "Iteration 1 running..."
local pbconv = 0
local o = 1
local k = 1
local j = 1
local stop = 0
//local nonunif
while (`j'<=`nbitems' & `stop'!=1) {
local max = -1
local c = 0
local stop = 0
timer clear 10
timer on 10
forvalues i = `=`nbitems'*2+1'/`=`nbitems'*3' {
constraint get `i'
if r(defined)== 1 {
constraint drop `i'
qui sem `sem1' `cl' constraints(1/`=`nbitems'*3') forcenoanchor
//constraint list
constraint `i' `c`i''
//constraint list
//di "Après avoir enlevé `c`i'' : "
if "`adjust'" != "" {
local nbtest = `nbitems'-`j'+1
}
else local nbtest = 1
//di "nbtest = `nbtest'"
qui eret li
if e(converged) == 1 {
est store model3
if "`sb'" == "" {
`qui' lrtest model2 model3
if r(p) < `=0.05/`nbtest'' {
local nbsign = `nbsign'+1
}
if r(chi2) > `max' & r(p) < `=0.05/`nbtest'' {
local max = r(chi2)
local c = `i'
}
}
else {
qui estat gof, stats(all)
local df3=r(df_ms)
local cmodel3 = e(sbc_ms)
local chi23=r(chi2sb_ms)
local cd=(`df2'*`cmodel2'-`df3'*`cmodel3')/(`df2'-`df3')
local df23=`df2'-`df3'
local chi223=(`chi22'-`chi23')/`cd'
local p23 = 1-chi2(`df23',`chi223')
//di "lr(sb) = `chi223'"
//di "p = `p23'"
if `p23' < `=0.05/`nbtest'' {
local nbsign = `nbsign'+1
}
if `chi223' > `max' & `p23' < `=0.05/`nbtest'' {
local max = `chi223'
local c = `i'
}
}
}
else {
local ++pbconv
//`qui' di "model did not converge (`pbconv' in total)"
}
}
}
//local mmax = `max'
//di `mmax'
//local cc`j' = `c'
//di `cc`j''
if `c' == 0 {
//matrix numcont[1,`c']=0
local stop = 1
//di "stop"
}
if `c'!=0 {
constraint get `c'
matrix numcont[1,`c']=1
//di "donc on retire"
//di r(contents)
local reprio`k' = r(contents)
local ordre_reprio_`k' = `o'
local ++o
constraint drop `c'
local c`c'
local ++k
}
qui sem `sem1' `cl' constraints(1/`=`nbitems'*3')
qui est store model2
if "`sb'" != "" {
qui estat gof, stats(all)
local df2=r(df_ms)
local cmodel2 = e(sbc_ms)
local chi22=r(chi2_ms)
}
timer off 10
qui timer list 10
local ++j
if `j'==2 {
if (`nbsign'==0) local nbsign=1
di as text "Iteration `j' running..." " (Based on the results of the first iteration, step 3 --reprioritization-- should last approximately " `=round(`r(t10)'*`nbsign')' " seconds)"
}
else {
di as text "Iteration `j' running..."
}
}
di as text "Constraints removed (reprioritization) : "
forvalues i = 1/`nbitems' {
if "`reprio`i''"!="" di "`reprio`i''"
}
di as result "Summary of step 3 "
/*
di "`pbconv' model(s) did not converge"
di
di as text "The following constraints were removed:"
forvalues i = 1/`=`nbitems'*3' {
if "`nonunif`i''"!="" di "`nonunif`i'' (order = `ordre_nonunif_`i'')"
}
forvalues i = 1/`=`nbitems'*3' {
if "`unif`i''"!="" di "`unif`i'' (order = `ordre_unif_`i'')"
}
forvalues i = 1/`=`nbitems'*3' {
if "`reprio`i''"!="" di "`reprio`i'' (order = `ordre_reprio_`i'')"
}
//constraint list
*/
}
else if "`hierarchical'" == "" & "`testno'" !=" no"{
di
di as result "Step 3: Detection of response shift"
timer clear 20
timer on 20
local nbsign = 0
di as text "Iteration 1 running " _c
local pbconv = 0
local o = 1
local k = 1
local j = 1
local stop = 0
local nonunif
while (`stop'!=1) {
local max = -1
local c = 0
local stop = 0
timer clear 10
timer on 10
forvalues i = 1/`=`nbitems'*3' {
constraint get `i'
if r(defined)== 1 {
//di as text "`j'_`i'"
constraint drop `i'
qui sem `sem1' `cl' constraints(1/`=`nbitems'*3') forcenoanchor
//constraint list
constraint `i' `c`i''
//constraint list
`qui' di as text "After removing `c`i'' : "
qui eret li
if e(converged) == 1 {
est store model3
if "`sb'" == "" {
qui lrtest model2 model3
if "`adjust'" != "" {
local nbtest = `nbitems'*3-`j'+1
}
else local nbtest = 1
if r(p) < `=0.05/`nbtest'' {
local nbsign = `nbsign'+1
}
`qui' di "nbtest = `nbtest'"
if r(chi2) > `max' & r(p) < `=0.05/`nbtest'' {
local max = r(chi2)
local c = `i'
}
}
else {
qui estat gof, stats(all)
local df3=r(df_ms)
local cmodel3 = e(sbc_ms)
local chi23=r(chi2_ms)
//di in red "chi22 = `chi22'"
//di in red "chi23 = `chi23'"
//di in red `cmodel2'
//di in red `cmodel3'
local cd=(`df2'*`cmodel2'-`df3'*`cmodel3')/(`df2'-`df3')
local df23=`df2'-`df3'
local chi223=(`chi22'-`chi23')/`cd'
local p23 = 1-chi2(`df23',`chi223')
//di "df2 = `df2'"
//di "df3 = `df3'"
di as text "cd = `cd'"
//di "chi223 = `chi223'"
//di "df23 = `df23'"
di as text "lr(sb) = `chi223'"
di as text "p = `p23'"
if `chi223' > `max' & `p23' < 0.05 {
local max = `chi223'
local c = `i'
}
}
}
else {
local ++pbconv
`qui' di "model did not converge (`pbconv' in total)"
}
}
di %4.0f `=`i'/(`nbitems'*3)*100' "% " _c
}
if `c' == 0 {
//matrix numcont[1,`c']=0
local stop = 1
//di "stop"
}
if `c'!=0 {
//di in red `c'
matrix numcont[1,`c']=1
constraint get `c'
`qui' di "The following constraint was removed: "
`qui' di r(contents)
if `c'<=`nbitems' {
local nonunif`k' = r(contents)
local ordre_nonunif_`k' = `o'
local ++o
}
else if `c' > `nbitems' & `c'<=`=`nbitems'*2' {
local unif`k' = r(contents)
local ordre_unif_`k' = `o'
local ++o
}
else if `c' > `=`nbitems'*2' {
local reprio`k' = r(contents)
local ordre_reprio_`k' = `o'
local ++o
}
constraint drop `c'
local c`c'
local ++k
}
qui sem `sem1' `cl' constraints(1/`=`nbitems'*3') forcenoanchor
qui est store model2
if "`sb'" != "" {
qui estat gof, stats(all)
local df2=r(df_ms)
local cmodel2 = e(sbc_ms)
local chi22=r(chi2_ms)
}
timer off 10
qui timer list 10
local ++j
if `j'==2 {
di as text _n "(Based on the results of the first iteration, Step 3 should last approximately " `=round(`r(t10)'*`nbsign')' " seconds)"
di as text "Iteration 2 running " _c
}
else {
if `c'!=0 {
di as text _n "Iteration `j' running " _c
}
}
}
timer off 20
qui timer list 20
di _n "(Step 3 took "`=round(`r(t20)')' " seconds to complete)"
di
est store model3
/*
di as text "Contraintes libérées (recalibration non-uniforme) : "
forvalues i = 1/`nbitems' {
if "`nonunif`i''"!="" di "`nonunif`i''"
}*/
di as result "Summary of step 3 "
/*
di
di as text "`pbconv' model(s) did not converge"
di
di as text "The following constraints were removed:"
forvalues i = 1/`=`nbitems'*3' {
if "`nonunif`i''"!="" di "`nonunif`i'' (order = `ordre_nonunif_`i'')"
}
forvalues i = 1/`=`nbitems'*3' {
if "`unif`i''"!="" di "`unif`i'' (order = `ordre_unif_`i'')"
}
forvalues i = 1/`=`nbitems'*3' {
if "`reprio`i''"!="" di "`reprio`i'' (order = `ordre_reprio_`i'')"
}
//constraint list
*/
}
est store model4
local m4 = e(cmdline)
local i = 1
foreach p in `partition' {
local cl `cl' means(L`i'_1@0) var(L`i'_1@1) var(L`i'_2@1) means(L`i'_2)
local ++i
}
mat mt = numcont'
local maxlength = 0
foreach v of varlist `varlist' {
if length("`v'")>`maxlength' {
local maxlength = length("`v'")
}
}
local et = "&|"
forvalues i=1/`=`nbitems'*3' {
local et "`et'" "&"
}
matrix colnames mt = "1 if RS detected"
if "`testno'" == "" {
di as text "Notation: "
di as text "RS = response shift"
di as text "NUR = non-uniform recalibration"
di as text "UR = uniform recalibration"
di as text "REP = reprioritization"
local esp
forvalues i = 1/`=`nbitems'*3+2' {
local esp = "`esp'&"
}
matlist mt, cspec(& %~`=`maxlength'+4's & %18.0f & ) rspec("`esp'")
mat li mt
matrix rsitems = mt
return matrix rsitems = mt
di
*di as text "End of step 3"
}
/***********************
Step 4
************************/
di as result "Step 4: Assessment of true change"
qui est rep model4
qui est rest model4
tempname b V
matrix `b'=e(b)
matrix `V'=e(V)
//mat li `V'
local i = 1
foreach p in `partition' {
local truechange_L`i'_4=`b'[1,`=`nbitems'*4+`i'']
local Vtruechange_L`i'_4=`V'[`=`nbitems'*4+`i'',`=`nbitems'*4+`i'']
local setruechange_L`i'_4=`=sqrt(`Vtruechange_L`i'_4')'
local ztruechange_L`i'_4=`=`truechange_L`i'_4'/sqrt(`Vtruechange_L`i'_4')'
local ptruechange_L`i'_4=`=2-2*normal(abs(`truechange_L`i'_4')/sqrt(`Vtruechange_L`i'_4'))'
local ++i
}
local i = 1
foreach p in `partition' {
return scalar truechange_L`i'_4 = `truechange_L`i'_4'
return scalar Vtruechange_L`i'_4=`Vtruechange_L`i'_4'
return scalar setruechange_L`i'_4=`setruechange_L`i'_4'
return scalar ztruechange_L`i'_4=`ztruechange_L`i'_4'
return scalar ptruechange_L`i'_4=`ptruechange_L`i'_4'
local ++i
}
local i = 1
foreach p in `partition' {
//di as text "True change (i.e. when accounting for response shift) for `ltname`i'' is " %4.3f `truechange_L`i'_4' " (p = " %4.3f `ptruechange_L`i'_4' ")"
//di as text "Without accounting for response shift, the estimated change for `ltname`i'' would be " %4.3f `truechange_L`i'' " (p = " %4.3f `ptruechange_L`i'' ")"
//di
local ++i
}
/* LR test for LT means */
qui est rest model4
local m4 = e(cmdline)
forvalues i = 1/`P' {
local cm `cm' means(L`i'_2@0)
}
qui `m4' `cm'
qui est store model4_0
if `P' > 1 {
*di as text "Test if all LT means = 0 at time 2"
qui lrtest model4 model4_0
qui ret li
if r(p) > 0.05 {
di as text "LT means are not significantly different from 0 (p=" %4.3f r(p) ")"
}
else {
di as text "LT means are significantly different from 0 (p=" %4.3f r(p) ")"
}
}
/* Decomposition of observed change */
di
di as result "Decomposition of observed change"
di
/*
di as text "Notation:"
di as text "observed change = contribution of response shift + true change"
di as text "contribution of reponse shift = contribution of recalibration + contribution of reprioritization"
di
*/
qui est rest model4
qui estat framework, fitted
mat mu = r(mu)
forvalues i = 1/`P' {
mat muLT`i' = mu[1,`nbitems'*2+`i'*2]
}
mat gamma = r(Gamma)
mat gamma1 = gamma[1...,1..1]
mat gamma2 = gamma[1...,2..2]
forvalues i=1(2)`=`P'*2' {
mat g1 = gamma[1...,`i'..`i']
mat gamma1 = gamma1,g1
mat g2 = gamma[1...,`i'+1..`i'+1]
mat gamma2 = gamma2,g2
}
mat gamma1 = gamma1[1...,2...]
mat gamma2 = gamma2[1...,2...]
mat alpha = r(alpha)
local v = 1
local c = 1
local i = 1
local j = 1
local pp = 0
foreach p in `partition' {
local pp = `pp'+`p'
while `j'<= `pp' {
local tc = 0
local reprio = 0
mat mui = mu
local mu1 = mui[1,`j']
local mu2 = mui[1,`j'+`p']
local mu2mu1 = `mu2'-`mu1'
local oc`v' = `mu2mu1'
local recalibration = alpha[1,`j'+`p']-alpha[1,`j']
mat tc = gamma1[`j',1...]*muLT`i'[1...,1...]
forvalues k = 1/`P' {
local t = el(tc,1,`k')
local tc = `tc'+`t'
}
local tc`v' = `tc'
mat g1 = gamma1[`j',1...]
mat g2 = gamma2[`j'+`p',1...]
mat m = muLT`i'[1...,1...]
mat reprio = (gamma2[`j'+`p',1...]-gamma1[`j',1...])*muLT`i'[1...,1...]
*mat li reprio
forvalues k = 1/`P' {
local r = el(reprio,1,`k')
local reprio = `reprio'+`r'
}
local rs = `recalibration'+`reprio'
local rs`v' = `rs'
//di as text "Observed change for `var`v'' = " %10.3g `mu2mu1' " = " %10.3g `rs' " + " %10.3g `tc'
if (`rs'!=0) {
//di as text = "Contribution of response shift = " %10.3g `rs' " = " %10.3g `recalibration' " + " %10.3g `reprio'
}
else {
//di as text "(no repsonse shift for `var`v'')"
}
local ++j
local ++v
//di
}
local j = `j'+`p'
local pp = `pp'+`p'
local ++i
}
/* Table */
local v = 1
forvalues i=1/`=`nbitems'*3' {
if rsitems[`i',1]==1 {
if `i' > `nbitems' & `i'<=`=`nbitems'*2' {
local v = `i'-`nbitems'
}
if `i' > `=`nbitems'*2' & `i'<=. {
local v = `i'-`nbitems'-`nbitems'
}
if `i'<=`nbitems' {
local rsd`v' "`rsd`v''" "NUR "
}
if `i'>`nbitems' & `i'<=`=`nbitems'*2' {
local rsd`v' "`rsd`v''" "UR "
}
if `i'>`=`nbitems'*2' {
local rsd`v' "`rsd`v''" "REP "
}
}
}
di _col(0) "{hline 128}"
di as result _col(0) "Variable" _col(25) "Response shift" _col(48) "Observed change" _col(72) "Response shift contribution" _col(105) "True change contribution"
di as text _col(0) "{hline 128}"
local i = 1
foreach v of varlist `varlist' {
if `i' <= `nbitems' {
di as text _col(0) "`v'" _c
di _col(25) %10.2g "`rsd`i''" _c
di _col(48) %10.2g `oc`i'' _c
di _col(72) %10.2g `rs`i'' _c
di _col(105)%10.2g `tc`i''
}
local ++i
}
di as result _col(0) "{hline 128}"
/* Effect-sizes */
di
di as result "Effect-sizes of observed change, response shift, and true change"
di
/*
di as text "Notation:"
di as text "observed change = contribution of response shift + true change"
di as text "contribution of reponse shift = contribution of recalibration + contribution of reprioritization"
*/
qui est rest model4
qui estat framework, fitted
mat mu = r(mu)
forvalues i = 1/`P' {
mat muLT`i' = mu[1,`nbitems'*2+`i'*2]
}
mat gamma = r(Gamma)
mat gamma1 = gamma[1...,1..1]
mat gamma2 = gamma[1...,2..2]
forvalues i=1(2)`=`P'*2' {
mat g1 = gamma[1...,`i'..`i']
mat gamma1 = gamma1,g1
mat g2 = gamma[1...,`i'+1..`i'+1]
mat gamma2 = gamma2,g2
}
mat gamma1 = gamma1[1...,2...]
mat gamma2 = gamma2[1...,2...]
mat alpha = r(alpha)
mat sigma = r(Sigma)
local v = 1
local c = 1
local i = 1
local j = 1
local pp = 0
foreach p in `partition' {
local pp = `pp'+`p'
while `j'<= `pp' {
local tc = 0
local reprio = 0
mat mui = mu
local mu1 = mui[1,`j']
local mu2 = mui[1,`j'+`p']
local mu2mu1 = `mu2'-`mu1'
/* standard deviations */
local sd1 = el(sigma,`j',`j')
local sd2 = el(sigma,`j'+`p',`j'+`p')
local covar = el(sigma,`j',`j'+`p')
local sd = sqrt(`sd1'+`sd2'-2*`covar')
*di "sd = " `sd'
local mu2mu1 = `mu2mu1'/`sd'
local oc`v' = `mu2mu1'
local recalibration = alpha[1,`j'+`p']-alpha[1,`j']
local recalibration = `recalibration'/`sd'
mat tc = gamma1[`j',1...]*muLT`i'[1...,1...]
forvalues k = 1/`P' {
local t = el(tc,1,`k')
local tc = `tc'+`t'
}
local tc = `tc'/`sd'
local tc`v' = `tc'
*di "tc = " `tc'
mat g1 = gamma1[`j',1...]
mat g2 = gamma2[`j'+`p',1...]
mat m = muLT`i'[1...,1...]
mat reprio = (gamma2[`j'+`p',1...]-gamma1[`j',1...])*muLT`i'[1...,1...]
*mat li reprio
forvalues k = 1/`P' {
local r = el(reprio,1,`k')
local reprio = `reprio'+`r'
}
local reprio = `reprio'/`sd'
local rs = `recalibration'+`reprio'
local rs`v' = `rs'
//di as text "Observed change for `var`v'' = " %4.3f `mu2mu1' " = " %4.3f `rs' " + " %4.3f `tc'
if (`rs'!=0) {
//di as text = "Contribution of response shift = " %4.3f `rs' " = " %4.3f `recalibration' " + " %4.3f `reprio'
}
else {
//di as text "(no repsonse shift for `var`v'')"
}
local ++j
local ++v
//di
}
local j = `j'+`p'
local pp = `pp'+`p'
local ++i
}
/* Table of effect-sizes */
forvalues i=1/`nbitems' {
local rsd`i'
}
local v = 1
forvalues i=1/`=`nbitems'*3' {
if rsitems[`i',1]==1 {
if `i' > `nbitems' & `i'<=`=`nbitems'*2' {
local v = `i'-`nbitems'
}
if `i' > `=`nbitems'*2' & `i'<=. {
local v = `i'-`nbitems'-`nbitems'
}
if `i'<=`nbitems' {
local rsd`v' "`rsd`v''" "NUR "
}
if `i'>`nbitems' & `i'<=`=`nbitems'*2' {
local rsd`v' "`rsd`v''" "UR "
}
if `i'>`=`nbitems'*2' {
local rsd`v' "`rsd`v''" "REP "
}
}
}
di _col(0) "{hline 128}"
di as result _col(0) "Variable" _col(25) "Response shift" _col(48) "Observed change" _col(72) "Response shift contribution" _col(105) "True change contribution"
di as text _col(0) "{hline 128}"
local i = 1
foreach v of varlist `varlist' {
if `i' <= `nbitems' {
di as text _col(0) "`v'" _c
di _col(25) %6.3f "`rsd`i''" _c
di _col(48) %6.3f `oc`i'' _c
di _col(72) %6.3f `rs`i'' _c
di _col(105)%6.3f `tc`i''
}
local ++i
}
di as result _col(0) "{hline 128}"
/* radar plots */
tempvar ocs tcs variable
qui gen `ocs' = .
qui gen `tcs' = .
qui gen `variable' = ""
forvalues i = 1/`nbitems' {
qui replace `variable' = "`var`i''" in `i'
qui replace `ocs' = `oc`i'' in `i'
qui replace `tcs' = `tc`i'' in `i'
}
//list `variable' `ocs' `tcs' in 1/`nbitems'
qui replace `variable' = "a" if `variable'==""
qui radar `variable' `ocs' `tcs' in 1/`nbitems', aspect(1) legend(lab(1 "Observed change") lab(2 "True change")) r(-1 -0.8 -0.5 0 0.5 0.8 1) note("") title(Effect-sizes of observed change and true change)
/* return */
matrix effectsizes = J(`nbitems',3,.)
forvalues i = 1/`nbitems'{
mat effectsizes[`i',1] = `oc`i''
mat effectsizes[`i',2] = `rs`i''
mat effectsizes[`i',3] = `tc`i''
local names `names' `var`i''
}
mat rownames effectsizes = `names'
return matrix effectsizes = effectsizes
//di "modèle 2 avec variances à 1"
qui `m2' `cl'
//di "modèle 4 avec variances à 1"
qui `m4' `cl'
est drop model2
//est dir
restore
end