%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%   A .mod file for solving the DSGE model in Working Paper I (2012).    %
%                                                                        %
%   Written for Matlab by                                                %
%       ANDREW KEINSLEY                                                  %
%       DEPARTMENT OF ECONOMICS                                          %
%       415 SNOW HALL                                                    %
%       THE UNIVERSITY OF KANSAS                                         %
%       LAWRENCE, KS 66045                                               %
%       akeinsley@ku.edu                                                 %
%                                                                        %
%   This Version: June 13, 2012                                          %
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%                           Preamble                                     %
%               Defining Variables and Parameters                        %
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

var c, m_a, e_a, k, n, d, t, l, q, m, f, y, n_upsilon, m_s, h_s, h, h_g,
    h_b, h_d, h_k, h_upsilon, w, mm, r, r_upsilon, r_d, r_l, r_k, r_a,
    u_a, u_n, u_d, rr, xi, z, pi, upsilon_e, a, x_a, tau, 
    lambda_1, lambda_2, lambda_3, lambda_4, g;
    
varexo epsilon_e, epsilon_a, epsilon_z, epsilon_x, epsilon_r, epsilon_tau;

parameters chi, beta, upsilon_es, upsilon_n, rho_e, rho_a, rho_x,
           rho_r, rho_pi, rho_g, rho_tau, theta_y, theta_e, theta_m, eta,
           z_s, g_s, phi, phi_upsilon, phi_k, pi_s, x_e, x_n, x_as, nu, 
           alpha, tau_s, sigma_u, sigma_a, sigma_z, sigma_x,
           sigma_r, sigma_tau, omega, r_s;
           
chi         = 5.00;
beta        = 0.995;
upsilon_es  = 0.90;
upsilon_n   = 0.20;
rho_e       = 0.95;
rho_a       = 0.95;
rho_x       = 0.50;
rho_r       = 0.93;
rho_pi      = 0.11;
rho_g       = 0.09;
rho_tau     = 0.50;
theta_y     = 6.00;
theta_e     = 6.00;
theta_m     = 0.50;
eta         = 2.50;
z_s         = 1.005;
g_s         = 1.005;
phi         = 50;
phi_upsilon = 0.000005;
phi_k       = 0.00005;      % Will need to change this to cover both
pi_s        = 1.005;
x_e         = 0.71;         % Will need to change this to cover both
omega       = 1;            % Will need to change this to cover both
x_n         = 0.75;
x_as        = 65;
nu          = 0.25;
alpha       = 1.0;
tau_s       = 0.999375;
sigma_u     = 0.01;         % This is 'sigma_e' in the paper.
sigma_a     = 0.01;
sigma_z     = 0.01;
sigma_x     = log(2);
sigma_r     = 0.000625;
sigma_tau   = 0.0003125;
r_s         = log(1.0151);


%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%                               Model                                    %
%                   All equations in Dynare notation.                    %
%           Here all variables are now considered in log form.           %
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

model;

exp(h_s) = (1/chi)*(exp(upsilon_e+c-e_a))^chi;

upsilon_e = ((1-rho_e)*STEADY_STATE(upsilon_e))+(rho_e*upsilon_e(-1))+
            (epsilon_e);

a = (rho_a)*a(-1)+(epsilon_a);

exp(d) = exp(m(-1)-pi-z(-1))+exp(t)-exp(n)+exp(l);

exp(e_a) = (((x_e)^(1/theta_e)*(exp(k)^((theta_e-1)/theta_e)))+
            ((1-x_e)^(1/theta_e)*(exp(m_a)^((theta_e-1)/theta_e))))^
            (theta_e/(theta_e-1));

exp(m_a) = (((upsilon_n)^(1/theta_m)*(exp(n)^((theta_m-1)/theta_m)))+
            ((1-upsilon_n)^(1/theta_m)*(exp(d)^((theta_m-1)/theta_m))))^
            (theta_m/(theta_m-1));

exp(m) = exp(n)+exp(w+h)+exp(r_d+d)+omega*exp(k)+exp(f)-exp(r_l+l)-
            omega*exp(r_k(-1)+k(-1)-pi-z(-1))-exp(c);

exp(d) = (1-upsilon_n)*exp(m_a)*(exp(lambda_2)/(exp(lambda_1)-
            exp(r_d+lambda_3)))^theta_m;

exp(n) = upsilon_n*exp(m_a)*(exp(lambda_2)/(exp(lambda_1)-exp(lambda_3)))^
            theta_m;

exp(lambda_1) = exp(r_l+lambda_3);

exp(lambda_1-r) = beta*exp(lambda_1(+1)-pi(+1)-z);

exp(lambda_1+q) = exp(lambda_3+f)+beta*exp(lambda_1(+1)+q(+1));

eta*exp(a) = exp(lambda_3+w);

exp(lambda_3) = exp(a-c)*(1-eta*exp(upsilon_e+c-e_a)^chi);

exp(lambda_4+e_a) = eta*exp(a)*exp(upsilon_e+c-e_a)^chi;

exp(m_a) = (1-x_e)*exp(e_a)*exp(lambda_4-lambda_2)^theta_e;

exp(lambda_3) = beta*exp(lambda_1(+1)-pi(+1)-z);

omega*exp(lambda_3) = (beta*omega*exp(lambda_3(+1)+r_k-pi(+1)-z))-
                        (x_e^(1/theta_e)*exp(lambda_4)*(exp(e_a-k)^
                        (1/theta_e)));

exp(y) = exp(z+h_g);

z = STEADY_STATE(z)+epsilon_z;                            %% Equation 20 %%

