Computed theoretical power for N=100 and N=200 scenarios
This commit is contained in:
18
Modules/ado/personal/n/nbmiss.ado
Normal file
18
Modules/ado/personal/n/nbmiss.ado
Normal file
@ -0,0 +1,18 @@
|
||||
program define nbmiss
|
||||
version 8.0
|
||||
syntax varlist(min=1) [, nbmiss(string)]
|
||||
|
||||
if "`nbmiss'"=="" {
|
||||
local nbmiss nbmiss
|
||||
}
|
||||
|
||||
local nbitems:word count `varlist'
|
||||
tokenize `varlist'
|
||||
|
||||
qui gen `nbmiss'=0
|
||||
|
||||
forvalues i=1/`nbitems' {
|
||||
qui replace `nbmiss'=`nbmiss'+1 if ``i''==.
|
||||
}
|
||||
end
|
||||
|
15
Modules/ado/personal/n/nbvalues.ado
Normal file
15
Modules/ado/personal/n/nbvalues.ado
Normal file
@ -0,0 +1,15 @@
|
||||
/*version au 17 juillet 2015 : ajout de if*/
|
||||
|
||||
capture program drop nbvalues
|
||||
program define nbvalues,rclass
|
||||
version 7.0
|
||||
syntax varlist(min=1 max=1) [if]
|
||||
|
||||
qui tabulate `varlist' `if',matrow(nbvalues)
|
||||
|
||||
local nrow=rowsof(nbvalues)
|
||||
|
||||
di "la variable `varlist' contient `nrow' valeurs differentes"
|
||||
return scalar nrow=`nrow'
|
||||
end
|
||||
|
703
Modules/ado/personal/n/nopalera.ado
Normal file
703
Modules/ado/personal/n/nopalera.ado
Normal file
@ -0,0 +1,703 @@
|
||||
*! 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
|
||||
|
||||
|
322
Modules/ado/personal/n/nopalerav2.1.ado
Normal file
322
Modules/ado/personal/n/nopalerav2.1.ado
Normal file
@ -0,0 +1,322 @@
|
||||
*! Version 2.1 13December2017
|
||||
************************************************************************************************************
|
||||
* nopalera : NOPALERA algorithm
|
||||
* Version 2: October 24, 2015
|
||||
*
|
||||
* 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*/
|
||||
*
|
||||
* 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 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) [, noGraph noBootstrap corr(numlist) NBBootstrap(int 10)]
|
||||
|
||||
set more off
|
||||
tempfile file1 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: `nbbootstrap'"
|
||||
|
||||
/*******************************************************************************
|
||||
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'''
|
||||
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''
|
||||
}
|
||||
}
|
||||
qui save `file3', replace
|
||||
|
||||
/*******************************************************************************
|
||||
Quelques tests de conformité
|
||||
*******************************************************************************/
|
||||
if `flag'==1 {
|
||||
*di as error "The lower answer category of each item must be 0"
|
||||
*exit
|
||||
}
|
||||
|
||||
qui su `varscore1'
|
||||
local maxscore=r(max)
|
||||
qui su `varscore1'
|
||||
if `r(max)'>`maxscore' {
|
||||
local maxscore=r(max)
|
||||
}
|
||||
|
||||
/* sauvegarde des données */
|
||||
tempfile rsbynpirtfile rsbynpirtfile1 rsbynpirtfile2
|
||||
tempvar score
|
||||
qui save `rsbynpirtfile', replace
|
||||
|
||||
/*On récupère les données des ICC au temps 1 puis au temps 2*/
|
||||
qui traces `listofitems1', nograph icc saveicc
|
||||
qui drop _all
|
||||
tempname mat1
|
||||
qui matrix `mat1'=r(matscore)
|
||||
qui svmat `mat1', names(t1item)
|
||||
forvalues i=1/`nbitems' {
|
||||
local j: word `i' of `listofitems1'
|
||||
qui rename t1item`i' `j'
|
||||
}
|
||||
qui rename t1item`=`nbitems'+1' `score'
|
||||
qui contract `score' `listofitems1'
|
||||
qui sort `score'
|
||||
qui save `rsbynpirtfile1', replace
|
||||
|
||||
qui use `rsbynpirtfile', clear
|
||||
qui traces `listofitems2', nograph icc saveicc
|
||||
qui drop _all
|
||||
tempname mat2
|
||||
qui matrix `mat2'=r(matscore)
|
||||
qui svmat `mat2', names(t2item)
|
||||
|
||||
/*puis on fait un seul fichier avec les deux jeux de données*/
|
||||
forvalues i=1/`nbitems' {
|
||||
local j: word `i' of `listofitems2'
|
||||
qui rename t2item`i' `j'
|
||||
}
|
||||
qui rename t2item`=`nbitems'+1' `score'
|
||||
qui contract `score' `listofitems2'
|
||||
qui sort `score'
|
||||
qui merge 1:1 `score' using `rsbynpirtfile1'
|
||||
|
||||
/*représentation simultanée des ICC aux deux temps pour chaque item*/
|
||||
if "`graph'"=="" {
|
||||
forvalues i=1/`nbitems' {
|
||||
twoway (line ``i'' `score') (line ``=`i'+`nbitems''' `score'), name(``i'',replace)
|
||||
}
|
||||
}
|
||||
qui drop if `score'==0|`score'==`scoremax'
|
||||
|
||||
/*calcul des deux AUC pour chaque item*/
|
||||
local tests
|
||||
forvalues i=1/`nbitems' {
|
||||
qui su ``i''
|
||||
local AUC``i''=r(mean)
|
||||
local AUC``i''=(`AUC``i'''*`scoremax')
|
||||
qui su ``=`i'+`nbitems'''
|
||||
local AUC`=`i'+`nbitems''=r(mean)
|
||||
local AUC`=`i'+`nbitems''=(`AUC`=`i'+`nbitems'''*`scoremax')
|
||||
tempname diff``i''
|
||||
gen `diff``i'''=abs(``i''-``=`i'+`nbitems''')
|
||||
qui su `diff``i'''
|
||||
local d``i''=`r(sum)'/(`scoremax'*`modamax`i'')*100
|
||||
local var``i''=`r(sd)'*100
|
||||
return scalar AUC``i''=`AUC``i'''
|
||||
return scalar AUC``=`i'+`nbitems'''=`AUC`=`i'+`nbitems'''
|
||||
local tests `tests' b``i''=(r(AUC``=`i'+`nbitems''')-r(AUC``i''))
|
||||
}
|
||||
|
||||
local abc=0
|
||||
|
||||
|
||||
/* 10 bootstrap pour estimer les intervalles de confiance des différences entre les deux AUC*/
|
||||
if "`bootstrap'"=="" {
|
||||
tempfile file2
|
||||
qui save `file2', replace
|
||||
qui use `file1', clear
|
||||
qui bootstrap `tests' , rep(`nbbootstrap') nol noh nodots : nopalera `varlist', nograph nobootstrap
|
||||
tempname mbootstrap
|
||||
matrix `mbootstrap'=r(table)
|
||||
*matrix list `mbootstrap'
|
||||
qui use `file3', clear
|
||||
*set trace on
|
||||
set tracedepth 1
|
||||
|
||||
/*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'
|
||||
*di "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)
|
||||
}
|
||||
}
|
||||
}
|
||||
*matrix list `p'
|
||||
*matrix list `p'
|
||||
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' {
|
||||
di "``i''/``=`i'+`nbitems'''" _col(19) %5.2f `AUC``i''' _col(29) %5.2f `AUC`=`i'+`nbitems''' _col(39) %5.2f `=`AUC``i'''-`AUC`=`i'+`nbitems'''' _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 round(`mbootstrap'[1,`i']/(`modamax`i''),`prec')
|
||||
}
|
||||
di "{hline 105}"
|
||||
local abc=1
|
||||
}
|
||||
if `abc'==1 {
|
||||
drop _all
|
||||
qui svmat `p'
|
||||
qui rename `p'1 score
|
||||
local testsb
|
||||
forvalues i=1/`nbitems' {
|
||||
qui rename `p'`=`i'*3-1' score``i''
|
||||
qui rename `p'`=`i'*3' t1``i''
|
||||
qui rename `p'`=`i'*3+1' t2``i''
|
||||
/*interpolation linéaire et nouvelles ICC corrigées*/
|
||||
qui ipolate t2``i'' score``i'' , generate(t2adj``i'')
|
||||
forvalues j=0/`=floor(round(`mbootstrap'[1,`i']/(`modamax`i''),`prec'))' {
|
||||
qui replace t2adj``i''=0 if score``i''==`j'&t2adj``i''==.
|
||||
}
|
||||
forvalues j=`=`scoremax'+floor(round(`mbootstrap'[1,`i']/(`modamax`i''),`prec'))'/`scoremax' {
|
||||
qui replace t2adj``i''=1 if score``i''==`j'&t2adj``i''==.
|
||||
}
|
||||
qui gen diff``i''=abs(t2adj``i''-t1``i'')
|
||||
qui su diff``i''
|
||||
local ABC``i''=`r(mean)'*`scoremax'
|
||||
return scalar ABC``i''=`ABC``i'''
|
||||
if "`graph'"=="" {
|
||||
qui sort score``i''
|
||||
qui gen scoreunadj``i''=score``i''-round(`mbootstrap'[1,`i']/(`modamax`i''),`prec')
|
||||
*twoway (line t1``i'' score``i'')(line t2``i'' score``i'')(line t2adj``i'' score``i'') ,name(``i''c,replace)
|
||||
twoway (line t1``i'' score``i'')(line t2``i'' scoreunadj``i'')(line t2adj``i'' score``i'') ,name(``i''c,replace)
|
||||
*di "twoway (line t1``i'' score``i'')(line t2``i'' score``i'')(line t2adj``i'' score``i'') ,name(``i''c,replace)"
|
||||
*su
|
||||
}
|
||||
local testsb `testsb' c``i''=(r(ABC``i''))
|
||||
|
||||
}
|
||||
|
||||
/* 10 bootstrap pour estimer les intervalles de confiance des ABC*/
|
||||
if "`bootstrap'"=="" {
|
||||
tempfile file3
|
||||
qui save `file3', replace
|
||||
qui use `file1', clear
|
||||
qui bootstrap `tests' , rep(`nbbootstrap') nol noh nodots : nopalera `varlist', nograph nobootstrap
|
||||
tempname mbootstrapb
|
||||
matrix `mbootstrapb'=r(table)
|
||||
*matrix list `mbootstrapb'
|
||||
di
|
||||
di "Research of non-uniform recalibration at item-level"
|
||||
di
|
||||
di "{hline 77}"
|
||||
di _col(29) "Bootstrap" _col(62) " Normal-based"
|
||||
di "Items" _col(24) "ABC" _col(29) "Std. Err." _col(47) "z" _col(54) "P>|z|" _col(62) "[95% Conf. Int.]"
|
||||
di "{hline 77}"
|
||||
forvalues i=1/`nbitems' {
|
||||
local z`i'=`ABC``i'''/`mbootstrapb'[2,`i']
|
||||
local p`i'=2*(1-normal(abs(`z`i'')))
|
||||
di "``i''/``=`i'+`nbitems'''" _col(23) %5.2f `ABC``i''' _col(33) %5.2f `mbootstrapb'[2,`i'] _col(43) %5.2f `z`i'' _col(53) %5.4f `p`i'' _col(63) %5.2f `=`ABC``i'''-1.96*`mbootstrapb'[2,`i']' _col(73) %5.2f `=`ABC``i'''+1.96*`mbootstrapb'[2,`i']'
|
||||
}
|
||||
di "{hline 77}"
|
||||
local abc=1
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
|
||||
if "`bootstrap'"=="" {
|
||||
return matrix p=`p'
|
||||
}
|
||||
qui restore , preserve
|
||||
end
|
||||
|
||||
|
653
Modules/ado/personal/n/nopalerav3.ado
Normal file
653
Modules/ado/personal/n/nopalerav3.ado
Normal file
@ -0,0 +1,653 @@
|
||||
*! 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
|
||||
|
||||
|
Reference in New Issue
Block a user