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.
211 lines
5.9 KiB
Plaintext
211 lines
5.9 KiB
Plaintext
7 months 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 raschlongitudinal2,rclass
|
||
|
syntax [varlist] [, n(int 100) diff(string) Mu(string) Sigma(string) Nodes(int 12) fast]
|
||
|
version 11
|
||
|
tempfile raschlongitudinalfile
|
||
|
capture qui save "`raschlongitudinalfile'",replace
|
||
|
|
||
|
if "`diff'"=="" {
|
||
|
tempname diff
|
||
|
*matrix `diff'=[-1\0\1]
|
||
|
matrix `diff'=[-1\-.5\0\.5\1]
|
||
|
}
|
||
|
|
||
|
if "`mu'"=="" {
|
||
|
tempname mu
|
||
|
matrix `mu'=[0,0]
|
||
|
}
|
||
|
if "`sigma'"=="" {
|
||
|
tempname sigma
|
||
|
matrix `sigma'=[1,0\0,1]
|
||
|
}
|
||
|
|
||
|
local nbitems=rowsof(`diff')
|
||
|
*local J=rowsof(`diff')+1
|
||
|
*local Nbit=rowsof(`diff')*2
|
||
|
di in gr "Number of individuals in the study: " in ye `n'
|
||
|
di in gr "Number of items: " in ye `nbitems'
|
||
|
di in green "Difficulties parameters of the items: " _c
|
||
|
tempname dt
|
||
|
matrix `dt'=`diff' ' ''
|
||
|
matrix list `dt',noblank nohalf nonames noheader
|
||
|
di in green "mean of the latent traits: " _c
|
||
|
matrix list `mu',noblank nohalf nonames noheader
|
||
|
di in green "variance matrix of the latent traits: " _c
|
||
|
di
|
||
|
matrix list `sigma',noblank nohalf nonames noheader
|
||
|
|
||
|
|
||
|
if "`data'"=="" {
|
||
|
clear
|
||
|
local temp=2^(`nbitems'*2)
|
||
|
qui range x1 0 `=`temp'-1' `temp'
|
||
|
qui g t=x1
|
||
|
qui g x2=x1
|
||
|
qui g x=x2
|
||
|
loc i=1
|
||
|
qui count if t>0
|
||
|
loc z=r(N)
|
||
|
qui while `z'>0 {
|
||
|
qui g item`i'=mod(t,2^`i')==2^`=`i'-1'
|
||
|
qui replace t=t-item`i'*2^`=`i'-1'
|
||
|
qui count if t>0
|
||
|
loc z=r(N)
|
||
|
loc i=`i'+1
|
||
|
}
|
||
|
}
|
||
|
drop t
|
||
|
*edit
|
||
|
|
||
|
if "`fast'"=="" {
|
||
|
qui gen proba=.
|
||
|
*qui gen proba2=.
|
||
|
forvalues i=1/`temp' {
|
||
|
local int1=1
|
||
|
local int2=1
|
||
|
forvalues j=1/`nbitems' {
|
||
|
qui su item`j' in `i'
|
||
|
local rep=r(mean)
|
||
|
local diffic=`diff'[`j',1]
|
||
|
local int1 "`int1'*exp(`rep'*(x1-`diffic'))/(1+exp(x1-`diffic'))"
|
||
|
*di `j'
|
||
|
*di `int1'
|
||
|
}
|
||
|
*qui gausshermite `int1', mu(1) sigma(2) display
|
||
|
* di r(int)
|
||
|
*qui replace proba=r(int) in `i'
|
||
|
|
||
|
forvalues k=`=`nbitems'+1' /`=2*`nbitems'' {
|
||
|
qui su item`k' in `i'
|
||
|
local rep=r(mean)
|
||
|
local diffic=`diff'[`=`k'-`nbitems'',1]
|
||
|
local int2 "`int2'*exp(`rep'*(x2-`diffic'))/(1+exp(x2-`diffic'))"
|
||
|
}
|
||
|
*di `i'
|
||
|
*di "`int1'"
|
||
|
*di "`int2'"
|
||
|
local int "`int1'*`int2'"
|
||
|
qui gausshermite2 `int', mu(`mu') sigma(`sigma') display
|
||
|
qui replace proba=r(int) in `i'
|
||
|
*di proba[`i']
|
||
|
}
|
||
|
}
|
||
|
|
||
|
gen eff=proba
|
||
|
keep item* proba eff
|
||
|
*gen eff2=`n'*proba2
|
||
|
*keep item* proba proba2 eff1 eff2
|
||
|
|
||
|
edit
|
||
|
local p=1/`n'
|
||
|
qui gen eff2=floor(eff/`p')
|
||
|
*list eff2 eff
|
||
|
qui replace eff=eff-eff2*(`p')
|
||
|
qui su eff2
|
||
|
local aff=r(sum)
|
||
|
|
||
|
local unaff=`n'-`aff'
|
||
|
di `aff'
|
||
|
di `unaff'
|
||
|
gen efftmp=eff2
|
||
|
qui gsort - eff
|
||
|
qui replace eff2=eff2+1 in 1/`unaff'
|
||
|
|
||
|
qui drop if eff2==0
|
||
|
gsort item*
|
||
|
*gen res=proba*50
|
||
|
* keep item* proba eff eff2 aff unaff
|
||
|
|
||
|
* Matrice complete qui ne tient pas compte des effectifs dans l'analyse
|
||
|
|
||
|
qui expand eff2
|
||
|
*qui drop proba eff eff2
|
||
|
*keep item* proba eff eff2
|
||
|
*}
|
||
|
|
||
|
|
||
|
forvalues j=1/`nbitems' {
|
||
|
rename item`j' T1reponse`j'
|
||
|
}
|
||
|
|
||
|
forvalues j=`=1+`nbitems''/`=2*`nbitems'' {
|
||
|
rename item`j' T2reponse`=`j'-`nbitems''
|
||
|
}
|
||
|
rename eff2 Eff
|
||
|
keep T1reponse* T2reponse* Eff
|
||
|
|
||
|
gen id=_n
|
||
|
forvalues i=1/`nbitems'{
|
||
|
local list="`list' T@reponse`i'"
|
||
|
}
|
||
|
reshape long `list', i(id) j(temps)
|
||
|
reshape long Treponse, i(id temps) j(item)
|
||
|
forvalues i=1/`nbitems'{
|
||
|
gen item`i'=0
|
||
|
replace item`i'=-1 if item==`i'
|
||
|
}
|
||
|
gen temps1=temps==1
|
||
|
gen temps2=temps==2
|
||
|
*gen W1=0
|
||
|
*gen W2=0
|
||
|
*replace W1=Eff if temps1==1
|
||
|
*replace W2=Eff if temps2==1
|
||
|
|
||
|
qui gen offset=0
|
||
|
forvalues i=1/`nbitems' {
|
||
|
qui replace offset=-`diff'[`i',1] if item==`i'
|
||
|
}
|
||
|
|
||
|
matrix C=cholesky(`sigma')
|
||
|
|
||
|
*constraint define 1 `sigma'[1,1]-C[1,1]^2=0
|
||
|
*constraint define 2 `sigma'[2,2]-C[2,1]^2-C[2,2]^2=0
|
||
|
*constraint define 3 `sigma'[2,1]-C[1,1]*C[2,1]=0
|
||
|
|
||
|
*constraint define 1 id_1:temps1=`=sqrt(`sigma'[1,1])'
|
||
|
*constraint define 2 id_2:temps2=`=sqrt(`sigma'[2,2]-`sigma'[2,1]^2/`sigma'[1,1])'
|
||
|
*constraint define 3 id1_2_1:_cons=`=`sigma'[2,1]/sqrt(`sigma'[1,1])'
|
||
|
|
||
|
*constraint define 1 var(1): =`=`sigma'[1,1]'
|
||
|
*constraint define 2 cov(2,1): =`=`sigma'[1,2]'
|
||
|
*constraint define 3 var(2): =`=`sigma'[2,2]'
|
||
|
|
||
|
|
||
|
|
||
|
constraint define 1 id1_1:temps1=`=C[1,1]'
|
||
|
constraint define 2 id1_2:temps2=`=C[2,2]'
|
||
|
constraint define 3 id1_2_1:_cons=`=C[2,1]'
|
||
|
|
||
|
/*CODE JBH*/
|
||
|
gen Treponse1=Treponse if temps1
|
||
|
replace Treponse1=0 if Treponse1==.
|
||
|
gen Treponse2=Treponse if temps2
|
||
|
replace Treponse2=0 if Treponse2==.
|
||
|
|
||
|
constraint define 1 Treponse1=`=C[1,1]'
|
||
|
constraint define 2 Treponse2=`=C[2,2]'
|
||
|
constraint define 3 _cons=`=C[2,1]'
|
||
|
|
||
|
eq b1:Treponse1
|
||
|
eq b2:Treponse2
|
||
|
/*FIN CODE JBH*/
|
||
|
gllamm Treponse temps1 temps2, offset(offset) i(id) link(logit) nocons fam(bin) nrf(2) constraints(1 2 3) eqs(b1 b2) iterate(20) trace
|
||
|
|
||
|
capture qui use `raschlongitudinalfile',clear
|
||
|
|
||
|
end
|