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.

406 lines
10 KiB
Plaintext

*! version 2.0.3 SRH 1 June 2003
program define remcor
version 6.0
* takes b and transform set of r.effs at same level using choleski
* returns bi where the r.effs are independent and correlation equations
* have been removed
* also takes exponential of sd parameters
* and evaluates contributions to linear predictor that don't change
args b stop
tempname b2 s1 cov t r d dd u denom mean mzps
tempvar junk
gen double `junk'=0
global HG_error=0
disp "*********in remcor:"
/* fixed effects $HG_xb1, $HG_xb2 etc. (tempnames stored in global macros-list) */
qui disp "fixed parameters: "
qui matrix list `b'
if $HG_const==1{
matrix `b2' = `b'*M_T' + M_a
matrix coleq `b2' = $HG_cole
matrix colnames `b2' = $HG_coln
noi matrix list `b2'
}
else{
matrix `b2' = `b'
}
local nffold=0
local ff = 1
local nxt = 1
while(`ff' <= $HG_tpff){
matrix `b2' = `b2'[1, `nxt'...]
local np = M_nffc[1, `ff'] - `nffold'
qui disp "np = " `np'
if `np'>0{
local nxt = `np' + 1
local nffold = M_nffc[1,`ff']
matrix `s1' = `b2'[1,1..`np']
qui matrix list `s1'
qui disp "tempname: ${HG_xb`ff'}"
matrix score double ${HG_xb`ff'} = `s1' /* nontemp */
}
else{
qui gen double ${HG_xb`ff'} = 0
}
qui disp ${HG_xb`ff'}[$which]
local ff=`ff'+1
}
if "$HG_off"~=""{qui replace $HG_xb1=$HG_xb1+$HG_off}
qui disp "HG_xb1 = " $HG_xb1[$which]
if $HG_ethr{
local j = 1
local ii = 1
while `ii'<=$HG_nolog{
local j = `j' + 1
local jm = `j' + M_nresp[1,`ii']-3
while `j' <= `jm'{
local jp = `j' + 1
* disp in re "replace HG_xb`jp' = HG_xb`j' + exp(HG_xb`jp')"
qui replace ${HG_xb`jp'} = ${HG_xb`j'} + exp(${HG_xb`jp'})
local j = `j' + 1
}
local ii = `ii' + 1
}
}
/* random effects */
/* level 1 */
local np = M_nbrf[1,1]
if `np'>0{
matrix `b2' = `b2'[1, `nxt'...]
local nxt = 1
matrix `s1' = `b2'[1,1..`np']
qui matrix list `s1'
matrix score double $HG_s1 = `s1'
if $HG_nats{
qui replace $HG_s1 = abs($HG_s1)
}
else{
qui replace $HG_s1=exp($HG_s1)
}
qui disp "s1 = $HG_s1 = " $HG_s1[$which]
local nxt = `nxt' + `np'
}
local lev = 2
local rf = 2
local nrfold = M_nrfc[2,1]
/* MASS POINTS */
if($HG_free){
tempname pdenom
gen double `pdenom' = 1.0
while(`lev'<=$HG_tplv&`rf'<=$HG_tprf){
local j1 = M_nrfc[2, `lev']
local nrf = `j1' - `nrfold'
local nip = M_nip[1, `lev']
scalar `denom' = 1 /* =exp(0) */
qui replace `pdenom' = 1.0
matrix M_zps`lev' = J(1,`nip',0)
local k = 1
qui disp "`nip' integration points at level `lev'"
local nloc = `nip'
local npar = M_np[1,`lev']
if $HG_cip|`nip'>1{ local nloc = `nloc'-1}
while `k' <= `nloc' {
local j = `nrfold'+1
while `j'<=`j1'{
qui disp "level `lev', class `k' and random effect `j'"
qui disp " nxt = " `nxt'
matrix `b2' = `b2'[1, `nxt'...]
qui matrix list `b2'
local nxt = 1
if `k'==1{
/* linear predictors come before first masspoint */
local np = M_nbrf[1,`j']-1
if `np'>0 {
qui disp "extracting coefficients for r.eff"
matrix `s1' = `b2'[1,1..`np']
matrix score double ${HG_s`j'} = `s1'
qui disp "HG_s`j' = ${HG_s`j'} = " ${HG_s`j'}[$which]
local nxt = `nxt' + `np'
}
/* first coeff fixed at one */
if M_frld[1,`rf']~=1{
matrix `s1' = (1)
local lab: colnames `b2'
local lab: word `nxt' of `lab'
matrix colnames `s1'=`lab'
qui matrix list `s1'
capture drop `junk'
matrix score double `junk' = `s1'
if `np'>0{
qui replace ${HG_s`j'}=${HG_s`j'}+`junk'
}
else{
qui gen double ${HG_s`j'}=`junk'
}
qui matrix list `s1'
}
qui disp "HG_s`j' = ${HG_s`j'} = " ${HG_s`j'}[$which]
qui disp "making M_zlc`j'"
matrix M_zlc`j' = J(1,`nip',0)
}
matrix M_zlc`j'[1,`k'] = `b2'[1,`nxt']
local nxt = `nxt' + 1
local j = `j' + 1
}
if `k'<`nip'{
if `npar'>0{
qui disp "extract probability parameters for HG_p`cl' (npar=`npar')"
matrix `s1' = `b2'[1,`nxt'..(`nxt'+`npar'-1)]
qui matrix list `s1'
capture drop `junk'
matrix score double `junk' = `s1'
qui gen double ${HG_p`lev'`k'} = `junk'
local nxt = `nxt' + `npar' - 1
qui replace `pdenom' = `pdenom' + exp(${HG_p`lev'`k'})
}
scalar `mzps' = exp(`b2'[1,`nxt'])
if `mzps' == . {
global HG_error=1
exit
}
matrix M_zps`lev'[1,`k'] = `b2'[1,`nxt']
local nxt = `nxt' + 1
scalar `denom' = `denom' + `mzps'
}
local k = `k' + 1
}
if `npar'>0{
qui gen double ${HG_p`lev'`nip'} = 0.0
local k = 1
while `k' <= `nip'{
qui disp "divide HG_p`lev'`k'"
qui replace ${HG_p`lev'`k'} = ${HG_p`lev'`k'} - ln(`pdenom')
local k = `k' + 1
}
}
local k = 1
while `k' <= `nip'{
matrix M_zps`lev'[1,`k'] = M_zps`lev'[1,`k'] - ln(`denom')
local k = `k' + 1
}
local j = `nrfold' + 1
while `j' <= `j1'{ /* define last location */
if $HG_cip == 1{
local k = 1
scalar `mean' = 0
while `k'<`nip'{
scalar `mean' = `mean' + M_zlc`j'[1,`k']*exp(M_zps`lev'[1,`k'])
local k = `k' + 1
}
scalar `mzps' = exp(M_zps`lev'[1,`nip'])
matrix M_zlc`j'[1,`nip'] = -`mean'/`mzps'
}
else if `nip'>1{
matrix M_zlc`j'[1,`nip'] = `b2'[1,`nxt']
local nxt = `nxt' + 1
}
qui disp "M_zlc`j'"
qui matrix list M_zlc`j'
local j = `j' + 1
}
qui disp "M_zps`lev'"
qui matrix list M_zps`lev'
local nrfold = `j1'
local lev = `lev' + 1
}
}/*endif HG_free */
else{
/* ST. DEVS */
qui disp "random parameters: "
if $HG_tprf>1{matrix CHmat = J($HG_tprf-1,$HG_tprf-1,0)}
while(`lev'<=$HG_tplv&`rf'<=$HG_tprf){
local np = M_nbrf[1,`rf']
qui disp "np = " `np'
local nrf = M_nrfc[2, `lev'] - `nrfold'
matrix `t' = J(`nrf',`nrf',0)
local i = 1
while (`i' <= `nrf'){
qui disp " nxt = " `nxt'
matrix `b2' = `b2'[1, `nxt'...]
local nxt = 1
qui matrix list `b2'
local np = M_nbrf[1, `rf'] - 1
qui disp `np' " loadings at random effect " `rf' ", level " `lev'
if `np'>0{
matrix `s1' = `b2'[1,1..`np']
/*
* fudge: exponentiate s1
local ij = 1
while `ij'<=`np'{
matrix `s1'[1,`ij'] = exp(`s1'[1,`ij'])
local ij = `ij' + 1
}
* end fudge
*/
qui matrix list `s1'
matrix score double ${HG_s`rf'} = `s1'
local nxt = `nxt' + `np'
}
/* first (single non-) loading fixed at one, label in st. dev */
if M_frld[1,`rf']~=1{
matrix `s1' = (1)
local lab: colnames `b2'
local lab: word `nxt' of `lab'
matrix colnames `s1' = `lab'
capture drop `junk'
tempname junk
matrix score double `junk' = `s1'
if `np'>0{
qui replace ${HG_s`rf'} = ${HG_s`rf'} + `junk'
}
else{
matrix score double ${HG_s`rf'} = `s1'
*qui replace ${HG_s`rf'} = `junk'
}
}
qui disp "HG_s`rf' = ${HG_s`rf'} = " ${HG_s`rf'}[$which]
* extract standard deviation
* fudge: take exponential
* matrix `t'[`i',`i'] = exp(`b2'[1, `nxt'])
matrix `t'[`i',`i'] = `b2'[1, `nxt']
matrix CHmat[`rf'-1,`rf'-1]=`t'[`i',`i']
local nxt = `nxt' + 1
local i = `i' + 1
local rf = `rf' + 1
}
if (`nrf'>1&$HG_cor==1){ /* deal with correlations */
/* extract correlation parameters */
local i = 2
while (`i' <= `nrf'){
local k = `i' + `nrfold' - 1
local j = 1
while (`j' < `i'){
local l = `j' + `nrfold' - 1
qui disp "i = " `i' " j = " `j' " nxt = " `nxt'
matrix `t'[`i',`j'] = `b2'[1,`nxt']
matrix CHmat[`k',`l'] = `t'[`i',`j']
local j = `j' + 1
local nxt = `nxt' + 1
}
local i = `i' + 1
}
}
qui matrix list `t'
matrix M_chol = `t'
/* unpacked parameters */
local nrfold = M_nrfc[2,`lev']
local lev = `lev' + 1
} /* loop through levels */
}/*endelse HG_free */
if "`stop'"~=""{
exit
}
local nrfold = M_nrfc[2,1]
/* use B-matrix */
if $HG_tprf>1&$HG_bmat==1{
qui disp "dealing with B-matrix"
local i = 1
matrix Bmat = J($HG_tprf-1,$HG_tprf-1,0)
while `i'<$HG_tprf{
local j = 1
while `j' < $HG_tprf{
if M_b[`i',`j']>0{
matrix Bmat[`i',`j']=`b2'[1,`nxt']
local nxt = `nxt' + 1
}
local j = `j' + 1
}
local i = `i' + 1
}
qui matrix list Bmat
/* only works if B-matrix is upper diagonal */
local i=2
while `i'<$HG_tprf{
local k = `i' + `nrfold'
local j = 1
qui disp "making s`k'"
while `j'<`i'{
local l = `j' + `nrfold'
qui replace ${HG_s`k'} = ${HG_s`k'} + Bmat[`j',`i']*${HG_s`l'}
qui disp " adding Bmat[`j',`i']s`l'"
local j = `j' + 1
}
local i = `i' + 1
}
}
/* deal with geqs */
if $HG_ngeqs>0{
qui disp "dealing with geqs"
local i = 1
while `i'<=$HG_ngeqs{
local k = M_ngeqs[1,`i']
local n = M_ngeqs[2,`i']
qui disp "random effect `k' has `n' covariates"
local nxt2 = `nxt'+`n'-1
matrix `s1' = `b2'[1,`nxt'..`nxt2']
qui matrix list `s1'
local nxt = `nxt2' + 1
capture drop `junk'
matrix score double `junk' = `s1'
qui disp "multiply " `junk'[$which] " by HG_s`k' and add to HG_xb1"
qui replace $HG_xb1 = $HG_xb1 + `junk'*${HG_s`k'}
qui disp "HG_xb1:" $HG_xb1[$which]
local i = `i' + 1
}
}
/* use inter */
if $HG_inter~=0{
local k = $HG_l + 1
local j = $HG_r + 1
qui disp "HG_s`k' = HG_s`k'*HG_s`j'
qui replace ${HG_s`k'} = ${HG_s`k'}*${HG_s`j'}
}
/* use CHmat */
if $HG_free==0&$HG_tprf>1{
qui disp "dealing with Cholesky matrix"
qui matrix list CHmat
local i = 1
while (`i'<$HG_tprf){
local k = `i' + `nrfold'
qui replace `junk'=0
local j = `i'
qui disp "making s`k'"
while `j'<$HG_tprf{
local l = `j' + `nrfold'
qui replace `junk' = `junk' + CHmat[`j',`i']*${HG_s`l'}
qui disp " adding CHmat[`j',`i']s`l'"
local j = `j' + 1
}
qui replace ${HG_s`k'}=`junk'
qui disp "s`k' = ${HG_s`k'} = " ${HG_s`k'}[$which]
local i = `i' + 1
}
}
* label M_znow
local i=2
local lab
while `i'<=$HG_tprf{
local lab "`lab' ${HG_s`i'}"
local i = `i' + 1
}
matrix colnames M_znow=`lab'
qui disp "M_znow:"
qui matrix list M_znow
end