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.

230 lines
5.9 KiB
Plaintext

*! 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és d'items fixé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