Merge branch 'particle' into 'master'

non_linear_dsge_likelihood.m: filter out explosive initial simulation

See merge request Dynare/dynare!1861
time-shift
Stéphane Adjemian 2021-05-28 11:42:24 +00:00
commit 77612e6bb7
3 changed files with 13 additions and 4 deletions

View File

@ -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

View File

@ -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;

View File

@ -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_');