diff --git a/matlab/dynare_estimation_init.m b/matlab/dynare_estimation_init.m index 07188a23a38e6dd211ca706f7ce5a5cdff32f4e5..bddfbaa0cd7beef0ee5697ab742d44f9c72c9e08 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