|
|
|
|
*! version 1 : February 15th, 2012
|
|
|
|
|
*! Myriam Blanchin
|
|
|
|
|
************************************************************************************************************
|
|
|
|
|
* raschlong: Estimation of the parameters of a model of the Rasch family in a longitudinal setting
|
|
|
|
|
*
|
|
|
|
|
* Version 1 : February 15th, 2012: pcm et rasch, contraintes sur la matrice de variance-covariance et difficult<6C>s d'items fix<69>es
|
|
|
|
|
*
|
|
|
|
|
************************************************************************************************************/
|
|
|
|
|
|
|
|
|
|
program define raschlong,eclass
|
|
|
|
|
syntax varlist [, NBT(int 2) DIFFiculties(string) VAR(string) ]
|
|
|
|
|
|
|
|
|
|
*the dataset should be in wide format
|
|
|
|
|
*the matrix of difficulties should contain `nbit' rows and `nbmodpos' columns
|
|
|
|
|
*the item parameters are assumed to be constant with time
|
|
|
|
|
*same number of modalities for each item
|
|
|
|
|
*varlist should contain for each timepoint the list of variables containing the answers to the items - example: T1item1 T1item2 T1item3 T2item1 T2item2 T2item3
|
|
|
|
|
preserve
|
|
|
|
|
|
|
|
|
|
tempname diff varcov item id temps one obs estbeta estvar
|
|
|
|
|
/*di "item" "`item'"
|
|
|
|
|
di "temps" "`temps'"
|
|
|
|
|
di "obs" "`obs'"
|
|
|
|
|
di "diff" "`diff'"
|
|
|
|
|
di "varcov" "`varcov'"
|
|
|
|
|
di "id" "`id'"
|
|
|
|
|
di "one" "`one'"*/
|
|
|
|
|
*verif varlist
|
|
|
|
|
tokenize `varlist'
|
|
|
|
|
local nbittot:word count `varlist'
|
|
|
|
|
local nbit=`nbittot'/`nbt'
|
|
|
|
|
if `=int(`nbit')'!=`nbit'{
|
|
|
|
|
di in red "The number of variables should be equal to (the number of items * the number of timepoints). Please correct it."
|
|
|
|
|
error 198
|
|
|
|
|
exit
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/*verif nb diff items*/
|
|
|
|
|
if "`difficulties'"!=""{
|
|
|
|
|
matrix `diff'=`difficulties'
|
|
|
|
|
if `nbit'!=`=rowsof(`diff')'{
|
|
|
|
|
di in red "The number of rows of the matrix of item parameters should be equal to the number of items. Please correct it."
|
|
|
|
|
error 198
|
|
|
|
|
exit
|
|
|
|
|
}
|
|
|
|
|
local nbmodat=colsof(`diff')+1
|
|
|
|
|
}
|
|
|
|
|
else{
|
|
|
|
|
local modcount=word("`varlist'",1)
|
|
|
|
|
qui tab `modcount'
|
|
|
|
|
local nbmodat=r(r)
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
*verif matcov
|
|
|
|
|
if "`var'"!=""{
|
|
|
|
|
matrix `varcov'=`var'
|
|
|
|
|
if `=rowsof(`var')'!=`nbt'{
|
|
|
|
|
di in red "The covariance matrix is incorrectly specified. Please correct it."
|
|
|
|
|
error 198
|
|
|
|
|
exit
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
qui{
|
|
|
|
|
*reshape of the dataset
|
|
|
|
|
gen `one'=1
|
|
|
|
|
collapse(sum) wt2=`one', by (`varlist')
|
|
|
|
|
*list in 1/3
|
|
|
|
|
forvalues t=1/`nbt'{
|
|
|
|
|
forvalues i=1/`nbit'{
|
|
|
|
|
local vartemp=word("`varlist'",`=(`t'-1)*`nbit'+`i'')
|
|
|
|
|
gen tps`t'item`i'=`vartemp'
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
gen `id'=_n
|
|
|
|
|
local list=""
|
|
|
|
|
forvalues i=1/`nbit'{
|
|
|
|
|
local list="`list' tps@item`i'"
|
|
|
|
|
}
|
|
|
|
|
reshape long `list', i(`id') j(`temps')
|
|
|
|
|
*list in 1/20
|
|
|
|
|
reshape long tpsitem, i(`id' `temps') j(`item')
|
|
|
|
|
*list in 1/20
|
|
|
|
|
drop if tpsitem==.
|
|
|
|
|
gen `obs'=_n
|
|
|
|
|
expand `nbmodat'
|
|
|
|
|
sort `id' `temps' `item' `obs'
|
|
|
|
|
*list in 1/20
|
|
|
|
|
tab `temps', gen(t)
|
|
|
|
|
forvalues t=1/`nbt'{
|
|
|
|
|
by `obs', sort: gen x`t'=(_n-1)*t`t'
|
|
|
|
|
}
|
|
|
|
|
gen chosen=.
|
|
|
|
|
forvalues t=1/`nbt'{
|
|
|
|
|
replace chosen=tpsitem==x`t' if `temps'==`t'
|
|
|
|
|
}
|
|
|
|
|
tab `item', gen(it)
|
|
|
|
|
|
|
|
|
|
if "`difficulties'"==""{
|
|
|
|
|
forvalues i=1/`nbit'{
|
|
|
|
|
forvalues g=1/`=`nbmodat'-1'{
|
|
|
|
|
gen d`i'_`g'=.
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
forvalues t=1/`nbt'{
|
|
|
|
|
forvalues i=1/`nbit'{
|
|
|
|
|
forvalues g=1/`=`nbmodat'-1'{
|
|
|
|
|
replace d`i'_`g'=-1*it`i'*(x`t'>=`g') if `temps'==`t'
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
else{
|
|
|
|
|
gen offset=0
|
|
|
|
|
forvalues t=1/`nbt'{
|
|
|
|
|
forvalues i=1/`nbit'{
|
|
|
|
|
local sumdiff=0
|
|
|
|
|
forvalues g=1/`=`nbmodat'-1'{
|
|
|
|
|
local sumdiff=`sumdiff'-`diff'[`i',`g']
|
|
|
|
|
replace offset=`sumdiff' if it`i'==1 & x`t'==`g'
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
*list in 1/25
|
|
|
|
|
local listeq ""
|
|
|
|
|
forvalues t=1/`nbt'{
|
|
|
|
|
eq slope`t':x`t'
|
|
|
|
|
local listeq "`listeq' slope`t'"
|
|
|
|
|
}
|
|
|
|
|
if "`var'"!=""{
|
|
|
|
|
matrix C=cholesky(`varcov')
|
|
|
|
|
constraint define 1 [__01_1]x1=`=C[1,1]'
|
|
|
|
|
constraint define 2 [__01_2]x2=`=C[2,2]'
|
|
|
|
|
constraint define 3 [__01_2_1]_cons=`=C[2,1]'
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
tempname b V
|
|
|
|
|
if "`difficulties'"==""{
|
|
|
|
|
if "`var'"==""{
|
|
|
|
|
gllamm x1-x`nbt' d1_1-d`nbit'_`=`nbmodat'-1',i(`id') eqs(`listeq') link(mlogit) expand(`obs' chosen o) weight(wt) nocons nrf(`nbt') adapt
|
|
|
|
|
}
|
|
|
|
|
else{
|
|
|
|
|
gllamm x1-x`nbt' d1_1-d`nbit'_`=`nbmodat'-1',i(`id') eqs(`listeq') link(mlogit) constraints(1 2 3) expand(`obs' chosen o) weight(wt) nocons nrf(`nbt') adapt
|
|
|
|
|
}
|
|
|
|
|
matrix `b'=e(b)
|
|
|
|
|
matrix EstDiff=J(`nbit',`=`nbmodat'-1',.)
|
|
|
|
|
forvalues j=1/`nbit'{
|
|
|
|
|
matrix EstDiff[`j',1]=`b'[1,`=`nbt'+(`j'-1)*(`nbmodat'-1)'..`=`nbt'-1+`j'*(`nbmodat'-1)']
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
else{
|
|
|
|
|
if "`var'"==""{
|
|
|
|
|
gllamm x1-x`nbt',i(`id') eqs(`listeq') link(mlogit) expand(`obs' chosen o) weight(wt) nocons nrf(`nbt') adapt offset(offset)
|
|
|
|
|
}
|
|
|
|
|
else{
|
|
|
|
|
gllamm x1-x`nbt',i(`id') eqs(`listeq') link(mlogit) constraints(1 2 3) expand(`obs' chosen o) weight(wt) nocons nrf(`nbt') adapt offset(offset)
|
|
|
|
|
}
|
|
|
|
|
matrix `b'=e(b)
|
|
|
|
|
}
|
|
|
|
|
matrix `V'=e(V)
|
|
|
|
|
matrix EstMu=`b'[1,1..`=`nbt'-1']
|
|
|
|
|
matrix Var=e(chol)*e(chol)'
|
|
|
|
|
matrix se2=vecdiag(`V'[1..`=`nbt'-1',1..`=`nbt'-1'])
|
|
|
|
|
|
|
|
|
|
/*if test
|
|
|
|
|
test x2=x3=0
|
|
|
|
|
r(chi2)
|
|
|
|
|
r(df)
|
|
|
|
|
r(p)
|
|
|
|
|
*/
|
|
|
|
|
di
|
|
|
|
|
di
|
|
|
|
|
di in gr "{hline 91}"
|
|
|
|
|
di in gr _col(39) "RASCH FAMILY MODEL"
|
|
|
|
|
di in gr "{hline 91}"
|
|
|
|
|
di in gr "Number of timepoints: " in ye `nbt'
|
|
|
|
|
di in gr "Number of items: " in ye `nbit'
|
|
|
|
|
di in gr "Number of modalities per item: " in ye `nbmodat'
|
|
|
|
|
di in gr "{hline 91}"
|
|
|
|
|
|
|
|
|
|
local collist ""
|
|
|
|
|
forvalues i=1/`=`nbmodat'-1'{
|
|
|
|
|
local collist "`collist' dj_`i'"
|
|
|
|
|
}
|
|
|
|
|
local rowlist ""
|
|
|
|
|
forvalues i=1/`nbit'{
|
|
|
|
|
local rowlist "`rowlist' item`i'"
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if "`difficulties'"==""{
|
|
|
|
|
di in gr "Item parameters estimations:"
|
|
|
|
|
matrix colnames EstDiff = `collist'
|
|
|
|
|
matrix rownames EstDiff = `rowlist'
|
|
|
|
|
matrix list EstDiff,noheader format(%7.3f)
|
|
|
|
|
ereturn matrix Diff=EstDiff
|
|
|
|
|
}
|
|
|
|
|
else{
|
|
|
|
|
di in gr "Item parameters fixed to:"
|
|
|
|
|
matrix colnames `diff' = `collist'
|
|
|
|
|
matrix rownames `diff' = `rowlist'
|
|
|
|
|
matrix list `diff',noheader format(%7.3f)
|
|
|
|
|
ereturn matrix Diff=`diff'
|
|
|
|
|
}
|
|
|
|
|
di
|
|
|
|
|
di
|
|
|
|
|
if "`var'"==""{
|
|
|
|
|
di in gr "Covariance matrix estimations:"
|
|
|
|
|
}
|
|
|
|
|
else{
|
|
|
|
|
di in gr "Covariance matrix fixed to:"
|
|
|
|
|
}
|
|
|
|
|
matrix list Var,noheader nonames format(%7.3f)
|
|
|
|
|
di
|
|
|
|
|
di
|
|
|
|
|
di in gr "Time effect estimations:"
|
|
|
|
|
di in gr _col(19) "Coef" _col(29) "S.E."
|
|
|
|
|
forvalues t=1/`=`nbt'-1'{
|
|
|
|
|
di in gr "Time" `=`t'+1' in ye _col(16) %7.2f EstMu[1,`t'] _col(26) %7.2f `=sqrt(se2[1,`t'])'
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
ereturn matrix Var=Var
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
end
|