OPEN DATA "Sign6.xls"
CALENDAR(D) 2000:1:1
DATA(FORMAT=XLS,ORG=COLUMNS,COMPACT=AVERAGE) 2000:01:03 2002:09:26 DYS PIS RS DY PI R DE
*
system(model=varmodel)
variables DYS PIS RS DY PI R DE
lags 1 to 4
deterministic constant
end(system)
estimate(noprint)
dec vect[strings] vl(7)
compute vl=||'Gap US','CPI US','Interest Rate us',$
     'GAP vn','cpi vn','Interest Rate vn','Real Effective Exchange Rate'||
compute n1=100000
compute n2=100000
compute nkeep=1000
compute nvar=7
compute nstep=60
compute KMAX=1
* This is the standard setup for MC integration of an OLS VAR
*
dec symm s(7,7)
dec vect v1(7)      ;* For the unit vector on the 1st draw
dec vect v2(6)      ;* For the unit vector on the 2nd draw
dec vect v3(5)       ;*For the unit vector on the 3rd draw
dec vect v4(4)      ;* For the unit vector on the 4th draw
dec vect v5(3)      ;* For the unit vector on the 5th draw
dec vect v6(2)       ;*For the unit vector on the 6th draw
dec vect v(7)     ;* Working impulse vector

compute sxx    =%decomp(%xx)
compute svt    =%decomp(inv(%nobs*%sigma))
compute betaols=%modelgetcoeffs(varmodel)
compute ncoef  =%rows(sxx)
compute wishdof=%nobs-ncoef
dec rect ranc(ncoef,nvar)
*
* Most draws are going to get rejected. We allow for up to 1000
* good ones. The variable accept will count the number of accepted
* draws. GOODRESP will be a RECT(nsteps,nvar) at each accepted
* draw.
*
declare vect[rect] goodresp(1000)
declare vect[rect] goodrespa(1000)
declare vect[rect] goodrespb(1000)
declare vect[rect] goodrespc(1000)
declare vect[rect] goodrespd(1000)
declare vect[rect] goodrespe(1000)
declare vector ik a(nvar)
source forcedfactor.src
*
compute accept=0
infobox(action=define,progress,lower=1,upper=n1) 'Monte Carlo Integration'
do draws=1,n1
   *
   * Make a draw from the posterior for the VAR and compute its impulse
   * responses.
   *
   compute sigmad  =%ranwisharti(svt,wishdof)
   compute p       =%decomp(sigmad)
   compute ranc    =%ran(1.0)
   compute betau   =sxx*ranc*tr(p)
   compute betadraw=betaols+betau
   compute %modelsetcoeffs(varmodel,betadraw)
   *
   * This is changed to unit shocks rather than orthogonalized shocks.
   *
   impulse(noprint,model=varmodel,decomp=%identity(7),results=impulses,steps=nstep)
   *
   * Do the subdraws over the unit sphere. These give the weights on the
   * orthogonal components.
   *
   do subdraws=1,n2
   ************************************************
   * First Set of Restrictions - Domestic Demand
   ************************************************
      compute v1=%zeros(3,1)~~%ransphere(nvar-3)
      compute i1=p*v1
      do k=1,KMAX+1
          compute ik=%xt(impulses,k)*v1
          if ik(4)<0.or.ik(5)<0.or.ik(6)<0
             branch 105
      end do k
      *
      *
      @forcedfactor(force=column) sigmad i1 f
      compute v2=%zeros(3,1)~~%ransphere(nvar-4)
      compute i2=%xsubmat(f,1,7,2,7)*v2
      compute v2=inv(p)*i2
      *****************************************************
      *  Second Set of Restrictions - Domestic productivity
      *****************************************************
      do k=1,KMAX+1
         compute ik=%xt(impulses,k)*v2
         if ik(4)<0.or.ik(5)>0.or.ik(6)>0
            branch 105
      end do k
      *
      *
      @forcedfactor(force=column) sigmad i1~i2 f
      compute v3=%zeros(3,1)~~%ransphere(nvar-5)
      compute i3=%xsubmat(f,1,7,3,7)*v3
      compute v3=inv(p)*i3
      *****************************************************
      *  Third Set of Restrictions - Domestic monetary policy
      *****************************************************
      do k=1,KMAX+1
         compute ik=%xt(impulses,k)*v3
         if ik(4)>0.or.ik(5)>0.or.ik(6)<0
           branch 105
      end do k
      *
      *
      @forcedfactor(force=column) sigmad i1~i2~i3 f
      compute v4=%ransphere(nvar-3)
      compute i4=%xsubmat(f,1,7,4,7)*v4
      compute v4=inv(p)*i4
      *****************************************************
      *  Fourth Set of Restrictions - Foreign Demand
      *****************************************************
      do k=1,KMAX+1
         compute ik=%xt(impulses,k)*v4
         if ik(1)<0.or.ik(2)<0.or.ik(3)<0
            branch 105
      end do k
      *
      *
      @forcedfactor(force=column) sigmad i1~i2~i3~i4 f
      compute v5=%ransphere(nvar-4)
      compute i5=%xsubmat(f,1,7,5,7)*v5
      compute v5=inv(p)*i5
      *****************************************************
      *  Fifth Set of Restrictions - Foreign Productivity
      *****************************************************
      do k=1,KMAX+1
         compute ik=%xt(impulses,k)*v5
         if ik(1)<0.or.ik(2)>0.or.ik(3)>0
            branch 105
      end do k
      *
      *
      @forcedfactor(force=column) sigmad i1~i2~i3~i4~i5 f
      compute v6=%ransphere(nvar-5)
      compute i6=%xsubmat(f,1,7,6,7)*v6
      compute v6=inv(p)*i6
      *****************************************************
      *  Sixth Set of Restrictions - Foreign Monetary policy
      *****************************************************
      do k=1,KMAX+1
         compute ik=%xt(impulses,k)*v
         if ik(1)>0.or.ik(2)>0.or.ik(3)<0
            branch 105
      end do k
      *
      * Meets all restrictions
      *
      compute accept=accept+1
      dim goodresp(accept)(nstep,nvar)
      dim goodrespa(accept)(nstep,nvar)
      dim goodrespb(accept)(nstep,nvar)
      dim goodrespc(accept)(nstep,nvar)
      dim goodrespd(accept)(nstep,nvar)
      dim goodrespe(accept)(nstep,nvar)
      ewise goodresp(accept)(i,j)=(ik=%xt(impulses,i)*i1),ik(j)
      ewise goodrespa(accept)(i,j)=(ik=%xt(impulses,i)*i2),ik(j)
      ewise goodrespb(accept)(i,j)=(ik=%xt(impulses,i)*i3),ik(j)
      ewise goodrespc(accept)(i,j)=(ik=%xt(impulses,i)*i4),ik(j)
      ewise goodrespd(accept)(i,j)=(ik=%xt(impulses,i)*i5),ik(j)
      ewise goodrespe(accept)(i,j)=(ik=%xt(impulses,i)*i6),ik(j)
      if accept>=nkeep
         break
   :105
   end do subdraws
   if accept>=nkeep
      break
   infobox(current=draws)
end do draws
infobox(action=remove)
*
* Post-processing. Graph the mean of the responses along with the 16% and 84%-iles
*
clear upper lower resp
*
spgraph(vfields=3,hfields=3,hlabel='Impulse Responses with Pure-Sign Approach',subhea='VN')
do i=1,nvar
   compute minlower=maxupper=0.0
   smpl 1 accept
   do k=1,nstep
      set work = goodresp(t)(k,i)
      compute frac=%fractiles(work,||.16,.84||)
      compute lower(k)=frac(1)
      compute upper(k)=frac(2)
      compute resp(k)=%avg(work)
   end do k
*
   smpl 1 nstep
   graph(pattern,ticks,number=0,picture='##.##',header='Impulse Responses for '+vl(i)) 3
   # resp
   # upper / 2
   # lower / 2
end do i
*
spgraph(done)
