*! Version 3.2 15January2020 *! 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*/ * Version 3.1 (2019-07-24): Jean-Benoit Hardouin /*Improvement*/ * Version 3.2 (2020-01-10): Jean-Benoit Hardouin /*outputs for simulations*/ * * 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-2020 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''' } tempname matnopalera matAUC matAABC matrix `matnopalera'=J(`nbitems',3,0) matrix `matAUC'=J(`nbitems',4,0) matrix `matAABC'=J(`nbitems',4,0) 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 count if `vargroup1``i'''==`j' if `r(N)'==0 { local bsauc nobsauc local bsaabc nobsaabc matrix `mat``i'''[`k',2]=. matrix `mat``i'''[`k',4]=. matrix `mat``i'''[`k',6]=. } else { qui su ``i'' if `vargroup1``i'''==`j' matrix `mat``i'''[`k',2]=`r(mean)' matrix `mat``i'''[`k',4]=`r(N)' qui su `rscore1``i''' if `vargroup1``i'''==`j' matrix `mat``i'''[`k',6]=`r(mean)' } local temp=`i'+`nbitems' qui count if `vargroup2``i'''==`j' if `r(N)'==0 { local bsauc nobsauc local bsaabc nobsaabc matrix `mat``i'''[`k',3]=. matrix `mat``i'''[`k',5]=. matrix `mat``i'''[`k',7]=. } else { qui su ``temp'' if `vargroup2``i'''==`j' matrix `mat``i'''[`k',3]=`r(mean)' matrix `mat``i'''[`k',5]=`r(N)' 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'' matrix `matAUC'[`i',1]=`AUC``i''' matrix `matAUC'[`i',2]=`AUC``=`i'+`nbitems'''' matrix `matAUC'[`i',3]=`diffAUC``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&`n'<10) { 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''' matrix `matAUC'[`i',4]=`mbootstrap'[2,`i'] } di "{hline 105}" local abc=1 } else { *di "pas de bootstrap AUC" di di "Research of uniform recalibration at item-level" di di "{hline 105}" di "Items" _col(48) "AUC t1" _col(58) "AUC t2" di "{hline 105}" forvalues i=1/`nbitems' { * local corr``i''=round(`mbootstrap'[1,`i']/(`modamax`i''),`prec') di "``i''/``=`i'+`nbitems'''" _col(49) %5.2f `AUC``i''' _col(59) %5.2f `AUC``=`i'+`nbitems'''' } di "{hline 105}" local abc=1 } *di "abc:`abc' bsAUC : `bsauc'" *return matrix AUC=`matAUC' /******************************************************************************* 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''' matrix `matAABC'[`i',1]=`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&`n'<50) { 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" matrix `matnopalera'[`i',1]=1 } if (`aabc``i'''>`upper``i'''&"`xur'"=="X") { local xnur="X" matrix `matnopalera'[`i',2]=1 } if (`aabc``i'''>`upper``i'''&"`xur'"=="") { local xrep="X" matrix `matnopalera'[`i',3]=1 } matrix `matAABC'[`i',2]=`upper``i''' 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) } } } return matrix matnopalera=`matnopalera' return matrix AUC=`matAUC' return matrix AABC=`matAABC' qui restore , preserve end