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.
182 lines
4.9 KiB
Plaintext
182 lines
4.9 KiB
Plaintext
9 months ago
|
*! Version 1 19 November 2008
|
||
|
*! Jean-Benoit Hardouin
|
||
|
************************************************************************************************************
|
||
|
* Stata program : guttmax
|
||
|
* Research of the maximal number of Guttman Errors for a specific score
|
||
|
*
|
||
|
* Historic :
|
||
|
* Version 1 (November 19, 2008) [Jean-Benoit Hardouin]
|
||
|
*
|
||
|
* Jean-benoit Hardouin, phD, Assistant Professor
|
||
|
* Team of Biostatistics, Clinical Research and Subjective Measures in Health Sciences (UPRES EA 4275)
|
||
|
* University of Nantes - Faculty of Pharmaceutical Sciences
|
||
|
* France
|
||
|
* jean-benoit.hardouin@anaqol.org
|
||
|
*
|
||
|
* Requiered Stata modules:
|
||
|
* -anaoption- (version 1)
|
||
|
* -traces- (version 3.2)
|
||
|
* -gengroup- (version 1)
|
||
|
*
|
||
|
* News about this program :http://www.anaqol.org
|
||
|
* FreeIRT Project website : http://www.freeirt.org
|
||
|
*
|
||
|
* Copyright 2008 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 guttmax , rclass
|
||
|
version 10
|
||
|
syntax anything [,Score(real -1) Response(string)]
|
||
|
|
||
|
if `score'!=-1&"`response'"!="" {
|
||
|
di in red "You cannot defined in the same time the score and the response options";
|
||
|
error 198
|
||
|
}
|
||
|
|
||
|
|
||
|
local step:word count `anything'
|
||
|
local nbitems=0
|
||
|
forvalues i=1/`step' {
|
||
|
local step`i':word `i' of `anything'
|
||
|
if `step`i''>`nbitems' {
|
||
|
local nbitems=`step`i''
|
||
|
}
|
||
|
}
|
||
|
di in green "Number of steps: " in ye `step'
|
||
|
di in green "Number of items: " in ye `nbitems'
|
||
|
tempname mate
|
||
|
matrix `mate'=J(1,`step',0)
|
||
|
|
||
|
|
||
|
if `score'!=-1 {
|
||
|
if `score'>`step' {
|
||
|
di in red "You cannot defined a score greater to the maximal possible score";
|
||
|
error 198
|
||
|
}
|
||
|
di in green "Score: " in ye `score'
|
||
|
local maxstep=0
|
||
|
forvalues i=1/`nbitems' {
|
||
|
local nstep`i'=0
|
||
|
forvalues j=1/`step' {
|
||
|
if `step`j''==`i' {
|
||
|
local ++nstep`i'
|
||
|
if `nstep`i''>`maxstep' {
|
||
|
local maxstep=`nstep`i''
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
|
||
|
tempname calcul
|
||
|
matrix `calcul'=J(`nbitems',`maxstep',0)
|
||
|
*matrix list `calcul'
|
||
|
forvalues i=1/`nbitems' {
|
||
|
*di "item `i'"
|
||
|
local n=1
|
||
|
forvalues j=1/`step' {
|
||
|
if `step`j''==`i' {
|
||
|
forvalues s=`n'/`nstep`i'' {
|
||
|
matrix `calcul'[`i',`s']=`calcul'[`i',`s']+`j'
|
||
|
matrix list `calcul'
|
||
|
}
|
||
|
local ++n
|
||
|
}
|
||
|
}
|
||
|
forvalues j=2/`nstep`i'' {
|
||
|
matrix `calcul'[`i',`j']=`calcul'[`i',`j']/`j'
|
||
|
di "j=`j'"
|
||
|
matrix list `calcul'
|
||
|
}
|
||
|
}
|
||
|
*matrix list `calcul'
|
||
|
|
||
|
while (`score'>0) {
|
||
|
local max=0
|
||
|
forvalues i=1/`nbitems' {
|
||
|
local s=min(`score',`nstep`i'')
|
||
|
*di "forvalues j=1/`s' {"
|
||
|
forvalues j=1/`s' {
|
||
|
if `calcul'[`i',`j']>`max' {
|
||
|
local maxi=`i'
|
||
|
local maxj=`j'
|
||
|
local max=`calcul'[`i',`j']
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
*di "maxi=`maxi' maxj=`maxj'"
|
||
|
local d=0
|
||
|
forvalues l=1/`step' {
|
||
|
if `step`l''==`maxi'&`mate'[1,`l']==0&`d'<=`maxj' {
|
||
|
matrix `mate'[1,`l']=1
|
||
|
local ++d
|
||
|
}
|
||
|
}
|
||
|
forvalues l=1/`maxj' {
|
||
|
matrix `calcul'[`maxi',`l']=0
|
||
|
}
|
||
|
local score=`score'-`maxj'
|
||
|
*matrix list `calcul'
|
||
|
}
|
||
|
}
|
||
|
else { /*if reponse*/
|
||
|
local nbrep: word count `response'
|
||
|
if `nbrep'!=`nbitems' {
|
||
|
di in red "You cannot defined a number of responses different of the number of items";
|
||
|
error 198
|
||
|
}
|
||
|
|
||
|
tempname cpt
|
||
|
qui matrix `cpt'=J(`nbitems',1,0)
|
||
|
forvalues i=1/`nbitems' {
|
||
|
local rep`i':word `i' of `response'
|
||
|
qui matrix `cpt'[`i',1]=`rep`i''
|
||
|
}
|
||
|
forvalues i=1/`step' {
|
||
|
if `cpt'[`step`i'',1]>0 {
|
||
|
qui matrix `mate'[1,`i']=1
|
||
|
qui matrix `cpt'[`step`i'',1]=`cpt'[`step`i'',1]-1
|
||
|
}
|
||
|
else {
|
||
|
qui matrix `mate'[1,`i']=0
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
local emax=0
|
||
|
|
||
|
forvalue i=1/`step' {
|
||
|
forvalues j=`=`i'+1'/`step' {
|
||
|
if `mate'[1,`i']==0&`mate'[1,`j']==1 {
|
||
|
local ++emax
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
|
||
|
|
||
|
if `score'!=-1 {
|
||
|
di in green "Responses profile generating the most important number of Guttman error"
|
||
|
matrix list `mate' ,noheader nonames
|
||
|
di in green "Max number of Guttman errors : " in ye `emax'
|
||
|
}
|
||
|
else {
|
||
|
di in green "Responses profile"
|
||
|
matrix list `mate' ,noheader nonames
|
||
|
di in green "Number of Guttman errors : " in ye `emax'
|
||
|
}
|
||
|
return scalar maxegutt =`emax'
|
||
|
end
|