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.

1535 lines
48 KiB
Plaintext

*! version 2.2.21 SRH 7 Sept 2011
program define gllam_ll
version 7.0
*disp in re "version 7.0"
args todo bo lnf junk1 junk2 what res
* what = 1: update posterior means and standard deviations
* what = 2: posterior probabilities
* what = 3: cluster likelihood contributions*cluster frequency weights
* what = 4: cluster likelihood contributions
* what = 5-7: posterior mean of statistic
/*
noi disp " "
noi disp $HG_SD1[$which]
noi disp $HG_SD2[$which]
noi disp $HG_C21[$which]
noi disp " "
*/
if "`what'"==""{
local what = 0
}
if `what' == 1 {
global HG_zip zipg1
if $HG_free{
global HG_zip zipf1
}
}
else if $HG_adapt{
global HG_zip zipga
}
*matrix list `bo'
if $HG_dots {
noi disp in gr "." _c
}
/* ----------------------------------------------------------------------------- */
/* set up variables and macros needed */
tempname b mzlc
local toplev = $HG_tplv
local topi = $HG_tpi
local clus $HG_clus
sort `clus'
* reset the the clock and reset znow
local i = 1
matrix M_ip[1,1] = 1 /* in case topi=0 */
while (`i' <= `topi'){
matrix M_ip[1,`i'] = 1
local i = `i' + 1
}
/* -------------------------------------------------------------------------------- */
/* set up lprod1 ... lint1 */
local i=1
tempvar extra
quietly gen double `extra'=0
while `i' <= `toplev'{
tempvar lint`i'
gen double `lint`i'' = 0.0 /* used to integrate, therefore must be zero */
tempvar lfac`i'
quietly gen double `lfac`i'' = 0
if (`i'>1){
tempvar lprod`i'
quietly gen double `lprod`i'' = .
tempvar lfac`i'
quietly gen double `lfac`i'' = 0
}
local i = `i' + 1
}
/* set up names for HG_xb`i' */
local i = 1
while (`i' <= $HG_tpff){
tempname junk
global HG_xb`i' "`junk'"
local i = `i' + 1
}
/* set up names for HG_s`i' */
local i = 1
while (`i'<=$HG_tprf){
tempname junk
global HG_s`i' "`junk'"
local i = `i'+1
}
if $HG_free{
/* set up names for HG_p`lev'`k' */
local lev = 2
while `lev'<=$HG_tplv{
local npar = M_np[1,`lev']
if `npar'>0{
local k = 1
while `k'<=M_nip[1, `lev']{
* disp in re "creating HG_p`lev'`k'"
tempname junk
global HG_p`lev'`k' "`junk'"
local k = `k' + 1
}
}
local lev = `lev' + 1
}
}
/* set up names for HG_E`rf'`lev' and HG_V`rf'`lev' */
if `what'==1{
local lev = 1
while `lev'<=$HG_tplv{
if `lev'<$HG_tplv{
local maxrf =M_nrfc[2,`lev'+1]
}
else{
local maxrf =M_nrfc[2,$HG_tplv]
}
local rf = 1
while `rf'<`maxrf'{
* disp in re "creating HG_V`rf'`rf'`lev'"
tempname junk
global HG_E`rf'`lev' "`junk'"
gen double ${HG_E`rf'`lev'}=0
tempname junk
global HG_V`rf'`rf'`lev' "`junk'"
gen double ${HG_V`rf'`rf'`lev'}=0
local rf2 = `rf' + 1
while `rf2'<$HG_tprf{ /* lower diagonal elements */
* disp in re "creating HG_V`rf2'`rf'`lev'"
tempname junk
global HG_V`rf2'`rf'`lev' "`junk'"
gen double ${HG_V`rf2'`rf'`lev'}=0
local rf2 = `rf2' + 1
}
local rf = `rf' + 1
}
local lev = `lev' + 1
}
}
else if $HG_adapt{
local llev = 1
while `llev'<$HG_tplv{
local lrf = M_nrfc[2,`llev']
while `lrf'<M_nrfc[2,`llev'+1]{
tempname junk
global HG_E`lrf'`llev' "`junk'"
gen double ${HG_E`lrf'`llev'}=0
local lrf = `lrf' + 1
}
local llev = `llev' + 1
}
}
/* set up names for posterior mean of statistic */
if `what'>=5{
tempvar lpred
local lev = 1
while `lev'<=$HG_tplv{
tempname junk
global HG_stat`lev' "`junk'"
gen double ${HG_stat`lev'}=0
local lev =`lev' + 1
}
}
qui remcor "`bo'"
if $HP_prior{
qui calc_prior
}
*noi matrix list `bo'
/*
if `npar'>0{
disp in re "after remcor: HG_p21[$which] = " $HG_p21[$which]
disp in re "after remcor: HG_p22[$which] = " $HG_p22[$which]
}
*/
if $HG_error==1{
disp in re "error in remcor"
scalar `lnf' = .
exit
}
if "$HG_post"!=""{ /* for predictions */
*noi tab $HG_ind
tempvar mssvls
* disp in re "`mssvls'"
qui gen byte `mssvls' = 0
qui replace `mssvls' = 1 if ($ML_y1>=.) & $HG_ind>0
local ffs = 1
while `ffs' <= $HG_tpff {
qui replace `mssvls' = 1 if ${HG_xb`ffs'} >=. & $HG_ind>0
local ffs = `ffs' + 1
}
if M_nbrf[1,1]>0{
qui replace `mssvls' = 1 if $HG_s1>=. & $HG_ind>0
}
}
* disp "HG_xb1 after remcor: HG_xb1[$which] = " $HG_xb1[$which]
* disp "HG_s2 after remcor: HG_s2[$which] = " $HG_s2[$which]
* disp "HG_s1 after remcor: HG_s1[$which] = $HG_s1 = " $HG_s1[$which]
if $HG_adapt{
*noi disp " "
local i = $HG_tprf - 1
while `i' >= 1 {
local ip = `i' + 1
local k = `i' - 1
while `k' >= 1 {
local kp = `k' + 1
* disp in re "replace HG_s`ip' = HG_s`ip' + HG_C`i'`k'*HG_s`kp'"
qui replace ${HG_s`ip'} = ${HG_s`ip'} + ${HG_C`i'`k'}*${HG_s`kp'}
local k = `k' - 1
}
local i = `i' - 1
}
local i = 2
tempname junk
global HG_zuoff "`junk'"
qui gen double $HG_zuoff = 0
while `i'<=$HG_tprf{
local im = `i' - 1
* disp in re "replace HG_zuoff = HG_zuoff + HG_s`i'*HG_MU`im'"
qui replace $HG_zuoff = $HG_zuoff + ${HG_s`i'}*${HG_MU`im'}
* disp in re "replace HG_s`i' = HG_SD`im'*HG_s`i'"
qui replace ${HG_s`i'} = ${HG_SD`im'}*${HG_s`i'}
local i = `i' + 1
}
*dis in re "HG_zuoff[$which] = " $HG_zuoff[$which]
}
local i = `toplev'
while `i' > 1 {
*noi disp "$HG_zip `i'$
quietly $HG_zip `i'
local i = `i' - 1
}
timer on 2
* disp "STARTING LOOP"
/* --------------------------------------------------------------------------------- */
/* recursive loop through r.effs (levels) */
/* topi nested loops: irf from 1 ro nip(rf) */
/* ip is "clock": (irf) stages of loops */
local levno = `toplev'
local rf = `topi'
while (`rf' <= `topi') { /* for each r.eff */
/* ----------------------------------------------------------------------------------*/
/* reset ip to 1st point for all lower r.effs... */
/* update znow */
* disp "reset ip up to random effect " `rf'
while (`rf' > 1) {
local rf = `rf' - 1
* disp `rf'
matrix M_ip[1,`rf'] = 1
}
while (`levno' > 1){
/* update znow for all new ips */
*noi disp "$HG_zip `levno'$
$HG_zip `levno'
local levno = `levno' - 1
}
/* --------------------------------------------------------------------------------- */
/* set lint1 to lpyz for new znow */
local rf = 1
local levno = 1
local sortlst `clus' /* cluster variables to aggregate over */
*matrix list M_ip
timer on 3
qui lpyz `lint1'
timer off 3
* noi disp in re " after lpyz lint1[" $which "] = " `lint1'[$which] " and HG_ind = " $HG_ind[$which]
if "$HG_post"!=""{/* for presictions */
qui replace `lint1' = 0 if `mssvls'==1
}
* noi disp in re " after lpyz lint1 = " `lint1'[$which] " and HG_ind = " $HG_ind[$which]
if `what'>=5{
if $HG_tplv>1{
matrix score double `lpred' = M_znow
}
else{
qui gen double `lpred' = 0
}
if $HG_adapt{
qui replace `lpred' = $HG_xb1 + $HG_zuoff + `lpred' - $HG_offs
}
else{
qui replace `lpred' = $HG_xb1 + `lpred' - $HG_offs
}
timer on 5
gllas_yu $HG_stat1 `lpred' `res' `what'
sort `sortlst' /* added Oct 2004 */
timer off 5
qui drop `lpred'
}
*noi summ `lint1' if `lint1'==-100
quietly count if `lint1'==.& $HG_ind>0
* noi disp in re "number missing: " r(N)
if r(N) > 0{
* overflow problem
* disp in re "overflow at level 1 ( " r(N) " missing values)"
* list $HG_clus if `lint1'==.
*matrix list `bo'
*lpyz `lint1'
if `what'!=3 { /* what = 3 used by robust & need valid ll contributions */
scalar `lnf' = .
exit
}
}
quietly replace `lint1' = `lint1' * $HG_wt1
/* --------------------------------------------------------------------------------- */
/* update lint for all completed levels up to */
/* highest completed level, reset lower lints */
/* to zero (for models including a random effect) */
while (M_ip[1,`rf'] == M_nip[1,`rf'] & `rf' <= `topi'){
* digit equals its max => increment next digit
if (`rf' == M_nrfc[1,`levno'] & `levno' < `toplev'){
* done last r.eff of current level
* disp "********** level " `levno' " complete ************"
* next level
local lprev = `levno'
local levno = `levno' + 1
/* change sortlst */
local prvsort `sortlst'
local l = `toplev' - `levno' + 2
tokenize "`sortlst'"
* take away var. of level to sum over
local `l' " "
local sortlst "`*'"
/*------------------------------------------------------------------------------------ */
/* change lprod`levno' and */
/* update lint`levno' */
if "`f`levno''"==""{ /* first term for lint`levno' */
local f`levno'=1
* disp "first term for level `levno'"
}
else{
local f`levno'=0
* disp "next term for level `levno'"
}
timer on 4
if $HG_noC1 {
lnupdate `levno' `lint`levno'' `lint`lprev'' `lprod`levno'' /*
*/ `lfac`levno'' `lfac`lprev'' `extra' /*
*/ `lnf' "`prvsort'" "`sortlst'" `f`levno'' `what'
}
else {
_gllamm_lnu, levno(`levno') lintlv(`lint`levno'') /*
*/ lintprv(`lint`lprev'') lprodlv(`lprod`levno'') /*
*/ lfaclv(`lfac`levno'') lfacprv(`lfac`lprev'') extra(`extra') /*
*/ lnf(`lnf') prvsort(`prvsort') sortlst(`sortlst') /*
*/ first(`f`levno'') what(`what')
}
timer off 4
local f`lprev'
*args levno lintlv lintprv lprodlv lfaclv lfacprv extra lnf prevsort sortlst first
/* ------------------------------------------------------------------------------------------- */
} /* next digit */
local rf = `rf' + 1
}
* rf is first r.eff that is not complete
* increase clock in lowest incomplete digit
* disp "update rf = " `rf'
matrix M_ip[1,`rf'] = M_ip[1,`rf'] + 1
}
timer off 2
*quietly{
*now rf too high
*!! disp "********** level " `toplev' " complete ************"
* noi disp "lint" `toplev' "[" $which "] = " `lint`toplev''[$which]
if(`toplev'>1){
if `what'==1{
local rf = 1
while `rf'< $HG_tprf{
* disp in re "setting HG_MU`rf' and HG_SD`rf'"
* disp in re "by `sortlst': replace HG_MU`rf' = HG_E`rf'`toplev'/lint`toplev'[_N]"
qui by `sortlst': replace ${HG_MU`rf'} = ${HG_E`rf'`toplev'}/`lint`toplev''[_N]
qui by `sortlst': replace ${HG_SD`rf'} = ${HG_V`rf'`rf'`toplev'}/`lint`toplev''[_N] - ${HG_MU`rf'}^2
qui replace ${HG_SD`rf'} = cond(${HG_SD`rf'}>0,sqrt(${HG_SD`rf'}),0)
*noi disp " "
*noi disp "HG_MU`rf'[$which] = " ${HG_MU`rf'}[$which]
*summ ${HG_MU`rf'}
*noi disp "HG_SD`rf'[$which] = " ${HG_SD`rf'}[$which]
*summ ${HG_SD`rf'}
local rf2 = 1
while `rf2' < `rf'{ /* must use MU's that are already calculated */
qui by `sortlst': replace ${HG_C`rf'`rf2'} = ${HG_V`rf'`rf2'`toplev'}/`lint`toplev''[_N] - (${HG_MU`rf2'}*${HG_MU`rf'})
*noi disp "HG_C`rf'`rf2'[$which] = " ${HG_C`rf'`rf2'}[$which]
*summ ${HG_C`rf'`rf2'}
local rf2 = `rf2' + 1
}
local rf = `rf' + 1
}
if $HG_adapt==1{ /* have recalculated means and covariances and need diff. ones for adaptive */
prepadpt
}
}
else if `what'>=5{
if $HG_post{
qui by `sortlst': replace ${HG_stat`toplev'} = ${HG_stat`toplev'}/`lint`toplev''[_N]
}
}
else if `what'==2{
local i = 1
while `i'<= M_nip[1,2] {
qui by `sortlst': replace ${HG_p`i'} = ${HG_p`i'}/`lint`toplev''[_N]
local i = `i' + 1
}
}
*a disp "taking log of lint" `toplev' " = " `lint`toplev''[$which]
*a disp "subtracting " `lfac`toplev''[$which]
** begin junk (conditional log-likelihood for capture-recapture)
/*
qui replace `lint`toplev'' = exp(ln(`lint`toplev'')-`lfac`toplev'')
qui summ `lint`toplev'', meanonly
qui replace `lint`toplev'' = ${HG_wt`toplev'}*(ln(`lint`toplev'') - ln(r(sum)))
*/
** end junk
quietly replace `lint`toplev'' = (ln(`lint`toplev'')-`lfac`toplev'')* ${HG_wt`toplev'}
}
* noi display "lint" `toplev' "[" $which "] = " `lint`toplev''[$which]
if `what'==3{
if `toplev'==1{ /* by sorlst won't work for composite link */
qui replace `res' = `lint`toplev''
}
else{
qui by `sortlst': replace `res' = `lint`toplev''[_N]
}
if $HP_prior {
qui replace `res' = `res' + $HP_res/ M_nu[1,$HG_tplv]
}
}
else if `what'==4{
if `toplev'==1{ /* by sorlst won't work for composite link */
qui replace `res' = `lint`toplev''/ ${HG_wt`toplev'}
}
else{
qui by `sortlst': replace `res' = `lint`toplev''[_N]/ ${HG_wt`toplev'}
}
if $HP_prior {
qui replace `res' = `res' + $HP_res / M_nu[1,$HG_tplv]
}
}
else if `what'>=5{
qui replace `res' = ${HG_stat`toplev'}
}
qui by `sortlst': replace `extra' = cond(_n==_N,1,0)
*mlsum `lnf' = `lint`toplev'' if `extra' == 1 /* can only use this when program called by ML */
*noi summ `lint`toplev'' if `extra' == 1
*list $HG_clus `lint`toplev'' if `extra' ==1 & `lint`toplev''< -300
qui count if `extra' == 1
local n = r(N)
summarize `lint`toplev'', meanonly
if `n' > r(N) {
* noi disp "there are " r(N) " values of likelihood, should be " `n'
* noi list $HG_clus if `extra' == 1& `lint`toplev''==.
* noi matrix list `bo'
* noi disp "lnf equal to missing in last step"
scalar `lnf' = .
exit
}
scalar `lnf' = r(sum)
if $HP_prior{
if $HP_sprd == 1 & `what'== 0 {
scalar `lnf' = `lnf' + $HP_res / M_nu[1,$HG_tplv]
}
else{
* disp in re $HP_res
scalar `lnf' = `lnf' + $HP_res
}
}
* display in re "total lnf = " `lnf'
* capture drop lint`toplev'
* gen double lint`toplev' = `lint`toplev''
*} /* qui */
end
program define prepadpt
*qui replace $HG_C21 = 0
*qui replace $HG_MU1 = 0
*qui replace $HG_MU2 = 0
*qui replace $HG_SD1 = 1
*qui replace $HG_SD2 = 1
*qui replace $HG_C31 = 0
*qui replace $HG_C32 = 0
*disp in re " "
local tplv = $HG_tplv
local i = $HG_tprf - 1
while `i' >= 1 {
* disp in re " "
qui replace ${HG_MU`i'} = 0 if ${HG_MU`i'} ==.
*qui replace ${HG_SD`i'} = 1e-05 if ${HG_SD`i'} < 1e-25 | ${HG_SD`i'} ==.
qui replace ${HG_SD`i'} = 1e-05 if ${HG_SD`i'} < 1e-05 | ${HG_SD`i'} ==.
* variance
* disp in re "HG_V`i'`i'`tplv' = HG_SD`i'^2"
qui replace ${HG_V`i'`i'`tplv'} = ${HG_SD`i'}^2
local j = $HG_tprf - 1
while `j' > `i'{
* disp in re "HG_V`i'`i'`tplv' = HG_V`i'`i'`tplv' - HG_C`j'`i'*HG_V`j'`i'`tplv' "
** new
qui replace ${HG_C`j'`i'} = 0 if ${HG_V`i'`i'`tplv'} - ${HG_C`j'`i'}*${HG_V`j'`i'`tplv'} < 0
qui replace ${HG_V`i'`i'`tplv'} = ${HG_V`i'`i'`tplv'} - ${HG_C`j'`i'}*${HG_V`j'`i'`tplv'}
qui replace ${HG_MU`i'} = ${HG_MU`i'} - ${HG_C`j'`i'}*${HG_MU`j'}
* disp in re "HG_MU`i' = HG_MU`i' - HG_C`j'`i'*HG_MU`j' = " in ye ${HG_MU`i'}[$which]
* noi summ ${HG_MU`i'}
local j = `j' - 1
}
* disp in re "negative variances"
* noi summ ${HG_V`i'`i'`tplv'} if ${HG_V`i'`i'`tplv'} <0
* noi list $HG_clus ${HG_V`i'`i'`tplv'} if ${HG_V`i'`i'`tplv'} <0
* qui replace ${HG_V`i'`i'`tplv'} = 1e-10 if ${HG_V`i'`i'`tplv'} <0
qui replace ${HG_SD`i'} = sqrt(${HG_V`i'`i'`tplv'})
*disp in re "HG_MU`i' = " in ye in ye ${HG_MU`i'}[$which]
*disp in re "HG_SD`i' = " in ye ${HG_SD`i'}[$which]
* noi summ ${HG_SD`i'}
* covariances and betas
local k = `i' - 1
while `k' >= 1 {
qui replace ${HG_V`i'`k'`tplv'} = ${HG_C`i'`k'}
* disp in re "HG_V`i'`k'`tplv' = HG_C`k'`i'"
local j = $HG_tprf - 1
while `j' > `i'{
*disp in re "HG_V`i'`k'`tplv' = HG_V`i'`k'`tplv' - HG_C`j'`i'*HG_V`j'`k'`tplv'"
qui replace ${HG_V`i'`k'`tplv'} = ${HG_V`i'`k'`tplv'} - ${HG_C`j'`i'}*${HG_V`j'`k'`tplv'}
local j = `j' - 1
}
qui replace ${HG_C`i'`k'} = ${HG_V`i'`k'`tplv'}/${HG_V`i'`i'`tplv'}
* noi summ ${HG_C`i'`k'}
*disp in re "HG_C`i'`k' = " in ye ${HG_C`i'`k'}[$which]
local k = `k' - 1
}
local i = `i' - 1
}
*qui replace $HG_C21 = 0
/*
qui replace $HG_MU2 = .57022599
qui replace $HG_SD2 = .83303331
qui replace $HG_MU1 = -.55565732
qui replace $HG_SD1 = .65728191
*/
end
program define lnupdate
version 7.0
args levno lintlv lintprv lprodlv lfaclv lfacprv extra lnf prvsort sortlst first what
tempvar lpkpl
quietly{
* disp in re "!!! update level " `levno'
* noi matrix list M_znow
/* set previous lint to ln(lint) */
local lprev = `levno' - 1
if(`levno' > 2){
*!! disp " replace lint" `lprev' " by ln(lint" `lprev' ")"
quietly count if `lintprv' < 1e-308
if r(N) > 0{
/* overflow problem */
* noi disp "overflow at level " `lprev'
scalar `lnf' = .
exit
}
if `what'==1{
local rf = 1
while `rf'< M_nrfc[2,`lprev']{
* disp "by `prvsort': replace HG_E`rf'`lprev' = HG_E`rf'`lprev'/lintprv[_N]"
qui by `prvsort': replace ${HG_E`rf'`lprev'} = ${HG_E`rf'`lprev'}/`lintprv'[_N]
* disp in re "by `prvsort': replace HG_V`rf'`rf'`lprev' = HG_V`rf'`rf'`lprev'/lintprv[_N]"
qui by `prvsort': replace ${HG_V`rf'`rf'`lprev'} = ${HG_V`rf'`rf'`lprev'}/`lintprv'[_N]
local rf2 = `rf' + 1
while `rf2' < $HG_tprf{
* disp in re "by `prvsort': replace HG_V`rf2'`rf'`lprev' = HG_V`rf2'`rf'`lprev'/lintprv[_N]"
qui by `prvsort': replace ${HG_V`rf2'`rf'`lprev'} = ${HG_V`rf2'`rf'`lprev'}/`lintprv'[_N]
local rf2 = `rf2' + 1
}
local rf = `rf' + 1
}
}
if `what'>=5{
if $HG_post{
qui by `prvsort': replace ${HG_stat`lprev'} = ${HG_stat`lprev'}/`lintprv'[_N]
}
}
quietly replace `lintprv' = ln(`lintprv')
quietly replace `lintprv' = (`lintprv'-`lfacprv')*${HG_wt`lprev'}
}
/* sum previous lprod within cluster at current level */
*!! disp " "
* noi disp "by `sortlst': replace lprod" `levno' "=cond(_n==N, sum(lint" `lprev' "))"
* noi summ `lintprv'
quietly by `sortlst': replace `lprodlv' = cond(_n==_N,sum(`lintprv'),.)
* noi disp " "
* noi disp "lprod" `levno' " = " `lprodlv'[$which]
* noi disp "lintprv[" $which "]= " `lintprv'[$which]
/* accumulate terms for integral */
/* get lpkpl: log of product of r.effs at level */
qui $HG_lzpr `levno' `lpkpl'
* noi disp "exp(lprod`leno'+lpkpl) = " exp(`lpkpl'[$which]+`lprodlv'[$which])
if `first' { /* first term for lint`levno' */
quietly replace `extra' = 0
quietly replace `lfaclv' = -`lprodlv' - `lpkpl'
*a noi disp " "
* noi disp "lfac`levno' = " `lfaclv'[$which]
* noi disp "lintlv = 1"
qui replace `lintlv' = 1
}
else{
local max = 500
quietly replace `extra' = cond(`lprodlv'+ `lpkpl'+`lfaclv'>`max', /*
*/ -(`lprodlv'+`lpkpl'+`lfaclv')+`max',0)
* noi disp "extra = " `extra'[$which]
quietly replace `lfaclv'=`lfaclv'+`extra'
* noi disp "lfac`levno' = " `lfaclv'[$which]
/* increment lint at current level using lprod at previous level */
* noi disp "increase lint" `levno' " by exp(lprodlv + lpkpl +lfaclv)"
quietly replace `lintlv' = exp(`extra')*`lintlv' + exp(`lprodlv'+ `lpkpl'+`lfaclv')
* noi disp "increase by " exp(`lprodlv'[$which]+`lpkpl'[$which]+`lfaclv'[$which]) " to " `lintlv'[$which]
}
/* posterior means and variances*/
if `what'==1{
local rf = 1
while `rf'< M_nrfc[2,`levno'] {
* noi disp "update `rf' `levno'"
quietly by `sortlst': replace ${HG_E`rf'`levno'}=/*
*/ exp(`extra'[_N])*${HG_E`rf'`levno'}+ ${HG_E`rf'`lprev'}*exp(`lprodlv'[_N]+`lpkpl'+`lfaclv'[_N])
* noi disp "HG_E" `rf' `levno' "[" $which "] = " ${HG_E`rf'`levno'}[$which]
quietly by `sortlst': replace ${HG_V`rf'`rf'`levno'}=/*
*/ exp(`extra'[_N])*${HG_V`rf'`rf'`levno'}+ ${HG_V`rf'`rf'`lprev'}*exp(`lprodlv'[_N]+`lpkpl'+`lfaclv'[_N])
*noi disp "HG_V" `rf' `rf' `levno' "[" $which "] = " ${HG_V`rf'`rf'`levno'}[$which]
local rf2 = `rf' + 1
while `rf2' < $HG_tprf {
* noi disp "HG_V`rf2'`rf'`levno' is ${HG_V`rf2'`rf'`levno'}"
quietly by `sortlst': replace ${HG_V`rf2'`rf'`levno'}=/*
*/ exp(`extra'[_N])*${HG_V`rf2'`rf'`levno'}+ ${HG_V`rf2'`rf'`lprev'}*exp(`lprodlv'[_N]+`lpkpl'+`lfaclv'[_N])
* noi disp "HG_V" `rf2' `rf' `levno' "[" $which "] = " ${HG_V`rf2'`rf'`levno'}[$which]
local rf2 = `rf2' + 1
}
local rf = `rf' + 1
}
}
if `what'>=5{
if $HG_post{
* disp in re "sortlist: `sortlst'"
*sort `sortlst' /* removed oct 2004 */
quietly by `sortlst': replace ${HG_stat`levno'}=/*
*/ exp(`extra'[_N])*${HG_stat`levno'}+ /*
*/ ${HG_stat`lprev'}*exp(`lprodlv'[_N]+`lpkpl'+`lfaclv'[_N])
}
else{
*disp in re "HG_stat`levno'[1] = " ${HG_stat`levno'}[1] " + " ${HG_stat`lprev'}[1] " * " exp(`lpkpl')
qui replace ${HG_stat`levno'} = ${HG_stat`levno'} + ${HG_stat`lprev'}*exp(`lpkpl')
}
}
else if `what'==2{
* noi matrix list M_ip
local i = M_ip[1,2]
local j = 1
while `j'<`i'{
quietly by `sortlst': replace ${HG_p`j'} = exp(`extra'[_N])*${HG_p`j'}
local j = `j' + 1
}
quietly by `sortlst': replace ${HG_p`i'} = exp(`lprodlv'[_N]+`lpkpl'+`lfaclv'[_N])
}
/* reset previous lint to zero */
if `levno'>2{
if `what'==1{
local rf = 1
while `rf'<M_nrfc[2,`lprev']{
* disp in re "replace HG_V`rf'`rf'`lprev' = 0"
qui replace ${HG_E`rf'`lprev'} = 0
qui replace ${HG_V`rf'`rf'`lprev'} = 0
local rf2 = `rf' + 1
while `rf2' < $HG_tprf{
* disp in re "replace HG_V`rf2'`rf'`lprev' = 0"
qui replace ${HG_V`rf2'`rf'`lprev'} = 0
local rf2 = `rf2' + 1
}
local rf = `rf' + 1
}
}
*!! disp "setting lint" `lprev' " to zero"
quietly replace `lintprv' = 0
quietly replace `lfacprv' = 0
*!!!!new
if `what'>=5{
*disp in re "setting HG_stat" `lprev' " to zero"
quietly replace ${HG_stat`lprev'} = 0
}
}
} /* qui */
end
program define zipf
version 7.0
* updates znow
* matrix list M_ip
args levno
* disp "in zip, levno is " `levno'
local i = M_nrfc[2,`levno'-1] + 1
*!! disp "update"
* same class for all random effects
local k = M_nrfc[1,`levno']
local k = M_ip[1,`k']
local last = M_nrfc[2,`levno']
while `i' <= `last'{
local npt = M_nip[2,`i']
local im = `i' - 1
* disp " "`im' "th z to " `which' "th location"
* disp " using M_zlc`npt' "
matrix M_znow[1,`im'] = M_zlc`npt'[1,`k']
local i = `i' + 1
}
end
program define zipf1
version 7.0
* updates znow
* matrix list M_ip
args levno
tempname mzlc
* disp "in zip, levno is " `levno'
local i = M_nrfc[2,`levno'-1] + 1
*!! disp "update"
* same class for all random effects
local k = M_nrfc[1,`levno']
local k = M_ip[1,`k']
local last = M_nrfc[2,`levno']
while `i' <= `last'{
local npt = M_nip[2,`i']
local im = `i' - 1
* disp " "`im' "th z to " `which' "th location"
* disp " using M_zlc`npt' "
matrix M_znow[1,`im'] = M_zlc`npt'[1,`k']
local i = `i' + 1
}
local llev = `levno' - 1
local im = M_nrfc[2,`llev']
while `im' < `last'{
* change HG_E and HG_V
scalar `mzlc' = M_znow[1,`im']
qui replace ${HG_E`im'`llev'} = ${HG_MU`im'} + ${HG_SD`im'}*`mzlc'
local im2 = $HG_tprf - 1
while `im2' > `im'{
scalar `mzlc' = M_znow[1,`im2']
* disp in re "replace HG_E`im'`llev' = HG_E`im'`llev' + HG_C`im2'`im'*(HG_MU`im2' + HG_SD`im2'*`mzlc')"
qui replace ${HG_E`im'`llev'} = ${HG_E`im'`llev'} + ${HG_C`im2'`im'}*(${HG_MU`im2'} + ${HG_SD`im2'}*`mzlc')
local im2 = `im2' - 1
}
* noi disp "HG_E`im'`llev'[$which] = " ${HG_E`im'`llev'}[$which]
qui replace ${HG_V`im'`im'`llev'} = ${HG_E`im'`llev'}^2
local im = `im' + 1
}
local im = M_nrfc[2,`llev']
while `im' < `last'{
* covariances with same level and higher level effects
local llev2 = `llev'
local im2 = `im' + 1
while `llev2'<$HG_tplv{
while `im2' < M_nrfc[2,`llev2' + 1]{
qui replace ${HG_V`im2'`im'`llev'} = ${HG_E`im'`llev'}*${HG_E`im2'`llev2'}
* disp in re "HG_V`im2'`im'`llev' = HG_E`im'`llev'*HG_E`im2'`llev2' = " in ye ${HG_V`im2'`im'`llev'}[$which]
local im2 = `im2' + 1
}
local llev2 = `llev2' + 1
}
local im = `im' + 1
}
end
program define zipg
version 7.0
* updates znow
* matrix list M_ip
args levno
* disp "in zip, levno is " `levno'
local i = M_nrfc[2,`levno'-1] + 1
*!! disp "update"
if $HG_mult{
*local npt = M_nip[2,`i']
local npt = M_nip[2,`levno']
local k = M_nrfc[1,`levno']
local k = M_ip[1,`k']
local f = M_nrfc[2,`levno'-1]
}
local last = M_nrfc[2,`levno']
while `i' <= `last'{
local im = `i' - 1
if $HG_mult{
matrix M_znow[1,`im'] = M_zlc`npt'[`i'-`f',`k']
}
else{
local npt = M_nip[2,`i']
local which = M_ip[1,`i']
* disp " "`im' "th z to " `which' "th location"
* disp " using M_zlc`npt' "
matrix M_znow[1,`im'] = M_zlc`npt'[1,`which']
}
*!! disp M_znow[1,`im']
local i = `i' + 1
}
end
program define zipga
version 7.0
* updates znow
* matrix list M_ip
args levno
tempname mzlc
* disp "in zip, levno is " `levno'
local llev = `levno' - 1
local i = M_nrfc[2,`llev'] + 1
*!! disp "update"
if $HG_mult{
*local npt = M_nip[2,`i']
local npt = M_nip[2,`levno']
local k = M_nrfc[1,`levno']
local k = M_ip[1,`k']
local f = M_nrfc[2,`levno'-1]
}
local last = M_nrfc[2,`levno']
while `i' <= `last'{
*local npt = M_nip[2,`i']
local im = `i' - 1
if $HG_mult{
matrix M_znow[1,`im'] = M_zlc`npt'[`i'-`f',`k']
}
else{
local npt = M_nip[2,`i']
local which = M_ip[1,`i']
* disp " "`im' "th z to " `which' "th location"
* disp " using M_zlc`npt' "
matrix M_znow[1,`im'] = M_zlc`npt'[1,`which']
}
local i = `i' + 1
}
local im = M_nrfc[2,`llev']
while `im' < `last'{
* change HG_E
scalar `mzlc' = M_znow[1,`im']
qui replace ${HG_E`im'`llev'} = ${HG_MU`im'} + ${HG_SD`im'}*`mzlc'
*local im2 = M_nrfc[2,`llev']
local im2 = $HG_tprf - 1
while `im2' > `im'{
scalar `mzlc' = M_znow[1,`im2']
* disp in re "replace HG_E`im'`llev' = HG_E`im'`llev' + HG_C`im2'`im'*(HG_MU`im2' + HG_SD`im2'*`mzlc')"
qui replace ${HG_E`im'`llev'} = ${HG_E`im'`llev'} + ${HG_C`im2'`im'}*(${HG_MU`im2'} + ${HG_SD`im2'}*`mzlc')
local im2 = `im2' - 1
}
* noi disp "HG_E`im'`llev'[$which] = " ${HG_E`im'`llev'}[$which]
*!! disp M_znow[1,`im']
local im = `im' + 1
}
end
program define zipg1
version 7.0
* updates znow
* matrix list M_ip
args levno
tempname mzlc
* noi disp "in zip, levno is " `levno'
local llev = `levno' - 1
local i = M_nrfc[2,`llev'] + 1
*!! disp "update"
if $HG_mult{
*local npt = M_nip[2,`i']
local npt = M_nip[2,`levno']
local k = M_nrfc[1,`levno']
local k = M_ip[1,`k']
local f = M_nrfc[2,`levno'-1]
}
local last = M_nrfc[2,`levno']
while `i' <= `last'{
local im = `i' - 1
*local npt = M_nip[2,`i']
if $HG_mult{
* disp in re "M_znow[1,`im'] = M_zlc`npt'[`i'-`f',`k']"
matrix M_znow[1,`im'] = M_zlc`npt'[`i'-`f',`k']
}
else{
local npt = M_nip[2,`i']
local which = M_ip[1,`i']
* disp " "`im' "th z to " `which' "th location"
* disp " using M_zlc`npt' "
matrix M_znow[1,`im'] = M_zlc`npt'[1,`which']
}
local i = `i' + 1
}
local im = M_nrfc[2,`llev']
while `im' < `last'{
* change HG_E and HG_V
scalar `mzlc' = M_znow[1,`im']
qui replace ${HG_E`im'`llev'} = ${HG_MU`im'} + ${HG_SD`im'}*`mzlc'
local im2 = $HG_tprf - 1
while `im2' > `im'{
scalar `mzlc' = M_znow[1,`im2']
* disp in re "replace HG_E`im'`llev' = HG_E`im'`llev' + HG_C`im2'`im'*(HG_MU`im2' + HG_SD`im2'*`mzlc')"
qui replace ${HG_E`im'`llev'} = ${HG_E`im'`llev'} + ${HG_C`im2'`im'}*(${HG_MU`im2'} + ${HG_SD`im2'}*`mzlc')
local im2 = `im2' - 1
}
* noi disp "HG_E`im'`llev'[$which] = " ${HG_E`im'`llev'}[$which]
qui replace ${HG_V`im'`im'`llev'} = ${HG_E`im'`llev'}^2
local im = `im' + 1
}
local im = M_nrfc[2,`llev']
while `im' < `last'{
* covariances with same level and higher level effects
local llev2 = `llev'
local im2 = `im' + 1
while `llev2'<$HG_tplv{
while `im2' < M_nrfc[2,`llev2' + 1]{
qui replace ${HG_V`im2'`im'`llev'} = ${HG_E`im'`llev'}*${HG_E`im2'`llev2'}
* disp in re "HG_V`im2'`im'`llev' = HG_E`im'`llev'*HG_E`im2'`llev2' = " in ye ${HG_V`im2'`im'`llev'}[$which]
local im2 = `im2' + 1
}
local llev2 = `llev2' + 1
}
local im = `im' + 1
}
end
program define lzprobf
version 7.0
* for free masses
* returns product of pk needed for integration at level lev for current ip
args levno lpkpl
tempname mzps mznow
* disp in re "in zprob, levno is " `levno'
local i=M_nrfc[1,`levno'-1] + 1
*!! disp "-----------lpkpl: sum of log of"
local npt = M_nip[2,`i']
* disp " prob for " `i' "th r.eff: " `which' "th weight"
* disp " using M_zps`npt' "
local which = M_ip[1,`i']
if M_np[1,`levno']>0{
qui gen double `lpkpl' = ${HG_p`npt'`which'}
}
else{
qui gen double `lpkpl' = M_zps`npt'[1,`which']
}
* disp in re "lpkpl[$which] = " `lpkpl'[$which]
end
program define lzprobg
version 7.0
* product gaussian quadrature
* returns product of pk needed for integration at level lev for current ip
args levno lpkpl
tempname mzps mznow
* disp in re "in zprob, levno is " `levno'
qui gen double `lpkpl' = 0
local lv = `levno' - 1
local i=M_nrfc[1,`lv'] + 1
*!! disp "-----------lpkpl: sum of log of"
local last = M_nrfc[1,`levno']
while `i' <= `last'{
local npt = M_nip[2,`i']
* disp " prob for " `i' "th r.eff: " `which' "th weight"
* disp " using M_zps`npt' "
local which = M_ip[1,`i']
local im = `i' - 1
scalar `mzps' = M_zps`npt'[1,`which']
qui replace `lpkpl' = `lpkpl'+ `mzps'
if $HG_adapt{
scalar `mznow' = M_znow[1,`im']
*qui replace `lpkpl' = `lpkpl' + ln(${HG_SD`im'}) + `mznow'^2/2 - (${HG_MU`im'} + ${HG_SD`im'}*`mznow')^2/2
qui replace `lpkpl' = `lpkpl' + ln(${HG_SD`im'}) + `mznow'^2/2 - (${HG_E`im'`lv'})^2/2
}
local i=`i'+1
}
* disp in re "lpkpl[$which] = " `lpkpl'[$which]
end
program define lzprobm
version 7.0
* mult version
* returns product of pk needed for integration at level lev for current ip
args levno lpkpl
tempname mzps mznow
* disp in re "in zprob, levno is " `levno'
local lv = `levno' - 1
local i=M_nrfc[1,`lv'] + 1
*!! disp "-----------lpkpl: sum of log of"
local npt = M_nip[2,`i']
* disp " prob for " `i' "th r.eff: " `which' "th weight"
* disp " using M_zps`npt' "
local which = M_ip[1,`i']
scalar `mzps' = M_zps`npt'[1,`which']
qui gen double `lpkpl' = `mzps'
if $HG_adapt{
local i=M_nrfc[2,`lv'] + 1
local last = M_nrfc[2,`levno']
while `i' <= `last'{
local im = `i' - 1
scalar `mznow' = M_znow[1,`im']
qui replace `lpkpl' = `lpkpl' + ln(${HG_SD`im'}) + `mznow'^2/2 - (${HG_E`im'`lv'})^2/2
*disp in re "HG_E`im'`lv'[$which] = " ${HG_E`im'`lv'}[$which]
local i = `i' + 1
}
}
*disp in re "lpkpl[$which] = " `lpkpl'[$which]
end
program define lpyz
version 7.0
* returns log of prob of obs. given znow
args lpyz
* disp "-----------------called lpyz"
tempvar zu xb mu /* linear predictor and zu: r.eff*design matrix for r.eff */
/* ----------------------------------------------------------------------------- */
*quietly{
if $HG_tprf>1{
matrix score double `zu' = M_znow
if $HG_adapt{
qui replace `zu' = $HG_zuoff + `zu'
*qui replace `zu' = $HG_E11*$HG_s2 + $HG_E21*$HG_s3
}
}
else{
qui gen double `zu' = 0
}
* matrix list M_znow
* disp "ML_y1: $ML_y1 " $ML_y1[$which]
* matrix list M_ip
disp " xb1 = " $HG_xb1[$which]
disp " zu = " `zu'[$which]
if $HG_mlog>0{
nominal `lpyz' `zu'
}
if $HG_oth{
local myand
if "$HG_lv"~=""&($HG_nolog>0|$HG_mlog>0){
local myand $HG_lvolo~=1
}
quietly gen double `mu' = 0
*if $HG_noC|$HG_comp>0 {
if $HG_noC {
link "$HG_link" `mu' $HG_xb1 `zu' $HG_s1
if $HG_comp>0 {
compos `mu' "`myand'"
}
*disp " mu = " `mu'[$which]
if $HG_comp>0{
if "`myand'"~=""{
local myand `myand' & $HG_ind>0
}
else{
local myand $HG_ind>0
}
}
family "$HG_famil" `lpyz' `mu' "`myand'"
}
else {
if $HG_lev1 != 0 {
local s1opt "st($HG_s1)"
}
if "$HG_denom" != "" {
local denopt "denom($HG_denom)"
}
if "$HG_fv" != "" {
local fvopt "fv($HG_fv)"
}
if "$HG_lv" != "" {
local lvopt "lv($HG_lv)"
local othopt "oth(M_oth)"
}
if "`myand'" != "" {
local ifopt "if `myand'"
}
if $HG_comp > 0 { /* only got here if new Stata 8 */
local comp "comp($HG_comp)"
local cclus "cluster($HG_clus)"
}
noi _gllamm_fl `lpyz' `mu' `ifopt', `s1opt' /*
*/ link($HG_link) family($HG_famil) `denopt' `fvopt' /*
*/ `lvopt' xb($HG_xb1) zu(`zu') /*
*/ y($ML_y1) `othopt' `comp' `cclus'
}
disp " mu = " `mu'[$which]
}
if $HG_nolog>0{
if $HG_noC {
ordinal `lpyz' `zu'
}
else {
if $HG_lev1 != 0 {
local stopt st($HG_s1)
}
if "$HG_lv"!="" {
local lvopt lv($HG_lv)
}
local j 1
while `j'<=$HG_tpff {
local xbeta `xbeta' ${HG_xb`j'}
local j = `j' + 1
}
_gllamm_ord `lpyz', y($ML_y1) xb(`xbeta') /*
*/ zu(`zu') link($HG_linko) nlog($HG_nolog) /*
*/ olog(M_olog) nresp(M_nresp) resp(M_resp) /*
*/ `stopt' `lvopt'
}
}
*} /* qui */
end
program define compos
version 7.0
args mu und
tempvar junk mu2
local ifs
if "`und'"~=""{
local ifs if `und'
}
gen double `junk'=0
gen double `mu2'=.
local i = 1
*disp in re "in compos: HG_clus is: $HG_clus"
while `i'<= $HG_comp{
*disp in re "in compos: variable HG_co`i' is: ${HG_co`i'}"
replace `junk' = `mu'*${HG_co`i'}
qui by $HG_clus: replace `junk' = sum(`junk')
qui by $HG_clus: replace `mu2' = `junk'[_N] if $HG_ind==`i'
local i = `i' + 1
}
qui replace `mu' = `mu2' `ifs'
end
program define nominal
version 7.0
args lpyz zu
tempvar mu
if $HG_smlog{
local s $HG_s1
}
else{
local s = 1
}
local and
if "$HG_lv"~=""{
local and & $HG_lv == $HG_mlog
local mlif if $HG_lv == $HG_mlog
}
disp "mlogit link `mlif'"
if $HG_exp==1&$HG_expf==0{
qui gen double `mu' = exp(`zu'/`s') if $ML_y1==M_respm[1,1] `and'
local n=rowsof(M_respm)
local i=2
while `i'<=`n'{
local prev = `i' - 1
* disp "xb`prev':" ${HG_xb`prev'}[$which]
qui replace `mu' = exp((${HG_xb`prev'} + `zu')/`s') if $ML_y1==M_respm[`i',1] `and'
local i = `i' + 1
}
sort $HG_clus $HG_ind
qui by $HG_clus: replace `lpyz'=cond(_n==_N,sum(`mu'),.) `mlif'
qui replace `lpyz' = ln(`mu'/`lpyz') `mlif'
/* skip sort
qui by $HG_clus: replace `lpyz' = sum(`mu') `mlif'
qui by $HG_clus: replace `lpyz' = cond($HG_ind>0,ln(`mu'/`lpyz'[_N]),.) `mlif'
*/
}
else if $HG_exp==1&$HG_expf==1{
qui gen double `mu' = exp(($HG_xb1 + `zu')/`s') `mlif'
sort $HG_clus $HG_ind
* disp "sort $HG_clus $HG_ind"
qui by $HG_clus: replace `lpyz'=cond(_n==_N,sum(`mu'),.) `mlif'
* disp "denom = " `lpyz'[$which]
qui replace `lpyz' = ln(`mu'/`lpyz') `mlif'
}
else{
tempvar den tmp
local n=rowsof(M_respm)
local i = 2
qui gen double `mu' = 1 if $ML_y1==M_respm[1,1] `mlif'
qui gen double `den' = 1
qui gen double `tmp' = 0
while `i'<= `n'{
local prev = `i' - 1
qui replace `tmp' = exp((${HG_xb`prev'} + `zu')/`s') `mlif'
qui replace `mu' = `tmp' if $ML_y1==M_respm[`i',1] `mlif'
replace `den' = `den' + `tmp' `mlif'
local i = `i' + 1
}
replace `lpyz' = ln(`mu'/`den') `mlif'
}
end
program define ordinal
version 7.0
args lpyz zu
local no = 1
local xbind = 2
tempvar mu p1 p2
qui gen double `p1' = 0
qui gen double `p2' = 0
qui gen double `mu' = 0
while `no' <= $HG_nolog{
local olog = M_olog[1,`no']
local lnk: word `no' of $HG_linko
if "`lnk'"=="ologit"{
local func logitl
}
else if "`lnk'"=="oprobit"{
local func probitl
}
else if "`lnk'"=="ocll"{
local func cll
}
else if "`lnk'"=="soprobit"{
local func sprobitl
}
local and
if "$HG_lv"~=""&$HG_nolog>0{
local and & $HG_lv == `olog'
}
* disp "ordinal link is `lnk', and = `and'"
local n=M_nresp[1,`no']
* disp "HG_xb1: " $HG_xb1
* disp "xbind = " `xbind'
* disp ${HG_xb`xbind'}[$which]
qui replace `mu' = $HG_xb1+`zu'-${HG_xb`xbind'}
`func' `mu' `p1'
qui replace `lpyz' = ln(1-`p1') /*
*/ if $ML_y1==M_resp[1,`no'] `and'
qui replace `p2' = `p1'
local i = 2
while `i' < `n'{
local nxt = `xbind' + `i' - 1
* disp "nxt = " `nxt'
* disp ${HG_xb`nxt'}[$which]
qui replace `mu' = $HG_xb1+`zu'-${HG_xb`nxt'}
`func' `mu' `p2'
* disp "p1 and p2: " `p1'[$which] " " `p2'[$which]
qui replace `lpyz' = ln(`p1' -`p2') /*
*/ if $ML_y1==M_resp[`i',`no'] `and'
qui replace `p1' = `p2'
local i = `i' + 1
}
local xbind = `xbind' + `n' -1
qui replace `lpyz' = ln(`p2') /*
*/ if $ML_y1==M_resp[`n',`no'] `and'
local no = `no' + 1
} /* next ordinal response */
*tab $ML_y1 if `lpyz'==. `and'
qui replace `lpyz' = -100 if `lpyz'==. `and'
end
program define logitl
version 7.0
args mu p
qui replace `p' = 1/(1+exp(-`mu'))
end
program define cll
version 7.0
args mu p
qui replace `p' = 1-exp(-exp(`mu'))
end
program define probitl
version 7.0
args mu p
qui replace `p' = normprob(`mu')
end
program define sprobitl
version 7.0
args mu p
qui replace `p' = normprob(`mu'/$HG_s1)
end
program define link
version 7.0
* returns mu for requested link
args which mu xb zu s1
* disp " in link, which is `which' "
tokenize "`which'"
local i=1
local ifs
while "`1'"~=""{
if "$HG_lv" ~= ""{
local oth = M_oth[1,`i']
local ifs if $HG_lv==`oth'
}
* disp "`1' link `ifs'"
if ("`1'" == "logit"){
quietly replace `mu' = 1/(1+exp(-`xb'-`zu')) `ifs'
}
else if ("`1'" == "probit"){
* disp "doing probit "
quietly replace `mu' = normprob((`xb'+`zu')) `ifs'
}
else if ("`1'" == "sprobit"){
quietly replace `mu' = normprob((`xb'+`zu')/`s1') `ifs'
}
else if ("`1'" == "log"){
* disp "doing log "
quietly replace `mu' = exp(`xb'+`zu') `ifs'
}
else if ("`1'" == "recip"){
* disp "doing recip "
quietly replace `mu' = 1/(`xb'+`zu') `ifs'
}
else if ("`1'" == "cll"){
* disp "doing cll "
quietly replace `mu' = 1 - exp(-exp(`xb'+`zu')) `ifs'
}
else if ("`1'" == "ll"){
quietly replace `mu' = exp(-exp(`xb'+`zu')) `ifs'
}
else if ("`1'" == "ident"){
quietly replace `mu' = `xb'+`zu' `ifs'
}
local i = `i' + 1
mac shift
}
end
program define family
version 7.0
args which lpyz mu und
tokenize "`which'"
local i=1
* disp "in family, und = `und'"
if "$HG_fv" == ""{
local ifs
if "`und'"~=""{local und if `und'}
}
else{
if "`und'"~=""{local und & `und'}
}
while "`1'"~=""{
if "$HG_fv" ~=""{
local ifs if $HG_fv == `i'
}
if ("`1'" == "binom"){
famb `lpyz' `mu' "`ifs'" "`und'"
}
else if ("`1'" == "poiss"){
famp `lpyz' `mu' "`ifs'" "`und'"
}
else if ("`1'" == "gauss") {
*disp in re "famg lpyz mu $HG_s1 `ifs' `und'"
famg `lpyz' `mu' $HG_s1 "`ifs'" "`und'" /* get log of conditional prob. */
}
else if ("`1'" == "gamma"){
famga `lpyz' `mu' $HG_s1 "`ifs'" "`und'"
}
else{
disp in re "unknown family in gllam_ll"
exit 198
}
local i = `i' + 1
mac shift
}
end
program define famg
version 7.0
* returns log of normal density conditional on r.effs
args lpyz mu s1 if and
* disp "running famg `if' `and'"
* disp "s1 = " `s1'[$which] ", mu = " `mu'[$which] " and Y = " $ML_y1[$which]
quietly replace `lpyz' = /*
*/ -(ln(2*_pi*`s1'^2) + (($ML_y1-`mu')/`s1')^2)/2 `if' `and'
end
program define famb
version 7.0
* returns log of binomial density conditional on r.effs
* $HG_denom is denominator
args lpyz mu if and
* disp "running famb `if' `and'"
* disp "mu = " `mu'[$which] " and Y = " $ML_y1[$which]
qui replace `lpyz' = cond($ML_y1>0,$ML_y1*ln(`mu'),0) /*
*/ + cond($HG_denom-$ML_y1>0,($HG_denom-$ML_y1)*ln(1-`mu'),0) /*
*/ + cond($HG_denom>1,lngamma($HG_denom+1)-lngamma($ML_y1+1) /*
*/ - lngamma($HG_denom-$ML_y1+1),0) `if' `and'
*tab $ML_y1 `if' `and' & `lpyz'==.
qui replace `lpyz' = cond(`lpyz'==.,-100,`lpyz') `if' `and'
* disp "done famb"
end
program define famp
version 7.0
* returns log of poisson density conditional on r.effs
args lpyz mu if and
*!! disp "running famp `if'"
* disp in re "if and: `if' `and'"
quietly replace `lpyz' = /*
*/ $ML_y1*(ln(`mu'))-`mu'-lngamma($ML_y1+1) `if' `and'
* qui replace `lpyz' = cond(`lpyz'==.,-100,`lpyz') `if' `and'
* disp "done famp"
end
program define famga
version 7.0
* returns log of gamma density conditional on r.effs
args lpyz mu s1 if and
*!! disp "running famg `if'"
*!! disp "mu = " `mu'[$which]
*!! disp "s1 = " `s1'[$which]
qui replace `mu' = 0.0001 if `mu' <= 0
tempvar nu
qui gen double `nu' = `s1'^(-2)
quietly replace `lpyz' = /*
*/ `nu'*(ln(`nu')-ln(`mu')) - lngamma(`nu')/*
*/ + (`nu'-1)*ln($ML_y1) - `nu'*$ML_y1/`mu' `if' `and'
end
program define timer
version 7.0
end