From f16689e76fd7a8bb719c7bf9e24878459ca2443c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?St=C3=A9phane=20Adjemian=20=28Scylla=29?= <stephane.adjemian@univ-lemans.fr> Date: Wed, 11 Dec 2013 10:00:33 +0100 Subject: [PATCH] Do not systematically throw an errror message if the parameters in the provided mode_file does not exactly match the set of estimated parameters. If some parameters are missing in the provided mode_file and if mode_compute>0, use the prior mean as an initial condition. --- matlab/dynare_estimation_init.m | 98 +++++++++++++++++++++------------ 1 file changed, 62 insertions(+), 36 deletions(-) diff --git a/matlab/dynare_estimation_init.m b/matlab/dynare_estimation_init.m index 07188a23a..bddfbaa0c 100644 --- a/matlab/dynare_estimation_init.m +++ b/matlab/dynare_estimation_init.m @@ -134,10 +134,14 @@ if ~isempty(estim_params_) && ~isempty(options_.mode_file) && ~options_.mh_poste skipline() disp(['The posterior mode file ' options_.mode_file ' has been generated using another specification of the model or another model!']) disp(['Your mode file contains estimates for ' int2str(length(mode_file.xparam1)) ' parameters, while you are attempting to estimate ' int2str(number_of_estimated_parameters) ' parameters:']) + md = []; xd = []; for i=1:number_of_estimated_parameters id = strmatch(deblank(bayestopt_.name(i,:)),mode_file.parameter_names,'exact'); if isempty(id) - disp(['--> Estimated parameter ' bayestopt_.name{i} ' is not present in the loaded mode file.']) + disp(['--> Estimated parameter ' bayestopt_.name{i} ' is not present in the loaded mode file (prior mean will be used, if possible).']) + else + xd = [xd; i]; + md = [md; id]; end end for i=1:length(mode_file.xparam1) @@ -146,21 +150,30 @@ if ~isempty(estim_params_) && ~isempty(options_.mode_file) && ~options_.mh_poste disp(['--> Parameter ' mode_file.parameter_names{i} ' is not estimated according to the current mod file.']) end end - error('Please change the mode_file option or the list of estimated parameters.') + if ~options_.mode_compute + % The posterior mode is not estimated. + error('Please change the mode_file option, the list of estimated parameters or set mode_compute>0.') + else + % The posterior mode is estimated, the Hessian evaluated at the mode is not needed so we set values for the parameters missing in the mode file using the prior mean. + if ~isempty(xd) + xparam1(xd) = mode_file.xparam1(md); + else + error('Please remove the mode_file option.') + end + end elseif number_of_estimated_parameters<length(mode_file.xparam1) % Less estimated parameters than parameters in the mode file. skipline() disp(['The posterior mode file ' options_.mode_file ' has been generated using another specification of the model or another model!']) disp(['Your mode file contains estimates for ' int2str(length(mode_file.xparam1)) ' parameters, while you are attempting to estimate only ' int2str(number_of_estimated_parameters) ' parameters:']) - Id = []; + md = []; xd = []; for i=1:number_of_estimated_parameters id = strmatch(deblank(bayestopt_.name(i,:)),mode_file.parameter_names,'exact'); if isempty(id) - disp(['--> Estimated parameter ' deblank(bayestopt_.name(i,:)) ' is not present in the loaded mode file.']) - Id = []; - break + disp(['--> Estimated parameter ' deblank(bayestopt_.name(i,:)) ' is not present in the loaded mode file (prior mean will be used, if possible).']) else - Id = [Id; id]; + xd = [xd; i]; + md = [md; id]; end end for i=1:length(mode_file.xparam1) @@ -169,60 +182,73 @@ if ~isempty(estim_params_) && ~isempty(options_.mode_file) && ~options_.mh_poste disp(['--> Parameter ' mode_file.parameter_names{i} ' is not estimated according to the current mod file.']) end end - if isempty(Id) - % None of the estimated parameters are present in the mode_file. - error('Please change the mode_file option or the list of estimated parameters.') - else - % If possible, fix the mode_file. - if isequal(length(Id),number_of_estimated_parameters) + if ~options_.mode_compute + % The posterior mode is not estimated. If possible, fix the mode_file. + if isequal(length(xd),number_of_estimated_parameters) disp('==> Fix mode file (remove unused parameters).') - mode_file.parameter_names = mode_file.parameter_names(Id,:); - mode_file.xparam1 = mode_file.xparam1(Id); + xparam1 = mode_file.xparam1(md); if isfield(mode_file,'hh') - mode_file.hh = mode_file.hh(Id,Id); + hh = mode_file.hh(md,md); end + else + error('Please change the mode_file option, the list of estimated parameters or set mode_compute>0.') + end + else + % The posterior mode is estimated, the Hessian evaluated at the mode is not needed so we set values for the parameters missing in the mode file using the prior mean. + if ~isempty(xd) + xparam1(xd) = mode_file.xparam1(md); + else + % None of the estimated parameters are present in the mode_file. + error('Please remove the mode_file option.') end end else % The number of declared estimated parameters match the number of parameters in the mode file. % Check that the parameters in the mode file and according to the current mod file are identical. if isequal(mode_file.parameter_names, bayestopt_.name) - % Ok! Nothing to do here. + xparam1 = mode_file.xparam1; + if isfield(mode_file,'hh') + hh = mode_file.hh; + end else skipline() disp(['The posterior mode file ' options_.mode_file ' has been generated using another specification of the model or another model!']) - % Check if this only an ordering issue. - Id = []; + % Check if this only an ordering issue or if the missing parameters can be initialized with the prior mean. + md = []; xd = []; for i=1:number_of_estimated_parameters - id = strmatch(deblank(bayestopt_.name(i,:)),mode_file.parameter_names,'exact'); + id = strmatch(deblank(bayestopt_.name(i,:)), mode_file.parameter_names,'exact'); if isempty(id) disp(['--> Estimated parameter ' bayestopt_.name{i} ' is not present in the loaded mode file.']) - Id = []; - break else - Id = [Id; id]; + xd = [xd; i]; + md = [md; id]; end end - if isempty(Id) - % None of the estimated parameters are present in the mode_file. - error('Please change the mode_file option or the list of estimated parameters.') + if ~options_.mode_compute + % The posterior mode is not estimated + if isequal(length(xd), number_of_estimated_parameters) + % This is an ordering issue. + xparam1 = mode_file.xparam1(md); + if isfield(mode_file,'hh') + hh = mode_file.hh(md,md); + end + else + error('Please change the mode_file option, the list of estimated parameters or set mode_compute>0.') + end else - % If possible, fix the mode_file. - if isequal(length(Id),number_of_estimated_parameters) - disp('==> Fix mode file (reorder the parameters).') - mode_file.parameter_names = mode_file.parameter_names(Id,:); - mode_file.xparam1 = mode_file.xparam1(Id); + % The posterior mode is estimated, the Hessian evaluated at the mode is not needed so we set values for the parameters missing in the mode file using the prior mean. + if ~isempty(xd) + xparam1(xd) = mode_file.xparam1(md); if isfield(mode_file,'hh') - mode_file.hh = mode_file.hh(Id,Id); + hh(xd,xd) = mode_file.hh(md,md); end + else + % None of the estimated parameters are present in the mode_file. + error('Please remove the mode_file option.') end end end end - xparam1 = mode_file.xparam1; - if isfield(mode_file,'hh') - hh = mode_file.hh; - end skipline() end -- GitLab