/* +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

Bivariate Decomposition of inflation and unumployment

Model:  Restricted Model in Table 1&2

This program generates Table 1&2 in Lee and Nelson, "Expectation Horizon 
and the Phillips Curve: The Solution to an Empirical Puzzle"
(forthcoming, Journal of Applied Econometrics).

written by Jaejoon Lee   Feb. 28. 2004 
+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ */


new;
library  optmum, pgraph;
optset;
_opgtol = 1/1000; 

format /m1 /rd 9,6;

load data[182,2] = c:\lee-nelson-data.txt;

@ "data" = 1957:Q1 - 2002:Q2  @

ggdata=data[1:182,.];						  

inf_gdpd=ggdata[.,1];
lhur = ggdata[.,2];

yy = lhur~inf_gdpd;  @ order is important! @

t=rows(yy); @182(57:1-2002:2)@

@ Maximum Likelihood Estimation @
START=21;  @ 5 yrs later from the beginning yr@

/*  @ # of parameter: 8 + 8 = 16 @
pr1= SV_UN;
pr2= SE_UN;
pr3= SV_INF;
pr4= SE_INF;
pr5 = Cov_ve_u;
pr6 = Cov_ve_i;
pr7 = Cov_v_ui;
pr8 = Cov_e_ui;

pr9= rho1;     @ need restriction for stationarity in TRANS @
pr10= rho2;
pr11 = a1;
pr12 = a2;
pr13= b1;
pr14 = b2;
pr15 = psi1;
pr16 = psi2;
*/

/*  prm_fnl    sd
0.001705  0.095909 
 0.251661  0.014269 
 0.926412  0.075914 
 0.199920  0.064598 
-0.000007  0.000497 
 0.185182  0.052178 
-0.000023  0.002490 
-0.050288  0.016964 
 1.605785  0.046948 
-0.644636  0.037694 
-1.702456  0.367493 
 0.991383  0.339969 
log(lik) = -103.173643 
a0 = -0.794021 
*/

@ initial value @
@prmtr_in = xout_rrr;@

prmtr_in = { 10.000009  4.854947  4.173607  1.609840 -0.000856  0.926284 -0.001474 -0.251540  4.073368  4.073368 -1.702456  0.991383  };
@ Better!!! 3rd w/ 0.001: { 9.999994  4.975130  1.356210  1.663815 -0.002410  0.906474 -0.019263 -0.250362  4.035047  4.035047 -1.666472  0.958992 };@
@ Good!!!  2nd w/ 0.01: {  9.999994  4.976352  1.432856  2.130522  0.022126  0.987299 -0.041340 -0.244095  3.876075  3.876075 -1.306586  0.777922  };@
@ 1st w/ 0.1tol: { 10 5 0 0 0 0 0 -0.5 0 0 0 0 }; @

prmtr_in = prmtr_in';


 {xout,fout,gout,cout}= optmum(&lik_fcn,PRMTR_IN);
                     @ prmtr estimates, -log lik value, Grandient, code@

prm_fnl=trans(xout);

"Calculating Hessian..... Please be patient!!!!";
                  hessn0=hessp(&lik_fcn,xout);
                  cov0=inv(hessn0);

grdn_fnl=gradfd(&TRANS,xout);
cov=grdn_fnl*cov0*grdn_fnl';
SD =sqrt(diag(cov)); @Standard errors of the estimated coefficients@

format /m1 /rd 9,6;
output file=c:\Lee&Nelson_r.out reset;

" ";;

"==FINAL OUTPUT================================================";
"initial values of prmtr(xout) is";
xout';
"==============================================================";
"likelihood value is ";; -fout;
"code";;cout;
"Estimated parameters are:";
prm_fnl';
"Standard errors of parameters are:";
sd';

OUTPUT OFF;

DATAf = filter(xout);

output file = c:\Lee&Nelson_Out_r.txt reset;
yy[start:t,1]~dataf[.,1:2]~yy[start:t,2]~dataf[.,3:4];
output off;

prm_fnl~sd;
"log(lik) = ";;-fout;
"a0 = ";;prm_fnl[8,1]/(prm_fnl[2,1]^2);

