diff --git a/matlab/DsgeSmoother.m b/matlab/DsgeSmoother.m index 74faa49e5..0140ecf12 100644 --- a/matlab/DsgeSmoother.m +++ b/matlab/DsgeSmoother.m @@ -147,7 +147,9 @@ elseif options_.lik_init == 3 % Diffuse Kalman filter if kalman_algo ~= 4 kalman_algo = 3; end - [Z,ST,R1,QT,Pstar,Pinf] = schur_statespace_transformation(mf,T,R,Q,options_.qz_criterium); + [Z,ST,R1,QT,Pstar,Pinf] = schur_statespace_transformation(mf,T,R,Q,options_.qz_criterium,oo_.dr.restrict_var_list); + Pinf = QT*Pinf*QT'; + Pstar = QT*Pstar*QT'; elseif options_.lik_init == 4 % Start from the solution of the Riccati equation. [err, Pstar] = kalman_steady_state(transpose(T),R*Q*transpose(R),transpose(build_selection_matrix(mf,np,vobs)),H); mexErrCheck('kalman_steady_state',err); @@ -196,13 +198,11 @@ if ~missing_value end end -if kalman_algo == 1 || kalman_algo == 2 - ST = T; - R1 = R; - Z = zeros(vobs,size(T,2)); - for i=1:vobs - Z(i,mf(i)) = 1; - end +ST = T; +R1 = R; +Z = zeros(vobs,size(T,2)); +for i=1:vobs + Z(i,mf(i)) = 1; end if kalman_algo == 1 || kalman_algo == 3 @@ -240,25 +240,6 @@ if kalman_algo == 2 || kalman_algo == 4 options_.filter_decomposition); end -if kalman_algo == 3 || kalman_algo == 4 - alphahat = QT*alphahat; - ahat = QT*ahat; - nk = options_.nk; - for jnk=1:nk - aK(jnk,:,:) = QT*dynare_squeeze(aK(jnk,:,:)); - for i=1:size(PK,4) - PK(jnk,:,:,i) = QT*dynare_squeeze(PK(jnk,:,:,i))*QT'; - end - if options_.filter_decomposition - for i=1:size(decomp,4) - decomp(jnk,:,:,i) = QT*dynare_squeeze(decomp(jnk,:,:,i)); - end - end - end - for i=1:size(P,4) - P(:,:,i) = QT*dynare_squeeze(P(:,:,i))*QT'; - end -end if estim_params_.ncn && (kalman_algo == 2 || kalman_algo == 4) % extracting measurement errors diff --git a/matlab/dsge_likelihood.m b/matlab/dsge_likelihood.m index fa9996f87..59198bfda 100644 --- a/matlab/dsge_likelihood.m +++ b/matlab/dsge_likelihood.m @@ -398,11 +398,20 @@ switch DynareOptions.lik_init error(['The model requires Diffuse filter, but you specified a different Kalman filter. You must set options_.kalman_algo ' ... 'to 0 (default), 3 or 4']) end - [Z,T,R,QT,Pstar,Pinf] = schur_statespace_transformation(Z,T,R,Q,DynareOptions.qz_criterium); + [Ztmp,Ttmp,Rtmp,QT,Pstar,Pinf] = schur_statespace_transformation(Z,T,R,Q,DynareOptions.qz_criterium,[1:length(T)]); + Pinf = QT*Pinf*QT'; + Pstar = QT*Pstar*QT'; + Z1=Ztmp*0; + for jz=1:length(Z) + Z1(jz,Z(jz))=1; + end + Z=Z1; + clear Ztmp Z1 Zflag = 1; % Run diffuse kalman filter on first periods. if (kalman_algo==3) % Multivariate Diffuse Kalman Filter + Pstar0 = Pstar; % store Pstar if no_missing_data_flag [dLIK,dlik,a,Pstar] = kalman_filter_d(Y, 1, size(Y,2), ... zeros(mm,1), Pinf, Pstar, ... @@ -419,6 +428,7 @@ switch DynareOptions.lik_init if isinf(dLIK) % Go to univariate diffuse filter if singularity problem. singular_diffuse_filter = 1; + Pstar = Pstar0; end end if singular_diffuse_filter || (kalman_algo==4) @@ -693,7 +703,11 @@ if ((kalman_algo==1) || (kalman_algo==3))% Multivariate Kalman Filter if DynareOptions.lik_init==3 LIK = LIK + dLIK; if analytic_derivation==0 && nargout==2, - lik = [dlik; lik]; + if ~singular_diffuse_filter, + lik = [dlik; lik]; + else + lik = [sum(dlik,2); lik]; + end end end end diff --git a/matlab/kalman/likelihood/kalman_filter.m b/matlab/kalman/likelihood/kalman_filter.m index 8dee95f06..14208f471 100644 --- a/matlab/kalman/likelihood/kalman_filter.m +++ b/matlab/kalman/likelihood/kalman_filter.m @@ -169,7 +169,8 @@ while notsteady && t<=last v = Y(:,t)-a(Z); F = P(Z,Z) + H; end - if rcond(F) < kalman_tol + sig=sqrt(diag(F)); + if any(diag(F)kalman_tol && newRank + if Finf>diffuse_kalman_tol && newRank Kinf = Pinf*Zi'; Kinf_Finf = Kinf/Finf; a = a + Kinf_Finf*prediction_error; diff --git a/matlab/missing_DiffuseKalmanSmootherH1_Z.m b/matlab/missing_DiffuseKalmanSmootherH1_Z.m index 9fc09eb30..b50416072 100644 --- a/matlab/missing_DiffuseKalmanSmootherH1_Z.m +++ b/matlab/missing_DiffuseKalmanSmootherH1_Z.m @@ -168,11 +168,13 @@ while notsteady && t kalman_tol && newRank + if Finf(i,t) > diffuse_kalman_tol && newRank icc=icc+1; Kinf(:,i,t) = Pinf(:,:,t)*Zi'; Kinf_Finf = Kinf(:,i,t)/Finf(i,t); @@ -233,7 +233,7 @@ if d for t = d:-1:1 di = flipud(data_index{t})'; for i = di - if Finf(i,t) > kalman_tol + if Finf(i,t) > diffuse_kalman_tol r1(:,t) = Z(i,:)'*v(i,t)/Finf(i,t) + ... (Kinf(:,i,t)'*Fstar(i,t)/Finf(i,t)-Kstar(:,i,t)')*r0(:,t)/Finf(i,t)*Z(i,:)' + ... r1(:,t)-Kinf(:,i,t)'*r1(:,t)/Finf(i,t)*Z(i,:)';