*! version 2.4 june2020
*! Myriam Blanchin - Priscilla Brisson
************************************************************************************************************
* ROSALI: RespOnse-Shift ALgorithm at Item-level
* Response-shift detection based on Rasch models family
*
* Version 1 : December 21, 2016 (Myriam Blanchin) /*rspcm122016*/
* Version 1.1 : October 13, 2017 (Myriam Blanchin) /*option: MODA, automatic recoding of unused response categories*/
* Version 2 : April, 2018 (Myriam Blanchin - Priscilla Brisson) /*option: GROUP, dichotomous group variable*/
* Version 2.1 : October, 2018 (Myriam Blanchin - Priscilla Brisson) /* Version 1.1 + Version 2 */
* Version 2.2 : February, 2019 (Priscilla Brisson) /* option nodif, optimization */
* Version 2.3 : December, 2019 (Priscilla Brisson) /* option detail, + petites corrections */
* Version 2.4 : June, 2020 (Myriam Blanchin) /* debug option detail + step C, modifs sorties et help */
*
* Myriam Blanchin, SPHERE, Faculty of Pharmaceutical Sciences - University of Nantes - France
* myriam.blanchin@univ-nantes.fr
*
* Priscilla Brisson, SPHERE, Faculty of Pharmaceutical Sciences - University of Nantes - France
* priscilla.brisson@univ-nantes.fr
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
************************************************************************************************************/

program define rosali, rclass

timer clear 1
timer on 1

syntax varlist(min=2 numeric) [if] [,GROUP(varlist) NODIF PRO DETail]

preserve 
version 15
tempfile saverspcm
capture qui save `saverspcm',replace
local save1=_rc

if "`if'"!="" {
    qui keep `if'
}

if "`pro'" != "" {
	di "START"
}

/**************************************************************************/
set more off
set matsize 5000
constraint drop _all
 
local gp "`group'"

tokenize `varlist'
local nbitems:word count `varlist'

	/* Vérif nb d'items pair */
local mod=mod(`nbitems',2)
if `mod'!=0 {
  di as error "You must enter an even number of items : the first half of the items represents the items at time 1 and the second half the items at time 2"
  error 198
  exit
}

local nbitems=`nbitems'/2


if "`group'"=="" & "`nodif'"!="" {
	di as error "nodif can only be used with the group option ({hi:nodif} option). Please correct this option."
	error 198
	exit
}

local nbc: word count `group'
if `nbc' >= 2 {
	di as error "Only one variable can be used for group option ({hi:group} option). Please correct this option."
	error 198
	exit
}

	/* Vérif qu'il y a 2 groupes si l'option groupe est choisie */
if "`group'"!="" {
  qui tab `group'
  local nbgrp = r(r)
  if `nbgrp' != 2 {
	di as error "Only 2 groups are possible for the group option ({hi:group} option). Please correct this option."
	error 420
	exit
  }
}
/* recoder la variable de groupe en 0, 1*/

if "`group'"!="" {
	qui tab `gp', matrow(rep)
	qui matrix list rep
	if rep[1,1]+rep[2,1] != 1 & rep[1,1]*rep[2,1] != 0 {  
		forvalues i=1/`=rowsof(rep)'{
			qui replace `gp'=`i'-1 if `gp'==rep[`i',1]
			di "WARNING : `gp' `=rep[`i',1]' is now `gp' `=`i'-1' "
		}
	}
	forvalues g = 0/1 {
		qui tab `gp' if `gp' == `g'
		local nbp_gp`g' = r(N)
	}
}



/*item rename*/
/*
Items au temps 1 : 1 à nbitems ``j''
Items au temps 2 : nbitems à 2*nbitems ``=`j'+`nbitems'''

Si t varie, puis num item : ``=(`t'-1)*`nbitems'+`j'''
*/


local com_z = 0 // Indicatrice de recodage
	/*verif modalités répondues*/
if "`gp'" == "" {							// Si pas d'option groupe
	forvalues j = 1 / `nbitems' {
		local recoda_`j' = 0
		qui tab ``j'', matrow(rect1_`j')				// Récupération des infos moda du temps 1
		local minm`j'_t1 = rect1_`j'[1,1]
		local maxm`j'_t1 = rect1_`j'[r(r),1]
		
		qui tab ``=`j'+`nbitems''', matrow(rect2_`j')			// Récupération des infos moda du temps 2
		local minm`j'_t2 = rect2_`j'[1,1]
		local maxm`j'_t2 = rect2_`j'[r(r),1]
		
		local minm_`j' = min(`minm`j'_t1',`minm`j'_t2')		// Info moda pour l'item j
		local maxm_`j' = max(`maxm`j'_t1',`maxm`j'_t2')
		local nbm_`j' = `=`maxm_`j''-`minm_`j'''
		
		if `minm_`j'' != 0 & `com_z' == 0 {
			local com_z = 1
		}

		
		//Recodage des réponses en 0, 1, 2, etc... 
		forvalues r = 0/`=`maxm_`j''-1'  {
				qui replace ``j'' = `r' if ``j'' == `=`r'+`minm_`j'''
				qui replace ``=`j'+`nbitems''' = `r' if ``=`j'+`nbitems''' == `=`r'+`minm_`j'''
		}
		
		// Vérif. Que toutes les modas sont utilisées & concordance entre temps
		forvalues m = 0/`nbm_`j'' {
			qui count if ``j'' == `m'
			local nb_rn1 = r(N)
			qui count if ``=`j'+`nbitems''' == `m'
			local nb_rn2 = r(N)
			local nb_rn = min(`nb_rn1',`nb_rn2')
			
			if `nb_rn' == 0 {		// Une moda n'est pas utilisée
				local recoda_`j' = 1
				if   `m' == 0 | `m' <= `minm`j'_t1' | `m' <= `minm`j'_t2' { // La moda 0 ou les moda min ne sont pas utilisées	
					local stop = 1
					forvalues k = 1/`=`nbm_`j''-`m'' {
						qui count if ``j'' == `=`m' + `k''
						local v`k'1 = r(N)
						qui count if ``=`j'+`nbitems''' == `=`m' + `k''
						local v`k'2 = r(N)
						if (`v`k'1' != 0 | `v`k'2' != 0) & `stop' != 0 {
							qui replace ``j''= `=`m'+`k'' if ``j''==`m'
							qui replace ``=`j'+`nbitems'''=`=`m'+`k'' if ``=`j'+`nbitems'''==`m'	
							di  "WARNING: items ``j'' & ``=`j'+`nbitems''': answers `m' and `=`m'+`k'' merged "
							local stop = 0
						}
					}
				}
				else if `m' >= `maxm`j'_t1' | `m' >= `maxm`j'_t2' | `m' == `maxm_`j'' {	// La (ou les) moda max ne sont pas utilisée(s)
					local stop = 1
					forvalues k = 1/`m' {
						qui count if ``j'' == `=`m' - `k''
						local v`k'1 = r(N)
						qui count if ``=`j'+`nbitems''' == `=`m' - `k''
						local v`k'2 = r(N)
						if (`v`k'1' != 0 | `v`k'2' != 0) & `stop' != 0 {
							qui replace ``j''=`=`m' - `k'' if ``j''==`m'
							qui replace ``=`j'+`nbitems'''=`=`m' - `k'' if ``=`j'+`nbitems'''==`m'
							di  "WARNING: items ``j'' & ``=`j'+`nbitems''': answers `m' and `=`m'-`k'' merged"
							local stop = 0
						}
					}
				}
				else {	
					if runiform()>0.5{											// Tirage au sort pour regrouper
						local stop = 1
						forvalues k = 1/`m' {
							qui count if ``j'' == `=`m' - `k''
							local v`k'1 = r(N)
							qui count if ``=`j'+`nbitems''' == `=`m' - `k''
							local v`k'2 = r(N)
							if (`v`k'1' != 0 | `v`k'2' != 0) & `stop' != 0 {
								qui replace ``j''= `=`m'-`k'' if ``j''==`m'
								qui replace ``=`j'+`nbitems''' =`=`m'-`k'' if ``=`j'+`nbitems''' ==`m'	
								di  "WARNING: items ``j'' & ``=`j'+`nbitems''': answers `m' and `=`m'-`k'' merged"
								local stop = 0
							}
						}
					}
					else {
						local stop = 1
						forvalues k = 1/`=`nbm_`j''-`m'' {
							qui count if ``j'' == `=`m' + `k''
							local v`k'1 = r(N)
							qui count if ``=`j'+`nbitems''' == `=`m' + `k''
							local v`k'2 = r(N)
							if (`v`k'1' != 0 | `v`k'2' != 0) & `stop' != 0 {
								qui replace ``j''=`=`m' + `k'' if ``j''==`m'
								qui replace ``=`j'+`nbitems'''=`=`m' + `k'' if ``=`j'+`nbitems'''==`m'
								di  "WARNING: items ``j'' & ``=`j'+`nbitems''': answers `m' and `=`m'+`k'' merged"
								local stop = 0
							}
							else {
								if `stop' != 0 {
									qui replace ``j''= `nbm_`j'' if ``j''==`m'
									qui replace ``=`j'+`nbitems'''= `nbm_`j'' if ``=`j'+`nbitems'''==`m'
									di  "WARNING: items ``j'' & ``=`j'+`nbitems''': answers `m' and `nbm_`j'' merged"
									local stop = 0
								}
							}
						}
					}
				}
			}
		}
	}
}
else {									// Cas où l'option groupe est utilisée
	forvalues j = 1 / `nbitems' {
		local recoda_`j' = 0
		qui tab ``j'' if `gp' == 0, matrow(rect1_g0_`j') matcell(nbrt1_g0_`j')					// Récupération des infos moda du temps 1pour chaque groupe
		local minm`j'_t1_g0 = rect1_g0_`j'[1,1]
		local maxm`j'_t1_g0 = rect1_g0_`j'[r(r),1]
		
		qui tab ``j'' if `gp' == 1, matrow(rect1_g1_`j') matcell(nbrt1_g1_`j')				
		local minm`j'_t1_g1 = rect1_g1_`j'[1,1]
		local maxm`j'_t1_g1 = rect1_g1_`j'[r(r),1]
		
		qui tab ``=`j'+`nbitems''' if `gp' == 0, matrow(rect2_g0_`j') matcell(nbrt2_g0_`j')				// Récupération des infos moda du temps 2 pour chaque groupe
		local minm`j'_t2_g0 = rect2_g0_`j'[1,1]
		local maxm`j'_t2_g0 = rect2_g0_`j'[r(r),1]
		
		qui tab ``=`j'+`nbitems''' if `gp' == 1	, matrow(rect2_g1_`j') matcell(nbrt2_g1_`j')				
		local minm`j'_t2_g1 = rect2_g0_`j'[1,1]
		local maxm`j'_t2_g1 = rect2_g0_`j'[r(r),1]
		
		local minm_`j' = min(`minm`j'_t1_g0',`minm`j'_t2_g0',`minm`j'_t1_g1',`minm`j'_t2_g1')		// Info moda pour l'item j
		local maxm_`j' = max(`maxm`j'_t1_g0',`maxm`j'_t2_g0',`maxm`j'_t1_g1',`maxm`j'_t2_g1')
		local nbm_`j' = `=`maxm_`j''-`minm_`j''+1'

		if `minm_`j'' != 0 & `com_z' == 0 {
			local com_z = 1
		}
		//Recodage des réponses en 0, 1, 2, etc... 
		forvalues r = 0/`=`maxm_`j''-1'  {
			qui replace ``j'' = `r' if ``j'' == `=`r'+`minm_`j'''
			qui replace ``=`j'+`nbitems''' = `r' if ``=`j'+`nbitems''' == `=`r'+`minm_`j'''
		}
		
		// Vérif. Que toutes les modas sont utilisées & concordance entre temps
		forvalues m = 0/`=`nbm_`j''-1' {
			qui count if ``j'' == `m' & `gp' == 0
			local nb_rn1_g0 = r(N)
			qui count if ``j'' == `m' & `gp' == 1
			local nb_rn1_g1 = r(N)
			qui count if ``=`j'+`nbitems''' == `m' & `gp' == 0
			local nb_rn2_g0 = r(N)
			qui count if ``=`j'+`nbitems''' == `m' & `gp' == 1
			local nb_rn2_g1 = r(N)			
			local nb_rn = min(`nb_rn1_g0',`nb_rn2_g0',`nb_rn1_g1',`nb_rn2_g1')
		
			if `nb_rn' == 0 {		// Une moda n'est pas utilisée
				local recoda_`j' = 1
				if  `m' == 0 | `m' < `minm`j'_t1_g0' | `m' < `minm`j'_t2_g0' | `m' < `minm`j'_t1_g1' | `m' < `minm`j'_t2_g1' { // La moda 0 n'est pas utilisée			
					local stop = 1
					forvalues k = 1/`=`nbm_`j''-`m'' {
						qui count if ``j'' == `=`m' + `k'' & `gp' == 0
						local v`k'1_0 = r(N)
						qui count if ``j'' == `=`m' + `k'' & `gp' == 1
						local v`k'1_1 = r(N)
						qui count if ``=`j'+`nbitems''' == `=`m' + `k'' & `gp' == 0
						local v`k'2_0 = r(N)
						qui count if ``=`j'+`nbitems''' == `=`m' + `k'' & `gp' == 1
						local v`k'2_1 = r(N)
						if (`v`k'1_0' != 0 | `v`k'2_0' != 0 | `v`k'1_1' != 0 | `v`k'2_1' != 0) & `stop' != 0 {
							qui replace ``j''= `=`m'+`k'' if ``j''==`m'
							qui replace ``=`j'+`nbitems'''=`=`m'+`k'' if ``=`j'+`nbitems'''==`m'	
							di  "WARNING: items ``j'' & ``=`j'+`nbitems''': answers `m' and `=`m'+`k'' merged"
							local stop = 0
						}
					}
				}
				else if `m' == `=`nbm_`j''-1' | `m' >= `maxm`j'_t2_g0' | `m' >= `maxm`j'_t1_g1' | `m' >= `maxm`j'_t2_g1' {	// La moda max n'est pas utilisée
					local stop = 1
					forvalues k = 1/`=`m'' {
						qui count if ``j'' == `=`m' - `k'' & `gp' == 0
						local v`k'1_0 = r(N)
						qui count if ``j'' == `=`m' - `k'' & `gp' == 1
						local v`k'1_1 = r(N)
						qui count if ``=`j'+`nbitems''' == `=`m' - `k'' & `gp' == 0
						local v`k'2_0 = r(N)
						qui count if ``=`j'+`nbitems''' == `=`m' - `k'' & `gp' == 1
						local v`k'2_1 = r(N)
						if (`v`k'1_0' != 0 | `v`k'2_0' != 0 | `v`k'1_1' != 0 | `v`k'2_1' != 0 ) & `stop' != 0 {
							qui replace ``j''= `=`m' - `k'' if ``j''==`m'
							qui replace ``=`j'+`nbitems'''= `=`m' - `k'' if ``=`j'+`nbitems'''==`m'
							di  "WARNING: items ``j'' & ``=`j'+`nbitems''': answers `m' and `=`m'-`k'' merged"
							local stop = 0
						}
					}
				} 
				else {														// Moda central non utilisée
					if runiform()>0.5{											// Tirage au sort pour regrouper
						local stop = 1
						forvalues k = 1/`m' {
							qui count if ``j'' == `=`m' - `k'' & `gp' == 0
							local v`k'1_0 = r(N)
							qui count if ``j'' == `=`m' - `k'' & `gp' == 1
							local v`k'1_1 = r(N)
							qui count if ``=`j'+`nbitems''' == `=`m' - `k'' & `gp' == 0
							local v`k'2_0 = r(N)
							qui count if ``=`j'+`nbitems''' == `=`m' - `k'' & `gp' == 1
							local v`k'2_1 = r(N)
							if (`v`k'1_0' != 0 | `v`k'2_0' != 0 | `v`k'1_1' != 0 | `v`k'2_1' != 0) & `stop' != 0 {
								qui replace ``j''= `=`m'-`k'' if ``j''==`m'
								qui replace ``=`j'+`nbitems'''=`=`m'-`k'' if ``=`j'+`nbitems'''==`m'	
								di  "WARNING: items ``j'' & ``=`j'+`nbitems''': answers `m' and `=`m'-`k'' merged"
								local stop = 0
							}
						}
					}
					else {
						local stop = 1
						forvalues k = 1/`=`nbm_`j''-`m'' {
							qui count if ``j'' == `=`m' + `k'' & `gp' == 0
							local v`k'1_0 = r(N)
							qui count if ``j'' == `=`m' + `k'' & `gp' == 1
							local v`k'1_1 = r(N)
							qui count if ``=`j'+`nbitems''' == `=`m' + `k'' & `gp' == 0
							local v`k'2_0 = r(N)
							qui count if ``=`j'+`nbitems''' == `=`m' + `k'' & `gp' == 1
							local v`k'2_1 = r(N)
							if (`v`k'1_0' != 0 | `v`k'2_0' != 0 | `v`k'1_1' != 0 | `v`k'2_1' != 0) & `stop' != 0{
								qui replace ``j''=`=`m' + `k'' if ``j''==`m'
								qui replace ``=`j'+`nbitems'''=`=`m' + `k'' if ``=`j'+`nbitems'''==`m'
								di  "WARNING: items ``j'' & ``=`j'+`nbitems''': answers `m' and `=`m'+`k'' merged"
								local stop = 0
							}
							else {
								if `stop' != 0 {
									qui replace ``j''= `nbm_`j'' if ``j''==`m'
									qui replace ``=`j'+`nbitems'''= `nbm_`j'' if ``=`j'+`nbitems'''==`m'
									di  "WARNING: items ``j'' & ``=`j'+`nbitems''': answers `m' and `nbm_`j'' merged"
									local stop = 0
								}
							}
						}
					}
				}
			}
		}
	}
}

if `com_z' == 1 {
	di
	di "WARNING : Automatic recoding, the first response category is 0. see {help rosali:help rosali}."
	di
}

forvalues j =1/`nbitems' {
		qui tab ``j'', matrow(rec)					// Récupération des infos moda du temps 1
		local nbm`j'_t1 = r(r)
		
		qui tab ``=`j'+`nbitems''' 					// Récupération des infos moda du temps 2
		local nbm`j'_t2 = r(r)

	local nbm_`j' = max(`nbm`j'_t1', `nbm`j'_t2')
	//Recodage des réponses en 0, 1, 2, etc... 
	forvalues r = 0/`=`nbm_`j''-1'  {
		qui replace ``j'' = `r' if ``j'' == `=rec[`=`r'+1',1]'
		qui replace ``=`j'+`nbitems''' = `r' if ``=`j'+`nbitems''' == `=rec[`=`r'+1',1]'
	}
}

/* Calcul de nbmoda & nbdif */
forvalues j = 1/`nbitems' {
	qui tab ``j''
	local nbmoda_`j' = r(r)
	local nbdif_`j' = r(r) - 1
}

local maxdif = 0
local nbmoda_sum = 0
forvalues j = 1/`nbitems' {
	if `maxdif' < `nbdif_`j'' {
		local maxdif = `nbdif_`j''
	}
	local nbmoda_sum = `nbmoda_sum' + `nbdif_`j''
}

/* Au moins 2 moda par item */
forvalues j=1/`nbitems' {
	if `nbmoda_`j'' == 1 {
	di as error "``j'' have only one response category, the analysis can be performed only if each item has at least 2 response categories"
		error 198
		exit
	}
}

local coln ""
forvalues j =1 /`nbitems' {
	local coln "`coln' ``j''"
}