grdn_sva=gradfd(&TR_svar,prm_fnl);
cov_sva=grdn_sva*cov*grdn_sva';
SD_sva =sqrt(diag(cov_sva)); @Standard errors of the estimated SVAR coefficients@
prm_SVAR = tr_svar(prm_fnl);
tr_svar(prm_fnl)~sd_sva;

format /m1 /rd 9,6;
output file=c:\Lee&Nelson_r2.out reset;

" ";;
"==============================================================";
"Restricted SVAR in Table 2";
"Estimated parameters are:";
prm_SVAR';
"Standard errors of parameters are:";
sd_sva';
"==============================================================";

OUTPUT OFF;

XY(SEQA(1,1,ROWS(DATAf)),YY[START:T,1]~DATAf[.,1]);
XY(SEQA(1,1,ROWS(DATAf)),DATAf[.,2]~dataf[.,4]~zeros(rows(dataf),1));
XY(SEQA(1,1,ROWS(DATAf)),YY[start:t,2]~DATAf[.,3]);


@ END OF MAIN PROGRAM @
@========================================================================@
@========================================================================@

PROC LIK_FCN(PRMTR1);

     LOCAL SV,SE,F,H,Q,R,BETA_LL,P_LL,BETA_TL,P_TL,BETA_TT,P_TT,vt,ft, VAL,
     LIK_MAT,J_ITER;

	local rho1,rho2,vecpll,prmtr,mu,SW,d0,d1,d2,d3, cov_ve;
	local a0, a1, a2, sv_inf, se_inf, sv_un, se_un;
	local cov_ve_u, cov_ve_i, cov_v_ui, cov_e_ui;
	local b1, b2, psi1, psi2;	 

prmtr = trans(prmtr1);

     SV_UN=PRMTR[1,1];  @s.e. of the random walk component@
     SE_UN=PRMTR[2,1];  @s.e. of the AR component@

	sv_inf = prmtr[3,1];
	se_inf = prmtr[4,1];

	cov_ve_u = prmtr[5,1];
	cov_ve_i =prmtr[6,1];
	cov_v_ui = prmtr[7,1];
	cov_e_ui = prmtr[8,1];

     rho1=prmtr[9,1];         @ persistence of ue cycle @
     rho2=prmtr[10,1];         @ persistence of ue cycle @

	a1 = prmtr[11,1];     @ trade-off btw inf & ue cycles @
	a2 = prmtr[12,1];

	b1 = 0; @prmtr[13,1];@
	b2 = 0;  @prmtr[14,1];@

	psi1 = 0; @prmtr[15,1];@
	psi2 = 0;  @prmtr[16,1];@

      F=(1~0~0~0~0~0)|
	(0~rho1~rho2~0~b1~b2)|
        (0~1~0~0~0~0)|
	(0~0~0~1~0~0)|
        (0~a1~a2~0~psi1~psi2)|
	(0~0~0~0~1~0);

     H=(1~1~0~0~0~0)|
       (0~0~0~1~1~0);

     Q= ZEROS(6,6);

		Q[1,1]=SV_un^2; 
		Q[2,2]=Se_un^2; 
		Q[1,2]=cov_ve_u;		Q[2,1]=cov_ve_u;
		Q[4,4]=sv_inf^2;
		Q[5,5]=se_inf^2;
		Q[4,5]=cov_ve_i;		Q[5,4] = cov_ve_i;
		Q[1,4] = cov_v_ui;		Q[4,1] = cov_v_ui;
		Q[2,5] = cov_e_ui;		Q[5,2] = cov_e_ui;

     R= zeros(2,2);	

     BETA_LL=zeros(6,1);
     P_LL=EYE(6)*100;

     LIK_MAT=ZEROS(T,1);

