📄 _vecu.ado
字号:
mat colnames `Ithetai' = `bnames'
mat rownames `Ithetai' = `bnames'
}
tempname pivec pi_V sigmabbi alpha_V
mat `sigmabbi' = syminv(`beta2m''*`s11'*`beta2m')
mat `pi' = `alpha2'*`beta2m''
mat colnames `pi' = `lagvarlist' `z1exn'
mat rownames `pi' = `diffvarlist2'
mat `pivec' = vec(`pi'')'
local pinames : colfullnames `pivec'
mat `pi_V' = `omega' # (`beta2m' * `sigmabbi' *`beta2m'')
mat `alpha_V' = 1/(`T' - `df') *( `omega' # `sigmabbi' )
if "`gmat'" != "NONE" {
mat `pi_V' = syminv(`gmat''* ///
(`omegai'#(`beta2m''*`s11'*`beta2m'))* ///
`gmat')
mat `alpha_V' = 1/(`T'-`df') * `gmat'*`pi_V'*`gmat''
tempname outer
mat `outer' = (`beta2m' # I(`K'))
mat `outer' = (I(`K') # `beta2m')
mat `pi_V' = `outer'*`gmat'*`pi_V'*`gmat''*`outer''
}
mat `pi_V' = (1/(`T'-`df'))*`pi_V'
mat colnames `pi_V' = `pinames'
mat rownames `pi_V' = `pinames'
tempname V2
mat `V2' = `V'
tempname chi2_res bcopy
scalar `chi2_res' = 2*(`llvalueJ' - `llvalue')
mat `bcopy' = `b'
eret clear
ereturn post `b' `V' , esample(`touse')
// seasonal is an undocumented e-result that results from
// the undocumented option seasonal
if "`seasonal'" != "" {
eret local seasonal "`stype'"
}
else if "`sindicators'" != "" {
eret local sindicators "`sindicators'"
}
eret local trend `trend'
eret local tsfmt "`tsfmt'"
eret local tvar "`tvar'"
eret local endog `tsvarlist'
eret local eqnames `diffvarlist2'
if "`reduce'" != "" {
eret local reduce_opt `reduce'
}
eret local reduce_lags `reduced'
eret local predict "vec_p"
if "`acnsmac'`bcnsmac'" != "" {
if `converge' == 0 {
scalar `converge' = 1
}
else {
scalar `converge' = 0
}
eret scalar converge = `converge'
}
if "`acnsmac'" != "" {
eret local aconstraints "`acnsmac'"
}
if "`bcnsmac'" != "" {
eret local bconstraints "`bcnsmac'"
}
eret scalar N = `T'
eret scalar beta_iden = `beta_iden'
eret scalar beta_icnt = `beta_iden_cnt'
eret scalar df_lr = `df_lr'
// BPP: saving off names of cointegrating equations _ce1, _ce2, ...
// needed for dialog boxes, and hard to do in dialog programming code
local cenames
forvalues i = 1 / `rank' {
local cenames "`cenames' _ce`i'"
}
local cenames `=trim("`cenames'")' // rm leading space
eret local cenames "`cenames'"
// end BPP modification
eret scalar k_ce = `rank'
eret scalar n_lags = `p'
eret scalar k_eq = `K'
eret scalar k_dv = `K'
eret scalar k_rank = `parms1'
eret scalar df_m = `df'
eret scalar ll = `llvalue'
eret scalar chi2_res = `chi2_res'
eret scalar tmin = `tmin'
eret scalar tmax = `tmax'
eret scalar aic = `aic'
eret scalar sbic = `bic'
eret scalar hqic = `hqic'
eret scalar detsig_ml = `detsig'
// save off equation level stats
forvalues i = 1/`K' {
eret scalar k_`i' = `k_`i''
eret scalar rmse_`i' = `rmse_`i''
eret scalar r2_`i' = `r2_`i''
eret scalar df_m`i' = `df_m`i''
eret scalar chi2_`i' = `chi2_`i''
}
// now get long-run impact matrix and its VCE
tempname C Gam xi1 xi2 xi C_V qstar alpha_bar
// _vecmkgam uses e(b) and e(trend) , they must already be posted
_vecmkgam, g(`Gam') b(`bcopy') rank(`rank') ///
trend(`trend') pm1(`pm1') k(`K')
mat `C' = `betao'*inv(`alphao''*`Gam'*`betao')*`alphao''
mat `alpha_bar' = `alpha2'* syminv(`alpha2''*`alpha2')
mat `xi1' = (`C''*`Gam''-I(`K'))*`alpha_bar'
if `pm1' > 0 {
mat `xi2' = J(1,`pm1',1)#(`C'')
mat `xi' = `xi1', `xi2'
}
else {
mat `xi' = `xi1'
}
mat `qstar' = (`xi1',`C'')
tempname dofw2 zmat smat lq1
// this next program uses e(V)
_vecmkapvp `dofw2' `rank' `pm1' `K' `tterms'
mat `smat' = (`C'#`xi')
mat `C_V' = ((`T'-`df')/`T')*(`smat')*`dofw2'*`smat''
mat colnames `C' = `tsvarlist2'
mat rownames `C' = `tsvarlist2'
mat `C' = vec(`C'')'
local cnames : colfullnames `C'
mat rownames `C_V' = `cnames'
mat colnames `C_V' = `cnames'
local anames
foreach nm1 of local diffvarlist2 {
foreach nm2 of local Lce_lab {
local anames "`anames' `nm1':`nm2' "
}
}
mat colnames `alpha_V' = `anames'
mat rownames `alpha_V' = `anames'
mat `alpha2' = vec(`alpha2'')'
mat colnames `alpha2' = `anames'
mat rownames `alpha2' = alpha
eret mat alpha = `alpha2'
eret mat V_alpha = `alpha_V'
mat colnames `omega' = `diffvarlist2'
mat rownames `omega' = `diffvarlist2'
mat rownames `beta2' = beta
mat rownames `bvec' = betavec
mat rownames `pivec' = pi
mat rownames `C' = mai
eret mat beta = `beta2'
eret mat V_beta = `Ithetai'
eret mat betavec = `bvec'
eret mat pi = `pivec'
eret mat V_pi = `pi_V'
eret mat omega = `omega'
eret mat mai = `C'
eret mat V_mai = `C_V'
eret local title "Vector error-correction model"
eret local cmd "vec"
}
end
program define MATsqrt
// syntax MATsqrt newmat oldmat
// oldmat is name of symmetric matrix of which to take the square root
// newmat is name of matrix to hold the matrix square root
// matrix square root is defined as
// newmat = W (1/sqrt(r_1), 1/sqrt(r_2), ..., 1/sqrt(r_k)) W'
// where W is matrix of eigenvectors of oldmat and
// r_i is i^th eigenvector of oldmat
// NB: return exits with 498 if r_i <= 1e-14
local newmat `1'
local oldmat `2'
confirm matrix `oldmat'
confirm name `newmat'
tempname w v v2
matrix symeigen `w' `v' = `2'
local k = colsof(`v')
mat `v2' = J(`k',`k',0)
forvalues i = 1/`k' {
if `v'[1,`i'] <= 1e-15 {
mat `v2'[`i',`i'] = 0
}
else {
mat `v2'[`i',`i'] = 1/sqrt(`v'[1,`i'])
}
}
mat `newmat' = `w'*`v2'*`w''
end
program define MKic
// arguments are passed in
// aic is 1 by (K+1) matrix to hold AIC
// bic is 1 by (K+1) matrix to hold BIC
// hqic is 1 by (K+1) matrix to hold HQIC
// ll is 1 by (K+1) matrix that already holds Loglikelihoods
// parms is 1 by (K+1) matrix that already holds number of parameters
// T is a scalar that already holds number of time periods in sample
// [ scalar ]
args aic bic hqic ll parms T scalar
if "`scalar'" == "" {
local r = colsof(`aic')
forvalues i = 1/`r' {
mat `aic'[1,`i'] = (-2*`ll'[1,`i'] + ///
2*`parms'[1,`i'])/`T'
mat `bic'[1,`i'] = (-2*`ll'[1,`i'] + ///
ln(`T')*`parms'[1,`i'])/`T'
mat `hqic'[1,`i'] = (-2*`ll'[1,`i'] + ///
2*ln(ln(`T'))*`parms'[1,`i'])/`T'
}
}
else {
scalar `aic' = (-2*`ll' + 2*`parms')/`T'
scalar `bic' = (-2*`ll' + ln(`T')*`parms')/`T'
scalar `hqic' = (-2*`ll' + 2*ln(ln(`T'))*`parms')/`T'
}
end
program define mkcns
syntax , rownames(string) ///
colnames(string) ///
cmat(name) ///
constraints(string) ///
[ ///
amat(name) ///
rmat(name) ///
transpose ///
]
foreach cns of local constraints {
constraint get `cns'
if r(defined) != 1 {
di as err "constraint `cns' not defined"
exit 498
}
}
tempname b v cur_est cur_samp C
if "`amat'" == "" {
tempname amat
}
if "`rmat'" == "" {
tempname rmat
}
local rows : word count `rownames'
local cols : word count `colnames'
mat `b' = J(`rows', `cols', .1)
mat rownames `b' = `rownames'
mat colnames `b' = `colnames'
if "`transpose'" != "" {
mat `b' = vec(`b'')'
}
else {
mat `b' = vec(`b')'
}
local names : colfullnames `b'
mat `v' = `b''*`b'
mat rownames `v' = `names'
mat colnames `v' = `names'
_estimates hold `cur_est', restore nullok varname(`cur_samp')
ereturn post `b' `v'
matrix makeCns `constraints'
matrix dispCns, r
matcproc `cmat' `amat' `rmat'
mat `rmat' = `rmat'[1...,1..colsof(`rmat')-1]
mat `amat' = `amat''
_estimates unhold `cur_est'
end
program define GetSWest
syntax , gmat(name) ///
hmat(name) ///
amat(name) ///
omega(name) ///
beta(name) ///
alpha(name) ///
s11(name) ///
s01(name) ///
s00(name) ///
tolerance(real) ///
ltolerance(real) ///
iter_n(name) ///
iterate(integer) ///
t(name) ///
k(integer) ///
converge(name) ///
[ ///
noLOg ///
btrace ///
toltrace ///
]
if "`log'" == "" {
di
}
tempname diff oldval vecpils ip1 omegai newval
tempname alpha0 beta0 omega0 mdiff tval
scalar `diff' = .
scalar `mdiff' = .
lcfunc , alpha(`alpha') ///
beta(`beta') ///
omega(`omega') ///
t(`t') ///
s00(`s00') ///
s01(`s01') ///
s11(`s11') ///
val(`oldval') ///
k(`k')
mat `vecpils' = vec((`s01'*inv(`s11'))')
mat `ip1' = I(rowsof(`beta'))
mat `alpha0' = `alpha'
mat `beta0' = `beta'
mat `omega0' = `omega'
Tolck , converge(`converge') fdiff(`diff') ///
mdiff(`mdiff') ftolvalue(`ltolerance') ///
btolvalue(`tolerance') iter_n(`iter_n') ///
iterate(`iterate')
while `converge' == 1 {
scalar `iter_n' = `iter_n' + 1
mat `omegai' = syminv(`omega')
GetBeta , hmat(`hmat') ///
alpha(`alpha') ///
omegai(`omegai') ///
s11(`s11') ///
vecpils(`vecpils') ///
ip1(`ip1') ///
beta(`beta') ///
amat(`amat')
GetAlpha , gmat(`gmat') ///
omegai(`omegai') ///
beta(`beta') ///
s11(`s11') ///
vecpils(`vecpils') ///
alpha(`alpha')
GetOmega , s00(`s00') ///
s01(`s01') ///
s11(`s11') ///
alpha(`alpha') ///
beta(`beta') ///
omega(`omega')
lcfunc , alpha(`alpha') ///
beta(`beta') ///
omega(`omega') ///
t(`t') ///
s00(`s00') ///
s01(`s01') ///
s11(`s11') ///
val(`newval') ///
k(`k')
scalar `tval' = mreldif(`alpha0',`alpha')
scalar `mdiff' = mreldif(`beta0',`beta')
scalar `mdiff' = cond( `tval' > `mdiff', `tval', `mdiff')
scalar `tval' = mreldif(`omega0',`omega')
scalar `mdiff' = cond( `tval' > `mdiff', `tval', `mdiff')
mat `alpha0' = `alpha'
mat `beta0' = `beta'
mat `omega0' = `omega'
if "`log'" == "" {
local iter = `iter_n'
local iter_d = int(log10(`iter'))
local iter_d2 = cond(5-`iter_d'> 0, 5-`iter_d',1)
local iter_sp : di "{space `iter_d2'}"
di as txt "Iteration `iter':`iter_sp'log likelihood = " as res `newval' %10.9g
}
scalar `diff' = reldif(`oldval',`newval')
if "`toltrace'" != "" {
di as txt "{col 5}The relative difference in log likelihood values " ///
"is " as res `diff' %8.7g
di as txt "{col 5}The relative difference in the coefficient " ///
"vectors is " as res `mdiff' %8.7g
}
if "`btrace'" != "" {
local mdisp
local rows = rowsof(`beta')
local cols = colsof(`beta')
di as txt "{col 14}beta"
forvalues i = 1/`rows' {
forvalues j = 1/`cols' {
local val : display %10.9g ///
`beta'[`i',`j']
local mdisp "`mdisp'`val' "
}
}
di as res "{p 13 13}`mdisp'{p_end}"
local mdisp
local rows = rowsof(`alpha')
local cols = colsof(`alpha')
di as txt "{col 14}alpha"
forvalues i = 1/`rows' {
forvalues j = 1/`cols' {
local val : display %10.9g ///
`alpha'[`i',`j']
local mdisp "`mdisp'`val' "
}
}
di as res "{p 13 13}`mdisp'{p_end}"
}
scalar `oldval' = `newval'
Tolck , converge(`converge') fdiff(`diff') ///
mdiff(`mdiff') ftolvalue(`ltolerance') ///
btolvalue(`tolerance') iter_n(`iter_n') ///
iterate(`iterate')
}
end
program define Tolck
syntax , converge(name) ///
fdiff(name) ///
iter_n(name) ///
iterate(integer) ///
ftolvalue(real) ///
btolvalue(real) ///
[ ///
mdiff(name) ///
]
if `iterate' == `iter_n' {
scalar `converge' = 430
exit
}
scalar `converge' = max( ///
cond(`fdiff' < `ftolvalue',0,1), ///
cond(`mdiff' < `btolvalue' ,0,1) )
end
program define LLval
syntax , alpha(name) ///
beta(name) ///
omega(name) ///
t(name) ///
val(name) ///
k(integer)
tempname pi omegai
mat `pi' = `alpha'*`beta''
scalar `val' = -.5*`t'*`k'*ln(2*_pi) - ///
.5*`t'*ln(abs(det(`omega'))) -.5*`t'*`k'
end
program define lcfunc
syntax , alpha(name) ///
beta(name) ///
omega(name) ///
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -