diff --git a/matlab/get_error_message.m b/matlab/get_error_message.m index c0227e517..af5ee750f 100644 --- a/matlab/get_error_message.m +++ b/matlab/get_error_message.m @@ -168,6 +168,8 @@ switch info(1) message = 'Aim: Problem in SPEIG.'; case 201 message = 'Particle Filter: Initial covariance of the states is not positive definite. Try a different nonlinear_filter_initialization'; + case 202 + message = 'Particle Filter: Initial covariance of the states based on simulation resulted in NaN/Inf. Use pruning or try a different nonlinear_filter_initialization'; otherwise message = 'This case shouldn''t happen. Contact the authors of Dynare'; end \ No newline at end of file diff --git a/matlab/initial_estimation_checks.m b/matlab/initial_estimation_checks.m index eda094042..fa4acfcde 100644 --- a/matlab/initial_estimation_checks.m +++ b/matlab/initial_estimation_checks.m @@ -235,9 +235,9 @@ if ~isequal(DynareOptions.mode_compute,11) || ... fprintf('initial_estimation_checks:: If you think the latter is the case, you should try with different initial values for the estimated parameters.\n') error('initial_estimation_checks:: The forecast error variance in the multivariate Kalman filter became singular.') end - if info(1)==201 - fprintf('initial_estimation_checks:: Initial covariance of the states is not positive definite. Try a different nonlinear_filter_initialization.\n') - error('initial_estimation_checks:: Initial covariance of the states is not positive definite. Try a different nonlinear_filter_initialization.') + if info(1)==201 || info(1)==202 + message=get_error_message(info,DynareOptions); + error('initial_estimation_checks:: %s.',message) end %reset options DynareOptions.use_univariate_filters_if_singularity_is_detected=use_univariate_filters_if_singularity_is_detected_old; diff --git a/matlab/non_linear_dsge_likelihood.m b/matlab/non_linear_dsge_likelihood.m index 7f34ab2d3..e69c9eea9 100644 --- a/matlab/non_linear_dsge_likelihood.m +++ b/matlab/non_linear_dsge_likelihood.m @@ -152,7 +152,14 @@ switch DynareOptions.particle.initialization DynareOptions.pruning = DynareOptions.particle.pruning; y_ = simult(DynareResults.steady_state, dr,Model,DynareOptions,DynareResults); y_ = y_(dr.order_var(state_variables_idx),2001:5000); %state_variables_idx is in dr-order while simult_ is in declaration order - StateVectorVariance = cov(y_'); + if any(any(isnan(y_))) || any(any(isinf(y_))) && ~ DynareOptions.pruning + fval = Inf; + info(1) = 202; + info(4) = 0.1; + exit_flag = 0; + return; + end + StateVectorVariance = cov(y_'); DynareOptions.periods = old_DynareOptionsperiods; DynareOptions.pruning = old_DynareOptionspruning; clear('old_DynareOptionsperiods','y_');