J_ITER = 1;
DO UNTIL J_ITER>T;

      BETA_TL = F * BETA_LL ;
      P_TL = F * P_LL * F' + Q;

      vt=yy[j_iter,.]' - H * BETA_TL ; @prediction error@

      ft= H * P_TL * H' + R;       @variance of forecast error@


      BETA_TT= BETA_TL + P_TL * H' * inv(ft) * vt;
      P_TT= P_TL - P_TL * H' * inv(ft) * H * P_TL;

      LIK_MAT[J_ITER,1] =  0.5*(LN(2*pi*det(ft)) + vt'inv(ft)*vt);

      BETA_LL=BETA_TT;
      P_LL=P_TT;


J_ITER = J_ITER+1;
ENDO;

VAL = SUMC(LIK_MAT[START:T]);

RETP(VAL);
ENDP;


@>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>@

PROC FILTER(PRMTR1);

     LOCAL SV,SE,F,H,Q,R,BETA_LL,P_LL,BETA_TL,P_TL,BETA_TT,P_TT,
     vt,ft, VAL, LIK_MAT,J_ITER;

	local rho1,rho2,vecpll,prmtr,mu,SW,BETA_MAT,d0,d1,d2,d3,sv_un,se_un,
     cov_ve;

	local a0, a1, a2, sv_inf, se_inf, sv_un, se_un;
	local cov_ve_u, cov_ve_i, cov_v_ui, cov_e_ui;
	local b1, b2, psi1, psi2;	 

prmtr = trans(prmtr1);

     SV_UN=PRMTR[1,1];  @s.e. of the random walk component@
     SE_UN=PRMTR[2,1];  @s.e. of the AR component@

	sv_inf = prmtr[3,1];
	se_inf = prmtr[4,1];

	cov_ve_u = prmtr[5,1];
	cov_ve_i =prmtr[6,1];
	cov_v_ui = prmtr[7,1];
	cov_e_ui = prmtr[8,1];

     rho1=prmtr[9,1];         @ persistence of ue cycle @
     rho2=prmtr[10,1];         @ persistence of ue cycle @

	a1 = prmtr[11,1];     @ trade-off btw inf & ue cycles @
	a2 = prmtr[12,1];

	b1 = 0; @prmtr[13,1];@
	b2 = 0;  @prmtr[14,1];@

	psi1 = 0; @prmtr[15,1];@
	psi2 = 0;  @prmtr[16,1];@


      F=(1~0~0~0~0~0)|
	(0~rho1~rho2~0~b1~b2)|
        (0~1~0~0~0~0)|
	(0~0~0~1~0~0)|
        (0~a1~a2~0~psi1~psi2)|
	(0~0~0~0~1~0);

     H=(1~1~0~0~0~0)|
       (0~0~0~1~1~0);

     Q= ZEROS(6,6);

		Q[1,1]=SV_un^2; 
		Q[2,2]=Se_un^2; 
		Q[1,2]=cov_ve_u;		Q[2,1]=cov_ve_u;
		Q[4,4]=sv_inf^2;
		Q[5,5]=se_inf^2;
		Q[4,5]=cov_ve_i;		Q[5,4] = cov_ve_i;
		Q[1,4] = cov_v_ui;		Q[4,1] = cov_v_ui;
		Q[2,5] = cov_e_ui;		Q[5,2] = cov_e_ui;
	 

     BETA_MAT=ZEROS(T,4);

     R= zeros(2,2);	

     BETA_LL=zeros(6,1);
     P_LL=EYE(6)*100;


J_ITER = 1;
DO UNTIL J_ITER>T;

      BETA_TL = F * BETA_LL ;
      P_TL = F * P_LL * F' + Q;

      vt=yy[j_iter,.]' - H * BETA_TL ; @prediction error@

      ft= H * P_TL * H' + R;       @variance of forecast error@

      BETA_TT= BETA_TL + P_TL * H' * inv(ft) * vt;
      P_TT= P_TL - P_TL * H' * inv(ft) * H * P_TL;


BETA_MAT[J_ITER,.]=BETA_TT[1,1]~BETA_TT[2,1]~BETA_TT[4,1]~beta_tt[5,1];

      BETA_LL=BETA_TT;
      P_LL=P_TT;


J_ITER = J_ITER+1;
ENDO;


RETP(BETA_MAT[START:T,.]);
ENDP;


@==========================================@
PROC TRANS(c0); @ constraining values of reg. coeff.@
         local c1,d1,d2, dd1, dd2, p, varcov;

         c1=c0;
         c1[1:4,.]=exp(-c0[1:4,.]);

	@ stationary restriction for AR(2) UE_cyc coefficents cf. K&N p.15@

     d1=c0[9,1]./(1+abs(c0[9,1]));
     d2=c0[10,1]./(1+abs(c0[10,1]));

     c1[9,1]=d1+d2;
     c1[10,1]= -1* d1*d2 ;

/* constrain cov(n_t,e_t) to be pd using Cholesky factorization */

     p = zeros(6,6);
      p[1,1] = exp(-c0[1,1]);
      p[2,1] = c0[5,1];
      p[2,2] = exp(-c0[2,1]);

      p[4,4] = exp(-c0[3,1]);
      p[5,4] = c0[6,1];
      p[5,5] = exp(-c0[4,1]);	

      p[4,1] = c0[7,1];
      p[5,2] = c0[8,1];

      varcov = p'p;

      c1[1,1]=sqrt(varcov[1,1]);
      c1[2,1]=sqrt(varcov[2,2]);
      c1[3,1]=sqrt(varcov[4,4]);
      c1[4,1]=sqrt(varcov[5,5]);

      c1[5,1]=varcov[2,1];
      c1[6,1]=varcov[5,4];
      c1[7,1]=varcov[4,1];
      c1[8,1]=varcov[5,2]; 

retp(c1);
endp;

@========================================@
proc Tr_SVAR(prm0); @transform VAR estimation to SVAR representation@

local coef, cof_mat,sv_un, se_un, se_inf, sv_inf, cov_ve_u, cov_ve_i, cov_v_ui, cov_e_ui;
local rho1, rho2,a1, a2, b1, b2, psi1, psi2, b1_hat, b2_hat, se_hat;
local a0, a_0,a_1, a_2, se, sum_rho, sum_a, coef_;

@ define @
cof_mat = prm0|0|0|0|0;

SV_UN = cof_mat[1,1];
SE_UN= cof_mat[2,1];
SV_INF= cof_mat[3,1];
SE_INF= cof_mat[4,1];
Cov_ve_u= cof_mat[5,1];
Cov_ve_i= cof_mat[6,1];
Cov_v_ui= cof_mat[7,1];
Cov_e_ui= cof_mat[8,1];

rho1= cof_mat[9,1];
rho2= cof_mat[10,1];
a1= cof_mat[11,1];
a2= cof_mat[12,1];
b1= cof_mat[13,1];
b2= cof_mat[14,1];
psi1= cof_mat[15,1];
psi2= cof_mat[16,1];

B1_hat = (rho1~b1)|(a1~psi1);
B2_hat = (rho2~b2)|(a2~psi2);
SE_hat = (Se_Un^2~Cov_E_ui)|(Cov_E_ui~Se_inf^2);

A0 = Cov_e_ui/(SE_UN)^2;
A_0 =(1~0)|(-a0~1);

A_1 = A_0*B1_hat;
A_2= A_0*B2_hat;
SE = A_0*SE_hat*A_0';

@ coef_={SE_U SE_I rho1 rho2 a0 a1 a2 b1 b2 psi1 psi2 sum_rho sum_a};@
coef_ = zeros( 14,1);
coef_[1,1] = SE[1,1];
coef_[2,1] = SE[2,2];
coef_[3,1] =  rho1;
coef_[4,1] = rho2;
coef_[5,1] = a0;
coef_[6,1] = A_1[2,1]; @a1@
coef_[7,1] = A_2[2,1];  @a2@
coef_[8,1] = A_1[1,2];  @b1@
coef_[9,1] = A_2[1,2];  @b2@
coef_[10,1] = A_1[2,2];  @psi1@
coef_[11,1] = A_2[2,2];  @psi2@
coef_[12,1] = (rho1+rho2);
coef_[13,1] =  (a0+A_1[2,1]+A_2[2,1]);
coef_[14,1] = (1-rho1-rho2)*a0;  @ Phillips slope in 1-step fwd model@

retp(coef_);
endp;









