dec vector rescale(n)
ewise rescale(i)=%if(i==n,1.0/sqrt(sigmadraw(n,n)),1.0)
compute sigmadraw=%diag(rescale)*sigmadraw*%diag(rescale)* Initial estimation of VAR by OLS
system(model=qualVAR)
var dlgdp dlcpi spread ffr nber
det constant
lag 1 to 5
end(system)
estimate(model=qualVAR) 1955:3 ftime-1
comp fxx = %decomp(%xx)
comp fwish = %decomp(inv(%nobs*%sigma))
comp wishdof = %nobs-%nreg
comp betaols = %modelgetcoeffs(qualVAR)
comp nvar = %rows(%sigma)
comp ystarmu = 0.
comp ystarsigma = 0.1
* Estimation by MCMC method
comp draws = 1000
comp burn = 250
decl vec rescale(nvar)
decl rec Cdraw(nvar,nvar) Ddraw(nvar,nvar)
infobox(action=define,progress,lower=1,upper=draws) "Estimation by MCMC"
do draw=1,draws
infobox(action=modify,current=draw)
*
* Draw VAR coefficients
comp betadraw = betaols+%ranmvkron(fsigma,fxx)
*
* Draw and rescale VAR error variance
comp sigmadraw = %ranwisharti(fwish,wishdof)
ewise rescale(i) = %if(i==nvar,1.0/sqrt(sigmadraw(nvar,nvar)),1.0)
comp sigmadraw = %diag(rescale)*sigmadraw*%diag(rescale)
*
* Draw the latent "recession variable"
* Get pstarmu and pstarsigma
comp Cdraw = inv(sigmadraw)+...
* Draw ystar for main sample
set ystar 1955:3+5 ftime-1 = %if(nber(t),%rantruncate(ystarmu,ystarsigma,%na,0.0-ystarmu/ystarsigma),%rantruncate(ystarmu,ystarsigma,0.0-ystarmu/ystarsigma,%na))
* Draw ystar for first p=5 observations
* Save single draws
if draw>burn {
}
end do draw
infobox(action=remove)
*
* Gibbs sampling estimate of a dynamic "probit" model, where the latent
* index follows an AR(1) equation:
*
* ystar(t)=alpha+rho*ystar(t-1)+eps(t), with eps(t)~N(0,1) i.i.d.
*
cal(q) 1960
@nbercycles(up=expansion) 1960:1 2009:4
*
* Start with ystar of +/-1
*
set ystar = %if(expansion,1.0,-1.0)
*
* Start the sampler at the OLS estimates, given the starting ystars
*
linreg ystar
# constant ystar{1}
compute rho=%beta(2),alpha=%beta(1)
*
* Set up state space model for ystar
*
frml af = rho
frml zf = alpha
*
* (diffuse) prior for coefficients
*
compute bprior=%zeros(2,1)
compute hprior=%zeros(2,2)
*
compute nburn=1000
compute ndraws=1000
*
dec series[vect] bgibbs(ndraws)
gset bgibbs 1 ndraws = %zeros(2,1)
*
infobox(action=define,progress,lower=-nburn,upper=ndraws) "Gibbs Sampler: Dynamic Probit"
do draw=-nburn,ndraws
infobox(current=draw)
*
* Draw ystar(time) given all other ystar's. This is done by Gibbs
* sampling on
*
* ystar(t)=alpha+rho*ystar(t-1)+eps(t) (state equation)
* ystar(t)=ystar(t)+0 if t<>time (measurement equation)
*
* Kalman smoothing gives the conditional mean and variance for
* ystar(time).
*
do time=1960:1,2009:4
dlm(y=%if(t==time,%na,ystar),a=af,z=zf,c=1.0,$
sw=1.0,presample=ergodic,type=smooth) 1960:1 2009:4 xstates vstates
compute cmean=%scalar(xstates(time)),cstddev=sqrt(%scalar(vstates(time)))
*
* Given the conditional mean and the observed value for the 0-1
* variable, draw a truncated Normal for ystar.
*
compute ystar(time)=%if(expansion(time),%rantruncate(cmean,cstddev,0.0,%na),$
%rantruncate(cmean,cstddev,%na,0.0))
end do time
*
* Draw coefficients from the index equation given ystars
*
cmom
# constant ystar{1} ystar
compute bdraw=%ranmvpostcmom(%cmom,1.0,hprior,bprior)
compute alpha=bdraw(1),rho=bdraw(2)
*
* After burn-in, save draws
*
if draw>0
compute bgibbs(draw)=bdraw
end do draw
infobox(action=remove)
*
@mcmcpostproc(ndraws=ndraws,mean=bmean,stderrs=bstderrs,cd=bcd) bgibbs* Initial estimation of VAR by OLS
system(model=qualVAR)
var dlgdp dlcpi spread ffr ystar
det constant
lag 1 to 5
end(system)
estimate(model=qualVAR) 1955:3 ftime-1
comp fxx = %decomp(%xx)
comp fwish = %decomp(inv(%nobs*%sigma))
comp wishdof = %nobs-%nreg
comp betaols = %modelgetcoeffs(qualVAR)
comp nvar = %rows(%sigma)
comp sigmadraw = %ranwisharti(fwish,wishdof)
decl vec rescale(nvar)
ewise rescale(i)= %if(i==nvar,1.0/sqrt(sigmadraw(nvar,nvar)),1.0)
comp sigmadraw = %diag(rescale)*sigmadraw*%diag(rescale)
comp betadraw = betaols+%ranmvkron(sigmadraw,fxx)
* Estimation by MCMC method
comp draws = 100
comp burn = 50
decl ser[vec] betagibbs
decl ser[vec] ystargibbs
gset betagibbs 1 draws = %zeros(1,%nreg*5)
gset ystargibbs 1 draws = %zeros(1,ftime-55:3+1)
comp sw = %zeros(5,5)
comp sw(1,1) = 1.0
frml zf = betadraw(26,5)+betadraw(1,5)*dlgdp{1}+betadraw(2,5)*dlgdp{2}+betadraw(3,5)*dlgdp{3}+betadraw(4,5)*dlgdp{4}+betadraw(5,5)*dlgdp{5}+ $
betadraw(6,5)*dlcpi{1}+betadraw(7,5)*dlcpi{2}+betadraw(8,5)*dlcpi{3}+betadraw(9,5)*dlcpi{4}+betadraw(10,5)*dlcpi{5}+ $
betadraw(11,5)*spread{1}+betadraw(12,5)*spread{2}+betadraw(13,5)*spread{3}+betadraw(14,5)*spread{4}+betadraw(15,5)*spread{5}+ $
betadraw(16,5)*ffr{1}+betadraw(17,5)*ffr{2}+betadraw(18,5)*ffr{3}+betadraw(19,5)*ffr{4}+betadraw(20,5)*ffr{5}
infobox(action=define,progress,lower=-burn,upper=draws) "Estimation by MCMC"
do draw=-burn,draws
infobox(action=modify,current=draw)
*
* Re-estimate VAR given the new estimates for ystar
estimate(noprint,model=qualVAR) 1955:3 ftime-1
comp fxx = %decomp(%xx)
comp fwish = %decomp(inv(%nobs*%sigma))
*
* Get VAR coefficients
comp betadraw = %modelgetcoeffs(qualVAR)+%ranmvkron(sigmadraw,fxx)
*
* Get and rescale VAR error variance
comp sigmadraw = %ranwisharti(fwish,wishdof)
ewise rescale(i) = %if(i==nvar,1.0/sqrt(sigmadraw(nvar,nvar)),1.0)
comp sigmadraw = %diag(rescale)*sigmadraw*%diag(rescale)
*
* Draw the latent "recession variable"
do time=1955:3,ftime-1
dlm(y=%if(t==time,%na,ystar), $
a=||betadraw(21,5),betadraw(22,5),betadraw(23,5),betadraw(24,5),betadraw(25,5)||~~(%identity(4)~%zeros(4,1)), $
z=zf~~%zeros(4,1), $
c=1.0~~%zeros(4,1), $
sw=sw, $
presample=ergodic,type=smooth) 1955:3 ftime-1 xstates vstates
*
comp cmean = xstates(time)(1)
comp cstddev = sqrt(%scalar(vstates(time)(1,1)))
compute ystar(time) = %if(nber(time),%rantruncate(cmean,cstddev,%na,0.0),%rantruncate(cmean,cstddev,0.0,%na))
end do time
disp draw @+3 betadraw(1,1) sigmadraw(1,1) ystar(2008:4)
* Save single draws
if draw>0 {
comp betagibbs(draw) = %vec(betadraw)
ewise ystargibbs(draw)(i) = ystar(55:3+i-1)
}
end do draw
infobox(action=remove)
* Evaluate the draws from the Gibbs sampler
@mcmcpostproc(ndraws=draws,mean=ystaravg,stderrs=ystarstderrs) ystargibbs
@mcmcpostproc(ndraws=draws,mean=betaavg,stderrs=betastderrs) betagibbs
set recindic 55:3 ftime-1 = ystaravg(t-55:3+1)
graph(shad=nber) 1; # recindic
frml zf = betadraw(26,5)+betadraw(1,5)*dlgdp{1}+betadraw(2,5)*dlgdp{2}+betadraw(3,5)*dlgdp{3}+betadraw(4,5)*dlgdp{4}+betadraw(5,5)*dlgdp{5}+ $
betadraw(6,5)*dlcpi{1}+betadraw(7,5)*dlcpi{2}+betadraw(8,5)*dlcpi{3}+betadraw(9,5)*dlcpi{4}+betadraw(10,5)*dlcpi{5}+ $
betadraw(11,5)*spread{1}+betadraw(12,5)*spread{2}+betadraw(13,5)*spread{3}+betadraw(14,5)*spread{4}+betadraw(15,5)*spread{5}+ $
betadraw(16,5)*ffr{1}+betadraw(17,5)*ffr{2}+betadraw(18,5)*ffr{3}+betadraw(19,5)*ffr{4}+betadraw(20,5)*ffr{5}
equation fixedvars *
# constant dlgdp{1 to 5} dlcpi{1 to 5} ...dec vect probzco(21)
ewise probzco(i)=%if(i==1,betadraw(26,5),betadraw(i-1,5))FRML ZF = %dot(probzco,%eqnxvector(fixedvars,t))jonasdovern wrote:Looks much simpler; thanks. But would probzco be re-evaluated during each Gibbs iteration based on the new betadraw in this case?
do time=1960:1,2009:4
dlm(y=%if(t==time,%na,ystar),a=af,z=zf,c=1.0,$
sw=1.0,presample=ergodic,type=smooth) 1960:1 2009:4 xstates vstates
compute cmean=%scalar(xstates(time)),cstddev=sqrt(%scalar(vstates(time)))
*
* Given the conditional mean and the observed value for the 0-1
* variable, draw a truncated Normal for ystar.
*
compute ystar(time)=%if(expansion(time),%rantruncate(cmean,cstddev,0.0,%na),$
%rantruncate(cmean,cstddev,%na,0.0))
compute ystarmean(time)=cmean
end do time
statistics(noprint) ystarmean 1960:1 2009:4
set ystarmean 1960:1 2009:4 = ystarmean(t)/sqrt(%VARIANCE)
set recprob 1960:1 2009:4 = %cdf(ystarmean(t))
Return to VARs (Vector Autoregression Models)
Users browsing this forum: No registered users and 1 guest