You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

654 lines
22 KiB
Plaintext

*! Version 3 11July2018
*! Jean-Benoit Hardouin
************************************************************************************************************
* nopalera : NOPALERA algorithm
*
* Historic:
* Version 1 (2015-07-20): Jean-Benoit Hardouin /*ICC; rsbynpirt module*/
* Version 1.1 (2015-10-24): Jean-Benoit Hardouin /*NOPALERA module, ISOQOL 2015*/
* Version 2 (2015-10-24): Jean-Benoit Hardouin /*NOPALERA module, ISOQOL 2015*/
* Version 2.1 (2017-12-13): Jean-Benoit Hardouin /*Improvement*/
* Version 3 (2018-07-11): Jean-Benoit Hardouin /*Improvement for paper*/
*
* Jean-benoit Hardouin, phD, Assistant Professor
* INSERM UMR 1246-SPHERE
* MethodS in Patients-centered outcomes and HEalth ResEarches
* University of Nantes - Faculty of Pharmaceutical Sciences
* France
* jean-benoit.hardouin@anaqol.org
*
* News about this program: http://www.anaqol.org
*
* Copyright 2015,2017,2018 Jean-Benoit Hardouin
*
* 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 nopalera, rclass
version 8.0
syntax varlist(numeric min=4) [, nobsauc nobsaabc noGraph corr(numlist) NBAUCbs(int 10) NBAABCbs(int 20) noRESTscore GRAPHBYGroup ] /*corr est la correction à appliquer pour corriger le RS unif*/
set more off
tempfile file1 file2 file3
qui save `file1', replace
preserve
local nbitems : word count `varlist'
qui count
local nind=r(N)
tokenize `varlist'
if mod(`nbitems',2)!=0 {
di in red "You must indicate an even number of items"
exit
}
else {
local nbitems=`nbitems'/2
}
if "`corr'"=="" {
forvalues i=1/`nbitems'{
local corr "`corr' 0"
}
}
local listofitems1
local listofitems2
forvalues i=1/`nbitems' {
local listofitems1 `listofitems1' ``i''
local listofitems2 `listofitems2' ``=`i'+`nbitems'''
}
di "NOPALERA: an algorithm to detect Response-shift at items level using non parametric IRT"
di "Number of individuals: `nind'"
di "Number of items: `nbitems'"
di "Number of Boostrap replications for AUC: `nbaucbs'"
di "Number of Boostrap replications for AABC: `nbaabcbs'"
/*******************************************************************************
Une boucle pour calculer le score, définir le score maximum par item et global
*******************************************************************************/
tempvar varscore1 varscore2
qui gen `varscore1'=0
qui gen `varscore2'=0
label variable `varscore1' "Total score time 1"
label variable `varscore2' "Total score time 2"
local scoremax=0
local flag=0
local modamax=0
forvalues i=1/`nbitems' {
local corr`i': word `i' of `corr'
qui replace ``=`i'+`nbitems'''=``=`i'+`nbitems'''+`corr`i''
qui replace `varscore1'=`varscore1'+``i''
qui replace `varscore2'=`varscore2'+``=`i'+`nbitems'''
local list1 `list1' ``i''
local list2 `list2' ``=`i'+`nbitems'''
qui su ``i''
local modamax`i'=r(max)
qui su ``=`i'+`nbitems'''
local modamax`i'=r(max)
if r(min)!=0 {
local flag=1
}
local scoremax=`scoremax'+`modamax`i''
if `modamax`i''!=1 {
local flagbin=0
}
if `modamax`i''>`modamax' {
local modamax=`modamax`i''
}
}
/*******************************************************************************
On va calculer maintenant les rest-score de chaque item à chaque temps
*******************************************************************************/
forvalues i=1/`nbitems'{
tempvar rscore1``i'' rscore2``i'' vargroup1``i'' vargroup2``i'' vargroup2b``i''
if "`restscore'"=="" {
qui gen `rscore1``i'''=`varscore1'-``i''
qui gen `rscore2``i'''=`varscore2'-``=`i'+`nbitems'''
}
else {
qui gen `rscore1``i'''=`varscore1'
qui gen `rscore2``i'''=`varscore2'
}
qui gengroup `rscore1``i''' , new(`vargroup1``i''') det
local seuil1=r(list)
*di "rscore1 et group1 item ``i''"
*tab `rscore1``i''' `vargroup1``i'''
local seuil1 "`seuil1' max"
local nbseuil1: word count `seuil1'
qui gen `vargroup2b``i'''=`rscore2``i'''
local t
forvalues j=1/`nbseuil1' {
if `j'==1 {
local seuilmin=0
}
else {
local seuilmin : word `=`j'-1' of `seuil1'
local seuilmin=`seuilmin'+1
local seuilmin=`seuilmax'+1
}
local seuilmax : word `j' of `seuil1'
if "`seuilmax'"!="max" {
if `seuilmax'<`seuilmin' {
local seuilmax `seuilmin'
}
}
local t `t' (`seuilmin'/`seuilmax'=`j')
}
*di "recode vargroup2b``i'' `t'"
qui recode `vargroup2b``i''' `t'
*di "rscore2 et group2 item ``i'' avant regroupage"
*tab `rscore2``i''' `vargroup2b``i'''
qui gengroup `vargroup2b``i''',new(`vargroup2``i''') det replace
local seuil2=r(list)
*di "rscore2 et group2 item ``i'' après regroupage"
*tab `rscore2``i''' `vargroup2``i'''
local seuil2 "`seuil2' max"
*di "``i'' seuil2 : `seuil2'"
local nbseuil2: word count `seuil2'
local t
forvalues j=1/`nbseuil2' {
if `j'==1 {
local seuilmin=1
}
else {
local seuilmin : word `=`j'-1' of `seuil2'
local seuilmin=`seuilmin'+1
local seuilmin=`seuilmax'+1
}
local seuilmax : word `j' of `seuil1'
if "`seuilmax'"!="max" {
if `seuilmax'<`seuilmin' {
local seuilmax `seuilmin'
}
}
local t `t' (`seuilmin'/`seuilmax'=`j')
}
*di "recode vargroup1``i'' `t'"
qui recode `vargroup1``i''' `t'
*di "rscore1 et group1 item ``i'' après regroupage"
*tab `rscore1``i''' `vargroup1``i'''
}
*tab `vargroup1itemA1' `vargroup2itemA1'
*exit
qui save `file3', replace
*exit
/*******************************************************************************
Quelques tests de conformité
*******************************************************************************/
qui su `varscore1'
local maxscore=r(max)
qui su `varscore2'
if `r(max)'>`maxscore' {
local maxscore=r(max)
}
forvalues i=1/`nbitems' {
qui su `vargroup1``i'''
local maxgroup``i''=r(max)
}
/* sauvegarde des données */
tempfile rsbynpirtfile rsbynpirtfile1 rsbynpirtfile2
tempvar score
qui save `rsbynpirtfile', replace
/*******************************************************************************
Représentation graphique des tracelines
*******************************************************************************/
forvalues i=1/`nbitems' {
tempfile file4
tempname mat``i''
matrix `mat``i'''=J(`=`maxgroup``i'''+2',9,0)
forvalues j=1/`maxgroup``i''' {
local k=`j'+1
matrix `mat``i'''[`k',1]=`j'
*tab `vargroup1``i'''
qui su ``i'' if `vargroup1``i'''==`j'
matrix `mat``i'''[`k',2]=`r(mean)'
matrix `mat``i'''[`k',4]=`r(N)'
local temp=`i'+`nbitems'
*tab `vargroup2``i''' `vargroup1``i'''
tab ``temp'' if `vargroup2``i'''==`j',m
qui su ``temp'' if `vargroup2``i'''==`j'
matrix `mat``i'''[`k',3]=`r(mean)'
matrix `mat``i'''[`k',5]=`r(N)'
qui su `rscore1``i''' if `vargroup1``i'''==`j'
matrix `mat``i'''[`k',6]=`r(mean)'
qui su `rscore2``i''' if `vargroup2``i'''==`j'
matrix `mat``i'''[`k',7]=`r(mean)'
}
local j=`maxgroup``i'''+2
matrix `mat``i'''[`j',1]=`maxgroup``i'''+1 /*numero du group*/
matrix `mat``i'''[`j',2]=`modamax`i'' /*mean item 1*/
matrix `mat``i'''[`j',3]=`modamax`i'' /*mean item 2*/
matrix `mat``i'''[`j',4]=0 /*frequency 1*/
matrix `mat``i'''[`j',5]=0 /*frequency 2*/
if "`restscore'"=="" {
local maxi=`scoremax'-`modamax`i''
}
else {
local maxi=`scoremax'
}
matrix `mat``i'''[`j',6]=`maxi' /*mean rest-score 1*/
matrix `mat``i'''[`j',7]=`maxi' /*mean rest-score 2*/
label values `vargroup1``i''' lblvarscore``i''
qui sort `vargroup1``i''' `vargroup2``i'''
qui save `file4',replace
forvalues j=1/`maxgroup``i''' {
qui count if `vargroup1``i'''==`j'
local n1=r(N)
qui su `rscore1``i''' if `vargroup1``i'''==`j'
local min1=r(min)
local max1=r(max)
qui count if `vargroup2``i'''==`j'
local n2=r(N)
qui su `rscore2``i''' if `vargroup2``i'''==`j'
local min2=r(min)
local max2=r(max)
local min=min(`min1',`min2')
local max=max(`max1',`max2')
label define lblvarscore``i'' `j' `""Scores `min'/`max'" "(n1=`n1';n2=`n2')""', add
}
label define lblvarscore``i'' 0 "Min", add
label define lblvarscore``i'' `=`maxgroup``i'''+1' "Max", add
qui drop _all
qui svmat `mat``i'''
qui rename `mat``i'''1 group
qui rename `mat``i'''2 e1
qui rename `mat``i'''3 e2
qui rename `mat``i'''6 rs1
qui rename `mat``i'''7 rs2
qui sort group
label values group lblvarscore``i''
label variable group "Groups of scores"
if "`graph'"=="" {
if "`graphbygroup'"!="" {
graph twoway (line e1 group ) (line e2 group ), title("Traceline of item ``i''") xtitle("") ytitle("Expected value of item ``i''", size(small)) ylabel(0(1)`modamax') xlabel(0(1)`=`maxgroup``i'''+1',valuelabel labsize(small) /*alternate*/) name("``i''", replace) legend(off)
}
else {
if "`restscore'"=="" {
local xtitle="Rest-score"
qui su rs1
local max=r(max)
qui su rs2
if `r(max)'>`max' {
local max=r(max)
}
}
else {
local xtitle="Score"
local max `maxscore'
}
graph twoway (line e1 rs1 ) (line e2 rs2 ), title("Traceline of item ``i''") xtitle("`xtitle'") ytitle("Expected value of item ``i''", size(small)) ylabel(0(1)`modamax') xlabel(0(1)`max',valuelabel labsize(small) /*alternate*/) name("auc``i''", replace) legend(off)
}
}
qui use `file4', replace
}
/*******************************************************************************
Calcul des AUC
*******************************************************************************/
local tests
forvalues i=1/`nbitems' {
local auc1`i'=0
local auc2`i'=0
forvalues g=1/`=`maxgroup``i'''+1' {
local k=`g'+1
local auc=(`mat``i'''[`g',2]+`mat``i'''[`k',2])/2*(`mat``i'''[`k',6]-`mat``i'''[`g',6])
local auc1`i'=`auc1`i''+`auc'
matrix `mat``i'''[`k',8]= `auc'
local auc=(`mat``i'''[`g',3]+`mat``i'''[`k',3])/2*(`mat``i'''[`k',7]-`mat``i'''[`g',7])
local auc2`i'=`auc2`i''+`auc'
matrix `mat``i'''[`k',9]= `auc'
}
local AUC``i''=`auc1`i''
local AUC``=`i'+`nbitems'''=`auc2`i''
local diffAUC``i''=`=`AUC``i'''-`AUC``=`i'+`nbitems'''''
return scalar AUC``i''=`auc1`i''
return scalar AUC``=`i'+`nbitems'''=`auc2`i''
local tests `tests' b``i''=(r(AUC``=`i'+`nbitems''')-r(AUC``i''))
}
/*******************************************************************************
Calcul des standard errors des AUC par bootstrap
*******************************************************************************/
*local abc=0
if "`bsauc'"=="" {
*di "on lance le bootstrap sur les AUC"
*set trace on
tempfile file2
qui save `file2', replace
qui use `file1', clear
capture qui bootstrap `tests' , rep(`nbaucbs') nol noh nodots : nopalera `varlist', nograph `restscore' nobsaabc nobsauc
local n=1
while (_rc!=0) {
di "`n'. The boostrap to obtain IC of the AUC has not been correctly performed, it is run again"
local ++n
capture qui bootstrap `tests' , rep(`nbaucbs') nol noh nodots : nopalera `varlist', nograph `restscore' nobsaabc nobsauc
}
tempname mbootstrap
matrix `mbootstrap'=r(table)
qui use `file2', clear
/*Création de la matrice p qui va permettre de décaler les ICC*/
tempname p
matrix `p'=J(`=(`scoremax'+1)*(`nbitems'+1)',`=`nbitems'*3+1',.)
forvalues s=0/`scoremax' {
matrix `p'[`=`s'+1',1]=`s'
forvalues i=1/`nbitems' {
matrix `p'[`=`s'+1',`=3*`i'-1']=`s'
}
}
forvalues i=1/`nbitems' {
forvalues s=0/`scoremax' {
qui su ``i'' if `varscore1'==`s'
matrix `p'[`=`s'+1',`=3*`i'']=r(mean)
}
forvalues s=0/`scoremax' {
qui su ``=`i'+`nbitems''' if `varscore2'==`s'
if `mbootstrap'[4,`i']>=0.05 {
matrix `p'[`=`s'+1',`=3*`i'+1']=r(mean)
local prec=1
local prec=0.01 /*pas d'arrondi*/
}
else {
if `nind'/`scoremax'>20 {
local prec=0.5
local prec=1
local prec=0.01 /*pas d'arrondi*/
}
else {
local prec=1
local prec=0.01 /*pas d'arrondi*/
}
matrix `p'[`=`i'*(`scoremax'+1)+`s'+1',`=3*`i'-1']=round(`s'+`mbootstrap'[1,`i']/(`modamax`i''),`prec')
matrix `p'[`=`i'*(`scoremax'+1)+`s'+1',`=3*`i'+1']=r(mean)
}
}
}
di
di "Research of uniform recalibration at item-level"
di
di "{hline 105}"
di _col(45) "Bootstrap" _col(78) " Normal-based"
di "Items" _col(18) "AUC t1" _col(28) "AUC t2" _col(38) "VarAUC" _col(45) "Std. Err." _col(63) "z" _col(70) "P>|z|" _col(78) "[95% Conf. Int.]" _col(96) "Correction"
di "{hline 105}"
forvalues i=1/`nbitems' {
local corr``i''=round(`mbootstrap'[1,`i']/(`modamax`i''),`prec')
di "``i''/``=`i'+`nbitems'''" _col(19) %5.2f `AUC``i''' _col(29) %5.2f `AUC``=`i'+`nbitems'''' _col(39) %5.2f `diffAUC``i''' _col(49) %5.2f `mbootstrap'[2,`i'] _col(59) %5.2f `mbootstrap'[3,`i'] _col(69) %5.4f `mbootstrap'[4,`i'] _col(79) %5.2f `mbootstrap'[5,`i'] _col(89) %5.2f `mbootstrap'[6,`i'] _col(100) %6.2f `corr``i'''
}
di "{hline 105}"
local abc=1
}
else {
*di "pas de bootstrap AUC"
local abc=1
}
*di "abc:`abc' bsAUC : `bsauc'"
/*******************************************************************************
Calcul des AABC et de leurs intervalles de confiance par boostrap
*******************************************************************************/
*set trace on
if `abc'==1 {
*di "on lance les AABC"
local testsb
forvalues i=1/`nbitems' {
if "`bsauc'"!="" { /*si pas de bootstrap pour AUC*/
*di "m1"
local sigAUC``i''=0
local rdiffAUC``i''=0
}
else if `mbootstrap'[4,`i']<0.05 { /* si bootstrap et significatif*/
*di "m2"
local sigAUC``i''=1
local rdiffAUC``i''=-`corr``i'''
di "The item ``i'' traceline is corrected of `corr``i'''"
}
else { /* si bootstrap et NS*/
*di "m3"
local sigAUC``i''=0
local rdiffAUC``i''=0
}
tempname mat2``i''
local nbl=`=`maxgroup``i'''*4+7'
matrix `mat2``i'''=J(`nbl',4,.)
matrix `mat2``i'''[1,2]=0
matrix `mat2``i'''[1,3]=0
matrix `mat2``i'''[`nbl',2]=`modamax`i''
matrix `mat2``i'''[`nbl',3]=`modamax`i''
local col1=1
local col2=1
local line=1
while (`line'<=`=`maxgroup``i'''*4+7') {
local t1=`mat``i'''[`col1',6]
local t2=`mat``i'''[`col2',7]-`rdiffAUC``i'''
local m2=`mat``i'''[`col1',2]
local m3=`mat``i'''[`col2',3]
if (`t1'<`t2'|(`t1'==`t2'&`m2'<`m3')) {
*di "m2 car `m2'<`m3'"
matrix `mat2``i'''[`line',1]=`t1'
matrix `mat2``i'''[`line',2]=`mat``i'''[`col1',2]
local ++col1
}
else {
*di "m3 car `m2'>`m3'"
matrix `mat2``i'''[`line',1]=`t2'
matrix `mat2``i'''[`line',3]=`mat``i'''[`col2',3]
local ++col2
}
local line=`line'+2
}
*matrix list `mat2``i'''
local j=1
while (`j'<=`nbl') {
foreach c in 2 3 {
if `mat2``i'''[`j',`c']==. {
local prec=`j'-2
local m=`mat2``i'''[`prec',`c']
while (`m'==.&`prec'>=0) {
local prec=`prec'-2
local m=`mat2``i'''[`prec',`c']
*di "prec:`prec' m: `m'"
}
local suiv=`j'+2
local m=`mat2``i'''[`suiv',`c']
while (`m'==.&`suiv'<=`nbl') {
local suiv=`suiv'+2
local m=`mat2``i'''[`suiv',`c']
*di "suiv:`suiv' m: `m'"
}
local yprec=`mat2``i'''[`prec',`c']
local ysuiv=`mat2``i'''[`suiv',`c']
local xprec=`mat2``i'''[`prec',1]
local xsuiv=`mat2``i'''[`suiv',1]
local x=`mat2``i'''[`j',1]
if (`xsuiv'!=`xprec') {
*di "matrix `mat2``i'''[`j',`c']=`yprec'+(`x'-`xprec')/(`xsuiv'-`xprec')*(`ysuiv'-`yprec')"
matrix `mat2``i'''[`j',`c']=`yprec'+(`x'-`xprec')/(`xsuiv'-`xprec')*(`ysuiv'-`yprec')
}
else {
matrix `mat2``i'''[`j',`c']=`mat2``i'''[`prec',`c']
}
}
}
local j=`j'+2
}
local j=2
*matrix list `mat2``i'''
while (`j'<`nbl') {
local prec=`j'-1
local suiv=`j'+1
local sign=(`mat2``i'''[`prec',2]-`mat2``i'''[`prec',3])*(`mat2``i'''[`suiv',2]-`mat2``i'''[`suiv',3])
*di "item ``i'', ligne `j', sign `sign'"
if (`sign'<0&`sign'!=.) {
local p1=(`mat2``i'''[`suiv',2]-`mat2``i'''[`prec',2])/(`mat2``i'''[`suiv',1]-`mat2``i'''[`prec',1])
local p2=(`mat2``i'''[`suiv',3]-`mat2``i'''[`prec',3])/(`mat2``i'''[`suiv',1]-`mat2``i'''[`prec',1])
if (`p1'==`p2') {
local cint=`mat2``i'''[`prec',1]
}
else {
local cint=`mat2``i'''[`prec',1]+(`mat2``i'''[`prec',3]-`mat2``i'''[`prec',2])/(`p1'-`p2')
}
matrix `mat2``i'''[`j',1]=`cint'
foreach c in 2 3 {
local yprec=`mat2``i'''[`prec',`c']
local ysuiv=`mat2``i'''[`suiv',`c']
local xprec=`mat2``i'''[`prec',1]
local xsuiv=`mat2``i'''[`suiv',1]
local x=`cint'
if (`xsuiv'==`xprec') {
matrix `mat2``i'''[`j',`c']=`mat2``i'''[`prec',`c']
}
else {
*di "matrix `mat2``i'''[`j',`c']=`yprec'+(`x'-`xprec')/(`xsuiv'-`xprec')*(`ysuiv'-`yprec')"
matrix `mat2``i'''[`j',`c']=`yprec'+(`x'-`xprec')/(`xsuiv'-`xprec')*(`ysuiv'-`yprec')
}
}
}
else {
local prec=`j'-1
forvalues c=1/3 {
matrix `mat2``i'''[`j',`c']=`mat2``i'''[`prec',`c']
}
}
local j=`j'+2
}
*matrix list `mat2``i'''
local aabc``i''=0
*set trace on
forvalues j=2/`nbl' {
local prec=`j'-1
local x=`mat2``i'''[`j',1]
local xprec=`mat2``i'''[`prec',1]
local y2=`mat2``i'''[`j',2]
local y3=`mat2``i'''[`j',3]
local yprec2=`mat2``i'''[`prec',2]
local yprec3=`mat2``i'''[`prec',3]
local aabc=(abs(`y2'-`y3')+abs(`yprec2'-`yprec3'))/2*abs(`x'-`xprec')
matrix `mat2``i'''[`j',4]=`aabc'
local aabc``i''=`aabc``i'''+`aabc'
}
return scalar AABC``i''=`aabc``i'''
*set trace off
local testsb `testsb' c``i''=r(AABC``i'')
*matrix list `mat2``i'''
*di "return scalar AABC``i''=`aabc``i'''"
*matrix list `mat2``i'''
}
*set trace on
if "`bsaabc'"=="" {
*di "on lance le bootstrap AABC"
tempfile file3
qui save `file3', replace
qui use `file1', clear
*di "bootstrap `testsb' , rep(`nbbootstrap') nol noh nodots saving(C:\Users\jean-\Documents\tmp\essai.dta, replace) : nopalera `varlist', fin nograph `restscore' nobsauc nobsaabc "
*set trace on
*set tracedepth 2
tempfile filebsaabc
*di "hello c'est l'heure du BS"
*qui bootstrap `testsb' , rep(`nbaabcbs') nol noh nodots saving("`filebsaabc'", replace) trace : nopalera `varlist', nograph `restscore' nobsauc nobsaabc
capture qui bootstrap `testsb' , rep(`nbaabcbs') saving("`filebsaabc'", replace) : nopalera `varlist', nograph `restscore' nobsauc nobsaabc
local n=1
while (_rc!=0) {
di "`n'. The boostrap to obtain IC of the AABC has not been correctly performed, it is run again"
local ++n
capture qui bootstrap `testsb' , rep(`nbaabcbs') saving("`filebsaabc'", replace) : nopalera `varlist', nograph `restscore' nobsauc nobsaabc
}
*return list
tempname mbootstrapb
matrix `mbootstrapb'=r(table)
*di "MATRIX mbootstrapb `mbootstrapb'"
*matrix list `mbootstrapb'
qui use "`filebsaabc'", replace
*su
local thres=`nbaabcbs'-ceil(`nbaabcbs'/20)
forvalues i=1/`nbitems' {
sort c``i''
qui su c``i'' in `thres'
local upper``i''=r(mean)
*di "Upper ``i'' : `upper``i'''"
}
di
di "Research of non-uniform recalibration at item-level"
di
di "{hline 103}"
di _col(36) "Bootstrap" _col(56) "Uniform" _col(72) "Non-uniform"
di "Items" _col(23) "AABC" _col(29) "[95% Conf. Int.]" _col(50) "Recalibration" _col(70) "Recalibration" _col(88) "Reprioritization"
di "{hline 103}"
forvalues i=1/`nbitems' {
local xur=""
local xnur=""
local xrep=""
if `mbootstrap'[4,`i']<=0.05 {
local xur="X"
}
if (`aabc``i'''>`upper``i'''&"`xur'"=="X") {
local xnur="X"
}
if (`aabc``i'''>`upper``i'''&"`xur'"=="") {
local xrep="X"
}
di "``i''/``=`i'+`nbitems'''" _col(23) %5.2f `aabc``i''' _col(36) "[" %1.0f 0 "-" %5.2f `upper``i''' "]" _col(62) "`xur'" _col(82) "`xnur'" _col(102) "`xrep'"
}
di "{hline 103}"
local abc=1
}
if "`graph'"=="" {
forvalues i=1/`nbitems' {
qui drop _all
qui svmat `mat2``i'''
qui rename `mat2``i'''1 score
qui rename `mat2``i'''2 t1
qui rename `mat2``i'''3 at2
qui sort score
if "`restscore'"=="" {
local xtitle="Rest-score"
qui su score
local max=r(max)
}
else {
local xtitle="Score"
local max `maxscore'
}
list *
graph twoway (line t1 score ) (line at2 score ) if score>0&score<=`maxscore', title("Traceline of item ``i''") xtitle("`xtitle'") ytitle("Expected value of item ``i''", size(small)) ylabel(0(1)`modamax') xlabel(0(1)`max',valuelabel labsize(small) /*alternate*/) name("aabc``i''", replace) legend(off)
}
}
}
qui restore , preserve
end