Merge pull request #696 from JohannesPfeifer/Ramsey_steady_state

Bugfix Ramsey steady state with steady state files
time-shift
MichelJuillard 2014-09-08 21:56:13 +02:00
commit 5e8489ac45
13 changed files with 419 additions and 38 deletions

View File

@ -36,6 +36,11 @@ function []=display_problematic_vars_Jacobian(problemrow,problemcol,M_,x,type,ca
if nargin<6
caller_string='';
end
aux_vars_type = [M_.aux_vars.type];
aux_eq_nbr = max(find(aux_vars_type == 6));
if isempty(aux_eq_nbr)
aux_eq_nbr=0;
end
if strcmp(type,'dynamic')
for ii=1:length(problemrow)
[var_row,var_index]=find(M_.lead_lag_incidence==problemcol(ii));
@ -47,10 +52,33 @@ if strcmp(type,'dynamic')
type_string='lead of';
end
if var_index<=M_.orig_endo_nbr
fprintf('Derivative of Equation %d with respect to %s Variable %s (initial value of %s: %g) \n',problemrow(ii),type_string,deblank(M_.endo_names(var_index,:)),deblank(M_.endo_names(var_index,:)),x(var_index))
if problemrow(ii)<=aux_eq_nbr
eq_nbr=problemrow(ii);
fprintf('Derivative of Auxiliary Equation %d with respect to %s Variable %s (initial value of %s: %g) \n',eq_nbr,type_string,deblank(M_.endo_names(var_index,:)),deblank(M_.endo_names(var_index,:)),x(var_index))
else
eq_nbr=problemrow(ii)-aux_eq_nbr;
fprintf('Derivative of Equation %d with respect to %s Variable %s (initial value of %s: %g) \n',eq_nbr,type_string,deblank(M_.endo_names(var_index,:)),deblank(M_.endo_names(var_index,:)),x(var_index))
end
else %auxiliary vars
orig_var_index=M_.aux_vars(1,var_index-M_.orig_endo_nbr).orig_index;
fprintf('Derivative of Equation %d with respect to %s Variable %s (initial value of %s: %g) \n',problemrow(ii),type_string,deblank(M_.endo_names(orig_var_index,:)),deblank(M_.endo_names(orig_var_index,:)),x(orig_var_index))
if M_.aux_vars(1,problemcol(ii)-M_.orig_endo_nbr).type ==6 %Ramsey Lagrange Multiplier
if problemrow(ii)<=aux_eq_nbr
eq_nbr=problemrow(ii);
fprintf('Derivative of Auxiliary Equation %d with respect to %s of Langrange multiplier of equation %s (initial value: %g) \n',eq_nbr,type_string,M_.aux_vars(1,problemcol(ii)-M_.orig_endo_nbr).eq_nbr,x(problemcol(ii)))
else
eq_nbr=problemrow(ii)-aux_eq_nbr;
fprintf('Derivative of Equation %d with respect to %s of Langrange multiplier of equation %s (initial value: %g) \n',eq_nbr,type_string,M_.aux_vars(1,problemcol(ii)-M_.orig_endo_nbr).eq_nbr,x(problemcol(ii)))
end
else
if problemrow(ii)<=aux_eq_nbr
eq_nbr=problemrow(ii);
orig_var_index=M_.aux_vars(1,var_index-M_.orig_endo_nbr).orig_index;
fprintf('Derivative of Auxiliary Equation %d with respect to %s Variable %s (initial value of %s: %g) \n',eq_nbr,type_string,deblank(M_.endo_names(orig_var_index,:)),deblank(M_.endo_names(orig_var_index,:)),x(orig_var_index))
else
eq_nbr=problemrow(ii)-aux_eq_nbr;
orig_var_index=M_.aux_vars(1,var_index-M_.orig_endo_nbr).orig_index;
fprintf('Derivative of Equation %d with respect to %s Variable %s (initial value of %s: %g) \n',eq_nbr,type_string,deblank(M_.endo_names(orig_var_index,:)),deblank(M_.endo_names(orig_var_index,:)),x(orig_var_index))
end
end
end
end
fprintf('\n%s The problem most often occurs, because a variable with\n',caller_string)
@ -59,10 +87,33 @@ if strcmp(type,'dynamic')
elseif strcmp(type,'static')
for ii=1:length(problemrow)
if problemcol(ii)<=M_.orig_endo_nbr
fprintf('Derivative of Equation %d with respect to Variable %s (initial value of %s: %g) \n',problemrow(ii),deblank(M_.endo_names(problemcol(ii),:)),deblank(M_.endo_names(problemcol(ii),:)),x(problemcol(ii)))
if problemrow(ii)<=aux_eq_nbr
eq_nbr=problemrow(ii);
fprintf('Derivative of Auxiliary Equation %d with respect to Variable %s (initial value of %s: %g) \n',eq_nbr,deblank(M_.endo_names(problemcol(ii),:)),deblank(M_.endo_names(problemcol(ii),:)),x(problemcol(ii)))
else
eq_nbr=problemrow(ii)-aux_eq_nbr;
fprintf('Derivative of Equation %d with respect to Variable %s (initial value of %s: %g) \n',eq_nbr,deblank(M_.endo_names(problemcol(ii),:)),deblank(M_.endo_names(problemcol(ii),:)),x(problemcol(ii)))
end
else %auxiliary vars
orig_var_index=M_.aux_vars(1,problemcol(ii)-M_.orig_endo_nbr).orig_index;
fprintf('Derivative of Equation %d with respect to Variable %s (initial value of %s: %g) \n',problemrow(ii),deblank(M_.endo_names(orig_var_index,:)),deblank(M_.endo_names(orig_var_index,:)),x(problemcol(ii)))
if M_.aux_vars(1,problemcol(ii)-M_.orig_endo_nbr).type ==6 %Ramsey Lagrange Multiplier
if problemrow(ii)<=aux_eq_nbr
eq_nbr=problemrow(ii);
fprintf('Derivative of Auxiliary Equation %s with respect to Lagrange multiplier of equation %d (initial value: %g) \n',eq_nbr,M_.aux_vars(1,problemcol(ii)-M_.orig_endo_nbr).eq_nbr,x(problemcol(ii)))
else
eq_nbr=problemrow(ii)-aux_eq_nbr;
fprintf('Derivative of Equation %s with respect to Lagrange multiplier of equation %d (initial value: %g) \n',eq_nbr,M_.aux_vars(1,problemcol(ii)-M_.orig_endo_nbr).eq_nbr,x(problemcol(ii)))
end
else
if problemrow(ii)<=aux_eq_nbr
eq_nbr=problemrow(ii);
orig_var_index=M_.aux_vars(1,problemcol(ii)-M_.orig_endo_nbr).orig_index;
fprintf('Derivative of Auxiliary Equation %d with respect to Variable %s (initial value of %s: %g) \n',eq_nbr,deblank(M_.endo_names(orig_var_index,:)),deblank(M_.endo_names(orig_var_index,:)),x(problemcol(ii)))
else
eq_nbr=problemrow(ii)-aux_eq_nbr;
orig_var_index=M_.aux_vars(1,problemcol(ii)-M_.orig_endo_nbr).orig_index;
fprintf('Derivative of Equation %d with respect to Variable %s (initial value of %s: %g) \n',eq_nbr,deblank(M_.endo_names(orig_var_index,:)),deblank(M_.endo_names(orig_var_index,:)),x(problemcol(ii)))
end
end
end
end
fprintf('\n%s The problem most often occurs, because a variable with\n',caller_string)

View File

@ -14,7 +14,7 @@ function [steady_state,params,check] = dyn_ramsey_static(x,M,options_,oo)
% SPECIAL REQUIREMENTS
% none
% Copyright (C) 2003-2012 Dynare Team
% Copyright (C) 2003-2014 Dynare Team
%
% This file is part of Dynare.
%
@ -32,20 +32,18 @@ function [steady_state,params,check] = dyn_ramsey_static(x,M,options_,oo)
% along with Dynare. If not, see <http://www.gnu.org/licenses/>.
steady_state = [];
params = M.params;
check = 0;
options_.steadystate.nocheck = 1;
options_.steadystate.nocheck = 1; %disable checking because Lagrange multipliers are not accounted for in evaluate_steady_state_file
% dyn_ramsey_static_1 is a subfunction
nl_func = @(x) dyn_ramsey_static_1(x,M,options_,oo);
% check_static_model is a subfunction
if check_static_model(oo.steady_state,M,options_,oo)
if check_static_model(oo.steady_state,M,options_,oo) && ~options_.steadystate_flag
steady_state = oo.steady_state;
return
elseif options_.steadystate_flag
k_inst = [];
instruments = options_.instruments;
inst_nbr = size(options_.instruments,1);
for i = 1:inst_nbr
k_inst = [k_inst; strmatch(options_.instruments(i,:), ...
@ -54,16 +52,16 @@ elseif options_.steadystate_flag
if inst_nbr == 1
inst_val = csolve(nl_func,oo.steady_state(k_inst),'',options_.solve_tolf,100);
else
[inst_val,info1] = dynare_solve(nl_func,ys(k_inst),0);
[inst_val,check] = dynare_solve(nl_func,ys(k_inst),0);
end
ys(k_inst) = inst_val;
exo_ss = [oo.exo_steady_state oo.exo_det_steady_state];
[xx,params,check] = evaluate_steady_state_file(ys,exo_ss,M,options_);
[junk,jun,steady_state] = nl_func(inst_val);
[junk,junk,steady_state] = nl_func(inst_val);
else
n_var = M.orig_endo_nbr;
xx = oo.steady_state(1:n_var);
[xx,info1] = dynare_solve(nl_func,xx,0);
[xx,check] = dynare_solve(nl_func,xx,0);
[junk,junk,steady_state] = nl_func(xx);
end
@ -78,24 +76,14 @@ mult = [];
params = M.params;
endo_nbr = M.endo_nbr;
endo_names = M.endo_names;
exo_nbr = M.exo_nbr;
orig_endo_nbr = M.orig_endo_nbr;
aux_vars_type = [M.aux_vars.type];
orig_endo_aux_nbr = orig_endo_nbr + min(find(aux_vars_type == 6)) - 1;
orig_eq_nbr = M.orig_eq_nbr;
inst_nbr = orig_endo_aux_nbr - orig_eq_nbr;
% indices of Lagrange multipliers
i_mult = [orig_endo_aux_nbr+(1:orig_eq_nbr)]';
fname = M.fname;
max_lead = M.maximum_lead;
max_lag = M.maximum_lag;
% indices of all endogenous variables
i_endo = [1:endo_nbr]';
% indices of endogenous variable except instruments
% i_inst = M.instruments;
% lead_lag incidence matrix
i_lag = M.lead_lag_incidence;
if options_.steadystate_flag
k_inst = [];
@ -112,7 +100,7 @@ if options_.steadystate_flag
end
xx = zeros(endo_nbr,1);
xx(1:length(x)) = x;
xx(1:M.orig_endo_nbr) = x(1:M.orig_endo_nbr); %take care of steady state file that will also return multipliers
% setting steady state of auxiliary variables
% that depends on original endogenous variables
if any([M.aux_vars.type] ~= 6)
@ -130,7 +118,6 @@ end
% value and Jacobian of objective function
ex = zeros(1,M.exo_nbr);
[U,Uy,Uyy] = feval([fname '_objective_static'],x,ex, params);
Uy = Uy';
Uyy = reshape(Uyy,endo_nbr,endo_nbr);
% set multipliers and auxiliary variables that

View File

@ -52,7 +52,119 @@ function [ys,params,info] = evaluate_steady_state(ys_init,M,options,oo,steadysta
end
if options.ramsey_policy
[ys,params] = dyn_ramsey_static(ys_init,M,options,oo);
if steadystate_flag
% explicit steady state file
[ys,params,info] = evaluate_steady_state_file(ys_init,exo_ss,M, ...
options);
%test whether it solves model conditional on the instruments
[resids] = evaluate_static_model(ys,exo_ss,params,M,options);
n_multipliers=M.endo_nbr-M.orig_endo_nbr;
nan_indices=find(isnan(resids(n_multipliers+1:end)));
if ~isempty(nan_indices)
fprintf('\nevaluate_steady_state: The steady state file computation for the Ramsey problem resulted in NaNs.\n')
fprintf('evaluate_steady_state: The steady state was computed conditional on the following initial instrument values: \n')
for ii = 1:size(options.instruments,1);
fprintf('\t %s \t %f \n',options.instruments(ii,:),ys_init(strmatch(options.instruments(ii,:),M.endo_names,'exact')))
end
fprintf('evaluate_steady_state: The problem occured in the following equations: \n')
fprintf('\t Equation(s): ')
for ii=1:length(nan_indices)
fprintf('%d, ',nan_indices(ii));
end
skipline();
fprintf('evaluate_steady_state: If those initial values are not admissable, change them using an initval-block.\n')
skipline(2);
check=1;
info(1) = 84;
info(2) = resids'*resids;
return;
end
if max(abs(resids(n_multipliers+1:end))) > options.dynatol.f %does it solve for all variables except for the Lagrange multipliers
fprintf('\nevaluate_steady_state: The steady state file does not solve the steady state for the Ramsey problem.\n')
fprintf('evaluate_steady_state: Conditional on the following instrument values: \n')
for ii = 1:size(options.instruments,1);
fprintf('\t %s \t %f \n',options.instruments(ii,:),ys_init(strmatch(options.instruments(ii,:),M.endo_names,'exact')))
end
fprintf('evaluate_steady_state: the following equations have non-zero residuals: \n')
for ii=n_multipliers+1:M.endo_nbr
if abs(resids(ii)) > options.dynatol.f/100
fprintf('\t Equation number %d: %f\n',ii-n_multipliers, resids(ii))
end
end
skipline(2);
info(1) = 85;
info(2) = resids'*resids;
return;
end
end
%either if no steady state file or steady state file without problems
[ys,params,info] = dyn_ramsey_static(ys_init,M,options,oo);
if info
info=81;%case should not happen
return;
end
%check whether steady state really solves the model
[resids] = evaluate_static_model(ys,exo_ss,params,M,options);
n_multipliers=M.endo_nbr-M.orig_endo_nbr;
nan_indices_multiplier=find(isnan(resids(1:n_multipliers)));
nan_indices=find(isnan(resids(n_multipliers+1:end)));
if ~isempty(nan_indices)
fprintf('\nevaluate_steady_state: The steady state computation for the Ramsey problem resulted in NaNs.\n')
fprintf('evaluate_steady_state: The steady state computation resulted in the following instrument values: \n')
for i = 1:size(options.instruments,1);
fprintf('\t %s \t %f \n',options.instruments(i,:),ys(strmatch(options.instruments(i,:),M.endo_names,'exact')))
end
fprintf('evaluate_steady_state: The problem occured in the following equations: \n')
fprintf('\t Equation(s): ')
for ii=1:length(nan_indices)
fprintf('%d, ',nan_indices(ii));
end
skipline();
info(1) = 82;
return;
end
if ~isempty(nan_indices_multiplier)
fprintf('\nevaluate_steady_state: The steady state computation for the Ramsey problem resulted in NaNs in the auxiliary equations.\n')
fprintf('evaluate_steady_state: The steady state computation resulted in the following instrument values: \n')
for i = 1:size(options.instruments,1);
fprintf('\t %s \t %f \n',options.instruments(i,:),ys(strmatch(options.instruments(i,:),M.endo_names,'exact')))
end
fprintf('evaluate_steady_state: The problem occured in the following equations: \n')
fprintf('\t Auxiliary equation(s): ')
for ii=1:length(nan_indices_multiplier)
fprintf('%d, ',nan_indices_multiplier(ii));
end
skipline();
info(1) = 83;
return;
end
if max(abs(resids)) > options.dynatol.f %does it solve for all variables including the auxiliary ones
fprintf('\nevaluate_steady_state: The steady state for the Ramsey problem could not be computed.\n')
fprintf('evaluate_steady_state: The steady state computation stopped with the following instrument values:: \n')
for i = 1:size(options.instruments,1);
fprintf('\t %s \t %f \n',options.instruments(i,:),ys_init(strmatch(options.instruments(i,:),M.endo_names,'exact')))
end
fprintf('evaluate_steady_state: The following equations have non-zero residuals: \n')
for ii=1:n_multipliers
if abs(resids(ii)) > options.dynatol.f/100
fprintf('\t Auxiliary Ramsey equation number %d: %f\n',ii, resids(ii))
end
end
for ii=n_multipliers+1:M.endo_nbr
if abs(resids(ii)) > options.dynatol.f/100
fprintf('\t Equation number %d: %f\n',ii-n_multipliers, resids(ii))
end
end
skipline(2);
info(1) = 81;
info(2) = resids'*resids;
return;
end
elseif steadystate_flag
% explicit steady state file
[ys,params,info] = evaluate_steady_state_file(ys_init,exo_ss,M, ...
@ -109,13 +221,8 @@ function [ys,params,info] = evaluate_steady_state(ys_init,M,options,oo,steadysta
end
if check
if options.steadystate_flag
info(1)= 19;
resid = check1 ;
else
info(1)= 20;
resid = evaluate_static_model(ys_init,exo_ss,params,M,options);
end
info(1)= 20;
resid = evaluate_static_model(ys_init,exo_ss,params,M,options);
info(2) = resid'*resid ;
if isnan(info(2))
info(1)=22;
@ -161,3 +268,5 @@ function [ys,params,info] = evaluate_steady_state(ys_init,M,options,oo,steadysta
return
end

View File

@ -120,6 +120,18 @@ if ~noprint
case 72
error(['Calibrated covariance of the measurement errors implies correlation larger than +-1.']);
% Aim Code Conversions by convertAimCodeToInfo.m
case 81
error(['Ramsey: The solution to the static first order conditions for optimal policy could not be found. Either the model' ...
' doesn''t have a steady state, there are an infinity of steady states, ' ...
' or the guess values are too far from the solution']);
case 82
error(['Ramsey: The steady state computation resulted in NaN in the static first order conditions for optimal policy']);
case 83
error(['Ramsey: The steady state computation resulted in NaN in the auxiliary equations for optimal policy']);
case 84
error(['Ramsey: The steady state file computation for the Ramsey problem resulted in NaNs at the initial values of the instruments']);
case 85
error(['Ramsey: The steady state file does not solve the static first order conditions conditional on the instruments.']);
case 102
error('Aim: roots not correctly computed by real_schur');
case 103

View File

@ -1523,7 +1523,8 @@ DynamicModel::writeDynamicMFile(const string &dynamic_basename) const
<< "%" << endl
<< "% Outputs:" << endl
<< "% residual [M_.endo_nbr by 1] double vector of residuals of the dynamic model equations in order of " << endl
<< "% declaration of the equations" << endl
<< "% declaration of the equations." << endl
<< "% Dynare may prepend auxiliary equations, see M_.aux_vars" << endl
<< "% g1 [M_.endo_nbr by #dynamic variables] double Jacobian matrix of the dynamic model equations;" << endl
<< "% rows: equations in order of declaration" << endl
<< "% columns: variables in order stored in M_.lead_lag_incidence" << endl

View File

@ -1159,7 +1159,8 @@ StaticModel::writeStaticMFile(const string &func_name) const
<< "%" << endl
<< "% Outputs:" << endl
<< "% residual [M_.endo_nbr by 1] double vector of residuals of the static model equations " << endl
<< "% in order of declaration of the equations" << endl
<< "% in order of declaration of the equations." << endl
<< "% Dynare may prepend auxiliary equations, see M_.aux_vars" << endl
<< "% g1 [M_.endo_nbr by M_.endo_nbr] double Jacobian matrix of the static model equations;" << endl
<< "% columns: variables in declaration order" << endl
<< "% rows: equations in order of declaration" << endl

View File

@ -26,6 +26,9 @@ MODFILES = \
optimal_policy/nk_ramsey_expectation.mod \
optimal_policy/nk_ramsey_expectation_a.mod \
optimal_policy/mult_elimination_test.mod \
optimal_policy/Ramsey/ramsey_ex_initval.mod \
optimal_policy/Ramsey/ramsey_ex.mod \
optimal_policy/Ramsey/ramsey_ex_initval_AR2.mod \
discretionary_policy/dennis_1.mod \
ramst_initval_file.mod \
ramst_normcdf_and_friends.mod \
@ -184,7 +187,8 @@ MODFILES = \
reporting/example1.mod
XFAIL_MODFILES = ramst_xfail.mod \
estim_param_in_shock_value.mod
estim_param_in_shock_value.mod \
optimal_policy/Ramsey/ramsey_ex_wrong_ss_file.mod \
# Dependencies
example1_use_dll.m.trs: example1.m.trs
@ -346,7 +350,9 @@ EXTRA_DIST = \
filter_step_ahead/fs2000_filter_step_ahead_bayesian_steadystate.m \
filter_step_ahead/fs2000_filter_step_ahead_ML_steadystate.m \
loglinear/results_exp.mat \
smoother2histval/fsdat_simul.m
smoother2histval/fsdat_simul.m \
optimal_policy/Ramsey/find_c.m \
optimal_policy/Ramsey/oo_ramsey_policy_initval.mat \
TARGETS =

View File

@ -0,0 +1,8 @@
function c = find_c(c0,pai,beta,epsilon,phi,gamma,omega)
c = csolve(@nk_ss,c0,[],1e-8,100,pai,beta,epsilon,phi,gamma,omega);
end
function r = nk_ss(c,pai,beta,epsilon,phi,gamma,omega)
r = pai*(pai-1)/c - beta*pai*(pai-1)/c-epsilon*phi*(c+(omega/2)*(pai-1)^2)^(gamma+1)/omega +(c+(omega/2)*(pai-1)^2)*(epsilon-1)/(omega*c);
end

View File

@ -0,0 +1,63 @@
/* Mod file tests the correctness of the Ramsey command when used together with a steady state file by
* - checking whether the results coincide with the ones when used with an initval block
* - checking whether between stoch_simul and ramsey_planner are consistent
* The example is taken from Juillard, Michel (2011): User manual for optimal policy package,
* MONFISPOL FP7 project SSH-225149, Deliverable 1.1.2
*/
var pai, c, n, r, a;
varexo u;
parameters beta, rho, epsilon, omega, phi, gamma;
beta=0.99;
gamma=3;
omega=17;
epsilon=8;
phi=1;
rho=0.95;
model;
a = rho*a(-1)+u;
1/c = beta*r/(c(+1)*pai(+1));
pai*(pai-1)/c = beta*pai(+1)*(pai(+1)-1)/c(+1)+epsilon*phi*n^(gamma+1)/omega -exp(a)*n*(epsilon-1)/(omega*c);
exp(a)*n = c+(omega/2)*(pai-1)^2;
end;
initval;
r=1;
end;
steady_state_model;
a = 0;
pai = beta*r;
c = find_c(0.96,pai,beta,epsilon,phi,gamma,omega);
n = c+(omega/2)*(pai-1)^2;
end;
shocks;
var u; stderr 0.008;
end;
planner_objective(ln(c)-phi*((n^(1+gamma))/(1+gamma)));
ramsey_policy(planner_discount=0.99,order=1,instruments=(r));
oo_ramsey_policy_steady_state_file=oo_;
stoch_simul(periods=0, order=1, irf=25, nograph);
if max(abs((oo_ramsey_policy_steady_state_file.steady_state-oo_.steady_state)))>1e-5 ...
|| max(abs(oo_ramsey_policy_steady_state_file.dr.ys-oo_.dr.ys))>1e-5 ...
|| max(max(abs(oo_ramsey_policy_steady_state_file.dr.ghx-oo_.dr.ghx)))>1e-5 ...
|| max(max(abs(oo_ramsey_policy_steady_state_file.dr.ghu-oo_.dr.ghu)))>1e-5 ...
|| max(max(abs(oo_ramsey_policy_steady_state_file.dr.Gy-oo_.dr.Gy)))>1e-5 ...
|| max(abs((oo_ramsey_policy_steady_state_file.planner_objective_value-oo_.planner_objective_value)))>1e-5
error('Running stoch_simul after ramsey_policy leads to inconsistent results')
end
load oo_ramsey_policy_initval;
if max(abs((oo_ramsey_policy_initval.steady_state-oo_.steady_state)))>1e-5 ...
|| max(abs(oo_ramsey_policy_initval.dr.ys-oo_.dr.ys))>1e-5 ...
|| max(max(abs(oo_ramsey_policy_initval.dr.ghx-oo_.dr.ghx)))>1e-5 ...
|| max(max(abs(oo_ramsey_policy_initval.dr.ghu-oo_.dr.ghu)))>1e-5 ...
|| max(max(abs(oo_ramsey_policy_initval.dr.Gy-oo_.dr.Gy)))>1e-5 ...
|| max(abs((oo_ramsey_policy_initval.planner_objective_value-oo_.planner_objective_value)))>1e-5
error('Initval and steady state file yield different results')
end

View File

@ -0,0 +1,52 @@
/* Mod file tests the functioning of the Ramsey command when used together with an initval-block
* - Tests whether subsequent calls to ramsey_policy and stoch_simul are possible
* The example is taken from Juillard, Michel (2011): User manual for optimal policy package,
* MONFISPOL FP7 project SSH-225149, Deliverable 1.1.2
*/
var pai, c, n, r, a;
varexo u;
parameters beta, rho, epsilon, omega, phi, gamma;
beta=0.99;
gamma=3;
omega=17;
epsilon=8;
phi=1;
rho=0.95;
model;
a = rho*a(-1)+u;
1/c = beta*r/(c(+1)*pai(+1));
pai*(pai-1)/c = beta*pai(+1)*(pai(+1)-1)/c(+1)+epsilon*phi*n^(gamma+1)/omega -exp(a)*n*(epsilon-1)/(omega*c);
exp(a)*n = c+(omega/2)*(pai-1)^2;
end;
initval;
r=1;
end;
initval;
a = 0;
pai = beta;
c = 0.9665;
n = 0.9673;
end;
shocks;
var u; stderr 0.008;
end;
planner_objective(ln(c)-phi*((n^(1+gamma))/(1+gamma)));
ramsey_policy(planner_discount=0.99,order=1,instruments=(r));
oo_ramsey_policy_initval=oo_;
%save oo_ramsey_policy_initval oo_ramsey_policy_initval
stoch_simul(periods=0, order=1, irf=25, nograph);
if max(abs((oo_ramsey_policy_initval.steady_state-oo_.steady_state)))>1e-5 ...
|| max(abs(oo_ramsey_policy_initval.dr.ys-oo_.dr.ys))>1e-5 ...
|| max(max(abs(oo_ramsey_policy_initval.dr.ghx-oo_.dr.ghx)))>1e-5 ...
|| max(max(abs(oo_ramsey_policy_initval.dr.ghu-oo_.dr.ghu)))>1e-5 ...
|| max(max(abs(oo_ramsey_policy_initval.dr.Gy-oo_.dr.Gy)))>1e-5 ...
|| max(abs((oo_ramsey_policy_initval.planner_objective_value-oo_.planner_objective_value)))>1e-5
error('Running stoch_simul after ramsey_policy leads to inconsistent results')
end

View File

@ -0,0 +1,50 @@
/* Mod file tests the correctness of the Ramsey command when Auxiliary variables for AR2 are used
* The example is adapted from Juillard, Michel (2011): User manual for optimal policy package,
* MONFISPOL FP7 project SSH-225149, Deliverable 1.1.2
*/
var pai, c, n, r, a;
varexo u;
parameters beta, rho, epsilon, omega, phi, gamma;
beta=0.99;
gamma=3;
omega=17;
epsilon=8;
phi=1;
rho=0.95;
model;
log(a) = rho*log(a(-2))+u;
1/c = beta*r/(c(+1)*pai(+1));
pai*(pai-1)/c = beta*pai(+1)*(pai(+1)-1)/c(+1)+epsilon*phi*n^(gamma+1)/omega -a*n*(epsilon-1)/(omega*c);
a*n = c+(omega/2)*(pai-1)^2;
end;
initval;
r=1;
end;
initval;
a = 1;
pai = beta;
c = 0.9665;
n = 0.9673;
end;
shocks;
var u; stderr 0.008;
end;
planner_objective(ln(c)-phi*((n^(1+gamma))/(1+gamma)));
ramsey_policy(planner_discount=0.99,order=1,instruments=(r));
oo_ramsey_policy_initval_AR2=oo_;
stoch_simul(periods=0, order=1, irf=25, nograph);
if max(abs((oo_ramsey_policy_initval_AR2.steady_state-oo_.steady_state)))>1e-5 ...
|| max(abs(oo_ramsey_policy_initval_AR2.dr.ys-oo_.dr.ys))>1e-5 ...
|| max(max(abs(oo_ramsey_policy_initval_AR2.dr.ghx-oo_.dr.ghx)))>1e-5 ...
|| max(max(abs(oo_ramsey_policy_initval_AR2.dr.ghu-oo_.dr.ghu)))>1e-5 ...
|| max(max(abs(oo_ramsey_policy_initval_AR2.dr.Gy-oo_.dr.Gy)))>1e-5 ...
|| max(abs((oo_ramsey_policy_initval_AR2.planner_objective_value-oo_.planner_objective_value)))>1e-5
error('Running stoch_simul after ramsey_policy leads to inconsistent results')
end

View File

@ -0,0 +1,41 @@
/* Mod file tests whether the Ramsey command correctly filters out an incorrect steady state
* The example is taken from Juillard, Michel (2011): User manual for optimal policy package,
* MONFISPOL FP7 project SSH-225149, Deliverable 1.1.2
*/
var pai, c, n, r, a;
varexo u;
parameters beta, rho, epsilon, omega, phi, gamma;
beta=0.99;
gamma=3;
omega=17;
epsilon=8;
phi=1;
rho=0.95;
model;
a = rho*a(-1)+u;
1/c = beta*r/(c(+1)*pai(+1));
pai*(pai-1)/c = beta*pai(+1)*(pai(+1)-1)/c(+1)+epsilon*phi*n^(gamma+1)/omega -exp(a)*n*(epsilon-1)/(omega*c);
exp(a)*n = c+(omega/2)*(pai-1)^2;
end;
initval;
r=1;
end;
steady_state_model;
a = 1;
pai = beta*r;
c = find_c(0.96,pai,beta,epsilon,phi,gamma,omega);
n = c+(omega/2)*(pai-1)^2;
end;
shocks;
var u; stderr 0.008;
end;
planner_objective(ln(c)-phi*((n^(1+gamma))/(1+gamma)));
ramsey_policy(planner_discount=0.99,order=1,instruments=(r));