xtgls.ado
来自「是一个经济学管理应用软件 很难找的 但是经济学学生又必须用到」· ADO 代码 · 共 1,056 行 · 第 1/2 页
ADO
1,056 行
*! version 2.2.8 01apr2005
program define xtgls, eclass byable(onecall)
version 7.0, missing
if replay() {
if _by() { error 190 }
if `"`e(cmd)'"'~=`"xtgls"' {
error 301
}
syntax [, Level(cilevel)]
DispRes `level'
exit
}
if _by() {
local by "by `_byvars'`_byrc0':"
}
capture noi `by' Estimate `0'
nobreak { mac drop X_* }
exit _rc
end
program define Estimate, eclass byable(recall)
mac drop X_*
syntax varlist(ts) [if] [in] [aw] [, /*
*/ noCONstant Corr(string) FORCE I(varname) /*
*/ ITERate(int `c(maxiter)') Level(cilevel) noLOg IGLS /*
*/ NMK OLS Panels(string) PCSE T(varname) /*
*/ TOLerance(real 1e-7) RHOtype(string) FORCEPCSE ]
tsunab varlist : `varlist'
local tol "`tolerance'"
local toleran
local rr = cond("`rhotype'"=="", "regress", "`rhotype'")
global X_rcalc "`rr'"
global X_nocons `constant'
if `iterate' < 1 {
noi di in red `"iterate() must be positive"'
exit 198
}
local qqq = cond("`log'"!="", "quietly", "noisily")
gettoken depvar varlist: varlist
_rmcoll `varlist' [`weight'`exp'] `if' `in', `constant'
local varlist `r(varlist)'
global X_indv1 `varlist'
local kk : word count `varlist'
global X_rhok "k(`kk')"
if "`constant'" == "" {
local varname `varlist' _cons
}
else {
local varname `varlist'
}
local varlist `depvar' `varlist'
global X_depv2 "`depvar'"
local origdep "`depvar'"
tsunab origdep : `origdep'
local origdep : subinstr local origdep "." "_"
tsrevar `depvar'
local depvar "`r(varlist)'"
tsrevar `varlist'
local varlist "`r(varlist)'"
if "`weight'" != "" {
tempvar www
qui gen double `www' `exp'
summ `www', meanonly
qui replace `www' = `www'/r(mean)
local j = 1
foreach var of varlist `varlist' {
tempvar var`j'
qui gen double `var`j'' = `var'*sqrt(`www')
local varli1 `varli1' `var`j''
/* replace the first occurence only */
local j = `j'+1
}
if "`constant'"=="" {
tempvar cons
qui gen double `cons' = sqrt(`www')
local varli1 `varli1' `cons'
local constant "noconstant"
local consopt "noconstant"
}
local varlist `varli1'
qui replace `www'=1
local fixname 1
global X_wtype "aweight"
global X_wexp "`exp'"
global X_wt `"[aweight=`www']"'
global X_wtexp `"[aweight`exp']"'
global X_wtvar `"`www'"'
}
else global X_wt
if `"`pcse'"' != "" {
local ols `"ols"'
}
global X_if `"`if'"'
global X_in `"`in'"'
MapCorr `corr'
local corr $S_1
MapPanel `panels'
local var $S_1
local panels
global S_1
getPCSE `"`0'"' "`pcse'" "`ols'" "`forcepcse'" `var' /*
*/ "`igls'" "`t'" "`i'"
if "`r(done)'" == "1" { exit }
if `"`corr'"' != `"0"' | "`constant'" != "" {
if "`constant'" == "" & "`weight'" == "" {
tempvar cons
gen byte `cons' = 1
global X_cons `"`cons'"'
local fixname 1
}
local copt "nocons"
global X_cot "nocons"
}
global X_bal = (`var'==2)
xt_iis `i'
global X_ivar `"`s(ivar)'"'
if `corr' > 0 | `var' == 2 {
xt_tis `t'
global X_tvar `"`s(timevar)'"'
}
tokenize `varlist'
global X_depv `"`1'"'
mac shift
global X_indv `"`*'"'
quietly {
tempvar touse
mark `touse' $X_if $X_in
markout `touse' $X_depv $X_indv $X_ivar $X_tvar
if `"`www'"' != "" {
replace `touse' = 0 if `www'<= 0
}
preserve
keep if `touse'
local nnobs = _N
if `"`corr'"' != `"0"' {
sort $X_ivar $X_tvar
by $X_ivar : replace `touse'=0 if _N==1
count if `touse'==0
local drop = r(N)
if `drop'>0 {
keep if `touse'
noi di in blue `"(note: "' in ye `drop' /*
*/ in blue `" observations dropped"' /*
*/ `" because only 1 obs in group)"'
}
}
tempvar ii
egen `ii' = group($X_ivar)
compress `ii'
global X_itemp `"`ii'"'
sort $X_itemp $X_tvar /* sic, X_tvar may be blank */
if "`force'" != "" | `"$X_tvar"' != `""' {
tempvar tt
if "`force'" == "" {
egen `tt' = group($X_tvar)
compress `tt'
}
else qui by $X_itemp : gen `tt' = _n
global X_ttemp `"`tt'"'
}
sort $X_itemp $X_ttemp
if `corr' > 0 | `var' == 2 {
qui tsset $X_itemp $X_ttemp
global X_ttmp
tempname ttt
capture _crcar1 `ttt' opt : $X_itemp , check /*
*/ $X_rcalc $X_rhok
if _rc {
local arg $X_rcalc
di in red "rhotype(`arg') : argument is invalid"
exit 198
}
}
else if "$X_ttemp" == "" {
tempvar tvar
quietly by $X_itemp : gen `tvar' = _n
quietly compress `tvar'
global X_tvar `"`tvar'"'
global X_ttmp 1
global X_ttemp $X_tvar
sort $X_itemp $X_ttemp
}
if `corr' > 0 & "`force'" == "" {
checkt $X_tvar `touse'
if $S_1==2 {
noi di in red /*
*/ `"$X_tvar has duplicate values within panel"'
exit 459
}
if $S_1==1 & `"`force'"' == `""' {
noi di in red /*
*/ `"$X_tvar is not regularly spaced or does not have intervals of 1 -- use "'
no di in red "the force option to treat the" /*
*/ " intervals as though they were regular"
exit 459
}
}
ChkBal
if $S_1 == 1 {
noi di in red `"panels must be balanced"'
exit 459
}
if $S_1 == 2 {
noi di in red /*
*/ `"$X_tvar has duplicate values within panel"'
exit 459
}
if $S_1 == 3 {
noi di in red /*
*/ "$X_tvar has different values across panels"
exit 459
}
GetNKT
if $X_ng == 1 & `var'==2 {
local var = 1
}
if $X_nt < 2 & `corr' > 0 {
local corr 0
}
tempname sigmat
mat `sigmat' = J(1,$X_ng,0)
global X_sig `"`sigmat'"'
tempname E Ei
tempname xEx xEix xEiy xxi xty beta vce pcvce bold
tempname ovce obeta
global X_Emat `"`E'"'
global X_beta `"`beta'"'
local diff = `tol'+1
local iter = 0
if `var' < 2 {
tempvar ee
gen double `ee' = .
global X_ee `"`ee'"'
}
else {
gen double _ee = .
global X_ee `"_ee"'
}
while `iter' < `iterate' & `diff' > `tol' {
if `"`igls'"' == `""' {
local diff = 0
}
mc`corr' `iter'
mv`var'
if `iter' == 0 {
mat $X_sig = $X_Emat
}
mat `Ei' = syminv(`E')
sort $X_ttemp $X_itemp
mat glsaccum `xEx' = $X_indv /*
*/ $X_cons $X_wt, `copt' /*
*/ glsmat(`E') row($X_itemp) /*
*/ group($X_ttemp)
mat glsaccum `xEix' = $X_depv /*
*/ $X_indv /*
*/ $X_cons $X_wt, `copt' /*
*/ glsmat(`Ei') /*
*/ row($X_itemp) /*
*/ group($X_ttemp)
local s = rowsof(`xEix')
mat `xEiy' = `xEix'[2..`s',1]
mat `xEix' = `xEix'[2..`s',2..`s']
global X_ecoe = `s' - 1
mat accum `xxi' = $X_indv $X_cons $X_wt, `copt'
mat `xxi' = syminv(`xxi')
mat vecaccum `xty' = $X_depv $X_indv /*
*/ $X_cons $X_wt, `copt'
local nobs = r(N)
local p = rowsof(`xxi')
mat `vce' = syminv(`xEix')
mat `beta' = (`vce' * `xEiy')'
if `iter' == 0 {
mat `bold' = `beta'
}
else {
local diff = mreldif(`beta',`bold')
mat `bold' = `beta'
`qqq' di in gr `"Iteration "' `iter' /*
*/ `": tolerance = "' in ye `diff'
}
local iter = `iter' + 1
}
if `diff' > `tol' {
noi di in blue "convergence not achieved"
global X_rc 430
}
else global X_rc 0
mc`corr' `iter'
mat `pcvce' = `vce'
mat `ovce' = `xxi'*`xEx'*`xxi'
mat `obeta' = `xty'*`xxi'
if `"`ols'"' != `""' {
mat `beta' = `obeta'
mat `vce' = `ovce'
global X_tle `"ordinary least squares"'
}
else {
global X_tle `"generalized least squares"'
}
tempvar ehat
mat score double `ehat' = `beta'
replace `ehat' = $X_depv - `ehat'
calcll `var' `ehat'
if `"`nmk'"' != `""' {
tempname s1
local k = colsof(`beta')
scalar `s1' = `nobs'/(`nobs'-`k')
mat `vce' = `vce'*`s1'
}
local rho `"$rho"'
local bp = colsof(`beta')
/*
if `"`fixname'"' != `""' {
local bnam : colsname(`beta')
local nnam : word count `bnam'
tokenize `"`bnam'"'
local `nnam' `"_cons"'
local bnam `"`*'"'
*/
local bnam `varname'
mat colnames `beta' = `bnam'
mat colnames `vce' = `bnam'
mat rownames `vce' = `bnam'
mat colnames `pcvce' = `bnam'
mat rownames `pcvce' = `bnam'
/*
}
*/
global X_miss = `nnobs' - $X_nobs
if `var' == 0 {
global X_ecov = 1
}
else if `var' == 1 {
global X_ecov = $X_ng
}
else global X_ecov = $X_ng * ($X_ng + 1) / 2
global X_ecor : word count $X_rho
local df = $X_nobs - $X_ecoe - $X_ecov - $X_ecor
est post `beta' `vce', obs(`nobs') depname("`origdep'") /*
*/ `dfopt'
if `"`ols'"'!=`""' { est local vcetype "Panel-corrected" }
global S_E_vce `"`e(vcetype)'"' /* double save */
SetGlob
restore
est repost , esample(`touse')
}
if "`opt'" != "" { est local rhotype "`opt'" }
if `"`iter'"' != `""' {
if `iter' > 1 {
noi di
}
}
else noi di
est local chi2type "Wald"
est local predict "xtgls_p"
est local cmd "xtgls"
noi DispRes `level'
end
program define DispRes
local level `1'
if "`level'" == "" {
local level 95
}
di _n in gr `"`e(title)'"' _n
di in gr `"Coefficients: "' in ye `"`e(coefftype)'"'
di in gr `"Panels: "' in ye `"`e(vt)"'
local nc : word count `e(rho)'
if `nc' == 1 {
local myrho : di %9.4f `e(rho)'
di in gr `"Correlation: "' in ye `"`e(corr)'"' in gr /*
*/ `" ("' in ye trim(`"`myrho'"') in gr `")"'
}
else {
di in gr `"Correlation: "' in ye `"`e(corr)'"'
}
di
di in gr `"Estimated covariances"' _col(28) `"= "' /*
*/ in ye %9.0g e(n_cv) /*
*/ in gr _col(49) `"Number of obs"' _col(68) `"= "' in ye %9.0g e(N)
di in gr `"Estimated autocorrelations"' _col(28) `"= "' in ye /*
*/ %9.0g e(n_cr) /*
*/ in gr _col(49) `"Number of groups"' _col(68) `"= "'in ye %9.0g e(N_g)
if e(g_min) == e(g_max) {
di in gr `"Estimated coefficients"' _col(28) `"= "' /*
*/ in ye %9.0g e(n_cf) /*
*/ in gr _col(49) `"Time periods"' /*
*/ _col(68) `"= "' in ye %9.0g e(N_t)
}
else {
di in gr `"Estimated coefficients"' _col(28) `"= "' /*
*/ in ye %9.0g e(n_cf) /*
*/ in gr _col(49) `"Obs per group: min"' /*
*/ _col(68) `"= "' in ye %9.0g e(g_min)
di in gr _col(64) "avg" _col(68) "= " in ye %9.0g e(g_avg)
di in gr _col(64) "max" _col(68) "= " in ye %9.0g e(g_max)
}
if e(chi2) > 999999 {
local cfmt `"%9.0g"'
}
else local cfmt `"%9.2f"'
di /*
*/ in gr _col(49) `"Wald chi2("' in ye e(df) in gr `")"' /*
*/ in gr _col(68) `"= "' in ye `cfmt' e(chi2)
di in gr `"Log likelihood"' _col(28) `"= "' in ye %9.0g e(ll) /*
*/ in gr _col(49) `"Prob > chi2"' _col(68) `"= "' in ye /*
*/ %9.4f chiprob(e(df), e(chi2))
di
est display, level(`level')
if e(df_pear) <= 0 {
noi di
noi di in blue `"Note: "' _c
noi di in blue `"you estimated at least as many quantities "' _c
noi di in blue `"as you have observations."'
}
end
program define SetGlob, eclass
est local title "Cross-sectional time-series FGLS regression"
est local coefftype `"$X_tle"'
est local rhotype `"$X_rcalc"'
capture est scalar rc = $X_rc
est scalar N = $X_nobs
est scalar N_g = $X_ng
est scalar N_t = $X_nt
if "$X_ntavg" != "" {
est scalar g_min = $X_ntmin
est scalar g_avg = $X_ntavg
est scalar g_max = $X_ntmax
}
est local depvar `"$X_depv2"'
est local ivar `"$X_ivar"'
if `"$X_ttmp"' == `""' {
est local tvar `"$X_tvar"'
}
est local rho `"$X_rho"'
est scalar n_cf = $X_ecoe
est scalar n_cv = $X_ecov
local nrho : word count $X_rho
est scalar n_cr = `nrho'
est scalar df_pear = e(N) - e(n_cv) - e(n_cr) - e(n_cf)
est scalar N_miss = $X_miss
est local vt `"$X_var"'
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?