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

* 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