matrix nbmod = J(2,`nbitems',.)

matrix colnames nbmod = `coln'
matrix rownames nbmod = NbModa Recoding

forvalues j = 1/`nbitems' {
	matrix nbmod[1,`j'] = `nbmoda_`j''
	matrix nbmod[2,`j'] = `recoda_`j''
}
	
*Erreur si plus de 200 difficultés
local nb_test = 0
forvalues j=1/`nbitems' {
	local nb_test = `nb_test'+`nbmoda_`j'' -1
}

if `nb_test' >= 200 {
	di as error "The total number of items difficulties to be estimated must be less than 200 ({hi:moda} option option)."
	error 198
	exit
}	

local nbitp = 0

forvalues j = 1/`nbitems' {	
	if `nbmoda_`j'' >= 2 {
		local nbitp = `nbitp' + 1
	}
}

qui count
local nbpat = r(N)


/*********************************
* AFFICHAGE INITIAL
*********************************/
di
di _col(5) "{hline 78}"
di  _col(15) "Time 1" _col(42) "Time 2" _col(65) "Nb of Answer Cat."
di _col(5) "{hline 78}"
forvalues j=1/`nbitems' {
    di as text _col(15) abbrev("``j''",20)  _col(42) abbrev("``=`j'+`nbitems'''",20) _col(65) `nbmoda_`j'' 
}
di _col(5) "{hline 78}"
if "`group'" != "" {
	di _col(10) "Nb of patients: "  abbrev("`gp'",20) " 0 = `nbp_gp0' ;", abbrev("`gp'",20) " 1 = `nbp_gp1'" 
	di _col(5) "{hline 78}"
}
else {
	di _col(10) "Nb. of patients: `nbpat'"
	di _col(5) "{hline 78}"
}
di
if `nbitems' == 1 {
	di as error "The analysis can only be performed with at least 2 items."
	error 198
	exit
}
forvalues j = 1/`nbitems' {
	if `nbmoda_`j'' == 2 {
		di "WARNING: ``j'' has only 2 response categories, no distinction can be made between uniform or non-uniform recalibration."
	}
	if `nbmoda_`j'' == 1 {
		di as error "Only `nbmoda_`j'' response categories of item ``j'' were used by the sample, the analysis cannot be performed."
		error 198
		exit
	}
	if `nbmoda_`j'' == 0 {
		di as error "No response categories of item ``j'' were used by the sample, the analysis cannot be performed."
		error 198
		exit
	}
}
di
if "`group'" != "" {
	di _col(2) as text "For all models : - mean of the latent trait in `gp' 0 at time 1 is constrained at 0"
	di _col(19) "- equality of variances between groups"
	di
}
else {
	di _col(2) as text "For all models : mean of the latent trait at time 1 is constrained at 0"
	di
}


	
/*********************************
* DEFINITION DES CONTRAINTES
*********************************/

if "`group'"!="" { // Contraintes si option groupe
	*EGALITE ENTRE GROUPES A T1 (1-200)
	forvalues j=1/`nbitems'{
		forvalues p=1/`nbdif_`j''{
			constraint `=0+`maxdif'*(`j'-1)+`p'' [`p'.``j'']0bn.`gp'=[`p'.``j'']1.`gp'
		}
	}

	*DIF UNIFORME A T1 (201-400)
	forvalues j=1/`nbitems'{
		forvalues p=2/`nbdif_`j''{
			constraint `=200+`maxdif'*(`j'-1)+`p'' [`p'.``j'']1.`gp'-[`p'.``j'']0bn.`gp'=`p'*[1.``j'']1.`gp'-`p'*[1.``j'']0bn.`gp'
		}
	}

	*EGALITES ENTRE T1 et T2, groupe 0 (401-600)
	forvalues j=1/`nbitems'{
		forvalues p=1/`nbdif_`j''{
			constraint `=400+`maxdif'*(`j'-1)+`p'' [`p'.``j'']0bn.`gp'=[`p'.``=`j'+`nbitems''']0bn.`gp'
		}
	}

	*EGALITES ENTRE T1 et T2, groupe 1 (601-800)
	forvalues j=1/`nbitems'{
		forvalues p=1/`nbdif_`j''{
			constraint `=600+`maxdif'*(`j'-1)+`p'' [`p'.``j'']1.`gp'=[`p'.``=`j'+`nbitems''']1.`gp'
		}
	}

	* RC COMMUNE (801-1000)
	forvalues j=1/`nbitems'{
		forvalues p=1/`nbdif_`j''{
			constraint `=800+`maxdif'*(`j'-1)+`p'' [`p'.``=`j'+`nbitems''']0bn.`gp'-[`p'.``j'']0bn.`gp'=[`p'.``=`j'+`nbitems''']1.`gp'-[`p'.``j'']1.`gp'
		}
	}

	* RC UNIFORME, groupe 0 (1001-1200)
	forvalues j=1/`nbitems'{
		forvalues p=2/`nbdif_`j''{
			constraint `=1000+`maxdif'*(`j'-1)+`p'' `p'*([1.``=`j'+`nbitems''']0bn.`gp'-[1.``j'']0bn.`gp')=[`p'.``=`j'+`nbitems''']0bn.`gp'-[`p'.``j'']0bn.`gp'
		}
	}

	* RC UNIFORME, groupe 1 (1201-1400)
	forvalues j=1/`nbitems'{
		forvalues p=2/`nbdif_`j''{
			constraint `=1200+`maxdif'*(`j'-1)+`p'' `p'*([1.``=`j'+`nbitems''']1.`gp'-[1.``j'']1.`gp')=[`p'.``=`j'+`nbitems''']1.`gp'-[`p'.``j'']1.`gp'
		}
	}
	
	*Sans interaction temps x groupe
	constraint 1999 [/]:mean(THETA2)#1.`gp'-[/]:mean(THETA2)#0bn.`gp'=[/]:mean(THETA1)#1.`gp'-[/]:mean(THETA1)#0bn.`gp'
}
else { //Contraintes si pas d'option groupe
	*EGALITE ENTRE T1 et T2 (401-600)
	forvalues j=1/`nbitems'{
		forvalues p=1/`nbdif_`j''{
			constraint `=400+`maxdif'*(`j'-1)+`p'' [`p'.``j'']:_cons = [`p'.``=`j'+`nbitems''']:_cons
		}
	}
	*RC UNIFORME (1001-1200)
	forvalues j=1/`nbitems'{
		forvalues p=2/`nbdif_`j''{
			constraint `=1000+`maxdif'*(`j'-1)+`p'' `p'*([1.``=`j'+`nbitems''']:_cons - [1.``j'']:_cons)=[`p'.``=`j'+`nbitems''']:_cons -[`p'.``j'']:_cons
		}
	}
}

/*********************************
* MATRICE DES RESULTATS
*********************************/
matrix dif_rc=J(`nbitems',8,.)
matrix colnames dif_rc=DIFT1 DIFU RC RC_DIF RCG0 RCUG0 RCG1 RCUG1
local rown ""

forvalues j =1 /`nbitems' {
	local rown "`rown' ``j''"
}
matrix rownames dif_rc = `rown'

*Nb modalité max
local nbdif_max = 0
forvalues j=1/`nbitems' {
	if `nbdif_max' < `nbdif_`j'' {
		local nbdif_max = `nbdif_`j''
	}
}

////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////
////////					PARTIE 1 : DIF A T1 ?						////////
////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////

if "`group'"!="" & "`nodif'"=="" { // PARTIE 1 = Slmt si option group & pas de "nodif"

		di _dup(49) "_ "
		di
		di  as input "PART 1: DETECTION OF DIFFERENCE IN ITEM DIFFICULTIES BETWEEN GROUPS AT TIME 1"
	
	*********************************
	**			MODEL B			   **
	*********************************
	
	local model ""
	forvalues j=1/`nbitems'{
		forvalues p=1/`nbdif_`j''{
			local model "`model' (`p'.``j''<-THETA@`p')"
		}
	}

	qui gsem `model', mlogit tol(0.01) iterate(100) group(`gp') ginvariant(coef loading cons) var(0: THETA@v) var(1:THETA@v) latent(THETA) nocapslatent
	/* Stockage des estimations du modèle */
	estimates store modeldifB
	matrix val_mB = r(table)
	matrix esti_B = e(b)


	/* Calcul des difficultés d'item (delta_j) */
	matrix delta_mB=J(`nbitems',`=`nbdif_max'*2',.)
	local name_partOneC ""
	
	forvalues p=1/`nbdif_max' {
		forvalues g=0/1 {
			local name_partOneC "`name_partOneC' delta_`p'_gp`g'"
		}
	}
	local name_partOneL ""
	
	forvalues j=1/`nbitems' {
			local name_partOneL "`name_partOneL' ``j''"
	}
	
	matrix colnames delta_mB = `name_partOneC'
	matrix rownames delta_mB = `name_partOneL'
		matrix delta_mB_se=J(`nbitems',`=`nbdif_max'*2',.)
	local name_partOneC_se ""

	forvalues p=1/`nbdif_max' {
		forvalues g=0/1 {
			local name_partOneC_se "`name_partOneC_se' delta_`p'_gp`g'_se"
		}
	}

	matrix colnames delta_mB_se = `name_partOneC_se'
	matrix rownames delta_mB_se = `name_partOneL'
	
	forvalues j=1/`nbitems'{
		forvalues p=1/`nbdif_`j''{
			forvalues g=0/1{
				qui lincom -[`p'.``j'']:`g'.`gp'
				local delta`j'_`p'g`g'mB=r(estimate)
				local delta`j'_`p'g`g'mB_se=r(se)	
				if `p'>1{
					qui lincom [`=`p'-1'.``j'']:`g'.`gp' - [`p'.``j'']:`g'.`gp' 
					local delta`j'_`p'g`g'mB = r(estimate)
					local delta`j'_`p'g`g'mB_se = r(se)
				}
				matrix delta_mB[`j',`=2*`p'-1+`g'']=`delta`j'_`p'g`g'mB'
				matrix delta_mB_se[`j',`=2*`p'-1+`g'']=`delta`j'_`p'g`g'mB_se'
			}
		}
	}

	matrix var_mB = (val_mB[1,"/var(THETA)#0bn.`gp'"]\val_mB[2,"/var(THETA)#0bn.`gp'"])

	/*group effect*/
	qui lincom [/]:mean(THETA)#1.`gp'-[/]:mean(THETA)#0bn.`gp'
	local geffmB=r(estimate)
	local segeffmB=r(se)
	qui test [/]:mean(THETA)#1.`gp'-[/]:mean(THETA)#0bn.`gp'=0
	local gcmBp=r(p)
	local gcmBchi=r(chi2)
	local gcmBdf=r(df)
	

	*********************************
	**			MODEL A			   **
	*********************************

	local model ""
	forvalues j=1/`nbitems'{
		forvalues p=1/`nbdif_`j''{
			local model "`model' (`p'.``j''<-THETA@`p')"
		}
	}

	 qui gsem `model', mlogit tol(0.01) iterate(100) group(`gp') ginvariant(coef loading means) var(0: THETA@v) var(1:THETA@v) from(esti_B, skip) latent(THETA) nocapslatent

	/* Stockage des estimations du modèle */
	estimates store modeldifA
	matrix val_mA = r(table)
	matrix esti_A = e(b)

	/* Calcul des difficultés d'item (delta_j) */
	matrix delta_mA=J(`nbitems',`=`nbdif_max'*2',.)
	local name_partOneC ""
	
	forvalues p=1/`nbdif_max' {
		forvalues g=0/1 {
			local name_partOneC "`name_partOneC' delta_`p'_gp`g'"
		}
	}
	local name_partOneL ""
	
	forvalues j=1/`nbitems' {
			local name_partOneL "`name_partOneL' ``j''"
	}
	matrix colnames delta_mA = `name_partOneC'
	matrix rownames delta_mA = `name_partOneL'
	matrix delta_mA_se=J(`nbitems',`=`nbdif_max'*2',.)
	local name_partOneC_se ""

	forvalues p=1/`nbdif_max' {
		forvalues g=0/1 {
			local name_partOneC_se "`name_partOneC_se' delta_`p'_gp`g'_se"
		}
	}

	matrix colnames delta_mA_se = `name_partOneC_se'
	matrix rownames delta_mA_se = `name_partOneL'

	forvalues j=1/`nbitems'{
		forvalues p=1/`nbdif_`j''{
			forvalues g=0/1{
				qui lincom -[`p'.``j'']:`g'.`gp'
				local delta`j'_`p'g`g'mA=r(estimate)
				local delta`j'_`p'g`g'mA_se=r(se)	
				if `p'>1{
					qui lincom [`=`p'-1'.``j'']:`g'.`gp' - [`p'.``j'']:`g'.`gp' 
					local delta`j'_`p'g`g'mA = r(estimate)
					local delta`j'_`p'g`g'mA_se = r(se)
				}
				matrix delta_mA[`j',`=2*`p'-1+`g'']=`delta`j'_`p'g`g'mA'
				matrix delta_mA_se[`j',`=2*`p'-1+`g'']=`delta`j'_`p'g`g'mA_se'
			}
		}
	}
	//Variance et se mA
	matrix var_mA = (val_mA[1,"/var(THETA)#0bn.`gp'"]\val_mA[2,"/var(THETA)#0bn.`gp'"])
	

	*************************************************************
	***********************AFFICHAGE*****************************
	*************************************************************
	

	//Affichage modèle A
	di 
	di as input "PROCESSING STEP A"
	di
		
	if "`detail'" != "" {		
		/* Affichage des estimations des difficultés modèle A */
		
		di  _col(5) as text "{ul:MODEL A:} Overall measurement non-invariance between groups"
		di
		di %~85s as text "Item difficulties: estimates (s.e.)"
		di _col(10) "{hline 65}"
		di  _col(31) as text abbrev("`gp'",20) "=0" _col(57) abbrev("`gp'",20) "=1"
		di _col(10) "{hline 65}"
		forvalues j=1/`nbitems' {
			di as text _col(10) abbrev("``j''", 18) 
			forvalues p=1/`nbdif_`j'' {
				di as text _col(10) "`p'" as result _col(30) %6.2f `delta`j'_`p'g0mA'  %6.2f " (" %3.2f `delta`j'_`p'g0mA_se' ")"  _col(56) %6.2f `delta`j'_`p'g1mA' " (" %3.2f  `delta`j'_`p'g1mA_se' ")"
			}
		}
		di as text _col(10) "{hline 65}"
		/* Affichage des estimations sur le trait latent du modèle A */
		di
		di %~85s as text "Latent trait distribution"
		di _col(10) "{hline 65}"
		di _col(31) "Estimate" _col(57) "Standard error"
		di _col(10) "{hline 65}"
		di _col(10)  "Variance" as result _col(31) %6.2f `=var_mA[1,1]' _col(55) %6.2f `=var_mA[2,1]'
		di _col(10) as text "Group effect" as result _col(31) "0 (constrained)" 
		di _col(10) as text "{hline 65}"
		di
		di _col(10) as text "No group effect: equality of the latent trait means between groups"
		di _col(10) as text "All item difficulties are freely estimated in both groups"
		di
	}
		//*Affichage modèle B

		di 
		di as input "PROCESSING STEP B"
		di
		
			/* Affichage des estimations des difficultés modèle B */
	if "`detail'" != "" {		
		di  _col(5) as text "{ul:MODEL B:} Overall measurement invariance between groups"
		di
		di %~85s as text "Item difficulties: estimates (s.e.)"
		di _col(10) "{hline 65}"
		di  _col(31) abbrev("`gp'",20) "=0" _col(57) abbrev("`gp'",20) "=1"
		di _col(10) "{hline 65}"
		
		forvalues j=1/`nbitems' {
			di _col(10) as text "``j''" 
			forvalues p=1/`nbdif_`j'' {
				di as text _col(10) "`p'" as result _col(30) %6.2f `delta`j'_`p'g0mB' " (" %3.2f `delta`j'_`p'g0mB_se' ")"   _col(56) %6.2f `delta`j'_`p'g1mB' " (" %3.2f `delta`j'_`p'g1mB_se' ")"
			}
		}
		
		di _col(10) as text "{hline 65}"
			/* Affichage des estimations sur le trait latent du modèle B */
		di
		di %~85s as text "Latent trait distribution"
		di _col(10) "{hline 65}"
		di _col(28) "Estimate" _col(42) "Standard error" _col(62) "P-value"
		di _col(10) "{hline 65}"
		di _col(10)  "Variance" as result _col(28) %6.2f `=var_mB[1,1]' _col(40) %6.2f `=var_mB[2,1]'
		di _col(10) as text "Group effect" as result _col(28) %6.2f `geffmB' _col(40) %6.2f `segeffmB' _col(62) %6.4f `gcmBp'
		di _col(10) as text "{hline 65}"
		di
		di _col(10) as text "Group effect estimated: mean of the latent trait of group 1 freely estimated"
		di _col(10) "Equality of the item difficulties between groups"
		di
	}
		
		*****************************************************
		*			Modèle A vs Modèle B 					*
		*****************************************************
		
		qui lrtest modeldifA modeldifB
		local diftestp=r(p)
		local diftestchi=r(chi2)
		local diftestdf=r(df)
	if "`detail'" != "" {	
		//affichage lrtest
		di as input "LIKELIHOOD-RATIO TEST"
		di
		di %~60s "Model A vs Model B"
		di _col(10) "{hline 40}"
		di _col(10) as text "Chi-square" _col(28) "DF" _col(40) "P-value"
		di _col(10) as result %6.2f `diftestchi' _col(28) %2.0f `diftestdf' _col(40) %6.4f `diftestp'
		di _col(10) as text "{hline 40}"
		di
	}

	if `diftestp'<0.05{
		di as result "DIFFERENCE IN ITEM DIFFICULTIES BETWEEN GROUPS LIKELY"
	}
	else{
		di as result "NO DIFFERENCE BETWEEN GROUPS DETECTED"
	}
	*********************************
	*************MODEL C*************
	*********************************
	// Etape itérative si lrtest significatif
	local nb_stepC = 0
	if `diftestp'<0.05{  /*If pvalue(LRtest)<0.05 then step C*/
		di 
		di as input "PROCESSING STEP C"
		di
		
		/*test DIF pour chaque item*/
		local boucle = 1
		local stop = 0
		while `boucle'<=`=`nbitp'-1' & `stop'==0{ /*on s'arrête quand on a libéré du DIF sur (tous les items-1) ou lorsqu'il n'y a plus de tests significatifs*/
			local nb_stepC = `boucle'
			local pajust=0.05/`=`nbitp'+1-`boucle''
			/*réinitialisation de la matrice de test*/
			matrix test_difu_`boucle'=J(`nbitems',3,.)
			matrix colnames test_difu_`boucle'=chi_DIFU df_DIFU pvalueDIFU
			matrix test_dif_`boucle'=J(`nbitems',3,.)
			matrix colnames test_dif_`boucle'=chi_DIF df_DIF pvalueDIF
			local nbsig=0
			local minpval=1
			local itemdif=0
			if "`detail'" != ""{
				
				di as text "Loop `boucle'"
				di as text _col(5) "Adjusted  alpha: " %6.4f  `pajust'
				di
				di as text _col(10) "{hline 65}"
				di as text _col(10) "Freed item" _col(31) "Chi-Square"  _col(48) "DF" _col(57) "P-Value"
				di as text _col(10) "{hline 65}"
			}
			/*boucle de test*/
			forvalues j=1/`nbitems'{
				//if `nbdif_`j'' > 2 {
					local model ""
					local listconst ""
					if dif_rc[`j',1]==. | dif_rc[`j',1]==0 { /*si pas de DIF déjà détecté sur l'item j*/
						/*on libère le DIF de l'item i: pas de contraintes*/
						forvalues k=1/`nbitems'{ /*contraintes pour les autres items (si DIF NU sur item k, pas de contraintes*/
							if `k'!=`j' & `nbmoda_`j'' >= 2 {
								if dif_rc[`k',1]==. | dif_rc[`k',1]==0 {/*pas de DIF sur item k: contraintes 1-200*/
									forvalues p=1/`nbdif_`k''{ 
										qui local listconst "`listconst' `=0+`maxdif'*(`k'-1)+`p''"
										qui constraint list `=0+`maxdif'*(`k'-1)+`p''
									}
								}
								else{
									if dif_rc[`k',2]!=. & dif_rc[`k',2]!= 0 & `nbmoda_`k'' > 2 { /*DIF U: contraintes 201-400*/
										forvalues p=2/`nbdif_`k''{
											qui local listconst "`listconst' `=200+`maxdif'*(`k'-1)+`p''"
											qui constraint list `=200+`maxdif'*(`k'-1)+`p''
										}
									}
								}
							}
						}
						forvalues jj=1/`nbitems'{
							forvalues p=1/`nbdif_`jj''{
								local model "`model' (`p'.``jj''<-THETA@`p')"
							}
						}
						qui gsem `model', mlogit tol(0.01) iterate(100) group(`gp') ginvariant(coef loading) var(0: THETA@v) var(1:THETA@v) constraint(`listconst') from(esti_B) latent(THETA) nocapslatent
						estimates store modeldif3b`boucle'it`i'
				
						*************************
						*****test DIF item i*****
						*************************
						qui test [1.``j'']1.`gp'=[1.``j'']0bn.`gp'
						if `nbmoda_`j'' > 2 {
							forvalues p=2/`nbdif_`j''{
								qui test [`p'.``j'']1.`gp'=[`p'.``j'']0bn.`gp', acc
							}
						}
						matrix test_dif_`boucle'[`j',1]=(r(chi2),r(df),r(p))

						/* Test DIF Uniforme */
						if `nbmoda_`j'' > 2 {
							qui test 2*([1.``j'']1.`gp'-[1.``j'']0bn.`gp')=[2.``j'']1.`gp'-[2.``j'']0bn.`gp'
							forvalues p=3/`nbdif_`j''{
								qui test `p'*([1.``j'']1.`gp'-[1.``j'']0bn.`gp')=[`p'.``j'']1.`gp'-[`p'.``j'']0bn.`gp', acc
							}
							matrix test_difu_`boucle'[`j',1]=(r(chi2), r(df), r(p))
						}							

						if test_dif_`boucle'[`j',3]<`pajust'{/*si DIF sur item i*/
							local ++nbsig
							if test_dif_`boucle'[`j',3]<`minpval'{
								local minpval=test_dif_`boucle'[`j',3]
								local itemdif=`j'
							}
						}
						if "`detail'" != "" {
							di as text  _col(10) abbrev("``j''",15)  as result _col(31) %6.3f test_dif_`boucle'[`j',1] _col(48) test_dif_`boucle'[`j',2] _col(57)  %6.4f test_dif_`boucle'[`j',3]
						}
					}
			}			
			/*si nb de tests significatifs=0, on arrête*/
			if `nbsig'==0{
				local stop=1
				if `boucle' == 1 {
					if "`detail'" != "" {
						di as text _col(10) "{hline 65}"
						di
						di as result  "No significant test: no difference between groups detected, no DIF detected"
						di
					}
				}
				else {
					if "`detail'" != ""{
						di as text _col(10) "{hline 65}"
						di
						di as result "No other significant tests"
						di
					}
				}
			}
			else{/*si nb de tests significatifs>0, mise à jour de la matrice de résultats*/
				matrix dif_rc[`itemdif',1]=`boucle'
				if "`detail'" != ""{
					di as text _col(10) "{hline 65}"
					di 
					di as result "Difference between groups on ``itemdif'' at time 1"
				}
				if `nbmoda_`itemdif'' > 2 {
					if "`detail'" != "" {

						di
						di %~60s as text "Test of uniform difference"
						di _col(10) "{hline 40}"
						di _col(10) as text "Chi-square" _col(28) "DF" _col(40) "P-value"
						di _col(10) as result %4.2f `=test_difu_`boucle'[`itemdif',1]' _col(28) `=test_difu_`boucle'[`itemdif',2]' _col(40) %4.2f `=test_difu_`boucle'[`itemdif',3]'
						di _col(10) as text "{hline 40}"
					}
					if test_difu_`boucle'[`itemdif',3]<0.05{	/*DIF NU détectée*/
						matrix dif_rc[`itemdif',2]=0						
							di
							di as result "``itemdif'' : Non-uniform differences of item difficulties between groups at T1"
							di 			
					}
					else{/*DIF U détectée*/
						matrix dif_rc[`itemdif',2]=`boucle'
							di
							di as result "``itemdif'' : Uniform differences of item difficulties between groups at T1"
							di 			
					}
				}
				else {
					// Différence entre groupes au temps 1 mais slmt 2 moda. donc pas de U ou NU
					di _col(15) _dup(60) "-"
				}
			}		
			local ++boucle
		}
	}

	/* MODELE FINAL DE LA PARTIE 1. Si DIFT1 détecté (=Au moins 2 boucles dans l'étape C)*/
	if `nb_stepC' > 1 {
		forvalues j=1/`nbitems'{
			local model ""
			local listconst ""
			if dif_rc[`j',1]==. | dif_rc[`j',1]==0 { /*si pas de DIF: contraintes 1-200*/
				forvalues p=1/`nbdif_`j''{ 
					qui local listconst "`listconst' `=0+`maxdif'*(`j'-1)+`p''"
					qui constraint list `=0+`maxdif'*(`j'-1)+`p''
				}
			}
			else {
				if dif_rc[`j',2]!=. & dif_rc[`j',2]!=0 { /*DIF U: contraintes 201-400*/
					forvalues p=2/`nbdif_`j''{
						qui local listconst "`listconst' `=200+`maxdif'*(`j'-1)+`p''"
						qui constraint list `=200+`maxdif'*(`j'-1)+`p''
					}
				}
			}
		}
		forvalues j=1/`nbitems'{
			forvalues p=1/`nbdif_`j''{
				local model "`model' (`p'.``j''<-THETA@`p')"
			}
		}

		qui gsem `model', mlogit tol(0.01) iterate(100) group(`gp') ginvariant(coef loading) var(0: THETA@v) var(1:THETA@v) constraint(`listconst') from(esti_B) latent(THETA) nocapslatent
		/* Stockage des estimations du modèle */
		estimates store modeldifCFin
		matrix val_mC = r(table)

		/* Calcul des difficultés d'item (delta_j) */
		matrix delta_mCFin=J(`nbitems',`=`nbdif_max'*2',.)
		local name_partOneC ""
		forvalues p=1/`nbdif_max' {
			forvalues g=0/1 {
				local name_partOneC "`name_partOneC' delta_`p'_gp`g'"
			}
		}
		local name_partOneL ""
		forvalues j=1/`nbitems' {
			local name_partOneL "`name_partOneL' ``j''"
		}
		matrix colnames delta_mCFin = `name_partOneC'
		matrix rownames delta_mCFin = `name_partOneL'
	
		matrix delta_mCFin_se=J(`nbitems',`=`nbdif_max'*2',.)
		local name_partOneC_se ""

		forvalues p=1/`nbdif_max' {
			forvalues g=0/1 {
				local name_partOneC_se "`name_partOneC_se' delta_`p'_gp`g'_se"
			}
		}
		matrix colnames delta_mCFin_se = `name_partOneC_se'
		matrix rownames delta_mCFin_se = `name_partOneL'
					
		forvalues j=1/`nbitems'{
			forvalues p=1/`nbdif_`j''{
				forvalues g=0/1{
					qui lincom -[`p'.``j'']:`g'.`gp'
					local delta`j'_`p'g`g'mCFin=r(estimate)
					local delta`j'_`p'g`g'mCFin_se=r(se)	
					if `p'>1{
						qui lincom [`=`p'-1'.``j'']:`g'.`gp' - [`p'.``j'']:`g'.`gp' 
						local delta`j'_`p'g`g'mCFin = r(estimate)
						local delta`j'_`p'g`g'mCFin_se = r(se)
					}
					matrix delta_mCFin[`j',`=2*`p'-1+`g'']=`delta`j'_`p'g`g'mCFin'
					matrix delta_mCFin_se[`j',`=2*`p'-1+`g'']=`delta`j'_`p'g`g'mCFin_se'
				}	
			}	
		}
		if "`group'" != "" { //Variance et se mA
			matrix var_mC = (val_mC[1,"/var(THETA)#0bn.`gp'"]\val_mC[2,"/var(THETA)#0bn.`gp'"])
		}
			/*group effect*/
		qui lincom [/]:mean(THETA)#1.`gp'-[/]:mean(THETA)#0bn.`gp'
		local geffmCFin=r(estimate)
		local segeffmCFin=r(se)
		qui	test [/]:mean(THETA)#1.`gp'-[/]:mean(THETA)#0bn.`gp'=0
		local gcmCFinp=r(p)
		local gcmCFinchi=r(chi2)
		local gcmCFindf=r(df)
	}
}

