diff --git a/matlab/+mom/mode_compute_irf_matching.m b/matlab/+mom/mode_compute_irf_matching.m new file mode 100644 index 0000000000000000000000000000000000000000..71bb8f9dfc8ed847e4954ab001dccf1ae05e7480 --- /dev/null +++ b/matlab/+mom/mode_compute_irf_matching.m @@ -0,0 +1,122 @@ +function [xparam1, hessian_xparam1, fval, mom_verbose] = mode_compute_irf_matching(xparam0, hessian_xparam0, objective_function, doBayesianEstimation, weighting_info, data_moments, options_mom_, M_, estim_params_, bayestopt_, BoundsInfo, dr, endo_steady_state, exo_steady_state, exo_det_steady_state) +% [xparam1, hessian_xparam1, fval, mom_verbose] = mode_compute_irf_matching(xparam0, hessian_xparam0, objective_function, doBayesianEstimation, weighting_info, data_moments, options_mom_, M_, estim_params_, bayestopt_, BoundsInfo, dr, endo_steady_state, exo_steady_state, exo_det_steady_state) +% ------------------------------------------------------------------------- +% Computes the minimum of the objective function (distance between data irfs +% and model irfs) for a sequence of optimizers. +% Note that we call a "mode" the minimum of the objective function, i.e. +% the parameter vector that minimizes the distance between the irfs +% computed from the model and the irfs computed from the data. +% ------------------------------------------------------------------------- +% INPUTS +% xparam0: [vector] initialized parameters +% hessian_xparam0: [matrix] initialized hessian at xparam0 +% objective_function: [func handle] name of the objective function +% doBayesianEstimation: [logical] true if Bayesian estimation +% weighting_info: [structure] information on weighting matrix +% data_moments: [vector] data moments +% options_mom_: [structure] options +% M_: [structure] model information +% estim_params_: [structure] information on estimated parameters +% bayestopt_: [structure] information on priors +% BoundsInfo: [structure] bounds for optimization +% dr: [structure] information reduced-form model +% endo_steady_state: [vector] steady state of endogenous variables (initval) +% exo_steady_state: [vector] steady state of exogenous variables (initval) +% exo_det_steady_state: [vector] steady state of deterministic exogenous variables (initval) +% ------------------------------------------------------------------------- +% OUTPUT +% xparam1: [vector] mode of objective function +% hessian_xparam1: [matrix] hessian at xparam1 +% fval: [double] function value at mode +% mom_verbose: [structure] information on intermediate estimation results +% Also saves the computed mode and hessian to a file. +% ------------------------------------------------------------------------- +% This function is called by +% o mom.run +% ------------------------------------------------------------------------- +% This function calls +% o display_estimation_results_table +% o dynare_minimize_objective +% o hessian +% o mom.objective_function +% ------------------------------------------------------------------------- + +% Copyright © 2023 Dynare Team +% +% This file is part of Dynare. +% +% Dynare is free software: you can redistribute it and/or modify +% it under the terms of the GNU General Public License as published by +% the Free Software Foundation, either version 3 of the License, or +% (at your option) any later version. +% +% Dynare is distributed in the hope that it will be useful, +% but WITHOUT ANY WARRANTY; without even the implied warranty of +% MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +% GNU General Public License for more details. +% +% You should have received a copy of the GNU General Public License +% along with Dynare. If not, see <https://www.gnu.org/licenses/>. + + +mom_verbose = []; +for optim_iter = 1:length(options_mom_.optimizer_vec) + options_mom_.current_optimizer = options_mom_.optimizer_vec{optim_iter}; + if options_mom_.optimizer_vec{optim_iter}==0 + % no minimization, evaluate objective at current values + xparam1 = xparam0; + hessian_xparam1 = hessian_xparam0; + fval = feval(objective_function, xparam1, data_moments, weighting_info, options_mom_, M_, estim_params_, bayestopt_, BoundsInfo, dr, endo_steady_state, exo_steady_state, exo_det_steady_state); + else + [xparam1, fval, exitflag, hessian_xparam1, options_mom_, Scale, new_rat_hess_info] = dynare_minimize_objective(objective_function, xparam0, options_mom_.optimizer_vec{optim_iter}, options_mom_, [BoundsInfo.lb BoundsInfo.ub], bayestopt_.name, bayestopt_, hessian_xparam0,... + data_moments, weighting_info, options_mom_, M_, estim_params_, bayestopt_, BoundsInfo, dr, endo_steady_state, exo_steady_state, exo_det_steady_state); + end + fprintf('\nMode Compute Iteration %d: Value of minimized moment distance objective function: %12.10f.\n',optim_iter,fval); + if options_mom_.mom.verbose + fprintf('\n''verbose'' option: '); + if options_mom_.cova_compute + if options_mom_.optimizer_vec{optim_iter}==0 + hessian_xparam1_iter = hessian_xparam1; + else + fprintf('computing hessian'); + hessian_xparam1_iter = hessian(objective_function, xparam1, options_mom_.gstep,... + data_moments, weighting_info, options_mom_, M_, estim_params_, bayestopt_, BoundsInfo, dr, endo_steady_state, exo_steady_state, exo_det_steady_state); + hessian_xparam1_iter = reshape(hessian_xparam1_iter, length(xparam1), length(xparam1)); + end + hsd_iter = sqrt(diag(hessian_xparam1_iter)); + invhessian_xparam1_iter = inv(hessian_xparam1_iter./(hsd_iter*hsd_iter'))./(hsd_iter*hsd_iter'); + std_via_invhessian_xparam1_iter = sqrt(diag(invhessian_xparam1_iter)); + else + std_via_invhessian_xparam1_iter = NaN(size(xparam1)); + end + fprintf(' and displaying intermediate results.'); + if doBayesianEstimation + tbl_title_iter = sprintf('BAYESIAN %s (OPTIM ITERATION %d) VERBOSE',strrep(options_mom_.mom.mom_method,'_',' '),optim_iter); + field_name_iter = sprintf('posterior_iter_%d',optim_iter); + else + tbl_title_iter = sprintf('FREQUENTIST %s (OPTIM ITERATION %d) VERBOSE',strrep(options_mom_.mom.mom_method,'_',' '),optim_iter); + field_name_iter = sprintf('iter_%d',optim_iter); + end + mom_verbose.(field_name_iter) = display_estimation_results_table(xparam1,std_via_invhessian_xparam1_iter,M_,options_mom_,estim_params_,bayestopt_,[],prior_dist_names,tbl_title_iter,field_name_iter); + end + xparam0 = xparam1; + hessian_xparam0 = hessian_xparam1; +end + +if options_mom_.cova_compute + if options_mom_.mom.verbose + hessian_xparam1 = hessian_xparam1_iter; + else + fprintf('\nComputing Hessian at the mode.\n'); + hessian_xparam1 = hessian(objective_function, xparam1, options_mom_.gstep,... + data_moments, weighting_info, options_mom_, M_, estim_params_, bayestopt_, BoundsInfo, dr, endo_steady_state, exo_steady_state, exo_det_steady_state); + hessian_xparam1 = reshape(hessian_xparam1, length(xparam1), length(xparam1)); + end +end +parameter_names = bayestopt_.name; +if options_mom_.cova_compute || options_mom_.mode_compute==5 || options_mom_.mode_compute==6 + hh = hessian_xparam1; + save([M_.dname filesep 'method_of_moments' filesep M_.fname '_mode.mat'],'xparam1','hh','parameter_names','fval'); +else + save([M_.dname filesep 'method_of_moments' filesep M_.fname '_mode.mat'],'xparam1','parameter_names','fval'); +end \ No newline at end of file