diff --git a/matlab/dsge_likelihood.m b/matlab/dsge_likelihood.m index e6880d5910d7e8f4993d56a90519ca48fb77b6ec..a646f82af4a54546efdc534282f7314f7e633e1c 100644 --- a/matlab/dsge_likelihood.m +++ b/matlab/dsge_likelihood.m @@ -80,8 +80,12 @@ function [fval,DLIK,Hess,exit_flag,ys,trend_coeff,info,Model,DynareOptions,Bayes %! The covariance matrix of the measurement errors is not positive definite. %! @item info==45 %! Likelihood is not a number (NaN). -%! @item info==45 +%! @item info==46 %! Likelihood is a complex valued number. +%! @item info==47 +%! Posterior kernel is not a number (logged prior density is NaN) +%! @item info==48 +%! Posterior kernel is a complex valued number (logged prior density is complex). %! @end table %! @item Model %! Matlab's structure describing the model (initialized by dynare, see @ref{M_}). @@ -133,7 +137,7 @@ function [fval,DLIK,Hess,exit_flag,ys,trend_coeff,info,Model,DynareOptions,Bayes % set also 'exit_flag' equal to 0 instead of 1. It is only when % dsge_likelihood() is called by an optimizer called by % dynare_estimation_1() that 'exit_flag' is ignored and penalized 'fval' is -% actually used. +% actually used. % In that case, 'penalty' is properly initialized, at the very end of the % present function, by a call to dsge_likelihood() made in % initial_estimation_checks(). If a condition triggers exit_flag == @@ -176,7 +180,7 @@ end if nargout==1, analytic_derivation=0; end - + %------------------------------------------------------------------------------ % 1. Get the structural parameters & define penalties %------------------------------------------------------------------------------ @@ -332,7 +336,7 @@ if (kalman_algo == 2) || (kalman_algo == 4) else if all(all(abs(H-diag(diag(H)))<1e-14))% ie, the covariance matrix is diagonal... H = diag(H); - mmm = mm; + mmm = mm; else Z = [Z, eye(pp)]; T = blkdiag(T,zeros(pp)); @@ -381,7 +385,7 @@ switch DynareOptions.lik_init % Use standard kalman filter except if the univariate filter is explicitely choosen. if kalman_algo == 0 kalman_algo = 3; - elseif ~((kalman_algo == 3) || (kalman_algo == 4)) + elseif ~((kalman_algo == 3) || (kalman_algo == 4)) error(['diffuse filter: options_.kalman_algo can only be equal ' ... 'to 0 (default), 3 or 4']) end @@ -417,7 +421,7 @@ switch DynareOptions.lik_init else if all(all(abs(H-diag(diag(H)))<1e-14))% ie, the covariance matrix is diagonal... H1 = diag(H); - mmm = mm; + mmm = mm; else Z = [Z, eye(pp)]; T = blkdiag(T,zeros(pp)); @@ -605,8 +609,8 @@ if ((kalman_algo==1) || (kalman_algo==3))% Multivariate Kalman Filter kalman_tol, riccati_tol, ... DynareOptions.presample, ... T,Q,R,H,Z,mm,pp,rr,Zflag,diffuse_periods, ... - analytic_deriv_info{:}); - + analytic_deriv_info{:}); + end else if 0 %DynareOptions.block @@ -644,7 +648,7 @@ end if (kalman_algo==2) || (kalman_algo==4) % Univariate Kalman Filter - % resetting measurement error covariance matrix when necessary % + % resetting measurement error covariance matrix when necessary % if ~correlated_errors_have_been_checked if isequal(H,0) H = zeros(pp,1); @@ -718,18 +722,20 @@ if analytic_derivation end end - if isnan(LIK) info = 45; exit_flag = 0; return end + if imag(LIK)~=0 - likelihood = penalty; -else - likelihood = LIK; + info = 46; + exit_flag = 0; + return end +likelihood = LIK; + % ------------------------------------------------------------------------------ % 5. Adds prior if necessary % ------------------------------------------------------------------------------ @@ -751,8 +757,21 @@ if analytic_derivation else lnprior = priordens(xparam1,BayesInfo.pshape,BayesInfo.p6,BayesInfo.p7,BayesInfo.p3,BayesInfo.p4); end + fval = (likelihood-lnprior); +if isnan(fval) + info = 47; + exit_flag = 0; + return +end + +if imag(fval)~=0 + info = 48; + exit_flag = 0; + return +end + % Update DynareOptions.kalman_algo. DynareOptions.kalman_algo = kalman_algo; diff --git a/matlab/print_info.m b/matlab/print_info.m index 6e62ef0fd91b9042cafda0198a773a45cf4e275e..b406e964a004111787713a13f76ca84c7c827925 100644 --- a/matlab/print_info.m +++ b/matlab/print_info.m @@ -65,7 +65,7 @@ if ~noprint error('Some updated params are complex') case 24 error('Some updated params contain NaN or Inf') - case 30 + case 30 error('Variance can''t be computed') case 41 error('one (many) parameter(s) do(es) not satisfy the lower bound'); @@ -77,20 +77,22 @@ if ~noprint error('The covariance matrix of the measurement errors is not positive definite.'); case 45 %DsgeLikelihood_hh / dsge_likelihood error('Likelihood is not a number (NaN) or a complex number'); + case 46 %DsgeLikelihood_hh / dsge_likelihood + error('Likelihood is a complex number'); + case 47 %DsgeLikelihood_hh / dsge_likelihood + error('Prior density is not a number (NaN)'); + case 48 %DsgeLikelihood_hh / dsge_likelihood + error('Prior density is a complex number'); case 51 error('You are estimating a DSGE-VAR model, but the value of the dsge prior weight is too low!') case 52 %DsgeVarLikelihood error(''); case 61 %Discretionary policy - error(['Discretionary policy: maximum number of iterations has ' ... - 'been reached. Procedure failed. ']); + error(['Discretionary policy: maximum number of iterations has been reached. Procedure failed. ']); case 62 - error(['Discretionary policy: some eigenvalues greater than ' ... - 'options_.qz_criterium. Model potentially unstable.']); + error(['Discretionary policy: some eigenvalues greater than options_.qz_criterium. Model potentially unstable.']); case 63 - error(['Discretionary policy: NaN elements are present in the ' ... - 'solution. Procedure failed.']); - + error(['Discretionary policy: NaN elements are present in the solution. Procedure failed.']); % Aim Code Conversions by convertAimCodeToInfo.m case 102 error('Aim: roots not correctly computed by real_schur');