////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////
////////				PARTIE 2 : RECALIBRATION ?						////////
////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////

di
di as text _dup(49) "_ "
di 
if "`group'" != "" {
	di as input "PART 2 : DETECTION OF DIFFERENCE IN ITEM DIFFICULTIES ACROSS TIME (RECALIBRATION)"
}
else {
	di as input "DETECTION OF DIFFERENCE IN ITEM DIFFICULTIES ACROSS TIME (RECALIBRATION)"
}

	*********************************
	**			MODEL 2			   **
	*********************************

local listconst "" // liste des contraintes si option groupe
local listconst_g "" //LIste des contraintes sans option groupe (Notation peu logique !!) 

forvalues j=1/`nbitems'{ 
	if "`group'" == "" { // Contraintes pas de RC pour tous les items
		forvalues p=1/`nbdif_`j''{ 
			local listconst_g "`listconst_g' `=400+`maxdif'*(`j'-1)+`p''"
			qui constraint list `=400+`maxdif'*(`j'-1)+`p''
		}
	}
	else {
		if dif_rc[`j',1]==. | dif_rc[`j',1]==0 {/*pas de DIF à T1 sur item k: contraintes 1*/
			forvalues p=1/`nbdif_`j''{ 
				local listconst "`listconst' `=0+`maxdif'*(`j'-1)+`p''"
				qui constraint list `=0+`maxdif'*(`j'-1)+`p''
			}
		}
		else{
			if dif_rc[`j',2]!=. & dif_rc[`j',2] != 0 { /*diff T1 U: contraintes 200*/
				forvalues p=2/`nbdif_`j''{
					local listconst "`listconst' `=200+`maxdif'*(`j'-1)+`p''"
					qui constraint list `=200+`maxdif'*(`j'-1)+`p''
				}
			}
		}
		forvalues p=1/`nbdif_`j''{  /* egalites entre temps : groupe 0 (401-600)*/
			local listconst "`listconst' `=400+`maxdif'*(`j'-1)+`p''"
			qui constraint list `=400+`maxdif'*(`j'-1)+`p''
		}
			forvalues p=1/`nbdif_`j''{  /* egalites entre temps : groupe 1 (601-800)*/
			local listconst "`listconst' `=600+`maxdif'*(`j'-1)+`p''"
			qui constraint list `=600+`maxdif'*(`j'-1)+`p''
		}
	}
}	

local model ""
forvalues j=1/`nbitems'{
	forvalues p=1/`nbdif_`j''{
		local model "`model' (`p'.``j''<-THETA1@`p')(`p'.``=`j'+`nbitems'''<-THETA2@`p')"
	}
}

if "`group'" != "" {
*di "gsem `model', mlogit tol(0.01) iterate(100) group(`gp') ginvariant(coef loading) means(0: THETA1@0 THETA2@m20) means(1: THETA1@m11 THETA2@m21) var(0: THETA1@v1 THETA2@v2) var(1:THETA1@v1 THETA2@v2) cov(0: THETA1*THETA2@cov12) cov(1: THETA1*THETA2@cov12) constraint(`listconst') latent(THETA1 THETA2) nocapslatent"
	qui gsem `model', mlogit tol(0.01) iterate(100) group(`gp') ginvariant(coef loading) means(0: THETA1@0 THETA2@m20) means(1: THETA1@m11 THETA2@m21) var(0: THETA1@v1 THETA2@v2) var(1:THETA1@v1 THETA2@v2) cov(0: THETA1*THETA2@cov12) cov(1: THETA1*THETA2@cov12) constraint(`listconst') latent(THETA1 THETA2) nocapslatent
}
else {
	qui gsem `model', mlogit tol(0.01) iterate(100) means(THETA1@0 THETA2@m20) var(THETA1@v1 THETA2@v2) cov(THETA1*THETA2@cov12) constraint(`listconst_g') latent(THETA1 THETA2) nocapslatent
}

/*Stockage des données du modèle 2 */
estimates store model2
matrix val_m2 = r(table)
matrix esti_2 = e(b)

if "`group'" != "" {
	matrix var_m2 = (val_m2[1,"/var(THETA1)#0bn.`gp'"],val_m2[1,"/var(THETA2)#0bn.`gp'"]\val_m2[2,"/var(THETA1)#0bn.`gp'"],val_m2[2,"/var(THETA2)#0bn.`gp'"])
	matrix covar_m2 = (val_m2[1,"/cov(THETA1,THETA2)#0.`gp'"],val_m2[1,"/cov(THETA1,THETA2)#1.`gp'"]\val_m2[2,"/cov(THETA1,THETA2)#0.`gp'"],val_m2[2,"/cov(THETA1,THETA2)#1.`gp'"]\val_m2[4,"/cov(THETA1,THETA2)#0.`gp'"],val_m2[4,"/cov(THETA1,THETA2)#1.`gp'"])
}
else {
	matrix var_m2 = (val_m2[1,"/var(THETA1)"],val_m2[1,"/var(THETA2)"]\val_m2[2,"/var(THETA1)"],val_m2[2,"/var(THETA2)"])
	matrix covar_m2 = (val_m2[1,"/cov(THETA1,THETA2)"]\val_m2[2,"/cov(THETA1,THETA2)"]\val_m2[4,"/cov(THETA1,THETA2)"])
}

/*group effect*/
if "`group'" != "" {
	qui lincom [/]:mean(THETA1)#1.`gp'-[/]:mean(THETA1)#0bn.`gp'
	local geffm2=r(estimate)
	local segeffm2=r(se)
	local ubgeffm2 = r(ub)
	local lbgeffm2 = r(lb)
	qui test [/]:mean(THETA1)#1.`gp'-[/]:mean(THETA1)#0bn.`gp'=0
	local gpm2p=r(p)
	local gpm2chi=r(chi2)
	local gpm2df=r(df)
}

/*time effect*/
if "`group'" != "" {
	qui lincom [/]:mean(THETA2)#0bn.`gp'-[/]:mean(THETA1)#0bn.`gp'
	local teffm2=r(estimate)
	local seteffm2=r(se)
	local ubteffm2 = r(ub)
	local lbteffm2 = r(lb)
	qui test [/]:mean(THETA2)#0bn.`gp'-[/]:mean(THETA1)#0bn.`gp'=0
	local tm2p=r(p)
	local tm2chi=r(chi2)
	local tm2df=r(df)
}
else {
	qui lincom [/]:mean(THETA2) /* [/]:mean(THETA1)*/
	local teffm2=r(estimate)
	local seteffm2=r(se)
	local ubteffm2 = r(ub)
	local lbteffm2 = r(lb)
	qui test [/]:mean(THETA2) = 0 /* [/]:mean(THETA1)*/
	local tm2p=r(p)
	local tm2chi=r(chi2)
	local tm2df=r(df)
}

*INTERACTION
if "`group'" != "" {
	qui lincom [/]:mean(THETA2)#1.`gp'-[/]:mean(THETA2)#0bn.`gp'-[/]:mean(THETA1)#1.`gp'+[/]:mean(THETA1)#0bn.`gp'
	local interm2=r(estimate)
	local seinterm2=r(se)
	local ubinterm2 = r(ub)
	local lbinterm2 = r(lb)
	qui test [/]:mean(THETA2)#1.`gp'-[/]:mean(THETA2)#0bn.`gp'-[/]:mean(THETA1)#1.`gp'+[/]:mean(THETA1)#0bn.`gp' = 0
	local interm2p=r(p)
	local interm2chi=r(chi2)
	local interm2df=r(df)
}

