📄 xtabond.ado
字号:
*! version 3.6.3 07apr2005
program define xtabond, sortpreserve byable(onecall)
quietly query born
if $S_1 < d(23may2002) {
di as err "your Stata executable is out of date"
di as err " type -update executable- at the Stata prompt"
exit 498
}
if _by() {
local BY `"by `_byvars'`_byrc0':"'
}
`BY' _vce_parserun xtabond, nojack noboot : `0'
if "`s(exit)'" != "" {
exit
}
version 7.0, missing
if replay() {
if "`e(cmd)'" != "xtabond" { error 301 }
if _by() { error 190 }
syntax [, Level(cilevel) ]
Disp `level'
exit
}
`BY' Estimate `0'
end
program Estimate, sortpreserve eclass byable(recall)
syntax varlist(ts) [if] [in] , [LAgs(integer 1) Robust TWOstep /*
*/ noConstant ARtests(integer 2) /*
*/ MAXLDep(integer 0) DIFFvars(string) INST(string) /*
*/ MAXLAGs(string ) zout(integer 0) SMall /*
*/ Level(cilevel) * ]
if "`twostep'" != "" & "`robust'" != "" {
di as err "robust may not be specified with twostep"
exit 198
}
/* check that data is tsset */
capture tsset
local tmin = r(tmin)
local tmax = r(tmax)
capture local id "`r(panelvar)'"
if "`id'"=="" {
di as err "must tsset data and specify panelvar"
exit 459
}
capture local t "`r(timevar)'"
if "`t'" == "" {
di as err "must tsset data and specify timevar"
exit 459
}
local tvar `t'
if `lags' > `tmax'-`tmin'-1 {
di as error /*
*/ "too many lags of the dependent variable requested"
di as error "lags() must be between 1 and " `tmax'-`tmin'-2
exit 198
}
/* complain if number of lags is < 0 */
if `lags'<1 {
di as err "lags of dependent variable must be >=1 "
exit 198
}
/* only p+1 ar tests can be performed */
if `artests' > `lags' + 1 {
di as err "Only the number of lags on depvar +1 AR tests allowed"
exit 198
}
if "`maxlags'" != "" {
capture local check = (`maxlags' <= 0 )
if _rc > 0 {
di as err "maxlags(`maxlags') not valid"
exit 198
}
if `maxlags'<=0 {
di as err "maxlags must be > 0"
exit 198
}
}
else {
local maxlags = `tmax' -`tmin'
}
tempvar touse touseb
mark `touse' `if' `in'
markout `touse' `id'
if _by() {
qui replace `touse' = 0 if `_byindex' != _byindex()
}
qui sum `touse'
if r(max) == 0 {
di as err "no observations"
exit 2000
}
qui gen byte `touseb' = `touse'
preserve
tempvar orig
qui gen byte `orig' =1
tsfill, full
sort `id' `t'
qui replace `orig' =0 if `orig' >=.
qui count if `t'>=.
if r(N)>0 {
di as err "no missing values in time variable (`t') allowed"
exit 459
}
/* parse diffvars */
if "`diffvars'" != "" {
tsvars `diffvars'
local diffvars "`r(varlist)'"
_rmcoll `diffvars', `constant'
local diffvars "`r(varlist)'"
}
/* parse instruments */
if "`inst'" != "" {
_rmcoll `inst', `constant'
local inst "`r(varlist)'"
local inst_o "`r(varlist)'"
/* inst_l is local list of instruments */
local inst_l "`inst'"
tsrevar `inst', substitute
local inst "`r(varlist)'"
}
if "`constant'" == "" {
tempname cons1
qui gen double `cons1'=1 if `touse'
}
local varlist "`varlist' "
tokenize `varlist'
local depvar `1'
local depvar: subinstr local depvar "." ".", count(local legal)
if `legal' > 0 {
di as err "`depvar' invalid in this context"
di as err /*
*/"dependent variable may not contain time-series operators"
exit 198
}
macro shift
local indeps "`*'"
local exog `indeps'
_rmcoll `exog', `constant'
local exog "`r(varlist)'"
if `lags' > 0 {
tsvars L(1(1)`lags').`depvar'
local laglist "`r(varlist)'"
}
else {
local laglist
}
/* parse out predetermined variables and their lag structures */
/* preM2 is a global name of matrix that holds the parameters for the
predetermined variable the structure of preM2 is
lags of variable in model,
maximum number of lags that can be used as instrument */
tempname preM2 preM2b
// prelist contains [{pre_el} [{pre_el}]..[{pre_el}]}
// where pre_el is {varname} {rlags} {rmlags} {firstpl}
// rlags is the number of lags of the predetermined
// variable in the model
// rmlags is the number of lags that can be used as instruments for the
// the predetermined variables
// firstpl is the minimum lag that can be included in as instrument minus 1,
// i.e., firstpl = first + rlags,
// where first=0 if predetermined and first=1 if endogenous
while "`options'" != "" {
local 0 ",`options'"
syntax [, PRE(string) * ]
if "`pre'" == "" {
di as err " `options' invalid"
exit 198
}
local tmp : subinstr local pre "," ",", all /*
*/ count(local ncommas)
if `ncommas' == 0 {
local mycomma ","
}
else {
local mycomma
}
pre_p `pre' `mycomma' exog(`exog' `diffvars') /*
*/ prevs(`prevs') `constant'
local rprelist "`r(pre)'"
if "`rprelist'" != "" {
local prevs "`prevs' `rprelist'"
local firstpl = r(first)
if r(lags)>=. {
local rlags 0
}
else {
local rlags = r(lags)
}
if r(maxlags)>=. {
local rmlags = `maxlags'
}
else {
local rmlags = r(maxlags)
}
if `rlags' < 0 {
di as err "Lags of predetermined variables must be >= 0"
exit 198
}
if `rmlags' < 1 {
di as err "Max number of instruments for "/*
*/ "predetermined variables must be >= 1 "
exit 198
}
local prelist "`prelist'`rprelist',"
local prelist "`prelist' `rlags' `rmlags' `firstpl':"
local pres `rprelist'
foreach pv of local pres {
mat `preM2' = nullmat(`preM2') \ /*
*/ (`rlags' , `rmlags' )
mat `preM2b' = nullmat(`preM2b') \ /*
*/ (`rlags' , `rmlags', `firstpl' )
}
}
}
if `lags' == 0 & "`prelist'" == "" {
di as err "no lags of the dependent variable or " /*
*/ "predetermined variables specified"
exit 198
}
if "`options'" != "" {
di as err "`options' invalid"
exit 198
}
if "`prevs'" != "" {
local pre ""
local j 1
tokenize `prevs'
while "``j''" != "" {
local vlag=`preM2'[`j',1]
local pre "`pre' L(0(1)`vlag').``j'' "
local j = `j' + 1
}
tsvars `pre'
local pre "`r(varlist)'"
}
else {
local pre ""
local preM2 ""
}
/* check for collinearity */
/* t2 contains `absolute t' which goes from 1 to number of observations in
* longest panel
*/
tempvar t2
qui gen long `t2'=`tvar'-`tmin'+1
qui sum `t2'
local t2max = r(max)
/* t2min contains first value of absolute t in model */
local t2min = 1 + `lags' + 1
local trows = `t2max' - (`lags'+1)
local fvarlist " `laglist' `indeps' "
if "`constant'"=="" {
_rmcoll `fvarlist' `diffvars' `pre' /*
*/ if `touse' & `t2'>`lags'+1
}
else {
_rmcoll `fvarlist' `diffvars' `pre' /*
*/ if `touse' & `t2'>`lags'+1 , nocons
}
local fvarlist "`r(varlist)'"
foreach tv of local fvarlist {
local laglist: subinstr local laglist "`tv'" "`tv'", /*
*/ word count(local n)
if `n'==1 {
local newlaglist "`newlaglist' `tv' "
}
local n 0
local indeps: subinstr local indeps "`tv'" "`tv'", /*
*/ word count(local n)
if `n'==1 {
local newindeps "`newindeps' `tv' "
}
local n 0
local diffvars: subinstr local diffvars "`tv'" "`tv'", /*
*/ word count(local n)
if `n'==1 {
local newdiffs "`newdiffs' `tv' "
}
local n 0
local exog: subinstr local exog "`tv'" "`tv'", /*
*/ word count(local n)
if `n'==1 {
local newexog "`newexog' `tv' "
}
local n 0
local pre: subinstr local pre "`tv'" "`tv'", /*
*/ word count(local n)
if `n'==1 {
local newpre "`newpre' `tv' "
}
}
local laglist "`newlaglist'"
local laglist_n "`laglist'"
if `lags' > 0 {
qui tsrevar `laglist' if `touse', substitute
local laglist "`r(varlist)'"
}
else {
local laglist ""
}
local indeps "`newindeps'"
local diffvars "`newdiffs'"
local pre "`newpre'"
local exog `newexog' `newdiffs'
/* now use time-series operators to difference indeps and laglist */
tokenize `laglist'
while "`1'" != "" {
local 1 "D.`1'"
local laglist2 "`laglist2' `1'"
macro shift
}
local laglist "`laglist2'"
local laglist_ud "`laglist_n'"
tokenize `laglist_n'
while "`1'" != "" {
local 1 "D.`1'"
local laglist_n2 "`laglist_n2' `1'"
macro shift
}
local laglist_n "`laglist_n2'"
local indeps_ud "`indeps' `diffvars' "
tokenize `indeps'
while "`1'" != "" {
local 1 "D.`1'"
local indeps2 "`indeps2' `1'"
macro shift
}
local indeps "`indeps2'"
/* now put diffvars into indeps */
local indeps "`indeps' `diffvars' "
local indeps_o `indeps'
qui tsrevar `pre' if `touse', list
local prebase "`r(varlist)'"
/* create differenced names for pre */
local pre_ud "`pre'"
tokenize `pre'
while "`1'" != "" {
local 1 "D.`1'"
local pre2 "`pre2' `1'"
macro shift
}
local pre_n "`pre2'"
local prevars_o `pre'
qui tsrevar `pre' if `touse',substitute
local prevars "`r(varlist)'"
tokenize `prebase'
local j 1
while "``j''" != "" {
tempname pre`j'
qui gen double `pre`j''=``j''
local prebase2 " `prebase2' `pre`j'' "
local j = `j' + 1
}
local prebase "`prebase2'"
/* difference prevars */
tokenize `prevars'
while "`1'" != "" {
local 1 "D.`1'"
local prevars2 "`prevars2' `1'"
macro shift
}
local prevars "`prevars2'"
/* put in cons */
if "`constant'" == "" {
local names_ud "`laglist_ud' `pre_ud' `indeps_ud' _cons "
local namesf "`laglist_n' `pre_n' `indeps' _cons "
local indeps "`indeps' `cons1'"
local fvarlist "`depvar' `laglist' `prevars' `indeps' "
local exog `exog' `cons1'
}
else {
local names_ud "`laglist_ud' `pre_ud' `indeps_ud' "
local fvarlist "`depvar' `laglist' `prevars' `indeps' "
local namesf "`laglist_n' `pre_n' `indeps' "
}
local names_ud : subinstr local names_ud " " " ", all
local names_ud : subinstr local names_ud " " " ", all
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -