From e637319be5eb6436fea72fd9e49abd2a88dc557e Mon Sep 17 00:00:00 2001 From: Marco Ratto Date: Fri, 14 Sep 2012 17:05:35 +0200 Subject: [PATCH 1/2] bug fix. the diffuse filter should simply penalize the likelihood with the NaN without breaking the estimation (this is in line with missing_observations_kalman_filter_d.m). --- matlab/dsge_likelihood.m | 7 +++++++ matlab/kalman/likelihood/univariate_kalman_filter_d.m | 4 ++-- 2 files changed, 9 insertions(+), 2 deletions(-) diff --git a/matlab/dsge_likelihood.m b/matlab/dsge_likelihood.m index 0aaee7215..c6ab3ccd9 100644 --- a/matlab/dsge_likelihood.m +++ b/matlab/dsge_likelihood.m @@ -427,6 +427,13 @@ switch DynareOptions.lik_init T,R,Q,H1,Z,mmm,pp,rr); diffuse_periods = length(dlik); end + if isnan(dLIK), + fval=dLIK; + info = 45; + exit_flag = 0; + return + end + case 4% Start from the solution of the Riccati equation. if kalman_algo ~= 2 kalman_algo = 1; diff --git a/matlab/kalman/likelihood/univariate_kalman_filter_d.m b/matlab/kalman/likelihood/univariate_kalman_filter_d.m index e983fd820..7bf16ef57 100644 --- a/matlab/kalman/likelihood/univariate_kalman_filter_d.m +++ b/matlab/kalman/likelihood/univariate_kalman_filter_d.m @@ -155,8 +155,8 @@ while newRank && (t<=last) end if (t>last) - error(['univariate_diffuse_kalman_filter:: There isn''t enough information to estimate the initial conditions of the nonstationary variables']); - LIK = NaN; + warning(['univariate_diffuse_kalman_filter:: There isn''t enough information to estimate the initial conditions of the nonstationary variables']); + dLIK = NaN; return end From b756ee1819cad27e0151e76dc6f3929baf05ed18 Mon Sep 17 00:00:00 2001 From: Marco Ratto Date: Fri, 14 Sep 2012 17:07:38 +0200 Subject: [PATCH 2/2] Analytic derivatives: make them work for lik_init==2 as well (lik_init =3 and =4 still to be worked out) --- matlab/dsge_likelihood.m | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/matlab/dsge_likelihood.m b/matlab/dsge_likelihood.m index c6ab3ccd9..256e04dba 100644 --- a/matlab/dsge_likelihood.m +++ b/matlab/dsge_likelihood.m @@ -523,6 +523,7 @@ if analytic_derivation, D2P=sparse(size(D2Om,1),size(D2Om,2)); %zeros([size(T),length(xparam1),length(xparam1)]); jcount=0; end + if DynareOptions.lik_init==1, for i=1:EstimatedParameters.nvx k =EstimatedParameters.var_exo(i,1); DQ(k,k,i) = 2*sqrt(Q(k,k)); @@ -541,6 +542,7 @@ if analytic_derivation, end end end + end offset = EstimatedParameters.nvx; for i=1:EstimatedParameters.nvn k = EstimatedParameters.var_endo(i,1); @@ -550,6 +552,7 @@ if analytic_derivation, end end offset = offset + EstimatedParameters.nvn; + if DynareOptions.lik_init==1, for j=1:EstimatedParameters.np dum = lyapunov_symm(T,DT(:,:,j+offset)*Pstar*T'+T*Pstar*DT(:,:,j+offset)'+DOm(:,:,j+offset),DynareOptions.qz_criterium,DynareOptions.lyapunov_complex_threshold); % kk = find(abs(dum) < 1e-12); @@ -572,6 +575,7 @@ if analytic_derivation, end end end + end if analytic_derivation==1, analytic_deriv_info={analytic_derivation,DT,DYss,DOm,DH,DP,asy_Hess}; else