if "`group'" != "" {
	matrix mod2 = J(7,`=`nbmoda_sum'*4+6',.)
	local name_partTwoC ""
	forvalues j = 1/`nbitems' {
		forvalues p=1/`nbdif_`j'' {
			forvalues t=1/2 {
				forvalues g = 0/1 {
					local name_partTwoC "`name_partTwoC' d_j`j'_p`p'_gp`g'_t`t'"
				}
			}
		}
	}
	local name_partTwoC "`name_partTwoC' VAR(THETA1) VAR(THETA2) COV(TH1,TH2) GROUP_Effect TIME_Effect INTER_TxG  "
	matrix colnames mod2 = `name_partTwoC'
	matrix rownames mod2 =  Estimate se Upper_b Lower_b Chi_square DF pvalue
}
else {
	matrix mod2 = J(7,`=`nbmoda_sum'*2+4',.)
	local name_partTwoC ""
	forvalues j = 1/`nbitems' {
		forvalues p=1/`nbdif_`j'' {
			forvalues t=1/2 {
				local name_partTwoC "`name_partTwoC' d_j`j'_p`p'_t`t'"
			}
		}
	}
	local name_partTwoC "`name_partTwoC' VAR(THETA1) VAR(THETA2) COV(TH1,TH2) TIME_Effect "
	matrix colnames mod2 = `name_partTwoC'
	matrix rownames mod2 =  Estimate se Upper_b Lower_b Chi_square DF pvalue
}

*Difficultés
forvalues j=1/`nbitems'{
	forvalues p=1/`nbdif_`j''{	
		forvalues t=1/2{
			if "`group'" != "" { // groupe binaire
				forvalues g=0/1 {
					qui lincom -[`p'.``=(`t'-1)*`nbitems'+`j''']:`g'.`gp'
					local delta`t'_`j'_`p'g`g'm2= r(estimate)
					local delta`t'_`j'_`p'g`g'm2_se= r(se)
					local delta`t'_`j'_`p'g`g'm2_ub=r(ub)
					local delta`t'_`j'_`p'g`g'm2_lb=r(lb)
					local delta`t'_`j'_`p'g`g'm2_p=r(p)
					if `p'>1 {
						qui lincom [`=`p'-1'.``=(`t'-1)*`nbitems'+`j''']:`g'.`gp' - [`p'.``=(`t'-1)*`nbitems'+`j''']:`g'.`gp'
						local delta`t'_`j'_`p'g`g'm2=r(estimate)
						local delta`t'_`j'_`p'g`g'm2_se=r(se)
						local delta`t'_`j'_`p'g`g'm2_ub=r(ub)
						local delta`t'_`j'_`p'g`g'm2_lb=r(lb)
						local delta`t'_`j'_`p'g`g'm2_p=r(p)
					}
					local place = 0
					local compt = 1
					while `compt' < `j' {
						local place = `place' + `nbdif_`compt''
						local ++compt
					}
					if `t' == 1 {
						matrix mod2[1,`=4*(`p'-1)+`g'+`t'+4*`place'']=`delta`t'_`j'_`p'g`g'm2'
						matrix mod2[2,`=4*(`p'-1)+`g'+`t'+4*`place'']=`delta`t'_`j'_`p'g`g'm2_se'
						matrix mod2[3,`=4*(`p'-1)+`g'+`t'+4*`place'']=`delta`t'_`j'_`p'g`g'm2_ub'
						matrix mod2[4,`=4*(`p'-1)+`g'+`t'+4*`place'']=`delta`t'_`j'_`p'g`g'm2_lb'
						matrix mod2[7,`=4*(`p'-1)+`g'+`t'+4*`place'']=`delta`t'_`j'_`p'g`g'm2_p'
					}
					if `t' == 2 {
						matrix mod2[1,`=4*(`p'-1)+`g'+`t'+1+4*`place'']=`delta`t'_`j'_`p'g`g'm2'
						matrix mod2[2,`=4*(`p'-1)+`g'+`t'+1+4*`place'']=`delta`t'_`j'_`p'g`g'm2_se'
						matrix mod2[3,`=4*(`p'-1)+`g'+`t'+1+4*`place'']=`delta`t'_`j'_`p'g`g'm2_ub'
						matrix mod2[4,`=4*(`p'-1)+`g'+`t'+1+4*`place'']=`delta`t'_`j'_`p'g`g'm2_lb'
						matrix mod2[7,`=4*(`p'-1)+`g'+`t'+1+4*`place'']=`delta`t'_`j'_`p'g`g'm2_p'
					}
				}
			}
			else { // groupe unique (=gp0)
				qui lincom -[`p'.``=(`t'-1)*`nbitems'+`j''']_cons
				local delta`t'_`j'_`p'g0m2= r(estimate)
				local delta`t'_`j'_`p'g0m2_se= r(se)
				local delta`t'_`j'_`p'g0m2_ub=r(ub)
				local delta`t'_`j'_`p'g0m2_lb=r(lb)
				local delta`t'_`j'_`p'g0m2_p=r(p)
				if `p'>1{
					qui lincom [`=`p'-1'.``=(`t'-1)*`nbitems'+`j''']_cons - [`p'.``=(`t'-1)*`nbitems'+`j''']_cons
					local delta`t'_`j'_`p'g0m2=r(estimate)
					local delta`t'_`j'_`p'g0m2_se=r(se)
					local delta`t'_`j'_`p'g0m2_ub=r(ub)
					local delta`t'_`j'_`p'g0m2_lb=r(lb)
					local delta`t'_`j'_`p'g0m2_p=r(p)
				}
				local place = 0
				local compt = 1
				while `compt' < `j' {
					local place = `place' + `nbdif_`compt''
					local ++compt
				}
				if `t' == 1 {
					matrix mod2[1,`=2*(`p'-1)+`t'+2*`place'']=`delta`t'_`j'_`p'g0m2'
					matrix mod2[2,`=2*(`p'-1)+`t'+2*`place'']=`delta`t'_`j'_`p'g0m2_se'
					matrix mod2[3,`=2*(`p'-1)+`t'+2*`place'']=`delta`t'_`j'_`p'g0m2_ub'
					matrix mod2[4,`=2*(`p'-1)+`t'+2*`place'']=`delta`t'_`j'_`p'g0m2_lb'
					matrix mod2[7,`=2*(`p'-1)+`t'+2*`place'']=`delta`t'_`j'_`p'g0m2_p'
				}
				if `t' == 2 {
					matrix mod2[1,`=2*(`p'-1)+`t'+2*`place'']=`delta`t'_`j'_`p'g0m2'
					matrix mod2[2,`=2*(`p'-1)+`t'+2*`place'']=`delta`t'_`j'_`p'g0m2_se'
					matrix mod2[3,`=2*(`p'-1)+`t'+2*`place'']=`delta`t'_`j'_`p'g0m2_ub'
					matrix mod2[4,`=2*(`p'-1)+`t'+2*`place'']=`delta`t'_`j'_`p'g0m2_lb'
					matrix mod2[7,`=2*(`p'-1)+`t'+2*`place'']=`delta`t'_`j'_`p'g0m2_p'
				}
			}
		}
	}
}

if "`group'" != "" {
	matrix mod2[1,`=4*`nbmoda_sum'+1'] = (val_m2[1,"/var(THETA1)#0bn.`gp'"], val_m2[1,"/var(THETA2)#0bn.`gp'"])
	matrix mod2[2,`=4*`nbmoda_sum'+1'] = (val_m2[2,"/var(THETA1)#0bn.`gp'"],val_m2[2,"/var(THETA2)#0bn.`gp'"])
	matrix mod2[3,`=4*`nbmoda_sum'+1'] = (val_m2[6,"/var(THETA1)#0bn.`gp'"],val_m2[6,"/var(THETA2)#0bn.`gp'"])
	matrix mod2[4,`=4*`nbmoda_sum'+1'] = (val_m2[5,"/var(THETA1)#0bn.`gp'"],val_m2[5,"/var(THETA2)#0bn.`gp'"])
	
	matrix mod2[1,`=4*`nbmoda_sum'+2+1'] = (val_m2[1,"/cov(THETA1,THETA2)#0.`gp'"])
	matrix mod2[2,`=4*`nbmoda_sum'+2+1'] = (val_m2[2,"/cov(THETA1,THETA2)#0.`gp'"])
	matrix mod2[3,`=4*`nbmoda_sum'+2+1'] = (val_m2[6,"/cov(THETA1,THETA2)#0.`gp'"])
	matrix mod2[4,`=4*`nbmoda_sum'+2+1'] = (val_m2[5,"/cov(THETA1,THETA2)#0.`gp'"])

	matrix mod2[1,`=4*`nbmoda_sum'+2+1+1'] = `geffm2'
	matrix mod2[2,`=4*`nbmoda_sum'+2+1+1'] = `segeffm2'
	matrix mod2[3,`=4*`nbmoda_sum'+2+1+1'] = `ubgeffm2'
	matrix mod2[4,`=4*`nbmoda_sum'+2+1+1'] = `lbgeffm2'	
	matrix mod2[5,`=4*`nbmoda_sum'+2+1+1'] = `gpm2chi'
	matrix mod2[6,`=4*`nbmoda_sum'+2+1+1'] = `gpm2df'
	matrix mod2[7,`=4*`nbmoda_sum'+2+1+1'] = `gpm2p'
	
	matrix mod2[1,`=4*`nbmoda_sum'+2+1+1+1'] = `teffm2'
	matrix mod2[2,`=4*`nbmoda_sum'+2+1+1+1'] = `seteffm2'
	matrix mod2[3,`=4*`nbmoda_sum'+2+1+1+1'] = `ubteffm2'
	matrix mod2[4,`=4*`nbmoda_sum'+2+1+1+1'] = `lbteffm2'	
	matrix mod2[5,`=4*`nbmoda_sum'+2+1+1+1'] = `tm2chi'
	matrix mod2[6,`=4*`nbmoda_sum'+2+1+1+1'] = `tm2df'
	matrix mod2[7,`=4*`nbmoda_sum'+2+1+1+1'] = `tm2p'

	matrix mod2[1,`=4*`nbmoda_sum'+2+1+1+1+1'] = `interm2'
	matrix mod2[2,`=4*`nbmoda_sum'+2+1+1+1+1'] = `seinterm2'
	matrix mod2[3,`=4*`nbmoda_sum'+2+1+1+1+1'] = `ubinterm2'
	matrix mod2[4,`=4*`nbmoda_sum'+2+1+1+1+1'] = `lbinterm2'
	matrix mod2[5,`=4*`nbmoda_sum'+2+1+1+1+1'] = `interm2chi'
	matrix mod2[6,`=4*`nbmoda_sum'+2+1+1+1+1'] = `interm2df'
	matrix mod2[7,`=4*`nbmoda_sum'+2+1+1+1+1'] = `interm2p'
}
else {
	matrix mod2[1,`=2*`nbmoda_sum'+1'] = (val_m2[1,"/var(THETA1)"],val_m2[1,"/var(THETA2)"])
	matrix mod2[2,`=2*`nbmoda_sum'+1'] = (val_m2[2,"/var(THETA1)"],val_m2[2,"/var(THETA2)"])
	matrix mod2[3,`=2*`nbmoda_sum'+1'] = (val_m2[6,"/var(THETA1)"],val_m2[6,"/var(THETA2)"])
	matrix mod2[4,`=2*`nbmoda_sum'+1'] = (val_m2[5,"/var(THETA1)"],val_m2[5,"/var(THETA2)"])
	
	matrix mod2[1,`=2*`nbmoda_sum'+2+1'] = (val_m2[1,"/cov(THETA1,THETA2)"])
	matrix mod2[2,`=2*`nbmoda_sum'+2+1'] = (val_m2[2,"/cov(THETA1,THETA2)"])
	matrix mod2[3,`=2*`nbmoda_sum'+2+1'] = (val_m2[6,"/cov(THETA1,THETA2)"])
	matrix mod2[4,`=2*`nbmoda_sum'+2+1'] = (val_m2[5,"/cov(THETA1,THETA2)"])
	
	matrix mod2[1,`=2*`nbmoda_sum'+2+1+1'] = `teffm2'
	matrix mod2[2,`=2*`nbmoda_sum'+2+1+1'] = `seteffm2'
	matrix mod2[3,`=2*`nbmoda_sum'+2+1+1'] = `ubteffm2'
	matrix mod2[4,`=2*`nbmoda_sum'+2+1+1'] = `lbteffm2'	
	matrix mod2[5,`=2*`nbmoda_sum'+2+1+1'] = `tm2chi'
	matrix mod2[6,`=2*`nbmoda_sum'+2+1+1'] = `tm2df'
	matrix mod2[7,`=2*`nbmoda_sum'+2+1+1'] = `tm2p'
}

	*********************************
	**			MODEL 1			   **
	*********************************


/*PCM longitudinal, no true change, group effect, interaction*/
local listconst ""
forvalues j=1/`nbitems'{ /*contraintes pour les autres items (si DIF NU sur item k, pas de contraintes*/
	if dif_rc[`j',1]==. | dif_rc[`j',1]==0 {/*pas de DIF sur item k: contraintes 1*/
		forvalues p=1/`nbdif_`j''{ 
			local listconst "`listconst' `=0+`maxdif'*(`j'-1)+`p''"
			qui constraint list `=0+`maxdif'*(`j'-1)+`p''
		}
	}
	else{
		if `nbdif_`j'' > 1 {
			if dif_rc[`j',2]!=. & dif_rc[`j',2] != 0 { /*diff T1 U: contraintes 201*/
				forvalues p=2/`nbdif_`j''{
					local listconst "`listconst' `=200+`maxdif'*(`j'-1)+`p''"
					qui constraint list `=200+`maxdif'*(`j'-1)+`p''
				}
			}
		}
	}
}	


local model ""
forvalues j=1/`nbitems'{
	forvalues p=1/`nbdif_`j''{
		local model "`model' (`p'.``j''<-THETA1@`p')(`p'.``=`j'+`nbitems'''<-THETA2@`p')"
	}
}

if "`group'"!="" {
	qui gsem `model', mlogit tol(0.01) iterate(100) group(`gp') ginvariant(coef loading) means(0: THETA1@0 THETA2@0) means(1: THETA1@m1 THETA2@m1) var(0: THETA1@v1 THETA2@v2) var(1:THETA1@v1 THETA2@v2) cov(0: THETA1*THETA2@cov12) cov(1: THETA1*THETA2@cov12) constraint(`listconst') from(esti_2, skip) latent(THETA1 THETA2) nocapslatent
}
else {
	qui gsem `model', mlogit tol(0.01) iterate(100) means(THETA1@0 THETA2@0) var(THETA1@v1 THETA2@v2) cov(THETA1*THETA2@cov12) from(esti_2, skip) latent(THETA1 THETA2) nocapslatent
}

/* Stockage des estimations du modèle 1 */
estimates store model1
matrix val_m1 = r(table)

/* Calcul des difficultés d'item (delta_j) */
matrix delta_m1 = J(`nbitems',`=`nbdif_max'*4',.)
local name_partTwoC ""
forvalues p=1/`nbdif_max' {
	forvalues t=1/2 {
		forvalues g = 0/1 {
			local name_partTwoC "`name_partTwoC' delta_t`t'_`p'_gp`g'"
		}
	}
}

local name_partTwoL ""
forvalues j=1/`=`nbitems'*2' {
	if `j' <= `nbitems' {
		local name_partTwoL "`name_partTwoL' ``j''"
	}
	else {
		local name_partTwoL "`name_partTwoL' ``=`nbitems'+`j'''"
	}
}

matrix colnames delta_m1 = `name_partTwoC'
matrix rownames delta_m1 = `name_partTwoL'

matrix delta_m1_se = J(`nbitems',`=`nbdif_max'*4',.)
local name_partTwoC_se ""

forvalues p=1/`nbdif_max' {
	forvalues t=1/2 {
		forvalues g = 0/1 {
			local name_partTwoC_se "`name_partTwoC_se' delta_t`t'_`p'_gp`g'_se"
		}
	}
}

matrix colnames delta_m1_se = `name_partTwoC_se'
matrix rownames delta_m1_se = `name_partTwoL'

if "`group'"!="" {
	forvalues t=1/2{
		forvalues j=1/`nbitems'{
			forvalues p=1/`nbdif_`j''{
				forvalues g=0/1{
					qui lincom -[`p'.``=(`t'-1)*`nbitems'+`j''']:`g'.`gp'
					local delta`t'_`j'_`p'g`g'm1= r(estimate)
					local delta`t'_`j'_`p'g`g'm1_se= r(se)				
					if `p'>1{
						qui lincom [`=`p'-1'.``=(`t'-1)*`nbitems'+`j''']:`g'.`gp' - [`p'.``=(`t'-1)*`nbitems'+`j''']:`g'.`gp'
						local delta`t'_`j'_`p'g`g'm1=r(estimate)
						local delta`t'_`j'_`p'g`g'm1_se=r(se)
					}
					if `t' == 1 {
						matrix delta_m1[`j',`=4*(`p'-1)+`g'+`t'']=`delta`t'_`j'_`p'g`g'm1'
						matrix delta_m1_se[`j',`=4*(`p'-1)+`g'+`t'']=`delta`t'_`j'_`p'g`g'm1_se'
					}
					if `t' == 2 {
						matrix delta_m1[`j',`=4*(`p'-1)+1+`g'+`t'']=`delta`t'_`j'_`p'g`g'm1'
						matrix delta_m1_se[`j',`=4*(`p'-1)+1+`g'+`t'']=`delta`t'_`j'_`p'g`g'm1_se'
					}
				}
			}
		}
	}
}
else {
	forvalues t=1/2 {
		forvalues j=1/`nbitems' {
			forvalues p = 1/`nbdif_`j'' {
				qui lincom -[`p'.``=(`t'-1)*`nbitems'+`j''']:_cons
				local delta`t'_`j'_`p'g0m1= r(estimate)
				local delta`t'_`j'_`p'g0m1_se= r(se)				
				if `p'>1{
					qui lincom [`=`p'-1'.``=(`t'-1)*`nbitems'+`j''']:_cons - [`p'.``=(`t'-1)*`nbitems'+`j''']:_cons
					local delta`t'_`j'_`p'g0m1=r(estimate)
					local delta`t'_`j'_`p'g0m1_se=r(se)
				}
				if `t' == 1 {
					matrix delta_m1[`j',`=4*(`p'-1)+`t'']=`delta`t'_`j'_`p'g0m1'
					matrix delta_m1_se[`j',`=4*(`p'-1)+`t'']=`delta`t'_`j'_`p'g0m1_se'
				}
				if `t' == 2 {
					matrix delta_m1[`j',`=4*(`p'-1)+1+`t'']=`delta`t'_`j'_`p'g0m1'
					matrix delta_m1_se[`j',`=4*(`p'-1)+1+`t'']=`delta`t'_`j'_`p'g0m1_se'
				}
			}
		}
	}
}

if "`group'" != "" {
	matrix var_m1 = (val_m1[1,"/var(THETA1)#0bn.`gp'"],val_m1[1,"/var(THETA2)#0bn.`gp'"]\val_m1[2,"/var(THETA1)#0bn.`gp'"],val_m1[2,"/var(THETA2)#0bn.`gp'"])
	matrix covar_m1 = (val_m1[1,"/cov(THETA1,THETA2)#0.`gp'"],val_m1[1,"/cov(THETA1,THETA2)#1.`gp'"]\val_m1[2,"/cov(THETA1,THETA2)#0.`gp'"],val_m1[2,"/cov(THETA1,THETA2)#1.`gp'"]\val_m1[4,"/cov(THETA1,THETA2)#0.`gp'"],val_m1[4,"/cov(THETA1,THETA2)#1.`gp'"])
}
else {
	matrix var_m1 = (val_m1[1,"/var(THETA1)"],val_m1[1,"/var(THETA2)"]\val_m1[2,"/var(THETA1)"],val_m1[2,"/var(THETA2)"])
	matrix covar_m1 = (val_m1[1,"/cov(THETA1,THETA2)"]\val_m1[2,"/cov(THETA1,THETA2)"]\val_m1[4,"/cov(THETA1,THETA2)"])
}

/*group effect*/
if  "`group'"!="" {
	qui lincom [/]:mean(THETA1)#1.`gp'-[/]:mean(THETA1)#0bn.`gp'
	local geffm1=r(estimate)
	local segeffm1=r(se)
	qui test [/]:mean(THETA1)#1.`gp'-[/]:mean(THETA1)#0bn.`gp' = 0
	local gpm1p=r(p)
	local gpm1chi=r(chi2)
	local gpm1df=r(df)
}

	*************************************************************
	***********************AFFICHAGE*****************************
	*************************************************************
	di 
	di as input "PROCESSING STEP 1"
	di
	
if "`detail'" != "" {		
	// Affichage du modèle 1

		/* Affichage des estimations des difficultés */

	if "`group'" != "" {
		di  _col(5) as text "{ul:MODEL 1:} Overall longitudinal measurement non-invariance across time (RS on all items)"
		di
		di %~105s as text "Item difficulties: estimates (s.e.)"
		di _col(10) "{hline 85}"
		di _col(38) "Time 1" _col(76) "Time 2"
		di as text _col(26) abbrev("`gp'",15) "=0" _col(44) abbrev("`gp'",15) "=1" _col(64) abbrev("`gp'",15) "=0" _col(82) abbrev("`gp'",15) "=1" 
		di _col(10) "{hline 85}"
	}
	else {
		di  _col(5) as text "{ul:MODEL 1:} Overall longitudinal measurement non-invariance across time (RS on all items)"
		di
		di %~70s as text as text "Item difficulties: estimates (s.e.)"
		di _col(10) "{hline 50}"
		di _col(25) "Time 1" _col(42) "Time 2"
		di _col(10) "{hline 50}"
	}

	forvalues j=1/`nbitems' {
		di as text _col(10) "``j''" 
		forvalues p=1/`nbdif_`j'' {
			if "`group'" != "" {
				di as text _col(10) "`p'" as result _col(25) %6.2f `delta1_`j'_`p'g0m1' " (" %4.2f `delta1_`j'_`p'g0m1_se' ")" _col(43) %6.2f `delta1_`j'_`p'g1m1' " (" %4.2f `delta1_`j'_`p'g1m1_se' ")" ///
				_col(63) %6.2f `delta2_`j'_`p'g0m1' " (" %4.2f `delta2_`j'_`p'g0m1_se' ")" _col(81) %6.2f `delta2_`j'_`p'g1m1' " (" %4.2f `delta2_`j'_`p'g1m1_se' ")"
			}
			else {
				di as text _col(10) "`p'" as result _col(25) %6.2f `delta1_`j'_`p'g0m1' " (" %4.2f `delta1_`j'_`p'g0m1_se' ")" _col(42) %6.2f `delta2_`j'_`p'g0m1' " (" %4.2f `delta2_`j'_`p'g0m1_se' ")"
			}
		}
	}
	if "`group'" != "" {
		di _col(10) as text "{hline 85}"
	}
	else {
		di _col(10) as text "{hline 50}"
	}
		/* Affichage des estimations du trait latent du modèle 1 */

	di
	if "`group'" != "" {
		di %~85s as text "Latent trait distribution"
		di _col(10) "{hline 65}"
		di _col(28) "Estimate" _col(46) "Standard error" _col(64) "P-value"
		di _col(10) "{hline 65}"
	}
	else {
		di %~70s as text "Latent trait distribution"
		di _col(10) "{hline 50}"
		di  _col(28) as text "Estimate" _col(44) "Standard error" "
		di _col(10) "{hline 50}"
	}
	di  _col(10) as text "Variance Time 1" as result _col(28) %6.2f `=var_m1[1,1]' _col(44) %6.2f `=var_m1[2,1]'
	di  _col(10) as text "Variance Time 2" as result _col(28) %6.2f `=var_m1[1,2]' _col(44) %6.2f `=var_m1[2,2]'
	di  _col(10) as text "Covariance" as result _col(28) %6.2f `=covar_m1[1,1]' _col(44) %6.2f `=covar_m1[2,1]'
	if "`group'" != "" {
		di _col(10) as text "Group effect" as result _col(28) %6.2f `geffm1' _col(44) %6.2f `segeffm1' _col(64) %6.4f `gpm1p'
	}
	di _col(10) as text "Time effect" as result _col(28) "0 (constrained)"
	if "`group'" != "" {
		di _col(10) as text "TimexGroup inter" as result _col(28) "0 (constrained)"
	}
	if "`group'" != "" {
		di _col(10) as text "{hline 65}"
	}
	else {
		di _col(10) as text "{hline 50}"
	}
	di
	if "`group'" != "" {
		di _col(10) as text "Group effect estimated: mean of the latent trait of group 1 at time 1 freely estimated"
		di _col(10) as text "No time effect: equality of means of the latent trait of group 0 across time"
		di _col(10) as text "All item difficulties freely estimated across time"
	}
	else{
		di _col(10) as text "No time effect: equality of means of the latent trait across time"
		di _col(10) as text "All item difficulties freely estimated across time"
	}
}
	//Affichage du modèle 2