exp(f) = (1-exp(w-z)-(phi/2)*((exp(pi)/pi_s)-1)^2)*exp(y);

(exp(lambda_3)*(1-theta_y+(theta_y*exp(w-z))-(phi*((exp(pi)/pi_s)-1)*
    exp(pi)/pi_s))*exp(y))-((beta*phi/pi_s)*exp(lambda_3(+1)+pi(+1)+y(+1))*
    ((exp(pi)/pi_s)-1)) = 0;

exp(x_a)*((x_n^(1/nu)*exp(n_upsilon)^((nu-1)/nu))+((1-x_n)^(1/nu)*
    exp(z+h_d)^((nu-1)/nu)))^(nu/(nu-1)) = exp(d);

x_a = (1-rho_x)*STEADY_STATE(x_a)+rho_x*x_a(-1)+epsilon_x;

exp(d) = exp(n_upsilon)+exp(l)+omega*exp(k);

exp(z+h_upsilon) = phi_upsilon*exp(n_upsilon);

exp(z+h_k) = phi_k*exp(k);

exp(n_upsilon) = ((exp(r_l)-exp(r_d))^nu)*exp((nu-1)*x_a+d)*x_n*
                    ((exp(r_l)-exp(r_upsilon)+(phi_upsilon*exp(w-z)))
                    ^(-nu));

exp(h_d) = ((exp(r_l)-exp(r_d))^nu)*(exp(x_a)^(nu-1))*exp(d)*(1-x_n)*
            exp((nu-1)*z-nu*w);

exp(r_k) = (exp(pi(+1))/beta)*(exp(r_l)+phi_k*exp(w-z));

exp(g) = exp(y+z-y(-1));

r-STEADY_STATE(r) = rho_r*(r(-1)-STEADY_STATE(r))+rho_pi*(pi(-1)-
                    STEADY_STATE(pi))+rho_g*(g(-1)-STEADY_STATE(g))
                    +epsilon_r;

r_upsilon = tau+alpha*r;

tau = (1-rho_tau)*STEADY_STATE(tau)+rho_tau*tau(-1)+(epsilon_tau);

exp(r)-exp(r_a) = ((upsilon_n*(exp(r)-1)^(1-theta_m))+((1-upsilon_n)*
                    (exp(r)-exp(r_d))^(1-theta_m)))^(1/(1-theta_m));

exp(u_a) = (exp(r)-exp(r_a))/exp(r);

exp(u_d) = (exp(r)-exp(r_d))/exp(r);

exp(u_n) = (exp(r)-1)/exp(r);

exp(m_s) = exp(n)+exp(d);

exp(xi) = (exp(c)-omega*exp(k))/exp(c);

exp(rr) = exp(n_upsilon-d);

exp(m) = exp(m(-1)-pi-z(-1))+exp(t)+(exp(r_upsilon)-1)*exp(n_upsilon);

exp(mm) = (exp(d)+exp(n))/(exp(n_upsilon)+exp(n));

exp(h) = exp(h_g)+exp(h_b);

exp(h_b) = exp(h_upsilon)+exp(h_d)+exp(h_k);

end;


%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%                     Initial Values/Steady States                       %
%              All steady state values are input in log form.            %
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

initval;

c           = log(0.33091631);
m_a         = log(1.08503850344);
e_a         = log(0.863668523921);
k           = log(0.006487102412);
n           = log(0.107466707728);
d           = log(1.16486903679);
t           = log(0.000906258388654);
l           = log(1.10725831132);
q           = log(10.8664601346);
m           = log(0.165816990844);
f           = log(0.0551527457159);
y           = log(0.330916474296);
n_upsilon   = log(0.0511236230649);
m_s         = log(1.27233574452);
h_s         = log(0.000975209552239);
h           = log(0.332091925024);
h_g         = log(0.329270123677);
h_b         = log(0.00282180134641);
h_d         = log(0.00282122425861);
h_k         = log(0.000000322741413532);
h_upsilon   = log(0.000000254346383407);
w           = log(0.8375);
mm          = log(8.02278258808);
r           = log(1.01510050251);
r_upsilon   = log(1.0144660647);
r_d         = log(1.01304411448);
r_l         = log(1.01510050251);
r_k         = log(1.02534460304);
r_a         = log(1.01139720164);
u_a         = log(0.00364821105521);
u_n         = log(0.0148758694092);
u_d         = log(0.00202579747513);
rr          = log(0.0438878718981);
xi          = log(0.980396546752);
lambda_1    = log(3.03015075377);
lambda_2    = log(0.0110546294788);
lambda_3    = log(2.98507462687);
lambda_4    = log(0.0141143495049);
g           = log(1.0050);
z           = log(1.0050);
pi          = log(1.0050);
a           = log(1.0000);
upsilon_e   = log(0.9000);
x_a         = log(65);
tau         = log(0.999375);
epsilon_e   = (0);
epsilon_x   = (0);
epsilon_a   = (0);
epsilon_z   = (0);
epsilon_r   = (0);
epsilon_tau = (0);

end;

resid;
steady(solve_algo = 2);

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%                            Shocks to the Model                         %
%           The standard deviations are established in the Preamble      %
%           so all we have to do is define the variances.                %
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

shocks;

var epsilon_e   = sigma_u^2;
var epsilon_a   = sigma_a^2;
var epsilon_z   = sigma_z^2;
var epsilon_x   = sigma_x^2;
var epsilon_r   = sigma_r^2;
var epsilon_tau = sigma_tau^2;

end;

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%                            Deriving Results                            %
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

stoch_simul(irf = 100);






