📄 glm.ado
字号:
$SGLM_mu `mu'
mat `b0' = e(b)
local k = colsof(`b0')
local from "`b0'"
replace `z' = sum(`wt'*(`y'-`mu')^2/`v')
global SGLM_ph = `z'[_N]/(`nobs'-`k')
}
}
if "`from'" != "" & "`search'" == "" {
local initopt `"init(`from') search(off)"'
}
else local initopt `"search(on) maxfeas(100)"'
if `reg' & `"`offopt'"'=="" {
local iterate 0
local nowarn "nowarning"
}
local initopt "`initopt' iter(`iterate') `nowarn' "
if `"`scale'"'=="" { /* default */
local scale `scale1'
local cd
}
else if `scale'==0 { /* Pearson X2 scaling */
if `scale1' {
local cd "square root of Pearson"
local cd "`cd' X2-based dispersion"
}
}
else { /* user's scale parameter */
if !`scale1' | (`scale1' & `scale'!=1) {
local cd "dispersion equal to square"
local cd "`cd' root of `scale'"
}
}
if `scale1' == 1 & `scale' != `scale1' {
global SGLM_s1 = `scale1'
local fixme 1
}
else {
global SGLM_s1 = `scale'
local fixme 0
}
/*
Need to handle k==N case separately
This must be handled by ml because the
variance matrix is missing. The irls
works fine in this case. Maybe the right
thing to do is to just pass it on to the
irls method since the variance matrix is
missing anyway.
*/
tempname newdev
if "`opg'`unbiased'" != "" {
if "`scopt'" == "" {
tempvar scvar
local scopt score(`scvar')
}
if "`unbiased'" != "" {
local cll "`clopt'"
local robust
local clopt
}
}
if (!`iterate') { `iflog' di }
ml model d2 glim_lf /*
*/ (`yname': `y' = `xvars', `constant' `offopt') /*
*/ [`weight'`exp'] if `touse', collinear missing max nooutput /*
*/ nopreserve `mlopts' title(Generalized Linear Models) /*
*/ `scopt' `robust' `clopt' `log' `initopt' `trace'
local rc = cond(e(rc) == 430 & `reg', 0, e(rc))
local vcetype `e(vcetype)'
if "`vce'" == "eim" {
nobreak {
tempname esave
version 9: estimates store `esave'
capture noisily break {
capture drop `eta'
capture drop `mu'
capture drop `v'
capture drop `dmu'
capture drop `W'
capture drop `z'
quietly predict double `eta', xb
$SGLM_L 1 `eta' `mu'
$SGLM_V 1 `eta' `mu' `v'
$SGLM_L 2 `eta' `mu' `dmu'
gen double `W' = `dmu'*`dmu'/`v' if `touse'
tempname V
quietly matrix accum `V' = `xvars' ///
[iw=`W'*`wt'], `constant'
matrix `V' = inv(`V')
} // capture noisily break
local rc = c(rc)
quietly version 9: estimates restore `esave'
version 9: ereturn local _estimates_name
} // nobreak
if `rc' {
version 9: ereturn clear
exit `rc'
}
local vcetype "EIM"
estimates repost V = `V'
}
if `fixme' {
tempname V fix
mat `V' = e(V)
if `scale' { scalar `fix' = `scale' }
else scalar `fix' = $SGLM_ph
mat `V' = `fix'*`V'
estimates repost V = `V'
}
if "`vcetype'" == "OPG" | "`opg'" == "opg" {
local vce "opg"
}
else if "`vcetype'" == "" | "`vce'" == "oim" {
local vce oim
local vcetype "OIM"
}
if "`unbiased'" != "" {
tempvar hat eta mu v dmu dv d2mu z W
tempname ll
qui _predict double `eta', xb /* sic -- no nooffset */
qui $SGLM_L 1 `eta' `mu'
qui $SGLM_V 1 `eta' `mu' `v'
qui $SGLM_L 2 `eta' `mu' `dmu'
qui gen double `z' = `eta' + /*
*/ (`y'-`mu')/`dmu' `moffset' if `touse'
qui $SGLM_V 2 `eta' `mu' `dv'
qui $SGLM_L 3 `eta' `mu' `d2mu'
qui gen double `W' = `dmu'*`dmu'/`v' - /*
*/ (`mu'-`y')*(`dmu'*`dmu'*`dv'/(`v'*`v') - /*
*/ `d2mu'/`v') if `touse'
nobreak {
estimates hold `ll'
qui reg `z' `xvars' [iw=`W'*`wt'], /*
*/ mse1 `constant'
qui _predict double `hat' if `touse', /*
*/ stdp `offset'
qui replace `hat' = `hat'*`hat'*`v'
estimates unhold `ll'
}
qui replace `scvar' = `scvar' / sqrt(1-`hat')
qui _robust `scvar' [fweight=`fwt'] if `touse', /*
*/ `cll' minus(0)
local setype "Unbiased `setype'"
local setype "Unbiased Sandwich"
local vce "unbiased"
local vcetype "Unbiased"
}
if "`opg'" != "" {
tempname V1
mat `V1' = e(V)
local nms : colnames `V1'
local ncol = colsof(`V1')
mat `V1' = I(`ncol')
mat colnames `V1' = `nms'
mat rownames `V1' = `nms'
_robust `scvar' [fweight=`fwt'] if `touse', var(`V1')
mat `V1' = syminv(`V1')
estimates repost V = `V1'
local vcetype "OPG"
}
if "`hacnam'" != "" {
tempname V
mat `V' = e(V)
local p = colsof(`V')-1
capture drop `eta'
capture drop `mu'
capture drop `v'
capture drop `dmu'
capture drop `z'
qui _predict `eta', xb
qui $SGLM_L 1 `eta' `mu'
qui $SGLM_V 1 `eta' `mu' `v'
qui $SGLM_L 2 `eta' `mu' `dmu'
qui gen double `z' = `dmu'*(`y'-`mu')/`v'
sort `touse' `tvar'
qui HAC "`hacnam'" "`haclag'" "`wt'" "`z'" ///
"`touse'" `"`constant'"' `"`xvars'"'
tempname vm
mat `vm' = r(V)
local pm1 = `p'+1
`hacnam' `haclag' 0 `nobs' `pm1'
local delta = 1
if `scale1' == 0 {
local delta = $SGLM_ph
}
tempname ss
scalar `ss' = 1/(`delta'*`delta')
mat `V' = `ss'*`V'*`vm'*`V''
local hac_kern "`r(setype)'"
local vce "hac"
local vcetype "HAC"
estimates repost V = `V'
}
if "`jknife1'" != "" {
tempname b V
mat `b' = e(b)
mat `V' = e(V)
qui JK1nr `b' `V' `y' "`xvars'" `eta' `mu' `v' `dmu' /*
*/ "`tvar'" `z' "`moffset'" "`constant'" /*
*/ `wt' `touse' "`weight'"
local p = colsof(`b')
tempname ss
scalar `ss' = (`nobs'-`p')/`nobs'
mat `V' = `ss'*`V'
local vce "jackknife1"
local vcetype "1-step JKnife"
estimates repost V = `V'
}
if "`jknife'" != "" {
tempname b V
mat `b' = e(b)
mat `V' = e(V)
noi JKnife `b' `V' `y' "`xvars'" "`tvar'" /*
*/ "`offopt'" "`constant'" "`argfam'" "" /*
*/ "`arglink'" "[`weight'`exp']" `touse' /*
*/ "`cluster'" `dots' "`weight'" "`wt'"
local mm = `nobs'
if "`cluster'" != "" { local mm = $SGLM_nc }
else local mm = 1
local p = colsof(`b')
local nnn = `nobs'-$SGLM_bm
tempname ss
if "`cluster'" != "" {
scalar `ss' = (`nnn'-`p')/`nnn'
}
else {
scalar `ss' = (`nnn'-`p')/`nnn'
}
mat `V' = `ss'*`V'
local vcetype "Jackknife"
estimates repost V = `V'
}
if "`bstrap'" != "" {
tempname b V
mat `b' = e(b)
mat `V' = e(V)
noi Bstrap `b' `V' `y' "`xvars'" /*
*/ "`offopt'" "`constant'" "`argfam'" "" /*
*/ "`arglink'" "[`weight'`exp']" `touse' /*
*/ `brep' "`clopt'" `dots'
local p = colsof(`b')
tempname ss
scalar `ss' = (`nobs'-`p')/(`nobs'*(`brep'-$SGLM_bm))
mat `V' = `ss'*`V'
local vcetype "Bootstrap"
estimates repost V = `V'
}
if `vfactor' != 1 {
tempname V
mat `V' = `vfactor'*e(V)
estimates repost V = `V'
}
capture drop `eta'
capture drop `mu'
capture drop `v'
qui predict double `eta', xb
qui $SGLM_L 1 `eta' `mu'
qui $SGLM_mu `mu'
qui $SGLM_V 1 `eta' `mu' `v'
mat `b0' = e(b)
local dfm = colsof(`b0')
capture drop `z'
qui gen double `z' = sum(`wt'*(`y'-`mu')^2/`v')
local chi2 = `z'[_N]
local df = e(N)-`dfm'
if $SGLM_s1 { global SGLM_ph = $SGLM_s1 }
capture drop `z'
qui $SGLM_V 3 `eta' `mu' `z'
qui replace `z' = sum(`wt'*`z')
scalar `newdev' = `z'[_N]
local disp = $SGLM_ph
est scalar vf = `vfactor'
est scalar rc = `rc'
est scalar aic = (-2*e(ll)+2*`dfm')/`nobs'
}
/* Classical IRLS */
else {
if `"`mlopts'"' != "" {
// mlopts are not allowed with -irls-
local 0 `", `mlopts'"'
syntax [, NOOPTION ]
error 198 // [sic]
}
quietly {
tempvar eta mu dmu v W z
tempname Wscale b0
if "`offset'" != "" {
local moffset = "-`offset'"
}
if `"`init'"'!="" {
gen double `mu' = `init' if `touse'
}
else {
sum `y' [aw=`wt'] if `touse', mean
if "$SGLM_V" != "glim_v2" {
gen double `mu' = (`y'+r(mean))/(`m'+1)
}
else {
gen double `mu' = `m'*(`y'+.5)/(`m'+1)
}
}
if `reg' { local iterate 1 }
capture drop `eta'
$SGLM_L 0 `eta' `mu'
tempvar dev
tempname newdev oldev
scalar `oldev' = 0
scalar `newdev' = 1
local i 1
`iflog' di
while abs(`newdev'-`oldev')>`ltol' & `i'<=`iterate' {
capture drop `v'
capture drop `dmu'
capture drop `W'
capture drop `z'
scalar `oldev' = `newdev'
$SGLM_V 1 `eta' `mu' `v'
$SGLM_L 2 `eta' `mu' `dmu'
gen double `z' = `eta' + /*
*/ (`y'-`mu')/`dmu' `moffset' if `touse'
gen double `W' = `disp'*`dmu'*`dmu'/`v' /*
*/ if `touse'
summ `W' [aw=`wt'], meanonly
scalar `Wscale' = r(mean)
cap noisily quietly regress `z' `xvars' /*
*/ [iw=`W'*`wt'/`Wscale'], mse1 `constant'
if e(N)>=. {exit 459}
if _rc {exit _rc}
capture drop `eta'
capture drop `mu'
capture drop `dev'
predict double `eta' if `touse', xb
if "`offset'" != "" {
replace `eta' = `eta'+`offset'
}
$SGLM_L 1 `eta' `mu'
$SGLM_mu `mu'
$SGLM_V 3 `eta' `mu' `dev'
replace `dev' = sum(`wt'*`dev')
scalar `newdev' = `dev'[_N]/`disp'
`iflog' di as txt /*
*/ `"Iteration `i':"' _col(16) /*
*/ "deviance = " /*
*/ as res %9.0g `newdev'
if "`trace'" != "" {
tempname beta
`iflog' mat list e(b), noblank noheader
`iflog' di as txt "{hline 78}"
`iflog' di
}
local i = `i'+1
}
if "`unbiased'`jknife1'`jknife'" != "" {
cap noisily quietly regress `z' `xvars' /*
*/ [iw=`W'*`wt'], /*
*/ mse1 `constant'
if e(N)>=. {exit 459}
if _rc {exit _rc}
tempvar h
qui _predict double `h' if `touse', stdp
qui replace `h' = `h'*`h'*`v'
local minus "minus(0)"
}
else local h = 0
local rc = cond(abs(`newdev'-`oldev')>`ltol' /*
*/ & !`reg',430,0)
replace `z' = sum(`wt'*(`y'-`mu')^2/`v')
local chi2 = `z'[_N]/`disp'
local p = e(df_m)
local df = `nobs'-`p'-(`"`constant'"'=="")
local dispc = `chi2'/`df'
local dispd = `newdev'/`df'
global SGLM_ph = `dispc'
/* Apply appropriate scaling */
if `"`scale'"'=="" { /* default */
local scale `scale1'
if `scale1' { local delta 1 }
else local delta `dispc'
}
else if `scale'==0 { /* Pearson X2 scaling */
local delta `dispc'
if `scale1' {
local cd "square root of Pearson"
local cd "`cd' X2-based dispersion"
}
}
else if `scale'==-1 { /* deviance scaling */
local delta `dispd'
local cd "square root of deviance-based"
local cd "`cd' dispersion"
}
else { /* user's scale parameter */
local delta `scale'
if !`scale1' | (`scale1' & `scale'!=1) {
local cd "dispersion equal to square"
local cd "`cd' root of `delta'"
}
}
if !`scale1' | (`scale1' & `scale'!=1) {
if `scale1' { local dof 100000 }
else local dof `df'
if `delta'>=. {
local zapse "yes"
}
else {
scalar `Wscale' = `Wscale'/`delta'
}
}
tempname b V
mat `b' = e(b)
mat `V' = e(V)
local vce "eim"
local vcetype "EIM"
if "`robust'`oim'`hacnam'`opg'" != "" {
capture drop `W'
capture drop `z'
capture drop `v'
capture drop `dmu'
tempvar xb
_predict double `xb', xb /* sic--no nooffset */
$SGLM_V 1 `eta' `mu' `v'
$SGLM_L 2 `eta' `mu' `dmu'
tempvar ys yi
gen double `ys' = `dmu'*(`mu'-`y')/`v'
gen double `yi' = `dmu'*`dmu'
if "`oim'" != "" {
tempvar dv d2m
$SGLM_V 2 `eta' `mu' `dv'
$SGLM_L 3 `eta' `mu' `d2m'
replace `yi' = `yi' + /*
*/ `d2m'*(`mu'-`y') - /*
*/ `dmu'*`dv'*`ys'
}
replace `yi' = `awt' * `yi' / `v'
replace `ys' = `awt' * `ys' / sqrt(1-`h')
reg `xb' `xvars' if `touse' /*
*/ [iweight=`fwt'*`yi'], `constant' mse1
mat `V' = e(V)
local vce "oim"
local vcetype "OIM"
if "`robust'" != "" {
if "`oim'" != "" {
local vce ""
local vcetype "Robust"
}
else {
local vce ""
local vcetype "Semi-Robust"
}
_robust `ys' [fweight=`fwt'] /*
*/ if `touse', var(`V') /*
*/ `clopt' `minus'
if "`unbiased'" != "" {
local setype "Unbiased Sandwich"
local vce "unbiased"
local vcetype "Unbiased"
}
if `"`clopt'"' != "" {
global SGLM_nc = r(N_clust)
}
}
else if "`opg'" != "" {
local nms : colnames `V'
local ncol = colsof(`V')
mat `V' = I(`ncol')
mat colnames `V' = `nms'
mat rownames `V' = `nms'
replace `ys' = `ys'/`disp'
_robust `ys' [fweight=`fwt'] /*
*/ if `touse', var(`V')
mat `V'=`delta'*`delta'*syminv(`V')
local vce "opg"
local vcetype "OPG"
}
else if "`hacnam'" == "" {
tempname ss
scalar `ss' = `delta'*`Wscale'
mat `V' = `ss'*`V'
}
}
if "`hacnam'" != "" {
capture drop `v'
capture drop `dmu'
capture drop `z'
$SGLM_V 1 `eta' `mu' `v'
$SGLM_L 2 `eta' `mu' `dmu'
gen double `z' = `dmu'*(`y'-`mu')/`v'
sort `touse' `tvar'
qui HAC "`hacnam'" "`haclag'" "`wt'" "`z'" ///
"`touse'" `"`constant'"' `"`xvars'"'
tempname vm
mat `vm' = r(V)
local pm1 = `p'+1
`hacnam' `haclag' 0 `nobs' `pm1'
local hac_kern "`r(setype)'"
local vce "hac"
local vcetype "HAC"
local ddd = 1
tempname ss
scalar `ss' = 1/(`ddd'*`ddd')
mat `V' = `ss'*`V'*`vm'*`V''
}
if "`jknife1'" != "" {
JK1irls `b' `V' `y' "`xvars'" `h' `eta' /*
*/ `mu' `v' `dmu' "`tvar'" `z' /*
*/ "`moffset'" "`constant'" /*
*/ `wt' `touse' "`weight'"
local p = colsof(`b')
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -