Initial commit
This commit is contained in:
229
Modules/ado/personal/r/raschlong.ado
Normal file
229
Modules/ado/personal/r/raschlong.ado
Normal file
@ -0,0 +1,229 @@
|
||||
*! 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
|
Reference in New Issue
Block a user