di 
di as input "PROCESSING STEP 2"
di
if "`detail'" != "" {
		/* Affichage des estimations des difficultés */
	di  _col(5) as text "{ul:MODEL 2:} Overall longitudinal measurement invariance across time (no RS)"
	di
	if "`group'" != "" {
		di %~105s as text "Item difficulties: estimates (s.e.)"
		di _col(10) "{hline 85}"
		di _col(38) "Time 1" _col(76) "Time 2"
		di as text _col(26) abbrev("`gp'",15) "=0" _col(44) abbrev("`gp'",15) "=1" _col(64) abbrev("`gp'",15) "=0" _col(82) abbrev("`gp'",15) "=1" 
		di _col(10) "{hline 85}"
	}
	else {
		di %~70s as text as text "Item difficulties: estimates (s.e.)"
		di _col(10) "{hline 50}"
		di _col(25) "Time 1" _col(42) "Time 2"
		di _col(10) "{hline 50}"
	}

	forvalues j=1/`nbitems' {
		di as text _col(10) "``j''" 
		forvalues p=1/`nbdif_`j'' {
			if "`group'" != "" {
				di as text _col(10) "`p'" as result _col(25) %6.2f `delta1_`j'_`p'g0m2' " (" %4.2f `delta1_`j'_`p'g0m2_se' ")" _col(43) %6.2f `delta1_`j'_`p'g1m2' " (" %4.2f `delta1_`j'_`p'g1m2_se' ")" ///
				_col(63) %6.2f `delta2_`j'_`p'g0m2' " (" %4.2f `delta2_`j'_`p'g0m2_se' ")" _col(81) %6.2f `delta2_`j'_`p'g1m2' " (" %4.2f `delta2_`j'_`p'g1m2_se' ")"
			}
			else {
				di as text _col(10) "`p'" as result _col(25) %6.2f `delta1_`j'_`p'g0m2' " (" %4.2f `delta1_`j'_`p'g0m2_se' ")" 	_col(42) %6.2f `delta2_`j'_`p'g0m2' " (" %4.2f `delta2_`j'_`p'g0m2_se' ")" 
			}
		}
	}
	if "`group'" != "" {
		di as text _col(10) "{hline 85}"
	}
	else {
		di as text _col(10) "{hline 50}"
	}
		/* Affichage des estimations du trait latent du modèle 2 */
	di
	di %~85s as text "Latent trait distribution"
	di _col(10) "{hline 65}"
	di  _col(28) as text "Estimate" _col(46) "Standard error" _col(64) "P-value"
	di _col(10) "{hline 65}"

	if "`group'" == "" {
		local fact_k = 2
	}
	else {
		local fact_k = 4
	}

	di  _col(10) as text "Variance Time 1" as result _col(28) %6.2f `=mod2[1,`=`fact_k'*`nbmoda_sum'+1']' _col(44) %6.2f =mod2[2,`=`fact_k'*`nbmoda_sum'+1']
	di  _col(10) as text "Variance Time 2" as result _col(28) %6.2f `=mod2[1,`=`fact_k'*`nbmoda_sum'+2']' _col(44) %6.2f `=mod2[2,`=`fact_k'*`nbmoda_sum'+2']'
	di  _col(10) as text "Covariance" as result _col(28) %6.2f `=mod2[1,`=`fact_k'*`nbmoda_sum'+3']' _col(44) %6.2f `=mod2[2,`=`fact_k'*`nbmoda_sum'+3']'
	if "`group'" != "" {
		di _col(10) as text "Group effect" as result _col(28) %6.2f `geffm2' _col(44) %6.2f `segeffm2' _col(64) %6.4f `gpm2p'
	}
	di _col(10) as text "Time effect" as result _col(28) %6.2f `teffm2' _col(44) %6.2f `seteffm2' _col(64) %6.4f `tm2p'
	if "`group'" != "" {
		di _col(10) as text "TimexGroup inter" as result _col(28) %6.2f `interm2' _col(44) %6.2f `seinterm2' _col(64) %6.4f `interm2p'
	}
	di as text _col(10) "{hline 65}"
	di
	if "`group'" != "" {
		di _col(10) as text "Group effect estimated: mean of the latent trait of group 1 at time 1 freely estimated"
		di _col(10) as text "Time effect estimated: mean of the latent trait of group 0 at time 2 freely estimated"
		di _col(10) as text "Equality of all item difficulties across time"
	}
	else {
		di _col(10) as text "Time effect estimated: mean of the latent trait at time 2 freely estimated"
		di _col(10) as text "Equality of all item difficulties across time"
	}
	di
}

	*****************************************************
	*			Modèle 1 vs Modèle 2 					*
	*****************************************************
qui lrtest model2 model1

