diff --git a/matlab/evaluate_planner_objective.m b/matlab/evaluate_planner_objective.m index ec34a87b6..3a516b31b 100644 --- a/matlab/evaluate_planner_objective.m +++ b/matlab/evaluate_planner_objective.m @@ -5,12 +5,14 @@ function planner_objective_value = evaluate_planner_objective(M_,options_,oo_) % options_: (structure) options % oo_: (structure) output results % OUTPUT -% planner_objective_value (double) +% planner_objective_value (structure) % -%Returns a vector containing first order or second-order approximations of -% - the unconditional expectation of the planner's objective function -% - the conditional expectation of the planner's objective function starting from the non-stochastic steady state and allowing for future shocks -% depending on the value of options_.order. +%Returns a structure containing approximations of +% - the unconditional expectation of the planner's objective function in the field unconditional +% - the conditional expectations of the planner's objective function starting from the non-stochastic steady state in the field conditional +% - with Lagrange multipliers initially set to zero in the field zero_initial_multiplier +% - with lagrange multipliers initially set to their initial values in the field steady_initial_multiplier +% Approximations are consistent with the order specified in options_order. % % SPECIAL REQUIREMENTS % none @@ -38,8 +40,6 @@ function planner_objective_value = evaluate_planner_objective(M_,options_,oo_) % Taking the unconditional expectation yields E(U) = Ubar and E(W) = Ubar/(1-beta) % As for conditional welfare, a first-order approximation leads to % W = Wbar + W_y yhat_{t-1} + W_u u_t -% The approximated conditional expectation of the planner's objective function taking at the non-stochastic steady-state and allowing for future shocks thus verifies -% W (y, 0, 1) = Wbar % Similarly, taking the unconditional expectation of a second-order approximation of utility around the non-stochastic steady state yields a second-order approximation of unconditional welfare % E(W) = (1 - beta)^{-1} ( Ubar + U_x h_y E(yhat) + 0.5 ( (U_xx h_y^2 + U_x h_yy) E(yhat^2) + (U_xx h_u^2 + U_x h_uu) E(u^2) + U_x h_ss ) @@ -48,8 +48,6 @@ function planner_objective_value = evaluate_planner_objective(M_,options_,oo_) % As for conditional welfare, the second-order approximation of welfare around the non-stochastic steady state leads to % W(y_{t-1}, u_t, sigma) = Wbar + W_y yhat_{t-1} + W_u u_t + W_yu yhat_{t-1} ⊗ u_t + 0.5 ( W_yy yhat_{t-1}^2 + W_uu u_t^2 + W_ss ) % The derivatives of W taken at the non-stochastic steady state can be computed as in Kamenik and Juillard (2004) "Solving Stochastic Dynamic Equilibrium Models: A k-Order Perturbation Approach". -% The approximated conditional expectation of the planner's objective function starting from the non-stochastic steady-state and allowing for future shocks thus verifies -% W(y,0,1) = Wbar + 0.5*Wss % In the discretionary case, the model is assumed to be linear and the utility is assumed to be linear-quadratic. This changes 2 aspects of the results delinated above: % 1) the second-order derivatives of the policy and transition functions h and g are zero. @@ -87,7 +85,6 @@ nstatic = M_.nstatic; nspred = M_.nspred; beta = get_optimal_policy_discount_factor(M_.params, M_.param_names); -planner_objective_value = zeros(2,1); if options_.ramsey_policy if oo_.gui.ran_perfect_foresight T = size(oo_.endo_simul,2); @@ -98,14 +95,39 @@ if options_.ramsey_policy [U] = feval([M_.fname '.objective.static'],oo_.endo_simul(:,t),oo_.exo_simul(t,:), M_.params); W = U + beta*W; end - planner_objective_value(1) = EW; - planner_objective_value(2) = W; + planner_objective_value = struct("conditional", W, "unconditional", EW); else + planner_objective_value = struct("conditional", struct("zero_initial_multiplier", 0., "steady_initial_multiplier", 0.), "unconditional", 0.); ys = oo_.dr.ys; if options_.order == 1 || M_.hessian_eq_zero - [U] = feval([M_.fname '.objective.static'],ys,zeros(1,exo_nbr), M_.params); - planner_objective_value(1) = U/(1-beta); - planner_objective_value(2) = U/(1-beta); + [U,Uy] = feval([M_.fname '.objective.static'],ys,zeros(1,exo_nbr), M_.params); + + Gy = dr.ghx(nstatic+(1:nspred),:); + Gu = dr.ghu(nstatic+(1:nspred),:); + + gy(dr.order_var,:) = dr.ghx; + gu(dr.order_var,:) = dr.ghu; + + %% Unconditional welfare + + EW = U/(1-beta); + + planner_objective_value.unconditional = EW; + + %% Conditional welfare starting from the non-stochastic steady-state (i) with Lagrange multipliers set to their steady-state value (ii) with Lagrange multipliers set to 0 + + Wbar = U/(1-beta); + Wy = Uy*gy/(eye(nspred)-beta*Gy); + Wu = Uy*gu + beta*Wy*Gu; + + [yhat_L_SS,yhat_L_0, u]=get_initial_state(ys,M_,dr,oo_); + + W_L_SS = Wbar+Wy*yhat_L_SS+Wu*u; + W_L_0 = Wbar+Wy*yhat_L_0+Wu*u; + + planner_objective_value.conditional.steady_initial_multiplier = W_L_SS; + planner_objective_value.conditional.zero_initial_multiplier = W_L_0; + elseif options_.order == 2 && ~M_.hessian_eq_zero [U,Uy,Uyy] = feval([M_.fname '.objective.static'],ys,zeros(1,exo_nbr), M_.params); @@ -127,6 +149,7 @@ if options_.ramsey_policy Uyygygy = A_times_B_kronecker_C(Uyy,gy,gy); Uyygugu = A_times_B_kronecker_C(Uyy,gu,gu); + Uyygugy = A_times_B_kronecker_C(Uyy,gu,gy); %% Unconditional welfare @@ -157,10 +180,13 @@ if options_.ramsey_policy EU = U + Uy*gy*Eyhat + 0.5*((Uyygygy + Uy*gyy)*Eyhatyhat + (Uyygugu + Uy*guu)*Euu + Uy*gss); EW = EU/(1-beta); - %% Conditional welfare starting from the non-stochastic steady-state - + planner_objective_value.unconditional = EW; + + %% Conditional welfare starting from the non-stochastic steady-state (i) with Lagrange multipliers set to their steady-state value (ii) with Lagrange multipliers set to 0 + Wbar = U/(1-beta); Wy = Uy*gy/(eye(nspred)-beta*Gy); + Wu = Uy*gu + beta*Wy*Gu; if isempty(options_.qz_criterium) options_.qz_criterium = 1+1e-6; @@ -168,23 +194,42 @@ if options_.ramsey_policy %solve Lyapunuv equation Wyy=gy'*Uyy*gy+Uy*gyy+beta*Wy*Gyy+beta*Gy'Wyy*Gy Wyy = reshape(lyapunov_symm(sqrt(beta)*Gy',reshape(Uyygygy + Uy*gyy + beta*Wy*Gyy,nspred,nspred),options_.lyapunov_fixed_point_tol,options_.qz_criterium,options_.lyapunov_complex_threshold, 3, options_.debug),1,nspred*nspred); Wyygugu = A_times_B_kronecker_C(Wyy,Gu,Gu); + Wyygugy = A_times_B_kronecker_C(Wyy,Gu,Gy); Wuu = Uyygugu + Uy*guu + beta*(Wyygugu + Wy*Guu); Wss = (Uy*gss + beta*(Wy*Gss + Wuu*M_.Sigma_e(:)))/(1-beta); - W = Wbar + 0.5*Wss; - - planner_objective_value(1) = EW; - planner_objective_value(2) = W; + Wyu = Uyygugy + Uy*gyu + beta*(Wyygugy + Wy*Gyu); + + [yhat_L_SS,yhat_L_0, u]=get_initial_state(ys,M_,dr,oo_); + + Wyu_yu_L_SS = A_times_B_kronecker_C(Wyu,yhat_L_SS,u); + Wyy_yy_L_SS = A_times_B_kronecker_C(Wyy,yhat_L_SS,yhat_L_SS); + Wuu_uu_L_SS = A_times_B_kronecker_C(Wuu,u,u); + W_L_SS = Wbar+Wy*yhat_L_SS+Wu*u+Wyu_yu_L_SS+0.5*(Wss+Wyy_yy_L_SS+Wuu_uu_L_SS); + + Wyu_yu_L_0 = A_times_B_kronecker_C(Wyu,yhat_L_0,u); + Wyy_yy_L_0 = A_times_B_kronecker_C(Wyy,yhat_L_0,yhat_L_0); + Wuu_uu_L_0 = A_times_B_kronecker_C(Wuu,u,u); + W_L_0 = Wbar+Wy*yhat_L_0+Wu*u+Wyu_yu_L_0+0.5*(Wss+Wyy_yy_L_0+Wuu_uu_L_0); + + planner_objective_value.conditional.steady_initial_multiplier = W_L_SS; + planner_objective_value.conditional.zero_initial_multiplier = W_L_0; else %Order k code will go here! - fprintf('\nevaluate_planner_objective: order>2 unconditional welfare calculation not yet supported\n') - planner_objective_value(1) = k_order_welfare(dr, M_, options_); - planner_objective_value(2) = NaN; + if ~isempty(M_.endo_histval) + fprintf('\nevaluate_planner_objective: order>2 conditional and unconditional welfare calculations not yet supported when an histval block is provided\n') + else + fprintf('\nevaluate_planner_objective: order>2 conditional welfare with initial Lagrange multipliers set to zero and unconditional welfare calculations not yet supported\n') + planner_objective_value.conditional.steady_initial_multiplier = k_order_welfare(dr, M_, options_); + planner_objective_value.conditional.zero_initial_multiplier = NaN; + planner_objective_value.unconditional = NaN; + end return end end elseif options_.discretionary_policy ys = oo_.dr.ys; - + planner_objective_value = struct("conditional", struct("zero_initial_multiplier", 0., "steady_initial_multiplier", 0.), "unconditional", 0.); + [U,Uy,Uyy] = feval([M_.fname '.objective.static'],ys,zeros(1,exo_nbr), M_.params); Gy = dr.ghx(nstatic+(1:nspred),:); @@ -196,6 +241,7 @@ elseif options_.discretionary_policy Uyygygy = A_times_B_kronecker_C(Uyy,gy,gy); Uyygugu = A_times_B_kronecker_C(Uyy,gu,gu); + Uyygugy = A_times_B_kronecker_C(Uyy,gu,gy); %% Unconditional welfare @@ -222,34 +268,99 @@ elseif options_.discretionary_policy EU = U + Uy*gy*Eyhat + 0.5*(Uyygygy*Eyhatyhat + Uyygugu*Euu); EW = EU/(1-beta); - - + planner_objective_value.unconditional = EW; + %% Conditional welfare starting from the non-stochastic steady-state Wbar = U/(1-beta); Wy = Uy*gy/(eye(nspred)-beta*Gy); - + Wu = Uy*gu + beta*Wy*Gu; + %solve Lyapunuv equation Wyy=gy'*Uyy*gy+beta*Gy'Wyy*Gy Wyy = reshape(lyapunov_symm(sqrt(beta)*Gy',reshape(Uyygygy,nspred,nspred),options_.lyapunov_fixed_point_tol,options_.qz_criterium,options_.lyapunov_complex_threshold, 3, options_.debug),1,nspred*nspred); Wyygugu = A_times_B_kronecker_C(Wyy,Gu,Gu); + Wyygugy = A_times_B_kronecker_C(Wyy,Gu,Gy); Wuu = Uyygugu + beta*Wyygugu; Wss = beta*Wuu*M_.Sigma_e(:)/(1-beta); - W = Wbar + 0.5*Wss; - - planner_objective_value(1) = EW; - planner_objective_value(2) = W; + Wyu = Uyygugy + beta*Wyygugy; + + [yhat_L_SS,yhat_L_0, u]=get_initial_state(ys,M_,dr,oo_); + + Wyu_yu_L_SS = A_times_B_kronecker_C(Wyu,yhat_L_SS,u); + Wyy_yy_L_SS = A_times_B_kronecker_C(Wyy,yhat_L_SS,yhat_L_SS); + Wuu_uu_L_SS = A_times_B_kronecker_C(Wuu,u,u); + W_L_SS = Wbar+Wy*yhat_L_SS+Wu*u+Wyu_yu_L_SS+0.5*(Wss+Wyy_yy_L_SS+Wuu_uu_L_SS); + + Wyu_yu_L_0 = A_times_B_kronecker_C(Wyu,yhat_L_0,u); + Wyy_yy_L_0 = A_times_B_kronecker_C(Wyy,yhat_L_0,yhat_L_0); + Wuu_uu_L_0 = A_times_B_kronecker_C(Wuu,u,u); + W_L_0 = Wbar+Wy*yhat_L_0+Wu*u+Wyu_yu_L_0+0.5*(Wss+Wyy_yy_L_0+Wuu_uu_L_0); + + planner_objective_value.conditional.steady_initial_multiplier = W_L_SS; + planner_objective_value.conditional.zero_initial_multiplier = W_L_0; end if ~options_.noprint if options_.ramsey_policy if oo_.gui.ran_perfect_foresight - fprintf('\nSimulated value of unconditional welfare: %10.8f\n', planner_objective_value(1)) - fprintf('\nSimulated value of conditional welfare: %10.8f\n', planner_objective_value(2)) + fprintf('\nSimulated value of unconditional welfare: %10.8f\n', planner_objective_value.unconditional) + fprintf('\nSimulated value of conditional welfare: %10.8f\n', planner_objective_value.conditional) else - fprintf('\nApproximated value of unconditional welfare: %10.8f\n', planner_objective_value(1)) - fprintf('\nApproximated value of conditional welfare: %10.8f\n', planner_objective_value(2)) + fprintf('\nApproximated value of unconditional welfare: %10.8f\n', planner_objective_value.unconditional) + fprintf('\nApproximated value of conditional welfare:\n') + fprintf(' - with initial Lagrange multipliers set to 0: %10.8f\n', planner_objective_value.conditional.zero_initial_multiplier) + fprintf(' - with initial Lagrange multipliers set to steady state: %10.8f\n\n', planner_objective_value.conditional.steady_initial_multiplier) end elseif options_.discretionary_policy - fprintf('\nApproximated value of unconditional welfare with discretionary policy: %10.8f\n', planner_objective_value(1)) - fprintf('\nApproximated value of conditional welfare with discretionary policy: %10.8f\n', planner_objective_value(2)) + fprintf('\nApproximated value of unconditional welfare with discretionary policy: %10.8f\n', planner_objective_value.unconditional) + fprintf('\nApproximated value of conditional welfare with discretionary policy:\n') + fprintf(' - with initial Lagrange multipliers set to 0: %10.8f\n', planner_objective_value.conditional.zero_initial_multiplier) + fprintf(' - with initial Lagrange multipliers set to steady state: %10.8f\n\n', planner_objective_value.conditional.steady_initial_multiplier) end end + +function [yhat_L_SS,yhat_L_0, u]=get_initial_state(ys,M_,dr,oo_) + +% initialize Lagrange multipliers to their steady-state values in yhat_L_SS +yhat_L_SS = ys; +% initialize Lagrange multipliers to 0 in yhat_L_0 +yhat_L_0 = zeros(M_.endo_nbr,1); +if ~isempty(M_.aux_vars) +mult_indicator=([M_.aux_vars(:).type]==6); +mult_indices=[M_.aux_vars(mult_indicator).endo_index]; +else + mult_indices=[]; +end +non_mult_indices=~ismember(1:M_.endo_nbr,mult_indices); +if ~isempty(M_.endo_histval) + % initialize endogenous state variable to histval if necessary + yhat_L_SS(non_mult_indices) = M_.endo_histval(non_mult_indices); + yhat_L_0(non_mult_indices) = M_.endo_histval(non_mult_indices); +else + yhat_L_0(non_mult_indices) = ys(non_mult_indices); +end +yhat_L_0 = yhat_L_0(dr.order_var(M_.nstatic+(1:M_.nspred)),1)-ys(dr.order_var(M_.nstatic+(1:M_.nspred))); +yhat_L_SS = yhat_L_SS(dr.order_var(M_.nstatic+(1:M_.nspred)),1)-ys(dr.order_var(M_.nstatic+(1:M_.nspred))); +if ~isempty(M_.det_shocks) + if ~all(oo_.exo_simul(1,:)==0) + fprintf(['\nevaluate_planner_objective: oo_.exo_simul contains simulated values for the initial period.\n'... + 'evaluate_planner_objective: Dynare will ignore them and use the provided initial condition.\n']) + end + u =oo_.exo_steady_state; + periods=[M_.det_shocks(:).periods]; + if any(periods==0) + fprintf(['\nevaluate_planner_objective: M_.det_shocks contains values for the predetermined t=0 period.\n'... + 'evaluate_planner_objective: Dynare will ignore them. Use histval to set the value of lagged innovations.\n']) + end + if any(periods>1) + fprintf(['\nevaluate_planner_objective: Shock values for periods not contained in the initial information set (t=1) have been provided.\n' ... + 'evaluate_planner_objective: Note that they will be ignored.\n']) + end + shock_indices=find(periods==1); + if any([M_.det_shocks(shock_indices).multiplicative]) + fprintf(['\nevaluate_planner_objective: Shock values need to be specified as additive.\n']) + end + u([M_.det_shocks(shock_indices).exo_id])=[M_.det_shocks(shock_indices).value]; +else + u = oo_.exo_simul(1,:)'; %first value of simulation series (set by simult.m if periods>0), 1 otherwise +end + diff --git a/tests/Makefile.am b/tests/Makefile.am index bc45b6105..1a38316ec 100644 --- a/tests/Makefile.am +++ b/tests/Makefile.am @@ -679,6 +679,9 @@ kalman_filter_smoother/algo4.o.trs: kalman_filter_smoother/algo3.o.trs kalman_filter_smoother/test_compute_Pinf_Pstar.m.trs: kalman_filter_smoother/test_compute_Pinf_Pstar_data.m.trs kalman_filter_smoother/test_compute_Pinf_Pstar.o.trs: kalman_filter_smoother/test_compute_Pinf_Pstar_data.o.trs +optimal_policy/Ramsey/ramsey_ex.m.trs: optimal_policy/Ramsey/ramsey_ex_initval.m.trs +optimal_policy/Ramsey/ramsey_ex.o.trs: optimal_policy/Ramsey/ramsey_ex_initval.o.trs + optimal_policy/nk_ramsey_expectation_a.m.trs: optimal_policy/nk_ramsey_expectation.m.trs optimal_policy/nk_ramsey_expectation_a.o.trs: optimal_policy/nk_ramsey_expectation.o.trs @@ -1527,6 +1530,8 @@ clean-local: rm -f occbin/filter/dataobsfile2.mat + rm -f optimal_policy/Ramsey/oo_ramsey_policy_initval.mat + find . -name "*.tex" -type f -delete find . -name "*.aux" -type f -delete find . -name "*.log" -type f -delete diff --git a/tests/discretionary_policy/Gali_2015_chapter_3_nonlinear.mod b/tests/discretionary_policy/Gali_2015_chapter_3_nonlinear.mod index ca76e3033..3cc7bb649 100644 --- a/tests/discretionary_policy/Gali_2015_chapter_3_nonlinear.mod +++ b/tests/discretionary_policy/Gali_2015_chapter_3_nonlinear.mod @@ -1,5 +1,5 @@ /* - * This file implements the baseline New Keynesian model of Jordi Galí (2015): Monetary Policy, Inflation, + * This file implements the baseline New Keynesian model of Jordi Gal� (2015): Monetary Policy, Inflation, * and the Business Cycle, Princeton University Press, Second Edition, Chapter 3 * * Note that this mod-file implements the non-linear first order conditions and that the IRFs show the log-deviations @@ -220,8 +220,10 @@ planner_objective 0.5*((siggma+(varphi+alppha)/(1-alppha))*y_hat^2+epsilon/0.021 discretionary_policy(order=1,instruments=(R),irf=20,planner_discount=betta, periods=0) y_hat pi_ann log_y log_N log_W_real log_P; temp=load(['Gali_2015_chapter_3' filesep 'Output' filesep 'Gali_2015_chapter_3_results.mat']); -if abs(oo_.planner_objective_value-temp.oo_.planner_objective_value)>1e-6 - warning('Planner objective does not match linear model') +if abs(oo_.planner_objective_value.unconditional-temp.oo_.planner_objective_value.unconditional)>1e-6 ... + || abs(oo_.planner_objective_value.conditional.zero_initial_multiplier-temp.oo_.planner_objective_value.conditional.zero_initial_multiplier)>1e-6 ... + || abs(oo_.planner_objective_value.conditional.steady_initial_multiplier-temp.oo_.planner_objective_value.conditional.steady_initial_multiplier)>1e-6 ... + warning('Planner objective does not match linear model') end if max(max(abs([temp.oo_.irfs.y_eps_a; temp.oo_.irfs.w_real_eps_a; temp.oo_.irfs.n_eps_a; temp.oo_.irfs.pi_ann_eps_a]-... [oo_.irfs.log_y_eps_a; oo_.irfs.log_W_real_eps_a; oo_.irfs.log_N_eps_a; oo_.irfs.pi_ann_eps_a])))>1e-6 diff --git a/tests/discretionary_policy/Gali_discretion.mod b/tests/discretionary_policy/Gali_discretion.mod index a368462b1..d04dea02e 100644 --- a/tests/discretionary_policy/Gali_discretion.mod +++ b/tests/discretionary_policy/Gali_discretion.mod @@ -130,7 +130,7 @@ end %Compute theoretical objective function V=betta/(1-betta)*(var_pi_theoretical+alpha_x*var_y_gap_theoretical); %evaluate at steady state in first period -if any( [ isnan(oo_.planner_objective_value(2)), abs(V-oo_.planner_objective_value(2))>1e-10 ] ) +if any( [ isnan(oo_.planner_objective_value.conditional.zero_initial_multiplier), abs(V-oo_.planner_objective_value.conditional.zero_initial_multiplier)>1e-10 ] ) error('Computed welfare deviates from theoretical welfare') end end; @@ -144,6 +144,6 @@ end; V=var_pi_theoretical+alpha_x*var_y_gap_theoretical+ betta/(1-betta)*(var_pi_theoretical+alpha_x*var_y_gap_theoretical); %evaluate at steady state in first period discretionary_policy(instruments=(i),irf=20,discretionary_tol=1e-12,planner_discount=betta) y_gap pi p u; -if any( [ isnan(oo_.planner_objective_value(1)), abs(V-oo_.planner_objective_value(1))>1e-10 ] ) +if any( [ isnan(oo_.planner_objective_value.conditional.steady_initial_multiplier), abs(V-oo_.planner_objective_value.conditional.steady_initial_multiplier)>1e-10 ] ) error('Computed welfare deviates from theoretical welfare') end diff --git a/tests/optimal_policy/Ramsey/ramsey_ex.mod b/tests/optimal_policy/Ramsey/ramsey_ex.mod index 04e124462..ba00dcacf 100644 --- a/tests/optimal_policy/Ramsey/ramsey_ex.mod +++ b/tests/optimal_policy/Ramsey/ramsey_ex.mod @@ -47,7 +47,9 @@ if max(abs((oo_ramsey_policy_steady_state_file.steady_state-oo_.steady_state)))> || 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 + || abs(oo_ramsey_policy_steady_state_file.planner_objective_value.unconditional-oo_.planner_objective_value.unconditional)>1e-5 ... + || abs(oo_ramsey_policy_steady_state_file.planner_objective_value.conditional.zero_initial_multiplier-oo_.planner_objective_value.conditional.zero_initial_multiplier)>1e-5 ... + || abs(oo_ramsey_policy_steady_state_file.planner_objective_value.conditional.steady_initial_multiplier-oo_.planner_objective_value.conditional.steady_initial_multiplier)>1e-5 error('Running stoch_simul after ramsey_policy leads to inconsistent results') end @@ -58,6 +60,8 @@ if any( [ max(abs((oo_ramsey_policy_initval.steady_state-oo_.steady_state)))>1e- 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 ] ) + abs(oo_ramsey_policy_initval.planner_objective_value.unconditional-oo_.planner_objective_value.unconditional)>1e-5, ... + abs(oo_ramsey_policy_initval.planner_objective_value.conditional.zero_initial_multiplier-oo_.planner_objective_value.conditional.zero_initial_multiplier)>1e-5, ... + abs(oo_ramsey_policy_initval.planner_objective_value.conditional.steady_initial_multiplier-oo_.planner_objective_value.conditional.steady_initial_multiplier)>1e-5] ) error('Initval and steady state file yield different results') end diff --git a/tests/optimal_policy/Ramsey/ramsey_ex_initval.mod b/tests/optimal_policy/Ramsey/ramsey_ex_initval.mod index 9f0d8e132..27f51628d 100644 --- a/tests/optimal_policy/Ramsey/ramsey_ex_initval.mod +++ b/tests/optimal_policy/Ramsey/ramsey_ex_initval.mod @@ -47,6 +47,8 @@ if max(abs((oo_ramsey_policy_initval.steady_state-oo_.steady_state)))>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 + || abs(oo_ramsey_policy_initval.planner_objective_value.unconditional-oo_.planner_objective_value.unconditional)>1e-5 ... + || abs(oo_ramsey_policy_initval.planner_objective_value.conditional.zero_initial_multiplier-oo_.planner_objective_value.conditional.zero_initial_multiplier)>1e-5 ... + || abs(oo_ramsey_policy_initval.planner_objective_value.conditional.steady_initial_multiplier-oo_.planner_objective_value.conditional.steady_initial_multiplier)>1e-5 error('Running stoch_simul after ramsey_policy leads to inconsistent results') end diff --git a/tests/optimal_policy/Ramsey/ramsey_ex_initval_AR2.mod b/tests/optimal_policy/Ramsey/ramsey_ex_initval_AR2.mod index c10204922..0c522f57f 100644 --- a/tests/optimal_policy/Ramsey/ramsey_ex_initval_AR2.mod +++ b/tests/optimal_policy/Ramsey/ramsey_ex_initval_AR2.mod @@ -45,6 +45,8 @@ if max(abs((oo_ramsey_policy_initval_AR2.steady_state-oo_.steady_state)))>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 + || abs(oo_ramsey_policy_initval_AR2.planner_objective_value.unconditional-oo_.planner_objective_value.unconditional)>1e-5 ... + || abs(oo_ramsey_policy_initval_AR2.planner_objective_value.conditional.zero_initial_multiplier-oo_.planner_objective_value.conditional.zero_initial_multiplier)>1e-5 ... + || abs(oo_ramsey_policy_initval_AR2.planner_objective_value.conditional.steady_initial_multiplier-oo_.planner_objective_value.conditional.steady_initial_multiplier)>1e-5 error('Running stoch_simul after ramsey_policy leads to inconsistent results') end \ No newline at end of file diff --git a/tests/optimal_policy/Ramsey/ramsey_histval.mod b/tests/optimal_policy/Ramsey/ramsey_histval.mod index 4c61ba60b..5f296a740 100644 --- a/tests/optimal_policy/Ramsey/ramsey_histval.mod +++ b/tests/optimal_policy/Ramsey/ramsey_histval.mod @@ -12,7 +12,7 @@ phi=1; rho=0.95; model; -a = rho*a(-1)+u; +a = rho*a(-1)+u+u(-1); 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; @@ -23,6 +23,7 @@ r=1; end; histval; +u(0)=1; a(0)=-1; end; @@ -36,11 +37,30 @@ end; shocks; var u; stderr 0.008; var u; -periods 1; -values 1; +periods 0, 1; +values 1, 1; end; options_.dr_display_tol=0; planner_objective(ln(c)-phi*((n^(1+gamma))/(1+gamma))); ramsey_model(planner_discount=0.99,instruments=(r)); stoch_simul(order=1); -evaluate_planner_objective; \ No newline at end of file +evaluate_planner_objective; +stoch_simul(order=2); +evaluate_planner_objective; + + + +initval; +r=1; +end; + +histval; +u(0)=0; +a(0)=0; +end; + +shocks(overwrite); +var u; stderr 0.008; +end; +stoch_simul(order=1); +evaluate_planner_objective; diff --git a/tests/optimal_policy/neo_growth_ramsey.mod b/tests/optimal_policy/neo_growth_ramsey.mod index 8185ca2f4..09ef3b9e4 100644 --- a/tests/optimal_policy/neo_growth_ramsey.mod +++ b/tests/optimal_policy/neo_growth_ramsey.mod @@ -45,11 +45,20 @@ unc_W_hand = oo1.oo_.mean(strmatch('W',M1.M_.endo_names,'exact')); initial_condition_states = repmat(oo1.oo_.dr.ys,1,M1.M_.maximum_lag); shock_matrix = zeros(1,M1.M_.exo_nbr); y_sim = simult_(M1.M_,options1.options_,initial_condition_states,oo1.oo_.dr,shock_matrix,options1.options_.order); -cond_W_hand=y_sim(strmatch('W',M1.M_.endo_names,'exact'),2); +cond_W_hand_L_SS=y_sim(strmatch('W',M1.M_.endo_names,'exact'),2); -if abs((unc_W_hand - planner_objective_value(1))/unc_W_hand) > 1e-6; +if abs((unc_W_hand - planner_objective_value.unconditional)/unc_W_hand) > 1e-6; error('Inaccurate unconditional welfare assessment'); end; -if abs((cond_W_hand - planner_objective_value(2))/cond_W_hand) > 1e-6; - error('Inaccurate conditional welfare assessment'); +if abs(cond_W_hand_L_SS - planner_objective_value.conditional.steady_initial_multiplier) > 1e-6; + error('Inaccurate conditional welfare with Lagrange multiplier set to its steady-state value'); +end; + +initial_condition_states = zeros(M1.M_.endo_nbr,M1.M_.maximum_lag); +initial_condition_states(1:M1.M_.orig_endo_nbr,:) = repmat(oo1.oo_.dr.ys(1:M1.M_.orig_endo_nbr),1,M1.M_.maximum_lag); +shock_matrix = zeros(1,M1.M_.exo_nbr); +y_sim = simult_(M1.M_,options1.options_,initial_condition_states,oo1.oo_.dr,shock_matrix,options1.options_.order); +cond_W_hand_L_0=y_sim(strmatch('W',M1.M_.endo_names,'exact'),2); +if abs(cond_W_hand_L_0 - planner_objective_value.conditional.zero_initial_multiplier) > 1e-6; + error('Inaccurate conditional welfare with zero Lagrange multiplier'); end; diff --git a/tests/optimal_policy/neo_growth_ramsey_foresight.mod b/tests/optimal_policy/neo_growth_ramsey_foresight.mod index b4175f58f..ef32f9b17 100644 --- a/tests/optimal_policy/neo_growth_ramsey_foresight.mod +++ b/tests/optimal_policy/neo_growth_ramsey_foresight.mod @@ -45,9 +45,9 @@ options1 = load(['neo_growth_foresight' filesep 'Output' filesep 'neo_growth_for cond_W_hand = oo1.oo_.endo_simul(strmatch('W',M1.M_.endo_names,'exact'),2); unc_W_hand = oo1.oo_.endo_simul(strmatch('W',M1.M_.endo_names,'exact'),end); -if abs((unc_W_hand - planner_objective_value(1))/unc_W_hand) > 1e-6; +if abs((unc_W_hand - planner_objective_value.unconditional)/unc_W_hand) > 1e-6; error('Inaccurate unconditional welfare assessment'); end; -if abs((cond_W_hand - planner_objective_value(2))/cond_W_hand) > 1e-6; +if abs((cond_W_hand - planner_objective_value.conditional)/cond_W_hand) > 1e-6; error('Inaccurate conditional welfare assessment'); end; diff --git a/tests/optimal_policy/neo_growth_ramsey_k_order.mod b/tests/optimal_policy/neo_growth_ramsey_k_order.mod index 02a82d48b..8e62a4399 100644 --- a/tests/optimal_policy/neo_growth_ramsey_k_order.mod +++ b/tests/optimal_policy/neo_growth_ramsey_k_order.mod @@ -35,8 +35,8 @@ evaluate_planner_objective; [condWelfare, U_dynpp, W_dynpp, U_dyn, W_dyn] = k_order_welfare(oo_.dr, M_, options_); -if condWelfare~=oo_.planner_objective_value(1) - error('Values do not match'); +if condWelfare~=oo_.planner_objective_value.conditional.steady_initial_multiplier + error('Inaccurate conditional welfare with Lagrange multiplier set to its steady-state value'); end if ~exist(['neo_growth_k_order' filesep 'Output' filesep 'neo_growth_k_order_results.mat'],'file'); error('neo_growth_k_order must be run first'); diff --git a/tests/optimal_policy/nk_ramsey_expectation_a.mod b/tests/optimal_policy/nk_ramsey_expectation_a.mod index 4a0f85aaf..d8eaf4684 100644 --- a/tests/optimal_policy/nk_ramsey_expectation_a.mod +++ b/tests/optimal_policy/nk_ramsey_expectation_a.mod @@ -100,7 +100,9 @@ end if (norm(o1.oo_.dr.ghu-oo_.dr.ghu,inf) > 1e-12) error('ghu doesn''t match') end -if (abs(o1.oo_.planner_objective_value(1)-oo_.planner_objective_value(1)) > 1e-12) +if (abs(o1.oo_.planner_objective_value.conditional.zero_initial_multiplier-oo_.planner_objective_value.conditional.zero_initial_multiplier) > 1e-12 ... + || abs(o1.oo_.planner_objective_value.conditional.steady_initial_multiplier-oo_.planner_objective_value.conditional.steady_initial_multiplier) > 1e-12 ... + || abs(o1.oo_.planner_objective_value.unconditional-oo_.planner_objective_value.unconditional) > 1e-12) error('planner objective value doesn''t match') end