📄 xtreg_fe.ado
字号:
*! version 1.4.4 29apr2005
program define xtreg_fe, eclass
_vce_parserun xtreg, panel : `0'
if "`s(exit)'" != "" {
exit
}
version 6, missing
local options "Level(cilevel)"
if !replay() {
syntax varlist(ts) [if] [, `options' FAST I(varname) FE ///
Robust Cluster(varname) ]
tsunab varlist : `varlist'
tokenize `varlist'
xt_iis `i'
local ivar "`s(ivar)'"
tempvar x w touse tmp XB U Ti
tempname sst sse r2
local dv `1'
if "`fast'"!="" {
local fast "*"
}
quietly {
mark `touse' `if'
markout `touse' `varlist' `ivar' `cluster'
count if `touse'
if r(N)<=1 { error 2001 }
capture tsset
if _rc == 0 {
local ivar `r(panelvar)'
local tvar `r(timevar)'
}
sort `ivar' `tvar' `touse'
local origvars `varlist'
tsrevar `varlist'
local varlist `r(varlist)'
preserve
keep if `touse'
keep `varlist' `ivar' `userwgt' `touse' `cluster'
`fast' regress `varlist'
`fast' local r2c = e(r2)
if "`cluster'" != "" {
_xtreg_chk_cl `cluster' `ivar'
local clopt " cluster(`cluster') "
local robust robust
}
tokenize `varlist'
local tmpdep `1'
summ `1'
scalar `sst' = (r(N)-1)*r(Var)
/* lhs */
by `ivar': gen double `x' = sum(`1')/_n
summ `1'
by `ivar': replace `x' = (`1' - `x'[_N]) + r(mean)
drop `1'
rename `x' `1'
mac shift
/* rhs */
while ("`1'"!="") {
by `ivar': gen double `x' = sum(`1')/_n
summ `1'
by `ivar': replace `x' = /*
*/ (`1' - `x'[_N]) + r(mean)
drop `1'
rename `x' `1'
count if `1'!=`1'[1]
if r(N)==0 {
replace `1' = 0
}
mac shift
}
count if `ivar'!=`ivar'[_n-1]
local dfa = r(N)-1
est clear
regress `varlist'
local nobs = e(N)
local dfb = e(df_m)
scalar `sse' = e(rss)
local dfr = e(df_r)
local dfe = e(df_r) - `dfa'
if `dfe'<=0 | `dfe'>=. { noi error 2001 }
if "`robust'" == "" & "`clopt'" == "" {
local dofopt "dof(`dfe')"
}
* we could avoid this if only we knew dfe in advance
regress `varlist', `dofopt' `robust' `clopt'
if "`cluster'" != "" {
local N_clust = e(N_clust)
local df_cl = e(df_r)
}
if "`robust'" != "" | "`cluster'" != "" {
/* backup e() results */
local scalars : e(scalars)
foreach i of local scalars {
if "`i'" != "F" {
tempname `i'
scalar ``i'' = e(`i')
}
}
local macros : e(macros)
foreach i of local macros {
local `i' `e(`i')'
}
local cvar `e(clustvar)'
/* adjust e(V) for d.f. */
tempname b V
mat `V' = e(V)
mat `b' = e(b)
mat `V' = `V'*`dfr'/`dfe'
est post `b' `V'
/* restore e() results */
foreach i of local scalars {
if "`i'" != "F" {
est scalar `i' = ``i''
}
}
foreach i of local macros {
est local `i' `"``i''"'
}
est local clustvar "`cvar'"
gettoken yvar xvars : varlist
test `xvars'
est scalar F = r(F)
}
tempname er2 eF ermse emss er2a ell ell0 b V
scalar `er2' = e(r2)
scalar `eF' = e(F)
scalar `ermse' = e(rmse)
scalar `emss' = e(mss)
scalar `er2a' = e(r2_a)
scalar `ell' = e(ll)
scalar `ell0' = e(ll_0)
mat `b' = e(b)
mat `V' = e(V)
local xvars : subinstr local origvars "`dv'" ""
mat colnames `b' = `xvars' _cons
mat colnames `V' = `xvars' _cons
mat rownames `V' = `xvars' _cons
est post `b' `V', obs(`nobs') depname(`dv')
if "`robust'" != "" | "`cluster'" != ""{
est local vcetype "Robust"
est local vce robust
est local clustvar "`cvar'"
}
est local cmd
est scalar rss = `sse'
est scalar df_m = `dfa' + `dfb'
local df_r = `nobs' -1 - e(df_m)
if "`cluster'" == "" {
est scalar df_r = `df_r'
}
else {
est scalar N_clust = `N_clust'
est scalar df_r = min(`df_r', `df_cl')
}
est scalar r2 = `er2'
est scalar rmse = `ermse'
est scalar mss = `emss'
est scalar r2_a = `er2a'
est scalar ll = `ell'
est scalar ll_0 = `ell0'
scalar S_E_sse = e(rss)
global S_E_mdf = e(df_m)
global S_E_tdf = e(df_r)
if "`fast'"!="" {
exit
}
est scalar tss = `sst'
est scalar N = `nobs'
est scalar df_b = `dfb'
est scalar r2_w = `er2'
est local ivar "`ivar'"
est scalar df_a = `dfa' /* # of coeffs absorbed */
est scalar F = `eF'
scalar S_E_sst = `sst'
scalar S_E_nobs = `nobs'
global S_E_dfb = `dfb'
scalar S_E_r2w = e(r2_w)
global S_E_ivar "`ivar'"
global S_E_dfa `dfa' /* # of coefs absorbed */
global S_E_f = e(F)
scalar `r2'=1-`sse'/`sst'
if "`robust'" == "" & "`cluster'" == "" {
est scalar F_f = ((`r2'-`r2c')/(e(df_a)))/ /*
*/ ((1-`r2')/e(df_r))
}
scalar S_E_f2 = e(F_f)
sort `ivar' /* sic, in case in varlist */
by `ivar': gen long `Ti' = _N if _n==_N
summ `Ti'
scalar S_E_T = r(max)
est scalar Tbar = r(mean)
scalar S_E_Tbar = e(Tbar)
est scalar Tcon = (r(min)==r(max))
global S_E_Tcon = e(Tcon)
est scalar g_min = r(min)
est scalar g_avg = r(mean)
est scalar g_max = r(max)
count if `Ti'<.
est scalar N_g = r(N)
scalar S_E_n = r(N)
restore
est local depvar `dv'
tempname mysamp
qui gen byte `mysamp' = `touse'
est repost, esample(`mysamp')
_predict double `XB' if `touse', xb
sort `ivar' `touse'
by `ivar' `touse': gen double `U' = /*
*/ cond(`touse' & _n==_N, /*
*/ sum(`tmpdep')/_n-sum(`XB')/_n,.) /*
*/ if `touse'
summ `U'
est scalar ui = sqrt(r(Var))
est scalar sigma_u = sqrt(r(Var))
scalar S_E_ui= e(sigma_u)
by `ivar' `touse': replace `U' = `U'[_N]
corr `XB' `U'
est scalar corr = r(rho)
scalar S_E_rho = e(corr)
corr `tmpdep' `XB' if `touse'
est scalar r2_o = r(rho)^2
scalar S_E_r2o = e(r2_o)
by `ivar' `touse': replace `XB' = /*
*/ cond(_n==_N & `touse', /*
*/ sum(`XB'/_N),.)
by `ivar' `touse': replace `U' = /*
*/ cond(_n==_N & `touse', /*
*/ sum(`tmpdep'/_N),.)
corr `U' `XB'
est scalar r2_b = r(rho)^2
scalar S_E_r2b = e(r2_b)
est scalar sigma_e = sqrt(e(rss)/`dfe')
est scalar sigma = sqrt(e(sigma_u)^2 + e(sigma_e)^2)
est scalar rho = e(sigma_u)^2 / e(sigma)^2
est local model fe
est local predict xtrefe_p
est local cmd xtreg
tokenize `varlist'
mac shift
global S_E_vl `*'
global S_E_if `"`if'"'
global S_E_depv "`dv'"
global S_E_cmd2 "xtreg_fe"
global S_E_cmd "xtreg"
}
}
else {
if ("`e(model)'" !="fe") {
error 301
}
syntax [, `options']
}
if e(Tcon) {
local Twrd " T"
}
else local Twrd "T-bar"
local dft = e(N) - 1
local dfe = `dft' - e(df_m)
* local ssm = scalar(e(tss) - e(rss))
* local msm = `ssm'/e(df_m)
local ssm .
local msm .
local mse = e(rss)/`dfe'
if !missing(e(chi2)) {
local p = chi2tail(e(df_b),e(chi2))
}
else local p = fprob(e(df_b),`dfe',e(F))
#delimit ;
di _n in gr "Fixed-effects (within) regression"
_col(49) in gr "Number of obs" _col(68) "="
_col(70) in ye %9.0f e(N) ;
di in gr "Group variable (i): " in ye abbrev("`e(ivar)'",12) in gr
_col(49) "Number of groups" _col(68) "="
_col(70) in ye %9.0g e(N_g) _n ;
di in gr "R-sq: within = " in ye %6.4f e(r2_w)
_col(49) in gr "Obs per group: min" _col(68) "="
_col(70) in ye %9.0g e(g_min) ;
di in gr " between = " in ye %6.4f e(r2_b)
_col(64) in gr "avg" _col(68) "="
_col(70) in ye %9.1f e(g_avg) ;
di in gr " overall = " in ye %6.4f e(r2_o)
_col(64) in gr "max" _col(68) "="
_col(70) in ye %9.0g e(g_max) _n ;
if !missing(e(chi2)) { ;
di in gr _col(49) "Wald chi2(" in ye e(df_b)
in gr ")" _col(68) "=" _col(70) in ye %9.2f e(chi2) ;
di in gr "corr(u_i, Xb)" _col(16) "= " in ye %6.4f e(corr)
in gr _col(49) "Prob > chi2" _col(68) "="
_col(73) in ye %6.4f `p' _n ;
} ;
else { ;
di in gr _col(49) "F(" in ye e(df_b) in gr "," in ye `dfe'
in gr ")" _col(68) "=" _col(70) in ye %9.2f e(F) ;
di in gr "corr(u_i, Xb)" _col(16) "= " in ye %6.4f e(corr)
in gr _col(49) "Prob > F" _col(68) "="
_col(73) in ye %6.4f `p' _n ;
} ;
#delimit cr
est di , level(`level') plus
di in smcl in gr " sigma_u {c |} " in ye %10.0g e(sigma_u)
di in smcl in gr " sigma_e {c |} " in ye %10.0g e(sigma_e)
di in smcl in gr " rho {c |} " in ye %10.0g e(rho) /*
*/ in gr " (fraction of variance due to u_i)"
di in smcl in gr "{hline 13}{c BT}{hline 64}"
#delimit ;
if "`robust'" == "" & "`cluster'" == "" ///
& "`e(prefix)'" != "bootstrap" {
di in gr "F test that all u_i=0: "
"F(" in ye e(df_a) in gr ", " in ye e(df_r) in gr ") = "
in ye %8.2f e(F_f) _col(62) in gr "Prob > F = "
in ye %6.4f fprob(e(df_a),e(df_r),e(F_f)) ;
#delimit cr
}
end
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -