*
* Replication file for Dennis(2007), "Optimal Policy in Rational
* Expectations Models: New Solution Algorithms", Macroeconomic Dynamics,
* vol 11, 31-55.
*
* Gali-Monacelli model (simplified)
*
dec series y pi pic q r dr rStar piStar g u eps
*
dec real eta alpha beta sigma phi omegaAlpha kappaAlpha
dec real lambda nu
compute eta=1.0,alpha=0.4,beta=.99,theta=0.75,sigma=1.0,phi=3.0
*
* Simplications from deep parameters
*
compute omegaAlpha=1.0+alpha*(2-alpha)*(sigma*eta-1)
compute kappaAlpha=(1-theta)*(1-beta*theta)/theta*(phi+sigma/omegaAlpha)
*
frml(identity) f1 = pic-(pi+alpha/(1-alpha)*(q-q{1}))
frml(identity) f2 = pi -(beta*pi{-1}+kappaAlpha*y+u)
frml(identity) f3 = y  -(y{-1}-omegaAlpha/sigma*(r-pi{-1})+g)
frml(identity) f4 = q  -(q{-1}-(1-alpha)*(r-pi{-1}-rStar+piStar{-1})+(1-alpha)*eps)
frml(identity) f5 = dr -(r-r{1})
*
* These are exogenous
*
frml(identity) f6 = piStar
frml(identity) f7 = rStar
*
* These are shocks
*
frml           s1 = g
frml           s2 = u
frml           s3 = eps
*
* This is the control equation
*
frml(identity) c1 = r
*
* Partially solve model to its components. The control variable needs to
* be listed last on DSGE.
*
group control f1 f2 f3 f4 f5 f6 f7 s1 s2 s3 c1
dsge(model=control,analyze=output,form=second,comps=comps,controls=1) $
   pic y dr pi q piStar rStar g u eps r
*
* Compute controlled form
*
compute lambda=0.0,nu=1.0
compute rr=%diag(||1.0,lambda,nu||)
@dsgecontrol(beta=.99,r=rr) comps revised
*
* Compute backwards looking solution from the revised components
*
dsge(analyze=input,components=revised,form=second,$
        a=adlm,f=fdlm,z=zdlm)
@dlmirf(page=byvariable,a=adlm,f=fdlm,$
  variables=||"R","PIC","Y","DR","PI"||,shocks=||"G","U","EPS"||)
*
* Alternative way of handling control, using first difference.
*
frml(identity) c1 = dr
*
group control f1 f2 f3 f4 f5 f6 f7 s1 s2 s3 c1
dsge(model=control,analyze=output,form=second,comps=comps,controls=1) $
  pic y r pi q piStar rStar g u eps dr
compute rr=%diag(||1.0,lambda||)
compute qq=||nu||
@dsgecontrol(beta=.99,r=rr,q=qq) comps revised
dsge(analyze=input,components=revised,form=second,$
        a=adlm,f=fdlm,z=zdlm)
@dlmirf(page=byvariable,a=adlm,f=fdlm,$
  variables=||"DR","PIC","Y","R","PI"||,shocks=||"G","U","EPS"||)

