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
654 lines
22 KiB
Plaintext
7 months ago
|
*! 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
|
||
|
|
||
|
|