📄 xtgee.ado
字号:
*! version 4.4.6 27jun2005
program define xtgee, eclass byable(onecall)
if _by() {
local BY `"by `_byvars'`_byrc0':"'
}
`BY' _vce_parserun xtgee, panel : `0'
if "`s(exit)'" != "" {
exit
}
version 6.0, missing
if replay() {
if _by() { error 190 }
di
geerpt `0'
exit
}
if _by() {
local by "by `_byvars'`_byrc0':"
}
capture noisily `by' TSEstimate `0'
mac drop S_X_*
exit _rc
end
program define TSEstimate, eclass byable(recall)
syntax varlist(ts) [if] [in] [iw fw pw] [, HASCONS /*
*/ noCONstant noDISplay I(varname) T(varname) /*
*/ EForm *]
marksample touse /* needed here so by: works */
tokenize `varlist'
local dep `1'
mac shift
local ind `*'
/* Record names, then tsrevar */
local depname `dep'
local depstr : subinstr local depname "." "_"
local indname `ind'
_find_tsops `dep' `ind'
if `r(tsops)' {
qui tsset
local myi `r(panelvar)'
local myt `r(timevar)'
if ("`i'" != "" & "`i'" != "`myi'") | /*
*/ ("`t'" != "" & "`t'" != "`myt'") {
di as error /*
*/ "time and panel variables previously tsset -- may not be changed by" /*
*/ _newline "options t() and i() -- use tsset to change them"
exit 198
}
local i "i(`myi')"
local t "t(`myt')"
tsrevar `dep'
local dep `r(varlist)'
tsrevar `ind'
local ind `r(varlist)'
}
else {
if "`i'" != "" {
local i "i(`i')"
}
if "`t'" != "" {
local t "t(`t')"
}
}
/* Remove collinear vars and issue error message */
local inclcon ""
if "`hascons'`constant'" != "" {
local inclcon "noconstant"
}
local oldind `ind'
qui _rmcoll `ind' if `touse' [`weight'`exp'] , `inclcon'
local ind `r(varlist)'
local dropped : list oldind - ind
foreach x of local dropped {
local j : list posof "`x'" in oldind
local x2 : word `j' of `indname'
noi di as txt "note: `x2' dropped due to collinearity"
}
/* Fit the model on the tsrevar'ed data */
Estimate `dep' `ind' if `touse' [`weight'`exp'], `hascons' /*
*/ `constant' `options' depname(`depname') `i' `t'
/* Doctor up stripes on b and V */
tempname b V
mat `b' = e(b)
mat `V' = e(V)
local stripe : colfullnames `b'
local stripe : subinstr local stripe "`dep'" "`depstr'", all
foreach x of local ind {
local j : list posof "`x'" in oldind
local x2 : word `j' of `indname'
local stripe : subinstr local stripe "`x'" "`x2'"
}
mat colnames `b' = `stripe'
mat colnames `V' = `stripe'
mat rownames `V' = `stripe'
est local depvar "`depname'"
est repost b=`b' V=`V' , rename
global S_E_depv = "`=trim("`depname'")'"
global S_E_vl = "`=trim("`depname'")' `indname'"
if "`display'" == "" {
geerpt , `eform'
}
if "`e(rc)'" == "" {
error `e(rc)'
}
end
program define Estimate, eclass byable(recall) sort
syntax varlist [if] [in] [iw fw pw] [, /*
*/ Link(string) Family(string) Corr(string) /*
*/ I(varname) ITERate(int 100) TOLerance(real 1e-6) NMP RGF/*
*/ Exposure(varname numeric) OFFset(varname numeric) Robust /*
*/ HASCONS noCONstant TRace RC0 FROM(string) /*
*/ EForm FIXed(string) T(varname) Scale(string) /*
*/ noLOg noDISplay LEVel(cilevel) SCore(string) FORCE /*
*/ /* undocumented -> */ DEPNAME(string) ]
local iter "`iterate'"
local iterate
local tol "`tolerance'"
local toleran
GetName `"`link'"' `"`family'"' `"`corr'"'
local link = "$S_1" /* OK to use S_ here */
local family = "$S_2" /* OK to use S_ here */
local corr = "$S_3" /* OK to use S_ here */
local oarg = "$S_4" /* OK to use S_ here */
local band "$S_5" /* default -1 */ /* OK to use S_ here */
local fixed "$S_6" /* OK to use S_ here */
if "`nmp'"=="" {
local nmp 0
}
else {
local nmp 1
}
if "`rgf'" != "" {
if "`weight'" != "pweight" & "`robust'" =="" {
noi di in red "rgf can only be specified with robust"
error 198
}
if "$S_2" != "gauss" {
noi di in red "rgf can only be specified with "/*
*/ "family(gaussian) "
error 198
}
}
if "`constan'" != "" {
local cons "nocons"
local nocons "nocons"
}
checkfam "`family'" "`link'"
xt_iis `i'
local rivar "`s(ivar)'"
GetLag `corr' `t'
local tvar "`s(timevar)'"
global S_X_scp = "`scale'"
if "`log'" == "" {
local prel "noi di "
global S_LOG 1
}
else {
local prel "*"
}
if "`score'" != "" {
local n : word count `score'
if `n'!=1 {
di as err "score() requires specification of one " /*
*/ "new variable"
exit 198
}
confirm new var `score'
}
ChkSyn `tol' `iter' "`hascons'" "`cons'"
tempvar mui recid bb binom
if "`exposur'"!="" {
if "`offset'"!="" {
di in red "may not specify both exposure() and offset()"
exit 198
}
local offstr "ln(`exposur')"
tempvar offset
qui gen double `offset' = ln(`exposur')
}
if "`offset'" != "" {
local addoff "replace `mui' = `mui' + `offset'"
local glmarg "off(`offset')"
if "`offstr'"=="" {
local offstr "`offset'"
}
}
if "`oarg'"!="" & "`family'" != "binom" & "`family'" != "nbinom" {
noi di in red /*
*/ "family(`family') does not allow a parameter"
exit 198
}
marksample touse
tokenize `varlist'
if "`oarg'"!="" {
cap confirm number `oarg'
if _rc {
if "`family'" == "binom" {
capture confirm variable `oarg'
if _rc {
noi di in red /*
*/ "family(binomial) requires a " /*
*/ "positive number or variable name"
exit 198
}
markout `touse' `offset' `rivar' `tvar' `oarg'
capture assert `oarg' > 0 if `touse'
if _rc {
di as err /*
*/ `"`oarg' has nonpositive values"'
exit 499
}
capture assert `1'<= `oarg' if `touse'
if _rc {
di as err /*
*/ `"`1' > `oarg' in some cases"'
exit 499
}
unabbrev `oarg', max(1)
local oarg "`s(varlist)'"
gen `binom' = `oarg'
}
}
else {
if `oarg'<=0 {
noi di in red /*
*/ "family(binomial) requires a " /*
*/ "positive number or variable name"
exit 198
}
gen `binom' = `oarg'
markout `touse' `offset' `rivar' `tvar' `binom'
}
}
else {
gen byte `binom' = 1
markout `touse' `offset' `rivar' `tvar' `binom'
if "`family'" == "binom" {
cap assert `1' < 1 if `touse'
if _rc==0 { local oarg=1 }
else {
cap assert `1' <= 1 if `touse'
if _rc {
di as err /*
*/ `"`1' > 1 in some cases"'
exit 499
}
}
}
}
qui count if `touse'
if r(N) <= 1 {
di in red "insufficient observations"
exit 2001
}
if "`score'"!= "" {
tempvar merge
qui gen `merge' = _n
}
preserve
qui {
keep if `touse'
sort `rivar' `tvar'
if "`tvar'"!="" {
tempvar tord
tabulate `tvar', cgen(`tord')
if "`corr'"=="unstr" | "`corr'"=="fixed" {
local abst "`tord'"
local topt "t(`tord')"
}
else {
noi KeepMode `rivar' "`tvar'" "`force'"
noi KeepMin "`corr'" `rivar' `band'
local band `r(band)'
if "`corr'"=="nonst" {
local abst "`tord'"
local topt "t(`tord')"
}
}
noi Checkt `rivar' `tord' `tvar'
}
/* Observation sample fixed */
noi BigEnuf `rivar' `abst'
local minni `r(min)'
global S_X_maxn `r(xmax)'
local avgni `r(mean)'
local maxni $S_X_maxn
local rmaxni `r(max)'
local nclust `r(N)'
local keep `r(N)'
if "`corr'" == "fixed" {
local g = rowsof(`fixed')
if `maxni' != `g' {
noi di in red /*
*/ "correlation matrix must be `maxni'x`maxni'"
exit 198
}
}
if `nclust' == 1 & "`robust'" != "" {
noi di in red /*
*/ "cannot specify robust with only one panel"
exit 198
}
tempname sumw
if "`weight'" != "" {
if "`weight'" == "pweight" {
local robust "robust"
}
/* comment A */
* Generate weights
tempvar ww
gen double `ww' `exp'
* Scale weights if not iweight
/* comment B */
summ `ww'
if "`weight'" == "aweight" & 0 {
replace `ww' = `ww'/r(mean)
scalar `sumw' = _N
}
else {
scalar `sumw' = r(sum)
}
* Get avg panel size and number of groups
noi ChkWt `rivar' `ww'
if "`weight'" != "aweight" {
local avgni `r(mean)'
local nclust `r(sum)'
}
local wtex "[`weight'=`ww']"
}
else {
tempvar ww
gen byte `ww' = 1
scalar `sumw' = _N
}
local warg "wvar(`ww')"
keep `varlist' `rivar' `tvar' `offset' `merge' /*
*/ `ww' `tord' `binom'
if "`tvar'"=="" {
local ivar "`rivar'"
}
else {
tempvar ivar
xtgee_makeivar `rivar' `tvar' `tord' `maxni' -> `ivar'
sort `ivar' `tvar'
}
tempvar obs
gen float `obs' = _n
local nobs = _N
tokenize `varlist'
global S_X_depv "`1'"
mac shift
global S_X_idep "`*'"
if $S_X_con == 0 {
local hascons 1
if "`eform'" == "" {
noi _rmcoll $S_X_idep `wtex', nocons
}
else noi _rmcoll $S_X_idep `wtex'
global S_X_idep "`r(varlist)'"
_rmcoll $S_X_idep
global S_X_HAS "`r(varlist)'"
}
else {
noi _rmcoll $S_X_idep `wtex'
global S_X_idep "`r(varlist)'"
global S_X_HAS "`r(varlist)'"
}
noi di
local p : word count $S_X_idep
local p = `p' + $S_X_con
if `p' <= 0 {
error 102
}
if `p' >= _N {
di in red "insufficient observations"
exit 2001
}
if `sumw' < `p' {
noi di in red /*
*/ "sum of weights must be larger than p"
exit 198
}
global S_X_link "`link'"
global S_X_mvar "`family'"
global S_X_corr "`corr'"
global S_X_ivar "`ivar'"
sort `ivar' `tvar' `obs'
* the following may not be necesasry
if `band' < 0 {
local band = `minni'-1
}
if "`corr'" == "fixed" {
local R "`fixed'"
}
else {
tempname R
mat `R' = J(`maxni',`maxni',0)
}
tempname b0 b1 phi alpha S1 S2 zi
if "`family'" == "binom" {
local xarg "`binom'"
}
if "`from'" == "" {
GetIval "`hascons'" "`nocons'" "`wtex'" /*
*/ "`xarg'" "`oarg'" -> `b1' "`glmarg'"
}
else {
local names $S_X_idep
if $S_X_con {
local names `names' _cons
}
noi _mkvec `b1', from(`from') colnames(`names') /*
*/ error("from()")
}
local sna : colnames(`b1')
local XXn : word count `sna'
if `XXn' != `p' {
noi di in red "Unable to identify sample"
exit 198
}
local iterate 1
local diff 1000
if "`trace'" != "" {
local aanames ""
local i 0
while `i' <= `band' {
local aanames `aanames' `i'
local i = `i'+1
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -