📄 xtabond.ado
字号:
qui gen double `res2'=`res'^2
qui summ `res2' if `touses'
scalar `sig'=r(sum)
local NT =r(N)
scalar `sig'=`sig'/(`NT'-`k')
mat colnames `V'=`names'
mat rownames `V'=`names'
mat `b'=e(b)
tempname b_2 V_2
mat `b_2' = `b'
mat `V_2' = `V'
}
local df=`NT'-`k'
tempvar touse3 t2b
qui gen long `t2b'=`t'-`tmin'+1
mark `touse3' if `t2b'>`q'
local namesf2 : subinstr local namesf "_cons" ""
markout `touse3' `namesf2'
tempname b1 V1
mat `b1' = `b'
mat `V1' = `V'
tempname v4
mat `v4' = .5*(`V1'' + `V1' )
if mreldif(`v4', `V1') > 1e-5 {
di as err "robust VCE not symetric"
exit 198
}
mat `V1'=`v4'
mat `V'=`v4'
est post `b1' `V1'
est scalar sig=`sig'
est scalar N_g=`id2max_t'
/* calculate AR statistics */
tempvar xb res wi lsqr
tempname d0
qui _predict double `xb', xb
qui gen double `res'=D.`depvar'-`xb' if `touse'
qui replace `res'=0 if `res'>=.
tempname ZHW WW d1 d2m d3m d2 d3 ZV sargan wHw wHws
tempname hwname wtname
_xtzv `res', zvname(`ZV') ivar(`abid') /*
*/ imax(`id2max') tvar(`t2') tmin(`t2min') /*
*/ tmax(`t2max') lags(`lags') touse(`l2touse') /*
*/ zivars(zivars) timac(timac) lvmac(lvmac) /*
*/ indmac(indmac) instmac(instmac) /*
*/ zwords(`zvcnt') indwords(`indcnt') /*
*/ instwords(`instcnt') zimat(`zimat')
local i 1
while( `i' <= `artests') {
local zero -1
tempname arm`i'
qui capture drop `wi' `lsqr'
local sarres ""
local zvname ""
/* AR(m) statistic */
qui gen double `wi'=l`i'.`res' if `touse'
qui replace `wi'=0 if `wi'>=.
qui gen double `lsqr'=`wi'*`res'
qui summ `lsqr'
scalar `d0'=r(sum)
if `d0' == 0 {
di as txt "note: the residuals and the L(`i') " _c
di as txt "residuals have no obs in common"
di as txt " The AR(`i') is trivially zero "
scalar `arm`i''=.
local zero 0
}
if (`zero' != 0 | `i'==1 ) {
if "`twostep'" == "" {
local ltwo 0
if "`robust'" == "" {
if `i'==1 {
local sarres "sarres(`res')"
}
}
else {
local ltwo 1
local resl " res1(`res1') "
}
}
else {
local ltwo 1
/* local resl " res1(`res1') " */
local resl " res1(`res') "
if `i'==1 {
local sarres "sarres(`res')"
}
}
/* begin new method */
if "`twostep'" != "" | "`robust'" != "" {
_xtwhw `wi' , zhname(`ZHW') wwname(`WW') ivar(`abid') imax(`id2max') /*
*/ tvar(`t2') tmin(`t2min') tmax(`t2max') lags(`lags') /*
*/ touse(`l2touse') zivars(zivars) timac(timac) /*
*/ lvmac(lvmac) indmac(indmac) instmac(instmac) wvmac(wvmac) /*
*/ wwords(`wvcnt') zwords(`zvcnt') indwords(`indcnt') /*
*/ instwords(`instcnt') zimat(`zimat') hwname(`hwname') /*
*/ wtname(`wtname') res1(`res')
scalar `wHws' = r(wHw)
}
else {
_xtwhw `wi' , zhname(`ZHW') wwname(`WW') ivar(`abid') /*
*/ imax(`id2max') tvar(`t2') tmin(`t2min') /*
*/ tmax(`t2max') lags(`lags') touse(`l2touse') /*
*/ zivars(zivars) timac(timac) lvmac(lvmac) /*
*/ indmac(indmac) instmac(instmac) wvmac(wvmac) /*
*/ wwords(`wvcnt') zwords(`zvcnt') indwords(`indcnt') /*
*/ instwords(`instcnt') zimat(`zimat') hwname(`hwname')/*
*/ wtname(`wtname')
scalar `wHws' =r(wHw)
}
/* end new method */
if "`twostep'" == "" & "`robust'" == "" {
scalar `d1'=`wHws'*`sig1'
mat `d2m'=-2*`sig1'*`WW'*`M1'*`W'*`A'*`ZHW'
if `i' == 1 {
if (`sig1' >=. | 1/`sig1'>=. ) {
scalar `sargan' = .
}
else {
mat `sargan'= `ZV''*`A'* /*
*/ `ZV'*(1/`sig1')
scalar `sargan' = `sargan'[1,1]
}
}
}
else {
if "`robust'" != "" {
scalar `d1'= `wHws'
mat `d2m'=-2*`WW'*`M1'*`W'*`A'*`ZHW'
}
else {
scalar `d1'= `wHws'
mat `d2m'=-2*`WW'*`M1'*`W'*`A2'*`ZHW'
if `i'==1 {
mat `sargan'= `ZV''*`A2'*`ZV'
scalar `sargan' = `sargan'[1,1]
}
}
}
mat `d3m'=`WW'*e(V)*`WW''
if `zero' != 0 {
scalar `arm`i''=(`d0')/ /*
*/ ( sqrt(`d1'+`d2m'[1,1]+`d3m'[1,1]) )
}
else {
scalar `arm`i'' = .
}
}
local i = `i' + 1
}
restore
foreach var of local prevars_o {
local prevars_do " `prevars_do' d.`var' "
}
tempname dd3 dd4
qui gen double `dd3' = `depvar'
markout `touse' `dd3' DL(1/`lags').`dd3' `indeps_o' /*
*/ `prevars_do' `inst_o'
if "`small'" != "" {
local dofm " dof( `df' ) "
}
est post `b' `V', depname(D.`depvar') obs(`NT') `dofm' /*
*/ esample(`touse')
local i 1
while `i' <= `artests' {
est scalar arm`i' = `arm`i''
if "`robust'" == "" & `i'==1 {
/* est scalar sargan = `sargan'[1,1] */
est scalar sargan = `sargan'
}
local i = `i' + 1
}
/* do wald test on constant */
if "`constant'" == "" {
qui test `namesf2'
if "`small'" != "" {
est scalar F=r(F)
est scalar F_p = r(p)
est scalar F_df=r(df)
}
else {
tempname chi2 chi2_p chi2_df
est scalar chi2 = r(chi2)
est scalar chi2_p = r(p)
est scalar chi2_df = r(df)
est local chi2type "Wald"
}
}
est scalar N = `n2'
est scalar g_min=`tobs_min'
est scalar g_max=`tobs_max'
est scalar g_avg=`tobs_av'
est scalar t_min=`tmin'
est scalar t_max=`tmax'
est scalar n_lags = `lags'
est scalar sig2=`sig'
est scalar N_g=`id2max_t'
est local inst_l "`inst_l'"
est local ivar "`id'"
est local tvar "`t'"
est local robust "`robust'"
est local twostep "`twostep'"
est local predict "xtab_p"
est local bnames_ud `names_ud'
est local depvar_ud "`depvar'"
est local depvar "D.`depvar'"
est local small "`small'"
est scalar artests = `artests'
est scalar df_m = `k'
est scalar zcols =`zcols'
if "`robust'" == "" {
est scalar sar_df= `zcols'-`k'
}
else {
est local vce "robust"
est local vcetype "Robust"
}
est local cmd "xtabond"
Disp `level'
end
program define tsvars, rclass
syntax varlist(ts)
return local varlist "`varlist'"
end
/* pre_p parses pre(<varlist>, [LAGstruct(<#_1,#_2) ENDogenous
exog(exogvarlist) prevs(all_ready_parsed_predeterm_vars])
*/
program define pre_p, rclass
capture syntax varlist , [ /*
*/ LAGstruct(string) /*
*/ ENDogenous /*
*/ exog(varlist ts) /*
*/ prevs(varlist ts) /*
*/ noCONStant /*
*/ ]
if _rc > 0 {
di as err "pre(`0') invalid "
exit 198
}
_rmcoll `varlist', `constant'
local varlist "`r(varlist)'"
foreach var of local varlist {
capture _rmdcoll `var' `prevs', nocoll `constant'
if _rc == 459 {
di as txt "note: `var' dropped due to collinearity"
}
else {
capture _rmdcoll `var' `exog', nocoll `constant'
if _rc == 459 {
di as txt "note: `var' dropped due to collinearity"
}
else {
local prelist "`prelist' `var' "
}
}
}
local varlist "`prelist'"
if "`lagstruct'" != "" {
local lagstruct : subinstr local lagstruct " " "", all
gettoken lags lagstruct : lagstruct, parse(",")
if "`lags'"=="." {
local lags "."
}
gettoken comma lagstruct : lagstruct, parse(",")
if "`comma'"!="," {
error 198
}
gettoken maxlags lagstruct : lagstruct, parse(",")
if "`maxlags'" == "." {
local maxlags "."
}
if "`lagstruct'"!="" {
error 198
}
}
else {
local lags "."
local maxlags "."
}
capture confirm integer number `lags'
if _rc > 0 {
local lagsn 0
}
else {
if `lags' < 0 {
di as err "lags of predetermined variables " ///
"must be nonnegative"
exit 498
}
local lagsn `lags'
}
if "`endogenous'" != "" {
local first = 1 + `lagsn'
if `maxlags' < . {
local ++maxlags
}
}
else {
local first = 0 + `lagsn'
}
return scalar first = `first'
return scalar lags = `lags'
return scalar maxlags = `maxlags'
return local pre "`varlist'"
end
program define Disp, eclass
args level
#delimit ;
di _n as txt "Arellano-Bond dynamic panel-data estimation"
_col(49) as txt "Number of obs" _col(68) "="
_col(70) as res %9.0f e(N) ;
di as txt "Group variable (i): " as res abbrev("`e(ivar)'", 12) as txt
_col(49) "Number of groups" _col(68) "="
_col(70) as res %9.0g e(N_g) _n ;
#delimit cr
if "`e(prefix)'" != "" {
if !missing(e(df_r)) {
di as txt _col(49) "F(" as res e(df_m) as txt ", " /*
*/ as res e(df_r) as txt ")" _col(68) "=" /*
*/ _col(70) as res %9.2f e(F)
}
else {
di as txt _col(49) "Wald chi2(" /*
*/ as res e(df_m) as txt ")" _col(68) "=" /*
*/ _col(70) as res %9.2f e(chi2)
}
}
else if "`e(small)'" != "" {
di as txt _col(49) "F(" as res e(F_df) as txt ", " /*
*/ as res e(df_r) as txt ")" _col(68) "=" /*
*/ _col(70) as res %9.2f e(F)
}
else {
di as txt _col(49) "Wald chi2(" as res e(chi2_df) as txt ")" /*
*/ _col(68) "=" _col(70) as res %9.2f e(chi2)
}
di
#delimit ;
di as txt "Time variable (t): " as res abbrev("`e(tvar)'", 12)
as txt _col(49) "Obs per group: min " _col(68) "="
_col(70) as res %9.0g e(g_min) ;
di as txt _col(64) "avg" _col(68) "="
_col(70) as res %9.0g e(g_avg) ;
di as txt _col(64) "max" _col(68) "="
_col(70) as res %9.0g e(g_max) _n ;
#delimit cr
if "`e(twostep)'" != "" {
di as txt "Two-step results"
}
else {
di as txt "One-step results"
}
est di, level(`level')
if "`e(twostep)'" != "" {
di "Warning: Arellano and Bond recommend using " /*
*/ "one-step results for "
di " inference on coefficients"
di
}
if "`e(robust)'" == "" {
#delimit ;
di as txt "Sargan test of over-identifying restrictions: ";
di as txt _col(10) "chi2(" as res e(zcols)-e(df_m) as txt ") = "
as res %8.2f e(sargan) _col(35) as txt "Prob > chi2 = "
as res %6.4f chiprob(e(zcols)-e(df_m),e(sargan)) ;
di ;
#delimit cr
}
local i 1
while (`i' <= e(artests) ) {
di as txt "Arellano-Bond test that average " _c
di as txt "autocovariance in residuals of order `i' is 0:"
di _col(10) as txt "H0: no autocorrelation " /*
*/ _col(35) "z = "as res %6.2f e(arm`i')/*
*/ _col(48) as txt "Pr > z = " /*
*/ as res %6.4f 2*(normprob(-1*abs( (e(arm`i')) ) ))
local i = `i'+1
}
end
exit
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -