*! version 1.0.3 31Aug2003 program define cme, eclass version 8.0 if replay() { if "`e(cmd)'" != "cme" { error 301 } Replay `0' exit _rc } capture noisily Estimate `0' exit _rc end program define Estimate, eclass version 8.0 syntax anything(id="varlist etc.") [fweight pweight] [if] [in], [ noCOnstant /* */ Family(string) DEnom(varname numeric min=1) Link(string) /* */ Offset(varname numeric) TCovmod(varlist numeric) SImple /* */ NIp(passthru) noADapt FRom(passthru) ROBust CLuster(varname numeric) /* */ DOts noLOg noDISplay TRace EVal Level(passthru) EFORM ADOONLY /* */ MEVar(numlist min=1 max=1) COMmands INDirect TOTal] * get dependent and independent vars before (lab:var1 var2 ...) gettoken 0 coverr:anything, parse("(") syntax [varlist(min=1)] gettoken depvar indeps:varlist /* first variable (token) is depvar */ *local gindeps `indeps' if "`simple'"~=""{ local gindeps } else{ if "`tcovmod'"~=""{ local gindeps `tcovmod' } else{ local gindeps `indeps' } } local numg: word count `gindeps' * disp in re "Covariates for true covariate: `gindeps'" * interpret (lab:var1 var2 ...) gettoken lab 0:coverr, parse(":") /* "(lab" into lab and ":var1 var2 ...)" into 0 */ local lab: subinstr local lab "(" "" /* remove "(" from lab */ local 0: subinstr local 0 ")" "" /* remove ")" from 0 */ local 0: subinstr local 0 ":" "" /* remove ":" from 0 */ marksample touse markout `touse' `cluster' `denom' `offset' `gindeps' * define replics as var1 var 2... syntax [varlist(min=1)] local replics "`varlist'" *disp in re "regressio model `depvar' `indeps' `lab'" *disp in re "replicate measurements of `lab': `replics'" /* check link and family to avoid trouble with mixed responses in gllamm */ lnkfm "`link'" "`family'" local link1 = "$S_1" local fami1 = "$S_2" if "`fami1'"=="gauss"|"`fami1'"=="gamma"{ local varpar = 1 } else{ local varpar = 0 } preserve qui keep if `touse' *disp in re _N if "`commands'"~=""{ disp noi disp "------------------------------ begin do-file ------------------------------" } * deal with number of replicates and mevar local num: word count `replics' if `num' < 2{ if "`mevar'"==""{ disp in re "More than one replicate measurement required" disp in re "to estimate the measurement error variance" exit 198 } } if "`mevar'"~=""{ tempname melns1 if `mevar'< 0{ disp in re "Negative measurement error variance not allowed" exit 198 } else if `mevar'< 0.0000001{ disp in re "Cannot estimate the model with zero measurement error variance" disp in re "use glm" exit 198 } else{ scalar `melns1'= ln(`mevar')/2 } } /* sort out constant and offset */ if "`constant'"==""{ local numc = 1 } else{ local numc = 0 } if "`link1'"=="ologit"|"`link1'"=="oprobit"|"`link1'"=="ocll"{ quietly tab `depvar' local numc = r(r)-1 local nocons } else{ local nocons nocons } local add if "`offset'"~=""{ local add "offset(`offset')" } /* initial values */ if "`from'"==""{ tempname mat initp matg local reliab = 0.7 tempvar junk egen `junk' = rmean(`replics') qui reg `junk' `gindeps' matrix `matg' = e(b) local mn = `matg'[1,`numg'+1] /* true covariate mean or cons. */ if `numg'>0{ matrix `matg' = `matg'[1,1..`numg'] } local sdr = `e(rmse)'*sqrt(`reliab'*`num') /* true covariate variance */ if "`mevar'"==""{ tempname melns1 scalar `melns1'= ln(`e(rmse)'*sqrt( (1-`reliab')*`num')) } if substr("`link1'",1,1)~="o"{ * disp in re "glm `depvar' `indeps' `junk', link(`link1') fam(`fami1') `constant' " qui glm `depvar' `indeps' `junk', link(`link1') fam(`fami1') `constant' `add' } else{ /* ordinal links */ if "`link1'"=="ologit"|"`link1'"=="oprobit"{ qui `link1' `depvar' `indeps' `junk' `add' } else { /* ocll */ qui ologit `depvar' `indeps' `junk' `add' } } *set trace on matrix `mat' = e(b) local nc= colsof(`mat') local ncm2 = `nc' - 1 - `numc' /* position of last indepvar */ local ncm1 = `nc' - `numc' /* position of cov. effect */ if `ncm2'>0 { matrix `initp' = `mat'[1,1..`ncm2'] /* betas in outcome model */ } if `numc'>0{ local ncm1p1 = `ncm1' + 1 matrix `initp' = nullmat(`initp'), `mat'[1,`ncm1p1'..`nc'] /* beta_0, or _cut */ } if `varpar'{ matrix `initp' = nullmat(`initp'),ln(e(phi))/2 /* phi */ } matrix `initp' = nullmat(`initp'), `melns1', `mat'[1,`ncm1'], `sdr' /* sigma, lambda */ if `numg'>0{ matrix `initp' = `initp',`matg' /* gamma */ } matrix `initp' = nullmat(`initp') , `mn' /* gamma_0 */ * matrix list `initp' local frm "from(`initp')" local copy copy if "`commands'"~=""{ noi disp noi disp "* starting values" local nc = colsof(`initp') local ncm1 = `nc' - 1 local matexp "matrix startv = (" forvalues is = 1/ `ncm1'{ local junk = string(`initp'[1,`is'],"%9.4g") local matexp "`matexp' `junk'," } local junk = string(`initp'[1,`nc'],"%9.4g") local matexp "`matexp' `junk')" noi disp "`matexp'" noi disp "gen _id = _n" local cmfrm "from(startv)" } } else{ local frm "`from'" local cmfrm "`from'" local copy copy } * disp in re "cmfrm = `cmfrm'" /* prepare data */ tempvar id var v d1 dmeas *qui gen `id' = _n reshlong `depvar' `replics', oth(`indeps' `cluster' `offset' `denom' `gindeps') i(`id') /* */ j(`var') r(`v') wt(__blaay2) `commands' local glweight local cmglwei if "`weight'"=="fweight" { if "`commands'"~=""{ noi disp noi disp "* deal with frequency weights" noi disp "gen _junk `exp'" noi disp "replace _wt2 = _wt2*_junk" noi disp "drop junk" } tempvar wt qui gen long `wt' `exp' qui replace __blaay2 = __blaay2*`wt' } else if "`weight'"=="pweight" { if "`commands'"~=""{ noi disp noi disp "* deal with probability weights" noi disp "gen _pwt2 `exp'" local cmglwei "pweight(_pwt)" } qui gen double __blaby2 `exp' local glweight "pweight(__blaby)" } local glweight "`glweight' weightf(__blaay)" local cmglwei "`cmglwe' weightf(_wt)" if "`commands'"~=""{ noi disp noi disp "* create dummy variables and interactions" noi disp "gen byte cons = 1" noi disp "gen byte _d1 = _var == 1" noi disp "gen byte _dmeas = 1-_d1" noi disp "gen _type = _d1 + 2*_dmeas /* response type */ } qui gen byte `d1' = `var'==1 qui gen byte `dmeas' = 1-`d1' /* dummy for replicate measurements */ qui replace `var' = `d1' + 2*`dmeas' if `numg'>0{ local gind foreach x of varlist `gindeps'{ qui gen `x'_ = `x' local gind "`gind' `x'_" } } if "`indeps'"~=""{ foreach x of varlist `indeps'{ qui replace `x' = `x'*`d1' local cmindeps if "`commands'"~=""{ noi disp "gen _`x'_d1 = `x'*_d1" local cmindeps "`cmindeps' _`x'_d1" } } } else{ local cmindeps } if "`offset'"~=""{ qui replace `offset' = `offset'*`d1' if "`commands'"~=""{ noi disp "gen _`offset'_d1 = `offset'*_d1" local cmoffset "offset(_`offset'_d1)" } local offset "offset(`offset')" } rename `v' `depvar' if "`constant'"==""&substr("`link1'",1,1)~="o"{ local discons "`d1'" local cmdisc "_d1" } else{ local discons local cmdisc } if "`adapt'"==""{ local adapt adapt } else{ local adapt } if "`cluster'"~=""{ local clustvar "`cluster'" local cluster "cluster(`cluster')" } else{ local cluster } if "`denom'"~=""{ local denom "denom(`denom')" } local het if `varpar'{ eq het: `d1' `dmeas' local het "s(het)" } if "`mevar'"~=""{ if `varpar'{ constraint define 1 [lns1]`dmeas' = `melns1' } else{ constraint define 1 [lns1]_cons = `melns1' } local constr constr(1) long } else{ local constr } local geqs tempvar cons gen byte `cons' = 1 eq f1: `gind' `cons' local geqs "geqs(f1)" if "`commands'"~=""{ noi disp noi disp "* define equations" noi disp "eq load: _dmeas _d1" noi disp "eq f1: `gindeps' cons" if `varpar'{ noi disp "eq het: _d1 _dmeas" } if "`mevar'"~=""{ noi disp " " noi disp "* constraint for measurement error variance" if `varpar'{ noi disp "constraint define 1 [lns1]_dmeas =" `melns1' } else{ noi disp "constraint define 1 [lns1]_cons =" `melns1' } } noi disp " " noi disp "* call gllamm" noi disp "gllamm _r `cmindeps' `cmdisc', /* " noi disp " */ i(_id) `nocons' eqs(load) link(`link1' ident) family(`fami1' gauss) /*" noi disp " */ lv(_type) fv(_type) `het' `geqs' `denom' `cmfrm' `copy' `adapt' /*" noi disp " */ `cmglwei' `nip' `cmoffset' `robust' `cluster' `constr' `trace' `dots' `log' " noi disp noi disp "------------------------------- end do-file ------------------------------" restore exit 0 } /* call gllamm */ eq load: `dmeas' `d1' local nodis if "`trace'"==""{ local nodis nodisplay } else{ disp in gre "calling gllamm:" disp " " } gllamm `depvar' `indeps' `discons', i(`id') `nocons' eqs(load) link(`link1' ident) /* */ family(`fami1' gauss) lv(`var') fv(`var') `het' `geqs' `denom' `frm' `copy' `adapt' /* */ `glweight' `nip' `nolog' `offset' `robust' `cluster' `constr' `nodis' `trace' `dots' `log' tempname b V m matrix `b'=e(b) matrix `V'=e(V) /* rearrange parameters */ local nzs: word count `indeps' local numpar = `nzs'+`numc'+`varpar'+3+`numg'+1 matrix `m' = I(`numpar') * shift factor loading into first position after last beta matrix `m'[`nzs'+`numc'+`varpar'+2,`nzs'+`numc'+`varpar'+2]=0 matrix `m'[`nzs'+`numc'+`varpar'+2,`nzs'+1]=1 * shift all parameters up to "`nzs'+`numc'+`varpar'+1" one to the right local first = `nzs'+1 local last = `nzs'+`numc'+`varpar'+1 forvalues i=`first' / `last'{ matrix `m'[`i',`i'] = 0 matrix `m'[`i',`i'+1] = 1 } * matrix list `b' * matrix list `m' matrix `V' = `m''*`V'*`m' matrix `b' = `b'*`m' * matrix list `b' /* define column names */ local coln "`indeps' `lab' _cons _cons _cons" /* beta, lambda, sigma, tau, gamma1*/ local numcp = `numc'+`varpar' forval i = 1/ `numcp' { local coln "`coln' _cons" /* constants */ } forval i=1/ `numg' { local coln "`coln' _cons" /* gamma */ } /* define equation names */ local coleq "`depvar'" local last = `nzs'+1 forvalues i = 2/ `last' { local coleq "`coleq' `depvar'" } if substr("`link1'",1,1)~="o"{ if `numc'==1{ local coleq "`coleq' `depvar'" } } else{ forval i = 1/ `numc' { local coleq "`coleq' _cut`i'" } } if `varpar'{ local coleq "`coleq' _lnphi2" } local coleq "`coleq' lns1 sdT" if `numg'>0{ foreach x in `gindeps' { local coleq "`coleq' `x'" } } local coleq "`coleq' gamma0" matrix colnames `b'=`coln' matrix coleq `b'=`coleq' * matrix list `b' restore ereturn repost b=`b' V=`V', rename esample(`touse') tempname M_nu matrix `M_nu' = e(nu) ereturn local N = `M_nu'[1,2] if "`mevar'"~="" { ereturn scalar mevar = `mevar' } ereturn local lab `lab' if "`robust'"~=""{ ereturn local vcetype "Robust" } if "`cluster'"~=""{ ereturn local clustvar "`clustvar'" } ereturn local gindeps "`gindeps'" ereturn local cmd "cme" if substr("`link1'",1,1)=="o"{ ereturn local k_cat = `numc'+1 } if `varpar'{ ereturn local phi = exp(2*[_lnphi2]_cons) } Replay, `level' `eform' `indirect' `total' end capture program drop reshlong program define reshlong version 7.0 syntax varlist(min=1), I(string) J(string) R(string) wt(string) [ OTH(varlist) D(string) names COMMANDS ] confirm var `varlist' `oth' confirm new var `i' confirm new var `j' confirm new var `r' if "`d'"==""{ local d i } tempvar jvstr cons if "`commands'"~=""{ noi disp noi disp "* collapse data to make gllamm faster" noi disp "gen _one = 1" noi disp "collapse (sum) _wt2 = _one, by(`varlist' `oth')" noi disp "gen _id = _n" noi disp noi disp "* give response variable and replicate measurements same prefix" } qui gen `cons' = 1 qui collapse (sum) `wt'=`cons', by(`varlist' `oth') gen `i' = _n local ii = 1 foreach v of var `varlist' { qui rename `v' `r'`ii' if "`commands'"~=""{ noi disp "rename `v' _r`ii'" } local ii = `ii' + 1 } if "`commands'"~=""{ noi disp noi disp "* reshape data to long" noi disp "reshape long _r, i(_id) j(_var)" } qui reshape long `r', i(`i') j(`j') end program define lnkfm version 6.0 args link fam global S_1 /* link */ global S_2 /* family */ lnk "`1'" fm "`2'" if "$S_1" == "" { if "$S_2" == "gauss" { global S_1 "ident" } if "$S_2" == "poiss" { global S_1 "log" } if "$S_2" == "binom" { global S_1 "logit" } if "$S_2" == "gamma" { global S_1 "recip" } } /* if ("$S_1"=="mlogit"|"$S_1"=="smlogit")&"$S_2"~="binom"{ disp in red "mlogit link must be combined with binomial probability" exit 198 } */ if ("$S_1"=="mlogit"|"$S_1"=="smlogit"|"$S_1"=="ologit"|"$S_1"=="oprobit"|"$S_1"=="soprobit"|"$S_1"=="ocll"){ global S_2 } end program define fm version 6.0 args fam local f = lower(trim("`fam'")) local l = length("`f'") if "`f'" == substr("gaussian",1,max(`l',3)) { global S_2 "gauss" } else if "`f'" == substr("normal",1,max(`l',3)) { global S_2 "gauss" } else if "`f'" == substr("poisson",1,max(`l',3)) { global S_2 "poiss" } else if "`f'" == substr("binomial",1,max(`l',3)) { global S_2 "binom" } else if "`f'" == substr("gamma",1,max(`l',3)) { global S_2 "gamma" } else if "`f'" != "" { noi di in red "unknown family() `fam'" exit 198 } if "$S_2" == "" { global S_2 "gauss" } end program define lnk version 6.0 args link local f = lower(trim("`link'")) local l = length("`f'") if "`f'" == substr("identity",1,max(`l',2)) { global S_1 "ident" } else if "`f'" == substr("log",1,max(`l',3)) { global S_1 "log" } else if "`f'" == substr("logit",1,max(`l',4)) { global S_1 "logit" } else if "`f'" == substr("mlogit",1,max(`l',3)) { global S_1 "mlogit" } else if "`f'" == substr("smlogit",1,max(`l',3)) { global S_1 "smlogit" } else if "`f'" == substr("ologit",1,max(`l',3)) { global S_1 "ologit" } else if "`f'" == substr("oprobit",1,max(`l',3)) { global S_1 "oprobit" } else if "`f'" == substr("probit",1,max(`l',3)) { global S_1 "probit"} else if "`f'" == substr("ocll",1,max(`l',3)) { global S_1 "ocll"} else if "`f'" == substr("cll",1,max(`l',3)) { global S_1 "cll"} else if "`f'" == substr("ll",1,max(`l',2)) { global S_1 "ll"} else if "`f'" == substr("sprobit",1,max(`l',3)) { global S_1 "sprobit"} else if "`f'" == substr("soprobit",1,max(`l',3)) { global S_1 "soprobit"} else if "`f'"==substr("reciprocal",1,max(`l',3)) { global S_1 "recip" } else if "`f'" != "" { noi di in red "unknown link() `link'" exit 198 } end program define Replay, eclass version 8.0 syntax [, Level(int $S_level) EFORM DOTS INDirect TOTal] tempname M_nffc Vs mevar matrix `M_nffc' = e(nffc) local const = e(const) local tplv = e(tplv) local lab `e(lab)' local k_cat = e(k_cat) local phi = e(phi) local gindeps "`e(gindeps)'" local numg: word count `gindeps' if `k_cat'==.{ local neq = 1 } else{ local neq = `k_cat' } scalar `mevar' = e(mevar) di as txt _n "gllamm covariate measurement error model" /* */ _col(52) as txt "No. of obs" _col(68) "=" /* */ _col(70) as res %9.0gc e(N) di di disp as text "log likelihood = " as res %10.0g `e(ll)' /* local cn = e(cn) if `cn'>0{ disp in gr "Condition Number = " in ye `cn' } else{ disp in gr "Condition Number could not be computed" } disp " " */ if "`eform'"~=""{ local eform "eform(exp(b))" } disp " " if "`robust'"~=""&"`rob'"==""{ if "`cluster'"~=""{ disp as text "Robust standard errors for clustered data: `cluster'" } else{ disp as text "Robust standard errors" } } di in text "OUTCOME MODEL" noisily ereturn display , level(`level') `eform' neq(`neq') /* plus first */ if `phi'~=.{ noi _diparm _lnphi2, label(res. var.) function(exp(2*@)) /* */ derivative(2*exp(2*@)) level(`level') di in smcl in gr "{hline 13}{c BT}{hline 64}" } if "`indirect'"~=""&`numg'>0{ di " " di in smcl in gr "{space 6}" "Indirect effects of covariates via true covariate" di in smcl in gr "{hline 13}{c TT}{hline 64}" tempname b V a b ab eff se p z lower upper matrix `b'=e(b) matrix `V'=e(V) foreach x in `gindeps'{ local feq: coleq(`b') local feq: word 1 of `feq' scalar `eff' = [`x']_cons*[`feq']`lab' matrix `ab' = `V'["`feq':`lab'","`x':_cons"] matrix `a' = `V'["`x':_cons","`x':_cons"] matrix `b' = `V'["`feq':`lab'","`feq':`lab'"] scalar `se' = sqrt(2*`eff'* `ab'[1,1] + [`x']_cons^2*`b'[1,1] + /* */ ([`feq']`lab'^2)*`a'[1,1] ) scalar `z' = `eff'/`se' scalar `p' = chiprob(1,`z'^2) scalar `lower' = `eff' - invnorm(1-(100-`level')/200)*`se' scalar `upper' = `eff' + invnorm(1-(100-`level')/200)*`se' if "`eform'"~=""{ scalar `eff' = exp(`eff') scalar `se' = `eff'*`se' scalar `lower' = exp(`lower') scalar `upper' = exp(`upper') } di in smcl in gr "{ralign 12:`x'}" in gr "{space 1}{c |}" /* */ in ye "{space 2}" %9.0g `eff' "{space 2}" %9.0g `se' /* */ "{space 2}" %6.2f `z' "{space 4}" %5.3f `p' /* */ "{space 4}" %9.0g `lower' "{space 3}" %9.0g `upper' } di in smcl in gr "{hline 13}{c BT}{hline 64}" } if "`total'"~=""&`numg'>0{ di " " di in smcl in gr "{space 6}" "Total effects of covariates" di in smcl in gr "{hline 13}{c TT}{hline 64}" tempname b V a b ab eff se p z lower upper dir matrix `b'=e(b) matrix `V'=e(V) foreach x in `gindeps'{ local feq: coleq(`b') local feq: word 1 of `feq' * indirect effects scalar `eff' = [`x']_cons*[`feq']`lab' matrix `ab' = `V'["`feq':`lab'","`x':_cons"] matrix `a' = `V'["`x':_cons","`x':_cons"] matrix `b' = `V'["`feq':`lab'","`feq':`lab'"] scalar `se' = sqrt(2*`eff'* `ab'[1,1] + [`x']_cons^2*`b'[1,1] + /* */ ([`feq']`lab'^2)*`a'[1,1] ) capture scalar `dir' = [`feq']`x' if _rc==0{ scalar `eff' = `eff' + [`feq']`x' /* a*b + d */ matrix `a' = `V'["`feq':`x'","`feq':`x'"] /* d,d */ scalar `se' = `se'^2 + `a'[1,1] matrix `a' = `V'["`feq':`x'","`feq':`lab'"] /* d,b */ scalar `se' = `se' + 2*[`x']_cons*`a'[1,1] matrix `a' = `V'["`feq':`x'","`x':_cons"] /* d,a */ scalar `se' = `se' + 2*[`feq']`lab'*`a'[1,1] scalar `se' = sqrt(`se') } scalar `z' = `eff'/`se' scalar `p' = chiprob(1,`z'^2) scalar `lower' = `eff' - invnorm(1-(100-`level')/200)*`se' scalar `upper' = `eff' + invnorm(1-(100-`level')/200)*`se' if "`eform'"~=""{ scalar `eff' = exp(`eff') scalar `se' = `eff'*`se' scalar `lower' = exp(`lower') scalar `upper' = exp(`upper') } di in smcl in gr "{ralign 12:`x'}" in gr "{space 1}{c |}" /* */ in ye "{space 2}" %9.0g `eff' "{space 2}" %9.0g `se' /* */ "{space 2}" %6.2f `z' "{space 4}" %5.3f `p' /* */ "{space 4}" %9.0g `lower' "{space 3}" %9.0g `upper' } di in smcl in gr "{hline 13}{c BT}{hline 64}" } di " " di " " di in text "TRUE COVARIATE MODEL" di in smcl in gr "{hline 13}{c TT}{hline 64}" di in smcl in gr "{ralign 12:`lab'}" "{space 1}{c |}" /* */ "{space 2}" "{ralign 9:Coef.}" "{space 3}" "{ralign 9:Std. Err.}" /* */ "{space 2}" "{ralign 5:z}" "{space 1}" "{space 3}" "{ralign 5:P>|z|}" /* */ "{space 4}" "{ralign 21:[`level'% Conf. Interval]}" di in smcl in gr "{hline 13}{c +}{hline 64}" di in smcl in ye "{lalign 13:`lab'}" in gr "{c |}" if `numg'>0{ foreach x in `gindeps'{ noi _diparm `x', level(`level') label(`x') } } noi _diparm gamma0, level(`level') label(_cons) di in smcl in gr "{hline 13}{c +}{hline 64}" noi _diparm sdT, label(res. var.) function(@^2) derivative(2*@) level(`level') di in smcl in gr "{hline 13}{c BT}{hline 64}" di " " di " " di in text "MEASUREMENT MODEL" di in smcl in gr "{hline 13}{c TT}{hline 64}" if `mevar'==.{ /* measurement error variance not constrained */ noi _diparm lns1, label(error var.) function(exp(2*@)) /* */ derivative(2*exp(2*@)) level(`level') noi _diparm lns1 sdT, label(reliability) func(@2^2/(exp(2*@1)+@2^2)) /* */ der( -2*exp(2*@1)*(@2/(exp(2*@1)+@2^2))^2 /* */ -2*@2*(@2/(exp(2*@1)+@2^2))^2+2*@2/(exp(2*@1)+@2^2) ) /* */ level(`level') ci(probit) } else{ /* measurement error variance constrained */ local junk = `mevar' di in smcl in gr "{ralign 13:error var.}" in gr "{c |}" /* */ in ye "{ralign 11:`junk'}" in ye "{space 3}{center 11:-}" /* */ in ye "{center 18:(fixed parameter)}" noi _diparm sdT, label(reliability) function(@^2/(`mevar'+@^2)) /* */ derivative(-2*@*(@/(`mevar'+@^2))^2+2*@/(`mevar'+@^2)) /* */ level(`level') ci(probit) } di in smcl in gr "{hline 13}{c BT}{hline 64}" end