local rstestp=r(p)
local rstestchi=r(chi2)
local rstestdf=r(df)
if "`detail'" != "" {
	
	di as input "LIKELIHOOD-RATIO TEST 
	di
	di %~60s "Model 1 vs Model 2"
	di _col(10) "{hline 40}"
	di _col(10) as text "Chi-square" _col(28) "DF" _col(40) "P-value"
	di _col(10) as result %6.2f `rstestchi' _col(28) %2.0f `rstestdf' _col(40) %6.4f `rstestp'
	di _col(10) as text "{hline 40}"
	di
}
if `rstestp'<0.05{
	di as result "DIFFERENCE IN ITEM DIFFICULTIES ACROSS TIME LIKELY"
}
else{
	di as result "NO DIFFERENCE IN ITEM DIFFICULTIES ACROSS TIME DETECTED, NO RECALIBRATION DETECTED"
}
	*********************************
	*************MODEL 3*************
	*********************************
// Etape itérative si lrtest significatif
local nb_step3=0
		
if `rstestp' < 0.05 { /* If pvalue(LRtest)<0.05 then step 3 */
	di
	di as input "PROCESSING STEP 3"
	di

	/*test RC pour chaque item*/
	local boucle = 1
	local stop = 0
	//matrix list dif_rc
	while `boucle' <= `=`nbitp'-1' & `stop' == 0 { /*on s'arrête quand on a libéré du RC sur (tous les items-1) ou lorsqu'il n'y a plus de tests significatifs*/
		local nb_step3 = `boucle'
		local pajust=0.05/`=`nbitp'+1-`boucle''    // local pajust=0.05/`=`nbitems'+1-`boucle'
		if "`group'" != "" {
			local pajust2 = 0.05/`nbgrp'
		}
		/*réinitialisation de la matrice de test*/
		matrix test_rc_`boucle'=J(`nbitems',9,.)
		matrix test_rcCOMM_`boucle'=J(`nbitems',3,.)
		matrix test_rcU_`boucle'=J(`nbitems',6,.)
		matrix colnames test_rc_`boucle'= chi_RC df_RC pvalue_RC chi_RCg0 df_RCg0 pvalue_RCg0 chi_RCg1 df_RCg1 pvalue_RCg1
		matrix colnames test_rcCOMM_`boucle'= chi_RCCOMM df_RCCOMM pvalue_RCCOMM
		matrix colnames test_rcU_`boucle'= chi_RCUg0 df_RCUg0 pvalue_RCUg0 chi_RCUg1 df_RCUg1 pvalue_RCUg1
		local nbsig=0
		local minpval=1
		local itemrc=0
		if "`detail'" != "" {
			di  as text "Loop `boucle'" 
			di _col(5) "Adjusted alpha : " %6.4f `pajust'
			di
			di as text _col(10) "{hline 65}"
			di as text _col(10) "Freed item" _col(31) "Chi-Square"  _col(48) "DF" _col(57) "P-Value"
			di as text _col(10) "{hline 65}"
		}
		
				
				/*boucle de test*/
		forvalues j=1/`nbitems'{
			if `nbdif_`j'' >= 1 {
				local model ""
				local listconst ""
				local listconst_g ""
				if dif_rc[`j',3]==. { /*si pas de RC déjà détecté sur l'item j -> test item j*/
					/*on libère la RC de l'item j: pas de contraintes*/
					forvalues k=1/`nbitems'{
						if "`group'" == "" {
							if `k'!=`j'{
								if dif_rc[`k',3]==. | dif_rc[`k',3]==0 {/*pas de RC sur item k: contraintes 401-600*/
									forvalues p=1/`nbdif_`k''{ 
										local listconst_g "`listconst_g' `=400+`maxdif'*(`k'-1)+`p'' "
										qui constraint list `=400+`maxdif'*(`k'-1)+`p'' 
									}
								}
								else {
									if dif_rc[`k',6]!=. & dif_rc[`k',6]!=0 { // RC commune unif.
										if `nbmoda_`k'' > 2 {
											forvalues p=2/`nbdif_`k''{          
												local listconst_g "`listconst_g' `=1000+`maxdif'*(`k'-1)+`p''"
												qui constraint list `=1000+`maxdif'*(`k'-1)+`p''
											}
										}
									}
								}
							}
						}
						else {
					/* Contraintes de DIF */
							if dif_rc[`k',1]==.|dif_rc[`k',1]==0 { // contraintes si pas de DIF (1-200)
								forvalues p=1/`nbdif_`k''{ 
									local listconst "`listconst' `=0+`maxdif'*(`k'-1)+`p''"
									qui constraint list `=0+`maxdif'*(`k'-1)+`p''
								}
							}	 
							else { // Présence de DIF
								if dif_rc[`k',2]!=. & dif_rc[`k',2]!=0 { // contraintes de DIF U (201-400)
									if `nbmoda_`k'' > 2 {
										forvalues p=2/`nbdif_`k''{ 
											local listconst "`listconst' `=200+`maxdif'*(`k'-1)+`p''"
											qui constraint list `=200+`maxdif'*(`k'-1)+`p''
										}
									}
								}
							}			
							if `k'!=`j'{ /*contraintes pour les autres items */
								if dif_rc[`k',3]==. | dif_rc[`k',3]==0 {/*pas de RC sur item k: contraintes 401-600 601-800*/
									forvalues p=1/`nbdif_`k''{ 
										local listconst "`listconst' `=400+`maxdif'*(`k'-1)+`p'' `=600+`maxdif'*(`k'-1)+`p''"
										qui constraint list `=400+`maxdif'*(`k'-1)+`p'' `=600+`maxdif'*(`k'-1)+`p''
									}
								}
								else { //RC détectée sur l'item k
									if dif_rc[`k',4]==0{ /*RC commune: contraintes 801-1000*/
										forvalues p=1/`nbdif_`k''{           /***************************** j=1 ou 2 ?****/
											local listconst "`listconst' `=800+`maxdif'*(`k'-1)+`p''"
											qui constraint list `=800+`maxdif'*(`k'-1)+`p''
										}
										if dif_rc[`k',6]!=. & dif_rc[`k',6]!=0 { // RC commune unif.
											if `nbmoda_`k'' > 2 {
												forvalues p=2/`nbdif_`k''{          
													local listconst "`listconst' `=1000+`maxdif'*(`k'-1)+`p''"
													qui constraint list `=1000+`maxdif'*(`k'-1)+`p''
												}
											}
										}
									}
									else { // RC diff
										if dif_rc[`k',5]==. | dif_rc[`k',5]==0 { // RC gp0 (400)
											forvalues p=1/`nbdif_`k''{          
												local listconst "`listconst' `=400+`maxdif'*(`k'-1)+`p''"
												qui constraint list `=400+`maxdif'*(`k'-1)+`p''
											}	
										}
										if dif_rc[`k',6]!=. & dif_rc[`k',6]!=0 { // RCU gp0 (1001-1200)
											if `nbmoda_`k'' > 2 {
												forvalues p=2/`nbdif_`k''{          
													local listconst "`listconst' `=1000+`maxdif'*(`k'-1)+`p''"
													qui constraint list `=1000+`maxdif'*(`k'-1)+`p''
												}
											}	
										}
										if dif_rc[`k',7]==. | dif_rc[`k',7]==0 { // RC gp1 (600)
											forvalues p=1/`nbdif_`k''{          
												local listconst "`listconst' `=600+`maxdif'*(`k'-1)+`p''"
												qui constraint list `=600+`maxdif'*(`k'-1)+`p''
											}	
										}	
										if dif_rc[`k',8]!=. & dif_rc[`k',8]!=0 { // RCU gp1 (1201-1400)
											if `nbmoda_`k'' > 2 {
												forvalues p=2/`nbdif_`k''{          
													local listconst "`listconst' `=1200+`maxdif'*(`k'-1)+`p''"
													qui constraint list `=1200+`maxdif'*(`k'-1)+`p''
												}
											}
										}
									}
								}
							}
						}
					}
					
					local model ""
					forvalues jj=1/`nbitems'{
						forvalues p=1/`nbdif_`jj''{
							local model "`model' (`p'.``jj''<-THETA1@`p')(`p'.``=`jj'+`nbitems'''<-THETA2@`p')"
						}
					}
					if "`group'" == "" { // Sans l'option group
						qui gsem `model', mlogit tol(0.01) iterate(100) means(THETA1@0 THETA2@m20) var(THETA1@v1 THETA2@v2) cov(THETA1*THETA2@cov12) constraint(`listconst_g') from(esti_2, skip) latent(THETA1 THETA2) nocapslatent
					
							/*****************/
							/*tests RC item j*/
							/*****************/
					
							/* RC ? */
						qui test [1.``j'']_cons =[1.``=`j'+`nbitems''']_cons
						if `nbmoda_`j'' > 2 {
							forvalues p=2/`nbdif_`j''{
								qui test [`p'.``j'']_cons =[`p'.``=`j'+`nbitems''']_cons, acc
							}
						}
						matrix test_rc_`boucle'[`j',1]=(r(chi2),r(df),r(p))
						
																					
							/* RCU  ? */
						if `nbmoda_`j'' > 2 {
							qui test 2*([1.``=`j'+`nbitems''']_cons -[1.``j'']_cons)=[2.``=`j'+`nbitems''']_cons -[2.``j'']_cons
							forvalues p=3/`nbdif_`j''{
								qui test `p'*([1.``=`j'+`nbitems''']_cons -[1.``j'']_cons)=[`p'.``=`j'+`nbitems''']_cons -[`p'.``j'']_cons , acc
							}	
							matrix test_rcU_`boucle'[`j',1]=(r(chi2), r(df),r(p))
						}
					}
					else { // Avec l'option group
						qui gsem `model', mlogit tol(0.01) iterate(100) group(`gp') ginvariant(coef loading) means(0: THETA1@0 THETA2@m20) means(1: THETA1@m11 THETA2@m21) var(0: THETA1@v1 THETA2@v2) var(1:THETA1@v1 THETA2@v2) cov(0: THETA1*THETA2@cov12) cov(1: THETA1*THETA2@cov12) constraint(`listconst') from(esti_2, skip) latent(THETA1 THETA2) nocapslatent

							/*****************/
							/*tests RC item i*/
							/*****************/
							
							/* RC ? */
						qui test [1.``j'']0bn.`gp'=[1.``=`j'+`nbitems''']0bn.`gp'
						if `nbmoda_`j'' > 2 {
							forvalues p=2/`nbdif_`j''{
								qui test [`p'.``j'']0bn.`gp'=[`p'.``=`j'+`nbitems''']0bn.`gp', acc
							}
						}
						qui test [1.``j'']1.`gp'=[1.``=`j'+`nbitems''']1.`gp', acc
						if `nbmoda_`j'' > 2 {
							forvalues p=2/`nbdif_`j''{
								qui test [`p'.``j'']1.`gp'=[`p'.``=`j'+`nbitems''']1.`gp', acc
							}				
						}
						matrix test_rc_`boucle'[`j',1]=(r(chi2),r(df),r(p))
												/* RC COMMUNE ? */
						qui test [1.``=`j'+`nbitems''']0bn.`gp'-[1.``j'']0bn.`gp'=[1.``=`j'+`nbitems''']1.`gp'-[1.``j'']1.`gp'
						if `nbmoda_`j'' > 2 {
							forvalues p=2/`nbdif_`j''{
								qui test [`p'.``=`j'+`nbitems''']0bn.`gp'-[`p'.``j'']0bn.`gp'=[`p'.``=`j'+`nbitems''']1.`gp'-[`p'.``j'']1.`gp', acc
							}
						}
						matrix test_rcCOMM_`boucle'[`j',1]=(r(chi2),r(df),r(p))
												/* RC groupe 0 ? */
						qui test [1.``j'']0bn.`gp'=[1.``=`j'+`nbitems''']0bn.`gp'
						if `nbmoda_`j'' > 2 {
							forvalues p=2/`nbdif_`j''{
								qui test [`p'.``j'']0bn.`gp'=[`p'.``=`j'+`nbitems''']0bn.`gp', acc
							}
						}
						matrix test_rc_`boucle'[`j',4]=(r(chi2),r(df),r(p))
					
						/* RCU grp 0 ? */
						if `nbmoda_`j'' > 2 {
							qui test 2*([1.``=`j'+`nbitems''']0bn.`gp'-[1.``j'']0bn.`gp')=[2.``=`j'+`nbitems''']0bn.`gp'-[2.``j'']0bn.`gp'
							forvalues p=3/`nbdif_`j''{
									qui test `p'*([1.``=`j'+`nbitems''']0bn.`gp'-[1.``j'']0bn.`gp')=[`p'.``=`j'+`nbitems''']0bn.`gp'-[`p'.``j'']0bn.`gp', acc
							}	
							matrix test_rcU_`boucle'[`j',1]=(r(chi2),r(df),r(p))
						}
					
						/* RC groupe 1 ? */
						qui test [1.``j'']1.`gp'=[1.``=`j'+`nbitems''']1.`gp'
						if `nbmoda_`j'' > 2 {
							forvalues p=2/`nbdif_`j''{
								qui test [`p'.``j'']1.`gp'=[`p'.``=`j'+`nbitems''']1.`gp', acc
							}	
						}
						matrix test_rc_`boucle'[`j',7]=(r(chi2),r(df),r(p))
											
						/* RCU grp 1 ? */
						if `nbmoda_`j'' > 2 {
							qui test 2*([1.``=`j'+`nbitems''']1.`gp'-[1.``j'']1.`gp')=[2.``=`j'+`nbitems''']1.`gp'-[2.``j'']1.`gp'
							forvalues p=3/`nbdif_`j''{
								qui test `p'*([1.``=`j'+`nbitems''']1.`gp'-[1.``j'']1.`gp')=[`p'.``=`j'+`nbitems''']1.`gp'-[`p'.``j'']1.`gp', acc
							}
							matrix test_rcU_`boucle'[`j',4]=(r(chi2),r(df),r(p))
						}
					}
					/******* Matrice test complète *********/
					if "`detail'" != "" {
						di as text _col(10) abbrev("``j''",22) as result _col(31)  %6.3f test_rc_`boucle'[`j',1] _col(48) test_rc_`boucle'[`j',2] _col(57) %6.4f test_rc_`boucle'[`j',3] 	
					}
				}
			}
		}
		//matrix list test_rc_`boucle'
		forvalues j=1/`nbitems'{
			if test_rc_`boucle'[`j',3]<`pajust'{/*si RC sur item i*/
				if test_rc_`boucle'[`j',3]<`minpval'{
					local minpval=test_rc_`boucle'[`j',3]
					local itemrc=`j'
				}
			}
		}
		if `itemrc' != 0 { // itemrc = numéro de l'item avec le test le + sig.
			if "`group'" == "" { // Recalibration si pas d'option groupe
				local ++nbsig
				matrix dif_rc[`itemrc',3]=`boucle'
				matrix dif_rc[`itemrc',5]=`boucle'
				if `nbmoda_`itemrc'' > 2 {
					if "`detail'" != "" {
						di as text _col(10) "{hline 65}"
						di
						di as result "Recalibration on ``itemrc''"
						di
						di as text _col(10) "{hline 65}"
						di as text _col(10) "Test" _col(31) "Chi-Square"  _col(48) "DF" _col(57) "P-Value"
						di as text _col(10) "{hline 65}"
						di as text _col(10) "Uniform RC? " as result _col(31) %4.2f  `=test_rcU_`boucle'[`itemrc',1]'  _col(48) `=test_rcU_`boucle'[`itemrc',2]'  _col(57) %6.4f `=test_rcU_`boucle'[`itemrc',3]'
						di as text _col(10) "{hline 65}"
					}
					if test_rcU_`boucle'[`itemrc',3] >= 0.05 { //RC Uniforme sur itemRC
						matrix dif_rc[`itemrc',6]=`boucle'
							di
							di as result "``itemrc'' : Uniform RC"
							di 
					}
					else {
						matrix dif_rc[`itemrc',6]=0
							di
							di as result "``itemrc'' : Non-uniform RC"
							di 
					}
				}
				else {
						di
						di as result "``itemrc'' : Recalibration "
						di 
				}
			}
			else { // Option groupe
				if "`detail'" != "" {
					di as text _col(10) "{hline 65}"
					di
					di as result "Recalibration on ``itemrc''"
					di
					di as text _col(10) "{hline 65}"
					di as text _col(10) "Test" _col(31) "Chi-Square"  _col(48) "DF" _col(57) "P-Value"
					di as text _col(10) "{hline 65}"
					di _col(10) as text "Common RC? " as result _col(31) %4.2f `=test_rcCOMM_`boucle'[`itemrc',1]' _col(48) `=test_rcCOMM_`boucle'[`itemrc',2]' _col(57) %6.4f `=test_rcCOMM_`boucle'[`itemrc',3]' 
				}
				if test_rcCOMM_`boucle'[`itemrc',3] < 0.05 { //RC différentielle
					if "`detail'" != "" {
						di _col(10) as text "RC group 0? " as result _col(31) %4.2f  `=test_rc_`boucle'[`itemrc',4]' _col(48) `=test_rc_`boucle'[`itemrc',5]' _col(57) %6.4f `=test_rc_`boucle'[`itemrc',6]'  "{it: - with adjusted alpha = `pajust2' }"
					}
					if test_rc_`boucle'[`itemrc',6] < `pajust2' { //RC gp 0
						local ++nbsig
						matrix dif_rc[`itemrc',3]=`boucle'
						matrix dif_rc[`itemrc',4]=`boucle'
						matrix dif_rc[`itemrc',5]=`boucle'
						if `nbmoda_`itemrc'' > 2 {
							di _col(10) as text "Uniform RC group 0? " as result _col(31) %4.2f `=test_rcU_`boucle'[`itemrc',1]' _col(48) `=test_rcU_`boucle'[`itemrc',2]'  _col(57) %6.4f `=test_rcU_`boucle'[`itemrc',3]'
							if test_rcU_`boucle'[`itemrc',3] >= 0.05 { // RCU gp 0
								matrix dif_rc[`itemrc',6]=`boucle'	
								local phrase_diff = "``itemrc'' : Uniform differential RC in group 0."
							}
							else {
								matrix dif_rc[`itemrc',6]=0
								local phrase_diff = "``itemrc'' : Non-uniform differential RC in group 0."
							}
						}
						else {
							local phrase_diff = "``itemrc'' : Differential RC in group 0."
						}
					}
					if "`detail'" != "" {
						di _col(10) as text "RC group 1?" as result _col(31) %4.2f  `=test_rc_`boucle'[`itemrc',7]' _col(48) `=test_rc_`boucle'[`itemrc',8]' _col(57) %6.4f `=test_rc_`boucle'[`itemrc',9]' "{it: - with adjusted alpha = `pajust2' }"
					}
					if test_rc_`boucle'[`itemrc',9] < `pajust2' { //RC gp 1
						local ++nbsig
						matrix dif_rc[`itemrc',3]=`boucle'
						matrix dif_rc[`itemrc',4]=`boucle'
						matrix dif_rc[`itemrc',7]=`boucle'
						if `nbmoda_`itemrc'' > 2 {
							if "`detail'" != "" {
								di _col(10) as text "Uniform RC group 1? " as result _col(31) %4.2f `=test_rcU_`boucle'[`itemrc',4]' _col(48) `=test_rcU_`boucle'[`itemrc',5]'  _col(57) %6.4f `=test_rcU_`boucle'[`itemrc',6]'
							}
							if test_rcU_`boucle'[`itemrc',6] >= 0.05 { // RCU gp 1
								matrix dif_rc[`itemrc',8]=`boucle'
								if dif_rc[`itemrc',5] != `boucle' { //RC slmt sur g1
									local phrase_diff = "``itemrc'' : Differential RC, uniform RC in group 1."
								}
								else {
									if dif_rc[`itemrc',6] == 0 { // + RCNU g0
										local phrase_diff = "``itemrc'' : Differential RC, non-uniform RC in group 0 and uniform RC in group 1."
									}
									else { // + RCU G0
										local phrase_diff = "``itemrc'' : Differential RC, uniform RC in group 0 and uniform RC in group 1."
									}
								}
							}
							else { //RCNU gp 1
								matrix dif_rc[`itemrc',8]=0
								if "`detail'" != "" {
									di
								}
								if dif_rc[`itemrc',5] != `boucle' {
									local phrase_diff = "``itemrc'' : Differential RC, non-uniform RC in group 1."
								}
								else {
									if dif_rc[`itemrc',6] == 0 { // + RCNU g0
										local phrase_diff = "``itemrc'' : Differential RC, non-uniform RC in group 0 and non-uniform RC in group 1."
									}
									else { // + RCU G0
										local phrase_diff = "``itemrc'' : Differential RC, uniform RC in group 0 and non-uniform RC in group 1."
									}
								}
							}
						}
						else {
							if dif_rc[`itemrc',5] != `boucle' {
									local phrase_diff = "``itemrc'' : Differential RC in group 1."
							}
							else {
								local phrase_diff = "``itemrc'' : Differential RC in group 0 and differential RC in group 1."
							}
						}
					}
					if "`detail'" != "" {
						di as text _col(10) "{hline 65}"
					}
					di
					di as result "`phrase_diff'"
					di 
				}
				else { // RC commune -> MAJ modèle 3
	/*******************************************************************************************************************/
					if `nbmoda_`itemrc'' == 2 {
						if "`detail'" != "" {
							di
							di as result "{ul:``itemrc''}: recalibration"
							di _col(20) in ye "Common " in gr "{it:(Chi-s: " %4.2f `=test_rcCOMM_`boucle'[`itemrc',1]' ", DF: `=test_rcCOMM_`boucle'[`itemrc',2]' p-val. : " %4.2f `=test_rcCOMM_`boucle'[`itemrc',3]' ")}"
						}
						matrix dif_rc[`itemrc',3]=`boucle'
						matrix dif_rc[`itemrc',4]=0
						matrix dif_rc[`itemrc',5]=`boucle'
						matrix dif_rc[`itemrc',7]=`boucle'
						local ++nbsig
					}
					else {
						matrix dif_rc[`itemrc',3]=`boucle'
						matrix dif_rc[`itemrc',4]=0
						matrix dif_rc[`itemrc',5]=`boucle'
						matrix dif_rc[`itemrc',7]=`boucle'
						//matrix list dif_rc
						local model ""
						local listconst ""					
						forvalues j=1/`nbitems'{ 
							/* Contraintes de DIF */
							if dif_rc[`j',1]==.|dif_rc[`j',1]==0 { // contraintes si pas de DIF (1-200)
								forvalues p=1/`nbdif_`j''{ 
									qui local listconst "`listconst' `=0+`maxdif'*(`j'-1)+`p''"
									qui constraint list `=0+`maxdif'*(`j'-1)+`p''								
								}
							} 
							else { // Présence de DIF
								if dif_rc[`j',2]!=. & dif_rc[`j',2]!=0 { // contraintes de DIF U (201-400)
									if `nbmoda_`j'' > 2 {
										forvalues p=2/`nbdif_`j''{ 
											qui local listconst "`listconst' `=200+`maxdif'*(`j'-1)+`p''"
											qui constraint list `=200+`maxdif'*(`j'-1)+`p''
										}
									}
								}
							}
							if `j' != `itemrc'{ /*contraintes pour les autres items */
								if dif_rc[`j',3]==. | dif_rc[`j',3]==0 {/*pas de RC sur item p: contraintes 401-600 601-800*/
									forvalues p=1/`nbdif_`j''{ 
										qui local listconst "`listconst' `=400+`maxdif'*(`j'-1)+`p'' `=600+`maxdif'*(`j'-1)+`p''"
										qui constraint list `=400+`maxdif'*(`j'-1)+`p'' `=600+`maxdif'*(`j'-1)+`p''
									}
								}
								else { //RC détectée sur l'item p
									if dif_rc[`j',4]==0{ /*RC commune: contraintes 801-1000*/
										forvalues p=1/`nbdif_`j''{           
											qui local listconst "`listconst' `=800+`maxdif'*(`j'-1)+`p''"
											qui constraint list `=800+`maxdif'*(`j'-1)+`p''
										}
										if dif_rc[`j',6]!=. & dif_rc[`j',6]!=0 { // RC commune unif.
											if `nbmoda_`j'' > 2 {
												forvalues p=2/`nbdif_`j''{          
													qui local listconst "`listconst' `=1000+`maxdif'*(`j'-1)+`p''"
													qui constraint list `=1000+`maxdif'*(`j'-1)+`p''
												}	
											}
										}
									}
									else if dif_rc[`j',4] != 0 & dif_rc[`j',4]!=0. { // RC diff
										if dif_rc[`j',5]==. | dif_rc[`j',5]==0 { // RC gp0 (400)
											forvalues p=1/`nbdif_`j''{          
												qui local listconst "`listconst' `=400+`maxdif'*(`j'-1)+`p''"
												qui constraint list `=400+`maxdif'*(`j'-1)+`p''
											}	
										}
										if dif_rc[`j',6]!=. & dif_rc[`j',6]!=0 { // RCU gp0 (1001-1200)
											if `nbmoda_`j'' > 2 {
												forvalues p=2/`nbdif_`j''{          
													qui local listconst "`listconst' `=1000+`maxdif'*(`j'-1)+`p''"
													qui constraint list `=1000+`maxdif'*(`j'-1)+`p''
												}	
											}
										}
										if dif_rc[`j',7]==. | dif_rc[`j',7]==0 { // RC gp1 (600)
											forvalues p=1/`nbdif_`j''{          
												qui local listconst "`listconst' `=600+`maxdif'*(`j'-1)+`p''"
												qui constraint list `=600+`maxdif'*(`j'-1)+`p''
											}	
										}
										if dif_rc[`j',8]!=. & dif_rc[`j',8]!=0 { // RCU gp1 (1201-1400)
											if `nbmoda_`j'' > 2 {
												forvalues p=2/`nbdif_`j''{          
													qui local listconst "`listconst' `=1200+`maxdif'*(`j'-1)+`p''"
													qui constraint list `=1200+`maxdif'*(`j'-1)+`p''
												}
											}
										}	
									}
								}
							}
							else { // Contrainte de RC commune pour l'itemrc
								forvalues p=1/`nbdif_`j''{          
									qui local listconst "`listconst' `=800+`maxdif'*(`itemrc'-1)+`p''"
									qui constraint list `=800+`maxdif'*(`itemrc'-1)+`p''
								}	
							}
						}	
						qui di "`listconst'"
						local model ""
						forvalues jj=1/`nbitems'{
							forvalues p=1/`nbdif_`jj''{
								local model "`model' (`p'.``jj''<-THETA1@`p')(`p'.``=`jj'+`nbitems'''<-THETA2@`p')"
							}
						}
						qui gsem `model', mlogit tol(0.01) iterate(100) group(`gp') ginvariant(coef loading) means(0: THETA1@0 THETA2@m20) means(1: THETA1@m11 THETA2@m21) var(0: THETA1@v1 THETA2@v2) var(1:THETA1@v1 THETA2@v2) cov(0: THETA1*THETA2@cov12) cov(1: THETA1*THETA2@cov12) constraint(`listconst') from(esti_2, skip) latent(THETA1 THETA2) nocapslatent

						/************************/
						/*tests RC item `itemrc'*/
						/************************/
						matrix commU_`boucle'=J(`nbitems',3,.) //Matrice des tests de RCU slmt si RC commune 
						matrix colnames commU_`boucle'= chi_RCU df_RCU p_RCU
						
						/* RCU grp 0 ? */
						if `nbmoda_`itemrc'' > 2 {
							qui test 2*([1.``=`itemrc'+`nbitems''']0bn.`gp'-[1.``itemrc'']0bn.`gp')=[2.``=`itemrc'+`nbitems''']0bn.`gp'-[2.``itemrc'']0bn.`gp'
							forvalues j=3/`nbdif_`itemrc''{
								qui test `j'*([1.``=`itemrc'+`nbitems''']0bn.`gp'-[1.``itemrc'']0bn.`gp')=[`j'.``=`itemrc'+`nbitems''']0bn.`gp'-[`j'.``itemrc'']0bn.`gp', acc
							}	
							matrix commU_`boucle'[`itemrc',1]=(r(chi2),r(df),r(p))
							if "`detail'" != "" {
								di _col(10) as text "Uniform RC?" as result _col(31) %4.2f  `=commU_`boucle'[`itemrc',1]' _col(48) `=commU_`boucle'[`itemrc',2]' _col(57) %6.4f `=commU_`boucle'[`itemrc',3]'
								di as text _col(10) "{hline 65}"
							}
							if commU_`boucle'[`itemrc',3] >= 0.05 { // RCU
								local ++nbsig
								matrix dif_rc[`itemrc',6]=`boucle'
								matrix dif_rc[`itemrc',8]=`boucle'
								di
								//di as result "{ul:``itemrc''}: recalibration"
								//di _col(20) "Common " in gr "{it:(Chi-s: " %4.2f `=test_rcCOMM_`boucle'[`itemrc',1]' ", DF: `=test_rcCOMM_`boucle'[`itemrc',2]' p-val. : " %4.2f `=test_rcCOMM_`boucle'[`itemrc',3]' ")}"
								di as result "``itemrc'' : Uniform common RC"
								di 
							}
							else {
								local ++nbsig
								matrix dif_rc[`itemrc',6]=0
								matrix dif_rc[`itemrc',8]=0
								di
								di as result "``itemrc'' : Non-uniform common RC"
								di 
							}
						}
					} 
				}  // fin de RC commune
			}
		}
		else {
			local stop = 1
		}							
	/*******************************************************************************************************************/
		// Fin de RC sur item i
		if `nbsig'==0{
			local stop=1
			if `boucle' == 1 {
					di as text _col(10) "{hline 65}"
					di
					di as result "No significant tests, no recalibration detected"
					di
			}
			else {
				if "`detail'" != "" {
					di as text _col(10) "{hline 65}"
					di
					di as result "No other significant tests"
					di
				}
			}
		}
		local ++boucle
	}
}
	


	*********************************
	 ***		BILAN  			***
	*********************************

	if "`group'" != "" & "`nodif'" == "" {
	di
	di %~84s as result "SUMMARY"
	di as result _col(2)  "{hline 80}"
	di as result 		 _col(18) "Difference in"
	di as result _col(2) "Item" _col(18) "groups at T1" _col(36) "Recalibration"  _col(54) "RC " abbrev("`gp'",10) " 0"  _col(72) "RC " abbrev("`gp'",10) " 1" 
	di as result _col(2) "{hline 80}"
	forvalues j=1/`nbitems' {
		local RC
		local RCg0
		local RCg1
		local difft1
		if (dif_rc[`j',3] != . & dif_rc[`j',3] != 0 & dif_rc[`j',4] == 0) {
			local RC "Common"
		}
		if (dif_rc[`j',3] != . & dif_rc[`j',3] != 0 & dif_rc[`j',4] != 0) {
			local RC "Differential"
		}
		if `nbmoda_`j'' > 2 {
			if (dif_rc[`j',6]!=. & dif_rc[`j',6] != 0) {
				local RCg0 "Uniform"
			}
			if (dif_rc[`j',6] == 0) {
				local RCg0 "Non-uniform"
			}
				if (dif_rc[`j',8]!=. & dif_rc[`j',8] != 0) {
				local RCg1 "Uniform"
			}
			if ( dif_rc[`j',8] == 0) {
				local RCg1 "Non-uniform"
			}
			if (dif_rc[`j',1] != . ) {
				if (dif_rc[`j',2]!=0) {
					local difft1 "Uniform"
				}
				else {
					local difft1 "Non-uniform"
				}
			}
		}
		else {
			if dif_rc[`j',6] != . {
				local RCg0 " X "
			}
			if dif_rc[`j',8] != . {
				local RCg1 " X "
			}
			if dif_rc[`j',1] != . {
				local difft1 " X "
			}
		}
		di as result _col(2) abbrev("``j''",15) as text _col(18) "`difft1'"  _col(36) "`RC'"  _col(54) "`RCg0'"  _col(72) "`RCg1'"
	}
	di as result _col(2) "{hline 80}"
	di
}
else if "`group'" != "" & "`nodif'" != "" {
	di
	di %~90s as result "SUMMARY"
	di as result _col(10)  "{hline 70}"
	di as result _col(10) "Item" _col(26) "Recalibration"  _col(46) "RC `gp' 0"  _col(62) "RC `gp' 1" 
	di _col(10) "{hline 70}"
	forvalues j=1/`nbitems' {
		local RC
		local RCg0
		local RCg1
		if (dif_rc[`j',3] != . & dif_rc[`j',3] != 0 & dif_rc[`j',4] == 0) {
			local RC "Common"
		}
		if (dif_rc[`j',3] != . & dif_rc[`j',3] != 0 & dif_rc[`j',4] != 0) {
			local RC "Differential"
		}
		if `nbmoda_`j'' > 2 {
			if (dif_rc[`j',6]!=. & dif_rc[`j',6] != 0) {
				local RCg0 "Uniform"
			}
			if (dif_rc[`j',6] == 0) {
				local RCg0 "Non-uniform"
			}
			if (dif_rc[`j',8]!=. & dif_rc[`j',8] != 0) {
				local RCg1 "Uniform"
			}
			if ( dif_rc[`j',8] == 0) {
				local RCg1 "Non-uniform"
			}
		}
		else {
			if dif_rc[`j',6] != . {
				local RCg0 " X "
			}
			if dif_rc[`j',8] != . {
				local RCg1 " X "
			}
		}
		di as result _col(10) "``j''" as text  _col(26) "`RC'"  _col(44) "`RCg0'"  _col(62) "`RCg1'"
	}
	di as result _col(10) "{hline 70}"
}
else if "`group'" == "" {
	di
	di %~60s as result "SUMMARY"
	di as result _col(10)  "{hline 40}"
	di _col(10) "Item" _col(36) "Recalibration"  
	di _col(10) "{hline 40}"
	forvalues j=1/`nbitems' {
		local RC
		if dif_rc[`j',3] != . {
			if `nbmoda_`j'' > 2 {
				if (dif_rc[`j',6]!=. & dif_rc[`j',6] != 0) {
					local RC "Uniform"
				}
				if (dif_rc[`j',6] == 0) {
					local RC "Non-uniform"
				}
			}
			else {
				local RC " X "
			}				
		}
		di as result _col(10) "``j''" as text  _col(38) "`RC'"  
	}
	di as result _col(10) "{hline 40}"
	di
}	


	*********************************
	**			MODEL 4			   **
	*********************************
if "`detail'" != "" {
	di
	di as input "PROCESSING STEP 4"
	di
}
	//matrix list dif_rc, title ("Constraints")

local model ""
local listconst ""
local listconst_g ""
forvalues j=1/`nbitems'{
	if "`group'" != "" {
		if dif_rc[`j',1]==.|dif_rc[`j',1]==0 { /*si pas de DIF: contraintes 1-200 */
			forvalues p=1/`nbdif_`j''{ 
				local listconst "`listconst' `=0+`maxdif'*(`j'-1)+`p''"
				qui constraint list `=0+`maxdif'*(`j'-1)+`p''
			}
		} 
		else { // Présence de DIF
			if dif_rc[`j',2]!=. & dif_rc[`j',2]!=0 { // contraintes de DIF U (201-400)
				if `nbmoda_`j'' > 2 {
					forvalues p=2/`nbdif_`j''{ 
						local listconst "`listconst' `=200+`maxdif'*(`j'-1)+`p''"
						qui constraint list `=200+`maxdif'*(`j'-1)+`p''
					}
				}
			}
		}
	}
	if dif_rc[`j',3]==. | dif_rc[`j',3]==0 { /*pas de RC : contraintes 401-600 601-800*/
		forvalues p=1/`nbdif_`j''{
			if "`group'" == "" {
				local listconst_g "`listconst_g' `=400+`maxdif'*(`j'-1)+`p''"
				qui constraint list `=400+`maxdif'*(`j'-1)+`p''
			}
			else {
				local listconst "`listconst' `=400+`maxdif'*(`j'-1)+`p'' `=600+`maxdif'*(`j'-1)+`p''"
				qui constraint list `=400+`maxdif'*(`j'-1)+`p'' `=600+`maxdif'*(`j'-1)+`p''
			}
		}
	}
	else { //RC détectée sur l'item j
		if "`group'" == "" {
			if dif_rc[`j',6]!=. & dif_rc[`j',6]!=0 { // RC unif.
				if `nbmoda_`j'' > 2 {
					forvalues p=2/`nbdif_`j''{          
						local listconst_g "`listconst_g' `=1000+`maxdif'*(`j'-1)+`p''"
						qui constraint list `=1000+`maxdif'*(`j'-1)+`p''
					}
				}
			}
		}
		else {
			if dif_rc[`j',4]==0{ /*RC commune: contraintes 801-1000*/
				forvalues p=1/`nbdif_`j''{           
					local listconst "`listconst' `=800+`maxdif'*(`j'-1)+`p''"
					qui constraint list `=800+`maxdif'*(`j'-1)+`p''
				}
				if dif_rc[`j',6]!=. & dif_rc[`j',6]!=0 { // RC commune unif.
					if `nbmoda_`j'' > 2 {
						forvalues p=2/`nbdif_`j''{          
							local listconst "`listconst' `=1000+`maxdif'*(`j'-1)+`p''"
							qui constraint list `=1000+`maxdif'*(`j'-1)+`p''
						}
					}
				}
			}
			else { // RC diff
				if dif_rc[`j',5]==. | dif_rc[`j',5]==0 { // RC gp0 (400)
					forvalues p=1/`nbdif_`j''{          
						local listconst "`listconst' `=400+`maxdif'*(`j'-1)+`p''"
						qui constraint list `=400+`maxdif'*(`j'-1)+`p''
					}		
				}
				if dif_rc[`j',6]!=. & dif_rc[`j',6]!=0 { // RCU gp0 (1001-1200)
					if `nbmoda_`j'' > 2 {
						forvalues p=2/`nbdif_`j''{          
							local listconst "`listconst' `=1000+`maxdif'*(`j'-1)+`p''"
							qui constraint list `=1000+`maxdif'*(`j'-1)+`p''
						}
					}
				}
				if dif_rc[`j',7]==. | dif_rc[`j',7]==0 { // RC gp1 (600)
					forvalues p=1/`nbdif_`j''{          
						local listconst "`listconst' `=600+`maxdif'*(`j'-1)+`p''"
						qui constraint list `=600+`maxdif'*(`j'-1)+`p''
					}	
				}
				if dif_rc[`j',8]!=. & dif_rc[`j',8]!=0 { // RCU gp1 (1201-1400)
					if `nbmoda_`j'' > 2 {
						forvalues p=2/`nbdif_`j''{          
							local listconst "`listconst' `=1200+`maxdif'*(`j'-1)+`p''"
							qui constraint list `=1200+`maxdif'*(`j'-1)+`p''
						}
					}
				}	
			}
		}
	}
}

local model ""

forvalues jj=1/`nbitems'{
	forvalues p=1/`nbdif_`jj''{
		local model "`model' (`p'.``jj''<-THETA1@`p')(`p'.``=`jj'+`nbitems'''<-THETA2@`p')"
	}
}

if "`group'" != "" {
	qui gsem `model', mlogit tol(0.01) iterate(100) group(`gp') ginvariant(coef loading) means(0: THETA1@0 THETA2@m20) means(1: THETA1@m11 THETA2@m21) var(0: THETA1@v1 THETA2@v2) var(1:THETA1@v1 THETA2@v2) cov(0: THETA1*THETA2@cov12) cov(1: THETA1*THETA2@cov12) constraint(`listconst') from(esti_2, skip) latent(THETA1 THETA2) nocapslatent
}
else {
	qui gsem `model', mlogit tol(0.01) iterate(100)  means( THETA1@0 THETA2@m2) var(THETA1@v1 THETA2@v2)  cov(THETA1*THETA2@cov12)  constraint(`listconst_g') from(esti_2, skip) latent(THETA1 THETA2) nocapslatent
}
	/* Stockage des estimations du modèle */
matrix val_m4 = r(table)
matrix esti_4 = e(b)

if "`group'" != "" {
	matrix var_m4 = (val_m4[1,"/var(THETA1)#0bn.`gp'"],val_m4[1,"/var(THETA2)#0bn.`gp'"]\val_m4[2,"/var(THETA1)#0bn.`gp'"],val_m4[2,"/var(THETA2)#0bn.`gp'"])
	matrix covar_m4 = (val_m4[1,"/cov(THETA1,THETA2)#0.`gp'"],val_m4[1,"/cov(THETA1,THETA2)#1.`gp'"]\val_m4[2,"/cov(THETA1,THETA2)#0.`gp'"],val_m4[2,"/cov(THETA1,THETA2)#1.`gp'"]\val_m4[4,"/cov(THETA1,THETA2)#0.`gp'"],val_m4[4,"/cov(THETA1,THETA2)#1.`gp'"])
}
else {
	matrix var_m4 = (val_m4[1,"/var(THETA1)"],val_m4[1,"/var(THETA2)"]\val_m4[2,"/var(THETA1)"],val_m4[2,"/var(THETA2)"])
	matrix covar_m4 = (val_m4[1,"/cov(THETA1,THETA2)"]\val_m4[2,"/cov(THETA1,THETA2)"]\val_m4[4,"/cov(THETA1,THETA2)"])
}

/* Matrice des tests effet grp, tps et inter */
matrix effet = J(5,3,.)
matrix colnames effet= Groupe Temps Interaction  
matrix rownames effet = Esti Std_Err Pvalue Chi DF

/*group effect*/
if "`group'" != "" {
	qui lincom [/]:mean(THETA1)#1.`gp'-[/]:mean(THETA1)#0bn.`gp'
	matrix effet[1,1] =r(estimate)
	matrix effet[2,1]=r(se)
	qui test [/]:mean(THETA1)#1.`gp'-[/]:mean(THETA1)#0bn.`gp' = 0
	matrix effet[3,1]=r(p)
	matrix effet[4,1]=r(chi2)
	matrix effet[5,1]=r(df)
}

/*time effect*/
if "`group'" != "" {
	qui lincom [/]:mean(THETA2)#0bn.`gp'-[/]:mean(THETA1)#0bn.`gp'
	matrix effet[1,2]=r(estimate)
	matrix effet[2,2]=r(se)
	qui test [/]:mean(THETA2)#0bn.`gp'-[/]:mean(THETA1)#0bn.`gp' = 0
	matrix effet[3,2]=r(p)
	matrix effet[4,2]=r(chi2)
	matrix effet[5,2]=r(df)
}
else {
	qui lincom [/]:mean(THETA2)	/* -[/]:mean(THETA1)*/
	local teffm4=r(estimate)
	local seteffm4=r(se)
	local ubteffm4 = r(ub)
	local lbteffm4 = r(lb)
	qui test [/]:mean(THETA2) /* -[/]:mean(THETA1) */ = 0
	local tm4p=r(p)
	local tm4chi=r(chi2)
	local tm4df=r(df)
}

*INTERACTION
if "`group'" != "" {
	qui lincom [/]:mean(THETA2)#1.`gp'-[/]:mean(THETA2)#0bn.`gp'-[/]:mean(THETA1)#1.`gp'+[/]:mean(THETA1)#0bn.`gp'
	matrix effet[1,3]=r(estimate)
	matrix effet[2,3]=r(se)
	local ubinterm4=r(ub)
	local lbinterm4=r(lb)
	qui test [/]:mean(THETA2)#1.`gp'-[/]:mean(THETA2)#0bn.`gp'-[/]:mean(THETA1)#1.`gp'+[/]:mean(THETA1)#0bn.`gp' = 0
	matrix effet[3,3]=r(p)
	matrix effet[4,3]=r(chi2)
	matrix effet[5,3]=r(df)
}

if "`group'" != "" {
	local effet_tps = 0
	local effet_grp = 0

	if effet[3,3] >= 0.05 { // Si option group, on s'interesse à l'interaction temps x group, et MAJ modèle >>> modèle final = modèle 4 + contrainte 1999 (Interaction = 0)
			/* Affichage des estimations sur le trait latent du modèle 4  */
		if "`detail'" != "" {
			di
			di %~85s as text "Latent trait distribution"
			di _col(10) "{hline 65}"
			di  _col(28) as text "Estimate" _col(46) "Standard error" _col(62) "P-value"
			di _col(10) "{hline 65}"
			di  _col(10) as text "Variance Time 1" as result _col(28) %6.2f `=var_m4[1,1]' _col(44) %6.2f `=var_m4[2,1]'
			di  _col(10) as text "Variance Time 2" as result _col(28) %6.2f `=var_m4[1,2]' _col(44) %6.2f `=var_m4[2,2]'
			di  _col(10) as text "Covariance" as result _col(28) %6.2f `=covar_m4[1,1]' _col(44) %6.2f `=covar_m4[2,1]'
			if "`group'" != "" {
				di _col(10) as text "Group effect" as result _col(28) %6.2f effet[1,1] _col(44) %6.2f effet[2,1] _col(62) %6.4f effet[3,1]
			}
			di _col(10) as text "Time effect" as result _col(28) %6.2f effet[1,2] _col(44) %6.2f effet[2,2] _col(62) %6.4f effet[3,2]

			if "`group'" != "" { 
				di _col(10) as text "TimexGroup inter" as result _col(28) %6.2f effet[1,3] _col(44) %6.2f effet[2,3] _col(62) %6.4f effet[3,3]
			}
			di as text _col(10) "{hline 65}"
			di
			di as result "Time x group interaction : test not significant
			di "Reestimation of model 4 with time x group interaction constrained at 0 "
			di
		}
		local yn_inter = 0
		local listconst "`listconst' 1999"
		qui di "`listconst'"
		local model ""
		forvalues jj=1/`nbitems'{
			forvalues p=1/`nbdif_`jj''{
				local model "`model' (`p'.``jj''<-THETA1@`p')(`p'.``=`jj'+`nbitems'''<-THETA2@`p')"
			}
		}
		qui gsem `model', mlogit tol(0.01) iterate(100) group(`gp') ginvariant(coef loading) means(0: THETA1@0 THETA2@m20) means(1: THETA1@m11 THETA2@m21) var(0: THETA1@v1 THETA2@v2) var(1:THETA1@v1 THETA2@v2) cov(0: THETA1*THETA2@cov12) cov(1: THETA1*THETA2@cov12) constraint(`listconst') from(esti_4, skip) latent(THETA1 THETA2) nocapslatent
			
		matrix val_m4 = r(table)
	}
	else {
		local yn_inter = 1
	}
	
	/*group effect*/
	qui lincom [/]:mean(THETA1)#1.`gp'-[/]:mean(THETA1)#0bn.`gp'
	local geffm4=r(estimate)
	local segeffm4=r(se)
	local ubgeffm4=r(ub)
	local lbgeffm4=r(lb)
	qui test [/]:mean(THETA1)#1.`gp'-[/]:mean(THETA1)#0bn.`gp'=0
	local gpm4p=r(p)
	local gpm4chi=r(chi2)
	local gpm4df=r(df)

	/*time effect*/
	qui lincom [/]:mean(THETA2)#0bn.`gp'-[/]:mean(THETA1)#0bn.`gp'
	local teffm4=r(estimate)
	local seteffm4=r(se)
	local lbteffm4=r(lb)
	local ubteffm4=r(ub)
	qui test [/]:mean(THETA2)#0bn.`gp'-[/]:mean(THETA1)#0bn.`gp'=0
	local tm4p=r(p)
	local tm4chi=r(chi2)
	local tm4df=r(df)
}

	/* Calcul des difficultés (delta_j) */
if "`group'" != "" {
	matrix mod4 = J(7,`=`nbmoda_sum'*4+6',.)
	local name_partTwoC ""
	forvalues j = 1/`nbitems' {
		forvalues p=1/`nbdif_`j'' {
			forvalues t=1/2 {
				forvalues g = 0/1 {
					local name_partTwoC "`name_partTwoC' d_j`j'_p`p'_gp`g'_t`t'"
				}
			}
		}
	}
	local name_partTwoC "`name_partTwoC' VAR(THETA1) VAR(THETA2) COV(TH1,TH2) GROUP_Effect TIME_Effect INTER_TxG  "
	matrix colnames mod4 = `name_partTwoC'
	matrix rownames mod4 =  Estimate se Upper_b Lower_b Chi_square DF pvalue
}
else {
	matrix mod4 = J(7,`=`nbmoda_sum'*2+4',.)
	local name_partTwoC ""
	forvalues j = 1/`nbitems' {
		forvalues p=1/`nbdif_`j'' {
			forvalues t=1/2 {
				local name_partTwoC "`name_partTwoC' d_j`j'_p`p'_t`t'"
			}
		}
	}
	local name_partTwoC "`name_partTwoC' VAR(THETA1) VAR(THETA2) COV(TH1,TH2) TIME_Effect "
	matrix colnames mod4 = `name_partTwoC'
	matrix rownames mod4 =  Estimate se Upper_b Lower_b Chi_square DF pvalue
}

*Difficultés
forvalues j=1/`nbitems'{
	forvalues p=1/`nbdif_`j''{	
		forvalues t=1/2{
			if "`group'" != "" { // groupe binaire
				forvalues g=0/1 {
					qui lincom -[`p'.``=(`t'-1)*`nbitems'+`j''']:`g'.`gp'
					local delta`t'_`j'_`p'g`g'm4= r(estimate)
					local delta`t'_`j'_`p'g`g'm4_se= r(se)
					local delta`t'_`j'_`p'g`g'm4_ub=r(ub)
					local delta`t'_`j'_`p'g`g'm4_lb=r(lb)
					local delta`t'_`j'_`p'g`g'm4_p=r(p)
					if `p'>1 {
						qui lincom [`=`p'-1'.``=(`t'-1)*`nbitems'+`j''']:`g'.`gp' - [`p'.``=(`t'-1)*`nbitems'+`j''']:`g'.`gp'
						local delta`t'_`j'_`p'g`g'm4=r(estimate)
						local delta`t'_`j'_`p'g`g'm4_se=r(se)
						local delta`t'_`j'_`p'g`g'm4_ub=r(ub)
						local delta`t'_`j'_`p'g`g'm4_lb=r(lb)
						local delta`t'_`j'_`p'g`g'm4_p=r(p)
					}
					local place = 0
					local compt = 1
					while `compt' < `j' {
						local place = `place' + `nbdif_`compt''
						local ++compt
					}
					if `t' == 1 {
						matrix mod4[1,`=4*(`p'-1)+`g'+`t'+4*`place'']=`delta`t'_`j'_`p'g`g'm4'
						matrix mod4[2,`=4*(`p'-1)+`g'+`t'+4*`place'']=`delta`t'_`j'_`p'g`g'm4_se'
						matrix mod4[3,`=4*(`p'-1)+`g'+`t'+4*`place'']=`delta`t'_`j'_`p'g`g'm4_ub'
						matrix mod4[4,`=4*(`p'-1)+`g'+`t'+4*`place'']=`delta`t'_`j'_`p'g`g'm4_lb'
						matrix mod4[7,`=4*(`p'-1)+`g'+`t'+4*`place'']=`delta`t'_`j'_`p'g`g'm4_p'
					}
					if `t' == 2 {
						matrix mod4[1,`=4*(`p'-1)+`g'+`t'+1+4*`place'']=`delta`t'_`j'_`p'g`g'm4'
						matrix mod4[2,`=4*(`p'-1)+`g'+`t'+1+4*`place'']=`delta`t'_`j'_`p'g`g'm4_se'
						matrix mod4[3,`=4*(`p'-1)+`g'+`t'+1+4*`place'']=`delta`t'_`j'_`p'g`g'm4_ub'
						matrix mod4[4,`=4*(`p'-1)+`g'+`t'+1+4*`place'']=`delta`t'_`j'_`p'g`g'm4_lb'
						matrix mod4[7,`=4*(`p'-1)+`g'+`t'+1+4*`place'']=`delta`t'_`j'_`p'g`g'm4_p'
					}
				}
			}
			else { // groupe unique (=gp0)
				qui lincom -[`p'.``=(`t'-1)*`nbitems'+`j''']_cons
				local delta`t'_`j'_`p'g0m4= r(estimate)
				local delta`t'_`j'_`p'g0m4_se= r(se)
				local delta`t'_`j'_`p'g0m4_ub=r(ub)
				local delta`t'_`j'_`p'g0m4_lb=r(lb)
				local delta`t'_`j'_`p'g0m4_p=r(p)
				if `p'>1{
					qui lincom [`=`p'-1'.``=(`t'-1)*`nbitems'+`j''']_cons - [`p'.``=(`t'-1)*`nbitems'+`j''']_cons
					local delta`t'_`j'_`p'g0m4=r(estimate)
					local delta`t'_`j'_`p'g0m4_se=r(se)
					local delta`t'_`j'_`p'g0m4_ub=r(ub)
					local delta`t'_`j'_`p'g0m4_lb=r(lb)
					local delta`t'_`j'_`p'g0m4_p=r(p)
				}
				local place = 0
				local compt = 1
				while `compt' < `j' {
					local place = `place' + `nbdif_`compt''
					local ++compt
				}
				if `t' == 1 {
					matrix mod4[1,`=2*(`p'-1)+`t'+2*`place'']=`delta`t'_`j'_`p'g0m4'
					matrix mod4[2,`=2*(`p'-1)+`t'+2*`place'']=`delta`t'_`j'_`p'g0m4_se'
					matrix mod4[3,`=2*(`p'-1)+`t'+2*`place'']=`delta`t'_`j'_`p'g0m4_ub'
					matrix mod4[4,`=2*(`p'-1)+`t'+2*`place'']=`delta`t'_`j'_`p'g0m4_lb'
					matrix mod4[7,`=2*(`p'-1)+`t'+2*`place'']=`delta`t'_`j'_`p'g0m4_p'
				}
				if `t' == 2 {
					matrix mod4[1,`=2*(`p'-1)+`t'+2*`place'']=`delta`t'_`j'_`p'g0m4'
					matrix mod4[2,`=2*(`p'-1)+`t'+2*`place'']=`delta`t'_`j'_`p'g0m4_se'
					matrix mod4[3,`=2*(`p'-1)+`t'+2*`place'']=`delta`t'_`j'_`p'g0m4_ub'
					matrix mod4[4,`=2*(`p'-1)+`t'+2*`place'']=`delta`t'_`j'_`p'g0m4_lb'
					matrix mod4[7,`=2*(`p'-1)+`t'+2*`place'']=`delta`t'_`j'_`p'g0m4_p'
				}
			}
		}
	}
}

if "`group'" != "" {
	matrix mod4[1,`=4*`nbmoda_sum'+1'] = (val_m4[1,"/var(THETA1)#0bn.`gp'"], val_m4[1,"/var(THETA2)#0bn.`gp'"])
	matrix mod4[2,`=4*`nbmoda_sum'+1'] = (val_m4[2,"/var(THETA1)#0bn.`gp'"],val_m4[2,"/var(THETA2)#0bn.`gp'"])
	matrix mod4[3,`=4*`nbmoda_sum'+1'] = (val_m4[6,"/var(THETA1)#0bn.`gp'"],val_m4[6,"/var(THETA2)#0bn.`gp'"])
	matrix mod4[4,`=4*`nbmoda_sum'+1'] = (val_m4[5,"/var(THETA1)#0bn.`gp'"],val_m4[5,"/var(THETA2)#0bn.`gp'"])
	
	matrix mod4[1,`=4*`nbmoda_sum'+2+1'] = (val_m4[1,"/cov(THETA1,THETA2)#0.`gp'"])
	matrix mod4[2,`=4*`nbmoda_sum'+2+1'] = (val_m4[2,"/cov(THETA1,THETA2)#0.`gp'"])
	matrix mod4[3,`=4*`nbmoda_sum'+2+1'] = (val_m4[6,"/cov(THETA1,THETA2)#0.`gp'"])
	matrix mod4[4,`=4*`nbmoda_sum'+2+1'] = (val_m4[5,"/cov(THETA1,THETA2)#0.`gp'"])

	matrix mod4[1,`=4*`nbmoda_sum'+2+1+1'] = `geffm4'
	matrix mod4[2,`=4*`nbmoda_sum'+2+1+1'] = `segeffm4'
	matrix mod4[3,`=4*`nbmoda_sum'+2+1+1'] = `ubgeffm4'
	matrix mod4[4,`=4*`nbmoda_sum'+2+1+1'] = `lbgeffm4'	
	matrix mod4[5,`=4*`nbmoda_sum'+2+1+1'] = `gpm4chi'
	matrix mod4[6,`=4*`nbmoda_sum'+2+1+1'] = `gpm4df'
	matrix mod4[7,`=4*`nbmoda_sum'+2+1+1'] = `gpm4p'

	
	matrix mod4[1,`=4*`nbmoda_sum'+2+1+1+1'] = `teffm4'
	matrix mod4[2,`=4*`nbmoda_sum'+2+1+1+1'] = `seteffm4'
	matrix mod4[3,`=4*`nbmoda_sum'+2+1+1+1'] = `ubteffm4'
	matrix mod4[4,`=4*`nbmoda_sum'+2+1+1+1'] = `lbteffm4'	
	matrix mod4[5,`=4*`nbmoda_sum'+2+1+1+1'] = `tm4chi'
	matrix mod4[6,`=4*`nbmoda_sum'+2+1+1+1'] = `tm4df'
	matrix mod4[7,`=4*`nbmoda_sum'+2+1+1+1'] = `tm4p'

	if `yn_inter' == 1 { //Slmt si model avec interaction
		matrix mod4[1,`=4*`nbmoda_sum'+2+1+1+1+1'] = effet[1,3]
		matrix mod4[2,`=4*`nbmoda_sum'+2+1+1+1+1'] = effet[2,3]
		matrix mod4[3,`=4*`nbmoda_sum'+2+1+1+1+1'] = `ubinterm4'
		matrix mod4[4,`=4*`nbmoda_sum'+2+1+1+1+1'] = `lbinterm4'
		matrix mod4[5,`=4*`nbmoda_sum'+2+1+1+1+1'] = effet[4,3]
		matrix mod4[6,`=4*`nbmoda_sum'+2+1+1+1+1'] = effet[5,3]
		matrix mod4[7,`=4*`nbmoda_sum'+2+1+1+1+1'] = effet[3,3]
	}
		
}
else {
	matrix mod4[1,`=2*`nbmoda_sum'+1'] = (val_m4[1,"/var(THETA1)"],val_m4[1,"/var(THETA2)"])
	matrix mod4[2,`=2*`nbmoda_sum'+1'] = (val_m4[2,"/var(THETA1)"],val_m4[2,"/var(THETA2)"])
	matrix mod4[3,`=2*`nbmoda_sum'+1'] = (val_m4[6,"/var(THETA1)"],val_m4[6,"/var(THETA2)"])
	matrix mod4[4,`=2*`nbmoda_sum'+1'] = (val_m4[5,"/var(THETA1)"],val_m4[5,"/var(THETA2)"])
	
	matrix mod4[1,`=2*`nbmoda_sum'+2+1'] = (val_m4[1,"/cov(THETA1,THETA2)"])
	matrix mod4[2,`=2*`nbmoda_sum'+2+1'] = (val_m4[2,"/cov(THETA1,THETA2)"])
	matrix mod4[3,`=2*`nbmoda_sum'+2+1'] = (val_m4[6,"/cov(THETA1,THETA2)"])
	matrix mod4[4,`=2*`nbmoda_sum'+2+1'] = (val_m4[5,"/cov(THETA1,THETA2)"])
	
	matrix mod4[1,`=2*`nbmoda_sum'+2+1+1'] = `teffm4'
	matrix mod4[2,`=2*`nbmoda_sum'+2+1+1'] = `seteffm4'
	matrix mod4[3,`=2*`nbmoda_sum'+2+1+1'] = `ubteffm4'
	matrix mod4[4,`=2*`nbmoda_sum'+2+1+1'] = `lbteffm4'	
	matrix mod4[5,`=2*`nbmoda_sum'+2+1+1'] = `tm4chi'
	matrix mod4[6,`=2*`nbmoda_sum'+2+1+1'] = `tm4df'
	matrix mod4[7,`=2*`nbmoda_sum'+2+1+1'] = `tm4p'
}


	/* Affichage des estimations des difficultés */
di  _col(5) as text "{ul:MODEL 4} = Final model"
di
if "`group'" != "" {
	di %~105s as text "Item difficulties: estimates (s.e.)"
	di _col(10) "{hline 85}"
	di _col(38) "Time 1" _col(76) "Time 2"
	di as text _col(25) abbrev("`gp'",15) "=0" _col(43) abbrev("`gp'",15) "=1" _col(64) abbrev("`gp'",15) "=0" _col(82) abbrev("`gp'",15) "=1" 
	di _col(10) "{hline 85}"
}
else {
	di %~70s as text as text "Item difficulties: estimates (s.e.)"
	di _col(10) "{hline 50}"
	di _col(25) "Time 1" _col(43) "Time 2"
	di _col(10) "{hline 50}"
}

forvalues j=1/`nbitems' {
	di as text _col(10) "``j''" 
	forvalues p=1/`nbdif_`j'' {
		if "`group'" != "" {
			di as text _col(10) "`p'" as result _col(25) %6.2f `delta1_`j'_`p'g0m4' " (" %4.2f `delta1_`j'_`p'g0m4_se' ")" _col(43) %6.2f `delta1_`j'_`p'g1m4' " (" %4.2f `delta1_`j'_`p'g1m4_se' ")" ///
			_col(63) %6.2f `delta2_`j'_`p'g0m4' " (" %4.2f `delta2_`j'_`p'g0m4_se' ")" _col(81) %6.2f `delta2_`j'_`p'g1m4' " (" %4.2f `delta2_`j'_`p'g1m4_se' ")"
		}
		else {
			di as text _col(10) "`p'" as result _col(25) %6.2f `delta1_`j'_`p'g0m4' " (" %4.2f `delta1_`j'_`p'g0m4_se' ")" _col(43) %6.2f `delta2_`j'_`p'g0m4' " (" %4.2f `delta2_`j'_`p'g0m4_se' ")"
		}
	}
}

if "`group'" != "" {
	di as text _col(10) "{hline 85}"
}
else {
	di as text _col(10) "{hline 50}"
}

	/* Affichage des estimations sur le trait latent du modèle final */
di
di %~85s as text "Latent trait distribution"
di _col(10) "{hline 65}"
di  _col(28) as text "Estimate" _col(44) "Standard error" _col(62) "P-value"
di _col(10) "{hline 65}" 

if "`group'" == "" {
	local fact_k = 2
}
else {
	local fact_k = 4
}

di  _col(10) as text "Variance Time 1" as result _col(28) %6.2f `=mod4[1,`=`fact_k'*`nbmoda_sum'+1']' _col(44) %6.2f =mod4[2,`=`fact_k'*`nbmoda_sum'+1']
di  _col(10) as text "Variance Time 2" as result _col(28) %6.2f `=mod4[1,`=`fact_k'*`nbmoda_sum'+2']' _col(44) %6.2f `=mod4[2,`=`fact_k'*`nbmoda_sum'+2']'
di  _col(10) as text "Covariance" as result _col(28) %6.2f `=mod4[1,`=`fact_k'*`nbmoda_sum'+3']' _col(44) %6.2f `=mod4[2,`=`fact_k'*`nbmoda_sum'+3']'

if "`group'" != "" {

	di _col(10) as text "Group effect" as result _col(28) %6.2f `geffm4' _col(44) %6.2f `segeffm4' _col(62) %6.4f `gpm4p'
}
di _col(10) as text "Time effect" as result _col(28) %6.2f `teffm4' _col(44) %6.2f `seteffm4' _col(62) %6.4f `tm4p'

if "`group'" != "" {
	if effet[3,3] < 0.05 {
		di _col(10) as text "TimexGroup inter" as result _col(28) %6.2f effet[1,3] _col(44) %6.2f effet[2,3] _col(62) %6.4f effet[3,3]
	}
	else {
		di _col(10) as text "TimexGroup inter" as result _col(28) "0 (constrained)" 
	}
}

di as text _col(10) "{hline 65}"

/***************************************/
/* Calcul des valeurs de DIF et de RC */
/*************************************/

forvalues j=1/`nbitems' {
	if `nbmoda_`j'' >= 2 {
		matrix valeur_difrc_`j' = J(`nbdif_`j'',8,.)
		matrix colnames valeur_difrc_`j' = DIFT1 DIFT1_SE RC_GP0 RC_GP0_SE RC_GP1 RC_GP1_SE 
	}
}

forvalues j=1/`nbitems'{
	if `nbmoda_`j'' >= 2 {
		if "`group'" != "" {
			*DIF
			if "`nodif'"=="" {
				if (dif_rc[`j',1] != . ) {
					forvalues p=1/`nbdif_`j'' {
						if `p' == 1 {
							qui lincom -[1.``j'']:1.`gp'+[1.``j'']:0.`gp'
							matrix valeur_difrc_`j'[`p',1] = r(estimate)
							matrix valeur_difrc_`j'[`p',2] = round(r(se),0.01)
						}
						if `p' > 1 {
							qui lincom [`=`p'-1'.``j'']:1.`gp' - [`p'.``j'']:1.`gp' -[`=`p'-1'.``j'']:0.`gp' + [`p'.``j'']:0.`gp' 
							matrix valeur_difrc_`j'[`p',1] = r(estimate)
							matrix valeur_difrc_`j'[`p',2] = round(r(se),0.01)
						}
					}
				}
			}
			*RC GROUP 0
			if (dif_rc[`j',3] != . & dif_rc[`j',5] != . )  {
				forvalues p=1/`nbdif_`j'' {
					qui lincom -[1.``=`j'+`nbitems''']:0.`gp' + [1.``j'']:0.`gp'
					matrix valeur_difrc_`j'[`p',3] = r(estimate)
					matrix valeur_difrc_`j'[`p',4] = round(r(se),0.01)
					if `p' > 1 {
						qui lincom [`=`p'-1'.``=`j'+`nbitems''']:0.`gp' - [`p'.``=`j'+`nbitems''']:0.`gp' -[`=`p'-1'.``j'']:0.`gp' + [`p'.``j'']:0.`gp'
						matrix valeur_difrc_`j'[`p',3] = r(estimate)
						matrix valeur_difrc_`j'[`p',4] = round(r(se),0.01)
					}
				}
			}
			*RC GROUP 1
			if (dif_rc[`j',3] != . & dif_rc[`j',7] != . ) {
				forvalues p=1/`nbdif_`j'' {
					qui lincom -[1.``=`j'+`nbitems''']:1.`gp' + [1.``j'']:1.`gp'
					matrix valeur_difrc_`j'[`p',5] = r(estimate)
					matrix valeur_difrc_`j'[`p',6] = round(r(se),0.01)
					if `p' > 1 {
						qui lincom [`=`p'-1'.``=`j'+`nbitems''']:1.`gp' - [`p'.``=`j'+`nbitems''']:1.`gp' -[`=`p'-1'.``j'']:1.`gp' + [`p'.``j'']:1.`gp'
						matrix valeur_difrc_`j'[`p',5] = r(estimate)
						matrix valeur_difrc_`j'[`p',6] = round(r(se),0.01)
					}	
				}
			}
		}
		else {
			forvalues p=1/`nbdif_`j'' {
				qui lincom -[1.``=`j'+`nbitems''']_cons + [1.``j'']_cons
				matrix valeur_difrc_`j'[`p',3] = r(estimate)
				matrix valeur_difrc_`j'[`p',4] = round(r(se),0.01)
				if `p' > 1 {
					qui lincom [`=`p'-1'.``=`j'+`nbitems''']_cons - [`p'.``=`j'+`nbitems''']_cons -[`=`p'-1'.``j'']_cons + [`p'.``j'']_cons
					matrix valeur_difrc_`j'[`p',3] = r(estimate)
					matrix valeur_difrc_`j'[`p',4] = round(r(se),0.01)						
				}
			}
		}
	}
}

forvalues j = 1/`nbitems' {
	if `nbmoda_`j'' >= 2 {
		forvalues p = 1/`nbdif_`j'' {
			forvalues k = 1/8 {
				if valeur_difrc_`j'[`p',`k'] == . {
					matrix valeur_difrc_`j'[`p',`k'] = 0
				}
			}
		}
	}
}

	/* Affichage des estimations des valeurs de DIF et de RC */
if "`group'" != "" {
	di
	di %~85s as text "Estimates of differences between groups and recalibration"
}
else {
	di
	di %~50s as text "Estimates of recalibration"
}
if "`group'" != "" & "`nodif'"==""{
	di _col(10) "{hline 65}"
	di _col(27) "Difference of" _col(52) "RECALIBRATION"
	di _col(27) "groups at T1" _col(47) abbrev("`gp'",15) "=0" _col(62) abbrev("`gp'",15) "=1" 
	di _col(10) "{hline 65}"
}
else if "`group'" != "" & "`nodif'"!="" {
	di _col(10) "{hline 50}"
	di _col(32) "RECALIBRATION"
	di in ye  _col(27) "`gp'=`=rep[1,1]'" _col(47) "`gp'=`=rep[2,1]'"
	di _col(10) "{hline 50}"
}
else {
	di _col(10) "{hline 30}"
	di _col(25) "RECALIBRATION"
	di _col(10) "{hline 30}"
}

forvalues j=1/`nbitems' {
	if `nbmoda_`j'' >= 2 {
		if "`group'" != "" & "`nodif'" == "" {
			di as text _col(10) "``j''" 
		}
		else {
			di as text _col(10) "``j''" 
		}
		forvalues p=1/`nbdif_`j'' {
			if "`group'" != "" & "`nodif'"=="" { 
				di as text _col(10) "`p'" as result _col(27) %6.2f `=valeur_difrc_`j'[`p',1]' " (" %4.2f `=valeur_difrc_`j'[`p',2]' ")"  ///
				_col(47) %6.2f `=valeur_difrc_`j'[`p',3]' " (" %4.2f `=valeur_difrc_`j'[`p',4]' ")" _col(62) %6.2f `=valeur_difrc_`j'[`p',5]' " (" %4.2f `=valeur_difrc_`j'[`p',6]' ")" 
			}
			else if "`group'" != "" & "`nodif'"!="" {
				di as text _col(10) "`p'" as result _col(25) %6.2f `=valeur_difrc_`j'[`p',3]' " (" %4.2f `=valeur_difrc_`j'[`p',4]' ")" _col(45) %6.2f `=valeur_difrc_`j'[`p',5]' " (" %4.2f `=valeur_difrc_`j'[`p',6]' ")" 
			}
			else {
				di as text _col(10) "`p'" as result _col(25) %6.2f `=valeur_difrc_`j'[`p',3]' " (" %4.2f `=valeur_difrc_`j'[`p',4]' ")"
			}
		}
	}
}

if "`group'" != "" & "`nodif'"=="" {
	di as text _col(10) "{hline 65}"	
}
else if "`group'" != "" & "`nodif'"!=""{
	di as text _col(10) "{hline 50}"
}
else {
	di as text _col(10) "{hline 30}"
}
di


*******************************************************************************
* New outputs

if "`group'" == "" {
	matrix testlrm = J(1,3,.)
	matrix colnames testlrm = chi_square df pvalue
	matrix rownames testlrm = m1_vs_m2
	matrix testlrm[1,1] = (`rstestchi',`rstestdf',`rstestp')
	return matrix test_model = testlrm
}
else if "`nodif'" != "" {
	matrix testlrm = J(1,3,.)
	matrix colnames testlrm = chi_square df pvalue
	matrix rownames testlrm = m1_vs_m2
	matrix testlrm[1,1] = (`rstestchi',`rstestdf',`rstestp')
	return matrix test_model = testlrm
}
else {
	matrix testlrm = J(2,3,.)
	matrix colnames testlrm = chi_square df pvalue
	matrix rownames testlrm = mA_vs_mB m1_vs_m2
	matrix testlrm[1,1] = (`diftestchi',`diftestdf',`diftestp')
	matrix testlrm[2,1] = (`rstestchi',`rstestdf',`rstestp')
	return matrix test_model = testlrm
}

return matrix model_4 = mod4
return matrix model_2 = mod2

capture qui use `saverspcm', clear

end