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.
802 lines
26 KiB
Plaintext
802 lines
26 KiB
Plaintext
10 months ago
|
*! version 4.5 March 21, 2022
|
||
1 year ago
|
*! Jean-Benoit Hardouin
|
||
|
************************************************************************************************************
|
||
|
* Simirt: Simulation of dichotomous or polytomous data following an IRT model (Rasch model,
|
||
|
* OPLM, Birnbaum model, 3-PLM, 4-PLM, 5-PAM, RSM,PCM)
|
||
|
*
|
||
|
* Version 1 : May 9, 2005 (Jean-Benoit Hardouin)
|
||
|
* Version 1.1 : December 8, 2005 (Jean-Benoit Hardouin) /*group and deltagroup options*/
|
||
|
* Version 2 : January 20, 2006 (Jean-Benoit Hardouin) /*Rating Scale model*/
|
||
|
* Version 2.1 : Februar 2, 2006 (Jean-Benoit Hardouin) /*Threshold variables*/
|
||
|
* Version 2.2 : Februar 8, 2006 (Jean-Benoit Hardouin) /*Correction of an error with the RSM model*/
|
||
|
* Version 2.3 : October 22, 2006 (Jean-Benoit Hardouin) /*The "real" rating scale model*/
|
||
|
* Version 2.4 : July 7, 2008 (Jean-Benoit Hardouin) /*Title for the graphs*/
|
||
|
* Version 3 : October 14, 2008 (Jean-Benoit Hardouin) /*3 dimensions + correction for the mu vector*/
|
||
|
* Version 3.1 : December 11, 2008 (Jean-Benoit Hardouin) /*remove an useless output*/
|
||
|
* Version 3.2 : November 26, 2009 (Jean-Benoit Hardouin) /*covmatrix option*/
|
||
|
* Version 3.3 : October 25, 2011 (Jean-Benoit Hardouin) /*pcm option*/
|
||
|
* Version 3.4 : May 7, 2013 (Jean-Benoit Hardouin) /*Minor corrections, norandom option*/
|
||
|
* Version 3.5 : May 16, 2013 (Jean-Benoit Hardouin) /*Minor corrections*/
|
||
|
* Version 4 : December 11, 2013 (Jean-Benoit Hardouin, Myriam Blanchin) /*GPCM + genp, genicc, icc options*/
|
||
|
* Version 4.1 : December 17, 2013 (Jean-Benoit Hardouin, Myriam Blanchin) /*drawall option*/
|
||
|
* Version 4.2 : June 19, 2018 (Jean-Benoit Hardouin) /*correction of a small bug with rsm2 option*/
|
||
|
* Version 4.3 : August 29, 2019 (Jean-Benoit Hardouin) /*correction of a small bug with store option*/
|
||
10 months ago
|
* Version 4.4 : March 21, 2022 (Jean-Benoit Hardouin) /*correction of a small bug with store option*/
|
||
1 year ago
|
*
|
||
|
* Jean-benoit Hardouin, phD, Assistant Professor
|
||
|
* Team of Biostatistics, Pharmacoepidemiology and Subjective Measures in Health Sciences (UPRES EA 4275 SPHERE)
|
||
|
* University of Nantes - Faculty of Pharmaceutical Sciences
|
||
|
* France
|
||
|
* jean-benoit.hardouin@univ-nantes.fr
|
||
|
*
|
||
|
* News about this program : http://www.anaqol.org
|
||
|
*
|
||
10 months ago
|
* Copyright 2005-2006, 2008-2009, 2011, 20130 2018, 2019, 2022 Jean-Benoit Hardouin
|
||
1 year ago
|
*
|
||
|
* 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 simirt , rclass
|
||
|
version 8.0
|
||
12 months ago
|
syntax [, NBObs(integer 2000) Dim(string) MU(string) COV(string) COVMatrix(string) DISc(string) DIFf(string) PMIN(string) PMAX(string) ACC(string) clear STOre(string) REPlace PREFix(string) DRAW drawall ICC GRoup(real 0) noRANDom DELtagroup(real 0) rsm1(string) rsm2(string) THReshold TITle(string) PCM(string) id(string) GENProba GENIcc]
|
||
1 year ago
|
|
||
|
|
||
|
/********************************************************************************
|
||
|
TESTS
|
||
|
********************************************************************************/
|
||
|
|
||
|
|
||
|
if `group'<0|`group'>1 {
|
||
|
di in red "{p}The {hi:group} option defines a probability. The values defined by this option must be greater (or equal) to 0 and lesser (or equal) to 1.{p_end}"
|
||
|
error 198
|
||
|
exit
|
||
|
}
|
||
|
|
||
|
if "`clear'"==""&"`store'"=="" {
|
||
|
di in red "You must use at least one of these two options: clear and/or store."
|
||
|
error 198
|
||
|
exit
|
||
|
}
|
||
|
|
||
|
if "`dim'"!="" {
|
||
|
local nbdim:word count `dim'
|
||
|
if `nbdim'>2&"`covmatrix'"=="" {
|
||
|
di in red "You can simulate data with one or two dimensions, and you have indicated `nbdim' dimensions in the {hi:dim} option. Please correct it."
|
||
|
error 198
|
||
|
exit
|
||
|
}
|
||
|
if "`covmatrix'"!="" {
|
||
|
local nbrowcovm=rowsof(`covmatrix')
|
||
|
if `nbdim'!=`nbrowcovm' {
|
||
|
di in red "{p 0 0 0}You define `nbdim' dimension(s) with the {cmd:dim} option and `nbrowcovm' dimension(s) with the {cmd:covmatrix} option. Please correct that."
|
||
|
error 198
|
||
|
exit
|
||
|
}
|
||
|
}
|
||
|
local nbitems=0
|
||
|
forvalues d=1/`nbdim' {
|
||
|
local dim`d':word `d' of `dim'
|
||
|
local nbitems=`nbitems'+`dim`d''
|
||
|
}
|
||
|
local dim=`nbdim'
|
||
|
|
||
|
if "`diff'"!="" {
|
||
|
local nbdiff:word count `diff'
|
||
|
local tmp:word 1 of `diff'
|
||
|
if "`tmp'"=="gauss"|"`tmp'"=="uniform" {
|
||
|
local typediff values
|
||
|
}
|
||
|
else if `nbdiff'!=`nbitems' {
|
||
|
di in red "You have indicated a number of difficulty parameters ({hi:diff} option) different of the number of items to simulate ({hi:dim} option). Please correct these options."
|
||
|
error 198
|
||
|
exit
|
||
|
}
|
||
|
}
|
||
|
else if "`diff'"=="" {
|
||
|
local diff gauss
|
||
|
forvalues d=1/`dim' {
|
||
|
local diff `diff' 0 1
|
||
|
}
|
||
|
local typediff gauss
|
||
|
local nbdiff:word count `diff'
|
||
|
}
|
||
|
}
|
||
|
else if "`dim'"==""{
|
||
|
if "`diff'"==""&"`pcm'"=="" {
|
||
|
di in red "{p 0 0 0}You must indicate the number of items to simulate with the {hi:dim}, the {hi:pcm} or the {hi:diff} option(s)."
|
||
|
error 198
|
||
|
exit
|
||
|
}
|
||
|
else if "`covmatrix'"!= "" {
|
||
|
local nbrowcovm=rowsof(`covmatrix')
|
||
|
if `nbrowcovm'>1 {
|
||
|
di in red "{p 0 0 0}You have define `nbrowcovm' dimensions with the {hi:covmatrix} option, but you do not affect each item to a specific dimension using the {hi:dim} option. Please define the {hi:dim} option."
|
||
|
error 198
|
||
|
exit
|
||
|
}
|
||
|
}
|
||
|
else if "`pcm'"!="" {
|
||
|
local nbitems=rowsof(`pcm')
|
||
|
local dim=1
|
||
|
local dim1=`nbitems'
|
||
|
}
|
||
|
else {
|
||
|
local nbdiff:word count `diff'
|
||
|
local nbitems=`nbdiff'
|
||
|
local dim=1
|
||
|
local dim1=`nbitems'
|
||
|
}
|
||
|
}
|
||
|
|
||
|
if (`group'!=0|`deltagroup'!=0)&`dim'!=1 {
|
||
|
di in red "The {hi:group} and the {hi:deltagroup} options are available only with unidimensional simulated data."
|
||
|
error 198
|
||
|
exit
|
||
|
}
|
||
|
|
||
|
if "`prefix'"=="" {
|
||
|
local prefix item
|
||
|
}
|
||
|
|
||
|
local nbprefix:word count `prefix'
|
||
|
if `nbprefix'!=`dim'&`nbprefix'!=1 {
|
||
|
di in red "{p 0 0 0}The {hi:prefix} option is incorrect because the number of defined prefixes (`nbprefix') is different of the number of dimensions (`dim'). Please correct it."
|
||
|
error 198
|
||
|
exit
|
||
|
}
|
||
|
if `nbprefix'==`dim' {
|
||
|
forvalues d=1/`dim' {
|
||
|
local prefix`d':word `d' of `prefix'
|
||
|
}
|
||
|
}
|
||
|
else {
|
||
|
forvalues d=1/`dim' {
|
||
|
local tmp:word `d' of A B C D E F G H I J K L M N O P Q R S T U V W X Y Z
|
||
|
local prefix`d' `prefix'`tmp'
|
||
|
}
|
||
|
}
|
||
|
if "`covmatrix'"=="" {
|
||
|
tempname covmatrix2
|
||
|
local nbcov:word count `cov'
|
||
|
|
||
|
if `dim'==1 {
|
||
|
if "`cov'"=="" {
|
||
|
local cov=1
|
||
|
}
|
||
|
if `nbcov'>1 {
|
||
|
di in red "You simulate one dimension. You must indicate only the variance of the simulated latent trait in the {hi:cov} option."
|
||
|
error 198
|
||
|
exit
|
||
|
}
|
||
|
if `cov'<0 {
|
||
|
di in red "The variance of your latent trait can not be negative. Please correct your {hi:cov} option."
|
||
|
error 198
|
||
|
}
|
||
|
matrix `covmatrix2'=(`cov')
|
||
|
}
|
||
|
else if `dim'==2 {
|
||
|
if `nbcov'!=3&`nbcov'>0 {
|
||
|
di in red "You simulate two dimensions. You must indicate exactly 3 values in the {hi:cov} option (Variance of the first simulated latent trait, Variance of the second simulated latent trait, Covariance between the two simulated latent traits)."
|
||
|
error 198
|
||
|
exit
|
||
|
}
|
||
|
else if `nbcov'==0 {
|
||
|
if `dim'==1 {
|
||
|
local cov "1"
|
||
|
}
|
||
|
else if `dim'==2 {
|
||
|
local cov "1 1 0"
|
||
|
}
|
||
|
local nbcov:word count `cov'
|
||
|
}
|
||
|
if `nbcov'==3 {
|
||
|
local cov1:word 1 of `cov'
|
||
|
local cov2:word 2 of `cov'
|
||
|
local cov3:word 3 of `cov'
|
||
|
local rho=`cov3'/sqrt(`cov1'*`cov2')
|
||
|
if `cov1'<0|`cov2'<0|`rho'<-1|`rho'>1 {
|
||
|
di in red "Your covariance matrix defined by the {hi:cov} option is not correct. Please correct it."
|
||
|
error 198
|
||
|
exit
|
||
|
}
|
||
|
}
|
||
|
matrix `covmatrix2'=(`cov1' , `cov3' \ `cov3' , `cov2')
|
||
|
}
|
||
|
local covmatrix `covmatrix2'
|
||
|
}
|
||
|
|
||
|
local nbmu:word count `mu'
|
||
|
if `nbmu'!=`dim'&`nbmu'!=0 {
|
||
|
di in red "You must indicate as many values in the {hi:mu} option as the number of dimension(s) (`dim')"
|
||
|
error 198
|
||
|
exit
|
||
|
}
|
||
|
local nbdisc:word count `disc'
|
||
|
if `nbdisc'!=`nbitems'&`nbdisc'!=0 {
|
||
|
di in red "You must indicate as many values in the {hi:disc} option as items defined by the {hi:dim} and the {hi:diff} options (`nbitems')"
|
||
|
error 198
|
||
|
exit
|
||
|
}
|
||
|
local nbpmin:word count `pmin'
|
||
|
if `nbpmin'!=`nbitems'&`nbpmin'!=0 {
|
||
|
di in red "You must indicate as many values in the {hi:pmin} option as items defined by the {hi:dim} and the {hi:diff} options (`nbitems')"
|
||
|
error 198
|
||
|
exit
|
||
|
}
|
||
|
local nbpmax:word count `pmax'
|
||
|
if `nbpmax'!=`nbitems'&`nbpmax'!=0 {
|
||
|
di in red "You must indicate as many values in the {hi:pmax} option as items defined by the {hi:dim} and the {hi:diff} options (`nbitems')"
|
||
|
error 198
|
||
|
exit
|
||
|
}
|
||
|
local nbacc:word count `acc'
|
||
|
if `nbacc'!=`nbitems'&`nbacc'!=0 {
|
||
|
di in red "You must indicate as many values in the {hi:acc} option as items defined by the {hi:dim} and the {hi:diff} options (`nbitems')"
|
||
|
error 198
|
||
|
exit
|
||
|
}
|
||
|
|
||
|
if ("`threshold'"!="")&("`disc'"!=""|"`pmin'"!=""|"`pmax'"!=""|"`acc'"!="") {
|
||
|
di in red "If you use the {hi:threshold} option, you cannot define the {hi:disc}, {hi:pmin}, {hi:pmax} or {hi:acc} options"
|
||
|
error 198
|
||
|
exit
|
||
|
}
|
||
|
if ("`rsm1'"!=""|"`rsm2'"!="")&("`pmin'"!=""|"`pmax'"!=""|"`acc'"!="") {
|
||
|
di in red "If you use the {hi:rsm1} and/or {hi:rsm2} option(s), you cannot define the {hi:pmin}, {hi:pmax} or {hi:acc} options"
|
||
|
error 198
|
||
|
exit
|
||
|
}
|
||
|
if ("`pcm'"!="")&("`pmin'"!=""|"`pmax'"!=""|"`acc'"!="") {
|
||
|
di in red "If you use the {hi:pcm} option, you cannot define the {hi:pmin}, {hi:pmax} or {hi:acc} options"
|
||
|
error 198
|
||
|
exit
|
||
|
}
|
||
|
if ("`rsm1'"!=""|"`rsm2'"!="")&("`pcm'"!="") {
|
||
|
di in red "You cannot use in the same time the {hi:rsm1} and/or {hi:rsm2} options with the {hi:pcm} option"
|
||
|
error 198
|
||
|
exit
|
||
|
}
|
||
|
if "`rsm2'"!=""&`dim'==1 {
|
||
|
di in red "You cannot define the {hi:rsm2} option if you simulate only one dimension"
|
||
|
error 198
|
||
|
exit
|
||
|
}
|
||
|
if "`id'"=="" {
|
||
|
local id="id"
|
||
|
}
|
||
|
|
||
|
preserve
|
||
|
|
||
|
tempfile saveraschbin
|
||
|
capture qui save `saveraschbin'
|
||
|
|
||
|
|
||
|
|
||
|
|
||
|
/********************************************************************************
|
||
|
PARAMETERS
|
||
|
********************************************************************************/
|
||
|
|
||
|
|
||
|
local hour=real(substr("$S_TIME",1,2))
|
||
|
local min=real(substr("$S_TIME",4,2))
|
||
|
local sec=real(substr("$S_TIME",7,2))
|
||
|
local jour=real(substr("$S_DATE",1,2))
|
||
|
|
||
|
|
||
|
|
||
|
|
||
|
if "$seed"!="" {
|
||
|
global seed2=int($seed)
|
||
|
}
|
||
|
else {
|
||
|
global seed2=0
|
||
|
}
|
||
|
global seed=$seed2+256484+`sec'*1000000+`min'*10000+`hour'*100+`jour'
|
||
|
while $seed>2^31-1 {
|
||
|
global seed=int($seed/231)
|
||
|
}
|
||
|
qui set seed $seed
|
||
|
|
||
|
if "`typediff'"=="uniform" {
|
||
|
if `nbdiff'==`=`dim'*2+1' {
|
||
|
local min`d':word `=(`d'-1)*2+2' of `diff'
|
||
|
local max`d':word `=(`d'-1)*2+3' of `diff'
|
||
|
}
|
||
|
else if `nbdiff'==1 {
|
||
|
local min`d'=-2
|
||
|
local max`d'=2
|
||
|
}
|
||
|
else {
|
||
|
di in red "Your {hi:diff} option is uncorrect. Please correct it."
|
||
|
exit
|
||
|
}
|
||
|
local diff
|
||
|
forvalues d=1/`dim' {
|
||
|
forvalues i=1/`dim`d'' {
|
||
|
local diff `diff' `=`min`d''+(`max`d''-`min`d'')*`i'/(`dim`d''+1)'
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
else if "`typediff'"=="gauss" {
|
||
|
if `nbdiff'==`=`dim'*2+1' {
|
||
|
forvalues d=1/`dim' {
|
||
|
local mean`d':word `=(`d'-1)*2+2' of `diff'
|
||
|
local var`d':word `=(`d'-1)*2+3' of `diff'
|
||
|
}
|
||
|
}
|
||
|
else if `nbdiff'==1 {
|
||
|
forvalues d=1/`dim' {
|
||
|
local mean`d'=0
|
||
|
local var`d'=1
|
||
|
}
|
||
|
}
|
||
|
else {
|
||
|
di in red "Your {hi:diff} option is uncorrect. Please correct it."
|
||
|
error 198
|
||
|
exit
|
||
|
}
|
||
|
local diff
|
||
|
forvalues d=1/`dim' {
|
||
|
forvalues i=1/`dim`d'' {
|
||
|
local tmp=invnorm(`i'/(`dim`d''+1))*sqrt(`var`d'')+`mean`d''
|
||
|
local diff `diff' `tmp'
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
|
||
|
forvalues d=1/`dim' {
|
||
|
if "`rsm`d''"!="" {
|
||
|
local nbrsm`d':word count `rsm`d''
|
||
|
forvalues i=2/`=`nbrsm`d''+1' {
|
||
|
local rsm`d'`i':word `=`i'-1' of `rsm`d''
|
||
|
if "`threshold'"!=""&`rsm`d'`i''<0 {
|
||
|
di in red "With the {hi:threshold} option, the numbers defined in the {hi:rsm1} and {hi:rsm2} options must be positive."
|
||
|
error 198
|
||
|
exit
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
if "`diff'"!=""&"`pcm'"=="" {
|
||
|
tempname pcm
|
||
|
qui matrix `pcm'=J(`nbitems',1,.)
|
||
|
forvalues j=1/`nbitems' {
|
||
|
local tmp:word `j' of `diff'
|
||
|
qui matrix `pcm'[`j',1]=`tmp'
|
||
|
}
|
||
|
}
|
||
|
|
||
|
|
||
|
tempname matmu matcov matdiff matdisc matpmin matpmax matacc
|
||
|
matrix define `matdiff'=J(`nbitems',1,0)
|
||
|
matrix define `matdisc'=J(`nbitems',1,0)
|
||
|
matrix define `matpmin'=J(`nbitems',1,0)
|
||
|
matrix define `matpmax'=J(`nbitems',1,0)
|
||
|
matrix define `matacc'=J(`nbitems',1,0)
|
||
|
matrix define `matmu'=J(`dim',1,0)
|
||
|
matrix define `matcov'=J(`=(`dim'+1)*`dim'/2',1,0)
|
||
|
|
||
|
forvalues i=1/`nbitems'{
|
||
|
if `nbdisc'!=0 {
|
||
|
local tmp:word `i' of `disc'
|
||
|
matrix `matdisc'[`i',1]=`tmp'
|
||
|
}
|
||
|
else {
|
||
|
matrix `matdisc'[`i',1]=1
|
||
|
}
|
||
|
}
|
||
|
|
||
|
if "`pcm'"==""|"`rsm1'"!="" {
|
||
|
tempname pcm
|
||
|
if "`rsm1'"=="" {
|
||
|
forvalues i=1/`nbitems' {
|
||
|
local tmp:word `i' of `diff'
|
||
|
matrix `matdiff'[`i',1]=`tmp'
|
||
|
}
|
||
|
matrix `pcm'=`matdiff'
|
||
|
}
|
||
|
else {
|
||
|
local moda1:word count `rsm1'
|
||
|
local moda2:word count `rsm2'
|
||
|
local nbmodas=max(`=`moda1'+1',`=`moda2'+1')
|
||
|
matrix `pcm'=J(`nbitems',`nbmodas',.)
|
||
|
forvalues i=1/`dim1' {
|
||
|
local tmp:word `i' of `diff'
|
||
|
matrix `pcm'[`i',1]=`tmp'
|
||
|
forvalues j=1/`=`nbmodas'-1' {
|
||
|
local tmp:word `j' of `rsm1'
|
||
|
matrix `pcm'[`i',`=1+`j'']=`pcm'[`i',1]+`tmp'
|
||
|
}
|
||
|
}
|
||
|
if "`rsm2'"!="" {
|
||
|
forvalues i=`=`dim1'+1'/`=`dim1'+`dim2'' {
|
||
|
local tmp:word `i' of `diff'
|
||
|
matrix `pcm'[`i',1]=`tmp'
|
||
|
forvalues j=1/`=`nbmodas'-1' {
|
||
|
local tmp:word `j' of `rsm2'
|
||
|
matrix `pcm'[`i',`=1+`j'']=`pcm'[`i',1]+`tmp'
|
||
|
}
|
||
12 months ago
|
}
|
||
1 year ago
|
}
|
||
|
}
|
||
|
}
|
||
|
local nbmodas=colsof(`pcm')
|
||
|
forvalues j=1/`nbitems' {
|
||
|
local pcmpj`j'k0=-999999999999999
|
||
|
forvalues k=1/`nbmodas' {
|
||
|
local pcmpj`j'k`k'=`pcm'[`j',`k']
|
||
|
if `pcmpj`j'k`k''!=. {
|
||
|
local nbmodas`j'=`k'
|
||
|
}
|
||
|
local tmp=`k'-1
|
||
|
if "`threshold'"!=""&`pcmpj`j'k`k''<`pcmpj`j'k`tmp'' {
|
||
|
di in red "With the {hi:threshold} option, the difficulties of a given item must increase."
|
||
|
error 198
|
||
|
exit
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
|
||
|
|
||
|
forvalues i=1/`nbitems' {
|
||
|
if `nbpmin'!=0 {
|
||
|
local tmp:word `i' of `pmin'
|
||
|
matrix `matpmin'[`i',1]=`tmp'
|
||
|
}
|
||
|
else {
|
||
|
matrix `matpmin'[`i',1]=0
|
||
|
}
|
||
|
if `nbpmax'!=0 {
|
||
|
local tmp:word `i' of `pmax'
|
||
|
matrix `matpmax'[`i',1]=`tmp'
|
||
|
}
|
||
|
else {
|
||
|
matrix `matpmax'[`i',1]=1
|
||
|
}
|
||
|
if `nbacc'!=0 {
|
||
|
local tmp:word `i' of `acc'
|
||
|
matrix `matacc'[`i',1]=`tmp'
|
||
|
}
|
||
|
else {
|
||
|
matrix `matacc'[`i',1]=1
|
||
|
}
|
||
|
}
|
||
|
|
||
|
if "`covmatrix'"=="" {
|
||
12 months ago
|
tempname covmatrix
|
||
1 year ago
|
if `nbcov'==1 {
|
||
|
matrix `covmatrix'=(`cov')
|
||
|
}
|
||
|
if `nbcov'==3 {
|
||
|
local tmp1:word 1 of `cov'
|
||
|
local tmp2:word 2 of `cov'
|
||
|
local tmp12:word 3 of `cov'
|
||
|
matrix `covmatrix'=(`tmp1',`tmp12'\`tmp12',`tmp2')
|
||
|
}
|
||
|
}
|
||
|
matrix `matcov'=`covmatrix'
|
||
|
if (`nbmu'==`dim') {
|
||
|
forvalues d=1/`dim' {
|
||
|
local tmp:word `d' of `mu'
|
||
|
matrix `matmu'[`d',1]=`tmp'
|
||
|
}
|
||
|
}
|
||
|
if `dim'==2 {
|
||
|
local corr=`covmatrix'[1,2]/sqrt(`covmatrix'[1,1]*`covmatrix'[2,2])
|
||
|
}
|
||
|
|
||
|
|
||
|
|
||
|
/********************************************************************************
|
||
|
SIMULATION
|
||
|
********************************************************************************/
|
||
|
|
||
|
|
||
|
drop _all
|
||
|
qui set obs `=`nbobs'+2001'
|
||
|
qui gen `id'=_n
|
||
|
tempname graphobs
|
||
|
qui gen `graphobs'=`id'>`nbobs'
|
||
|
local names
|
||
|
forvalues d=1/`dim' {
|
||
|
qui gen x`d'=invnorm(uniform())
|
||
|
qui compress
|
||
12 months ago
|
local names `names' lt`d'
|
||
1 year ago
|
}
|
||
|
|
||
|
matrix Chol=cholesky(corr(`covmatrix'))
|
||
|
forvalues d=1/`dim' {
|
||
|
qui gen lt`d'=0
|
||
|
forvalues i=1/`d' {
|
||
|
qui replace lt`d'=lt`d'+Chol[`d',`i']*x`i'
|
||
|
}
|
||
|
qui compress
|
||
|
}
|
||
|
qui drop x*
|
||
|
forvalues d=1/`dim' {
|
||
|
qui replace lt`d'=lt`d'*sqrt(`covmatrix'[`d',`d'])+`matmu'[`d',1]
|
||
|
qui compress
|
||
|
}
|
||
12 months ago
|
qui replace lt1=_n-`nbobs' if `graphobs'
|
||
|
qui replace lt1=(lt1-1001)/1000*4*sqrt(`covmatrix'[1,1])+`matmu'[1,1] if `graphobs'
|
||
1 year ago
|
|
||
|
if `dim'==1&`group'!=0 {
|
||
|
if "`random'"=="" {
|
||
|
qui gen group=uniform()<`group'
|
||
|
}
|
||
|
else {
|
||
|
qui gen group=`id'<=`group'*`nbobs'
|
||
|
}
|
||
|
qui replace lt1=lt1+`deltagroup'*(1-`group') if group==1
|
||
|
qui replace lt1=lt1-`deltagroup'*`group' if group==0
|
||
|
qui compress
|
||
|
}
|
||
|
|
||
|
di in gr "Number of individuals: " in ye `nbobs'
|
||
|
di
|
||
|
|
||
|
if "`threshold'"=="" {
|
||
|
local line di in gr "{hline 75}"
|
||
|
}
|
||
|
else {
|
||
|
local line di in gr "{hline 27}"
|
||
|
}
|
||
|
|
||
|
if "`threshold'"=="" {
|
||
|
`line'
|
||
|
di _col(1) in gr "Items" _col(18) "Difficulty" _col(34) "Discr." _col(45) "Pmin" _col(58) "Pmax" _col(73) "Acc"
|
||
|
}
|
||
|
else {
|
||
|
`line'
|
||
|
di _col(1) in gr "Items" _col(18) "Difficulty"
|
||
|
}
|
||
|
local dim0=0
|
||
|
local deb1=1
|
||
|
local fin0=0
|
||
|
local fin1=`dim1'
|
||
|
|
||
|
forvalues d=1/`dim' { /* FOREACH DIMENSION*/
|
||
|
local deb`d'=`fin`=`d'-1''+1
|
||
|
local fin`d'=`deb`d''+`dim`d''-1
|
||
|
`line'
|
||
|
local p=`d'-1
|
||
|
local q=1
|
||
|
forvalues i=`deb`d''/`fin`d'' { /*FOREACH ITEM*/
|
||
|
qui compress
|
||
10 months ago
|
tempname prob`i'_`=`nbmodas`i''+1' est`i'
|
||
1 year ago
|
qui gen `prob`i'_`=`nbmodas`i''+1''=0
|
||
10 months ago
|
qui gen `est`i''=.
|
||
1 year ago
|
local tau0=0
|
||
|
local tau1=`pcm'[`i',1]
|
||
|
local D "1+exp(`matdisc'[`i',1]*(lt`d'-`tau1'))"
|
||
|
forvalues k=2/`nbmodas`i'' {
|
||
|
local tau`k'=`tau`=`k'-1''+`pcm'[`i',`k']
|
||
|
local D "`D'+exp(`matdisc'[`i',1]*(`k'*lt`d'-`tau`k'')) "
|
||
|
}
|
||
|
if "`threshold'"=="" {
|
||
|
tempname icc`i'
|
||
|
qui gen `icc`i''=0
|
||
10 months ago
|
tempname proba`i'_0 best`i'_0
|
||
1 year ago
|
gen `proba`i'_0'=1
|
||
|
forvalues k=`nbmodas`i''(-1)1 {
|
||
10 months ago
|
tempname prob`i'_`k' proba`i'_`k' best`i'_`k'
|
||
1 year ago
|
qui gen `proba`i'_`k''=`matpmin'[`i',1]+(`matpmax'[`i',1]-`matpmin'[`i',1])*(exp(`matdisc'[`i',1]*(`k'*lt`d'-`tau`k''))/(`D'))^`matacc'[`i',1]
|
||
|
qui replace `proba`i'_0'=`proba`i'_0'-`proba`i'_`k''
|
||
|
qui gen `prob`i'_`k''=`proba`i'_`k''+`prob`i'_`=`k'+1''
|
||
10 months ago
|
|
||
|
/************AJOUT 13/7/22**********/
|
||
|
qui gen `best`i'_`k''=`proba`i'_`k''*normalden(lt`d',`matmu'[1,1],sqrt(`covmatrix'[1,1]))
|
||
|
qui su `best`i'_`k''
|
||
|
qui su lt`d' if round(`best`i'_`k'',0.001)==round(`r(max)',0.001)
|
||
|
local bestloc`i'_`k'=r(mean)
|
||
|
di "Best location for item `i' category `k' : `bestloc`i'_`k''"
|
||
|
*qui replace `est`i''=`bestloc_`k'' if ``i''==`k'
|
||
|
/************FIN AJOUT 13/7/22**********/
|
||
|
|
||
1 year ago
|
qui replace `icc`i''=`icc`i''+`k'*`proba`i'_`k''
|
||
|
qui compress
|
||
|
if "`genproba'"!="" {
|
||
|
qui gen proba`i'_`k'=`prob`i'_`k''-`prob`i'_`=`k'+1''
|
||
|
}
|
||
|
}
|
||
10 months ago
|
/************AJOUT 13/7/22**********/
|
||
|
qui gen `best`i'_0'=`proba`i'_0'*normalden(lt`d',`matmu'[1,1],sqrt(`covmatrix'[1,1]))
|
||
|
qui su `best`i'_0'
|
||
|
qui su lt`d' if round(`best`i'_0',0.001)==round(`r(max)',0.001)
|
||
|
local bestloc`i'_0=r(mean)
|
||
|
di "Best location for item `i' category 0 : `bestloc_0'"
|
||
|
*qui replace `est`i''=`bestloc_0' if `i'==0
|
||
|
*corr `est`i'' lt1
|
||
|
/************FIN AJOUT 13/7/22**********/
|
||
1 year ago
|
if "`genicc'"!="" {
|
||
|
qui gen icc`i'=`icc`i''
|
||
|
}
|
||
|
qui gen `prefix`d''`q'=0
|
||
|
di _col(1) in gr "`prefix`d''`q'" _col(20) in ye %8.4f `pcm'[`i',1] _col(32) %8.4f `matdisc'[`i',1] _col(44) %6.4f `matpmin'[`i',1] _col(56) %6.4f `matpmax'[`i',1] _col(68) %8.4f `matacc'[`i',1]
|
||
|
forvalues k=2/`nbmodas`i'' {
|
||
|
di _col(1) in gr "`prefix`d''`q'_`k'" _col(20) in ye %8.4f `pcm'[`i',`k']
|
||
|
}
|
||
|
tempname uni
|
||
|
qui gen `uni'=uniform()
|
||
|
forvalues k=1/`nbmodas`i'' {
|
||
|
qui replace `prefix`d''`q'=`k' if `uni'<=`prob`i'_`k''
|
||
|
qui compress
|
||
|
}
|
||
10 months ago
|
forvalues k=0/`nbmodas`i'' {
|
||
|
qui replace `est`i''=`bestloc`i'_`k'' if `prefix`d''`q'==`k'
|
||
|
}
|
||
|
su lt1 `est`i''
|
||
|
corr lt1 `est`i''
|
||
1 year ago
|
}
|
||
|
else { /*if "`threshold'"!=""*/
|
||
|
qui gen `prefix`d''`q'=lt`d'>`pcm'[`i',1]
|
||
|
local tmp=0
|
||
|
forvalues k=1/`nbmodas`i'' {
|
||
|
di _col(1) in gr "`prefix`d''`q'_`k'" _col(20) in ye %8.4f `pcm'[`i',`k']
|
||
|
local tmp=`tmp'+`pcm'[`i',`k']
|
||
|
qui replace `prefix`d''`q'=`k' if lt`d'>`tmp'
|
||
|
qui compress
|
||
|
}
|
||
|
}
|
||
|
local q=`q'+1
|
||
|
}
|
||
|
}
|
||
|
`line'
|
||
|
di
|
||
|
|
||
|
|
||
|
/********************************************************************************
|
||
|
CATEGORIES PROBABILITY CURVES and ITEMS CHARACTERISTIC CURVES
|
||
|
********************************************************************************/
|
||
|
|
||
|
set tracedepth 1
|
||
|
if "`draw'"!=""|"`icc'"!=""|"`drawall'"!="" {
|
||
|
label variable lt1 "Latent trait"
|
||
|
local dess
|
||
10 months ago
|
/************AJOUT 13/7/22**********/
|
||
|
local dessbest
|
||
|
/************FIN AJOUT 13/7/22**********/
|
||
1 year ago
|
sort lt1
|
||
|
|
||
|
if "`draw'"!=""|"`drawall'"!="" {
|
||
|
local alldess
|
||
|
forvalues i=1/`dim1' {
|
||
|
if "`title'"=="" {
|
||
|
local title2="Category Probability Curves of the Item `i'"
|
||
|
}
|
||
|
else {
|
||
|
local title2="`title'"
|
||
|
}
|
||
|
local dess
|
||
10 months ago
|
/************AJOUT 13/7/22**********/
|
||
|
local dessbest
|
||
|
/************FIN AJOUT 13/7/22**********/
|
||
1 year ago
|
local tauj`j'k0=0
|
||
|
forvalues k=`nbmodas`i''(-1)0 {
|
||
|
local dess `dess' (line `proba`i'_`k'' lt1)
|
||
10 months ago
|
/************AJOUT 13/7/22**********/
|
||
|
local dessbest `dessbest' (line `best`i'_`k'' lt1)
|
||
|
/************FIN AJOUT 13/7/22**********/
|
||
1 year ago
|
label variable `proba`i'_`k'' "`k'"
|
||
|
}
|
||
|
graph twoway `dess' , ylabel(0(.25)1) legend(on) ytitle("Probability of response to each modality") title("`title2'") name(item`i',replace)
|
||
|
local alldess `alldess' `dess'
|
||
10 months ago
|
/************AJOUT 13/7/22**********/
|
||
|
graph twoway `dessbest' , ylabel(0(.25)1) legend(on) ytitle("Likelihood of latent trait as a fonction of the responses") title("`title2'") name(item`i',replace)
|
||
|
/************FIN AJOUT 13/7/22**********/
|
||
1 year ago
|
}
|
||
|
if "`drawall'"!="" {
|
||
|
graph twoway `alldess' , ylabel(0(.25)1) legend(on) ytitle("Probability of response to each modality") title("`title2'") name(all,replace)
|
||
|
}
|
||
|
}
|
||
|
if "`icc'"!="" {
|
||
|
local hicc
|
||
|
forvalues i=1/`dim1' {
|
||
|
if "`titleicc'"=="" {
|
||
|
local title3="Item Characteristic Curve of the Item `i'"
|
||
|
}
|
||
|
else {
|
||
|
local title3="`title'"
|
||
|
}
|
||
12 months ago
|
graph twoway (line `icc`i'' lt1) if `graphobs', ylabel(0(1)`nbmodas') legend(off) ytitle("Expected response") title("`title3'") name(iccitem`i',replace)
|
||
1 year ago
|
local hicc `hicc' (line `icc`i'' lt1)
|
||
|
label variable `icc`i'' "Item `i'"
|
||
|
}
|
||
12 months ago
|
graph twoway `hicc' if `graphobs', ylabel(0(1)`nbmodas') legend(on) ytitle("Expected response") title("Item Characteristic Curves") name(icc,replace)
|
||
1 year ago
|
}
|
||
|
}
|
||
12 months ago
|
qui drop if `graphobs'
|
||
1 year ago
|
|
||
|
|
||
|
/********************************************************************************
|
||
|
DISPLAYING
|
||
|
********************************************************************************/
|
||
|
|
||
|
forvalues d=1/`dim' {
|
||
|
qui su lt`d'
|
||
|
local var_`d'=r(Var)
|
||
|
local mean_`d'=r(mean)
|
||
|
forvalues l=`=`d'+1'/`dim' {
|
||
|
qui corr lt`d' lt`l' ,cov
|
||
|
local cov_`d'_`l'=r(cov_12)
|
||
|
return scalar cov_`d'_`l'=`cov_`d'_`l''
|
||
|
}
|
||
|
return scalar mean_`d'=`mean_`d''
|
||
|
return scalar var_`d'=`var_`d''
|
||
|
}
|
||
|
forvalues d=1/`dim' {
|
||
|
forvalues l=`=`d'+1'/`dim' {
|
||
|
local corr_`d'_`l'=`cov_`d'_`l''/sqrt(`var_`d''*`var_`l'')
|
||
|
return scalar corr_`d'_`l'=`corr_`d'_`l''
|
||
|
}
|
||
|
}
|
||
|
|
||
|
|
||
|
if `dim'==1&`group'!=0 {
|
||
|
qui su lt1 if group==0
|
||
|
local mean_0=r(mean)
|
||
|
qui su lt1 if group==1
|
||
|
local mean_1=r(mean)
|
||
|
local delta=`mean_1'-`mean_0'
|
||
|
}
|
||
|
|
||
|
return scalar nbobs=`nbobs'
|
||
|
tempname matcorr
|
||
|
matrix `matcorr'=corr(`matcov')
|
||
|
|
||
|
di in gr "{hline 50}"
|
||
|
di _col(1) in gr "Latent trait" _c
|
||
|
if `dim'==2 {
|
||
|
di in gr "s"_c
|
||
|
}
|
||
|
di in gr _col(30) "Expected" _col(42) "Observed"
|
||
|
di in gr "{hline 50}"
|
||
|
forvalues i=1/`dim' {
|
||
|
di _col(1) in gr "Mean(lt`i')" _col(30) in ye %8.4f `matmu'[`i',1] _col(42) %8.4f `mean_`i''
|
||
|
di _col(1) in gr "Variance(lt`i')" _col(30) in ye %8.4f `matcov'[`i',`i'] _col(42) %8.4f `var_`i''
|
||
|
forvalues d=`=`i'+1'/`dim' {
|
||
|
di _col(1) in gr "Covariance `i'_`d'" _col(30) in ye %8.4f `matcov'[`i',`d'] _col(42) %8.4f `cov_`i'_`d''
|
||
|
di _col(1) in gr "Correlation `i'_`d'" _col(31) in ye %7.4f `matcorr'[`i',`d'] _col(43) %7.4f `corr_`i'_`d''
|
||
|
}
|
||
|
di in gr "{hline 50}"
|
||
|
}
|
||
|
if `dim'==1&`group'!=0 {
|
||
|
di _col(1) in gr "Mean(lt1) group 0" _col(30) in ye %8.4f `matmu'[1,1]-`deltagroup'*`group' _col(42) %8.4f `mean_0'
|
||
|
di _col(1) in gr "Mean(lt1) group 1" _col(30) in ye %8.4f `matmu'[1,1]+`deltagroup'*(1-`group') _col(42) %8.4f `mean_1'
|
||
|
qui count if group==1
|
||
|
local prop=r(N)/`nbobs'
|
||
|
di _col(1) in gr "Proportion group 1" _col(30) in ye %8.4f `group' _col(42) %8.4f `prop'
|
||
|
di in gr "{hline 50}"
|
||
|
}
|
||
|
|
||
|
/********************************************************************************
|
||
|
CLEAR AND/OR STORE
|
||
|
********************************************************************************/
|
||
|
qui compress
|
||
|
|
||
|
if "`clear'"!="" {
|
||
|
restore, not
|
||
|
preserve
|
||
|
}
|
||
|
if "`store'"!="" {
|
||
10 months ago
|
keep id lt* item*
|
||
1 year ago
|
save "`store'",`replace'
|
||
|
}
|
||
|
if "`clear'"=="" {
|
||
|
capture use "`saveraschbin'",replace
|
||
|
}
|
||
|
end
|