- Once Schur stape space transformation is done, map immediately Pinf and Pstar onto the original variablesm to avoid propagation of errors related to multiple unit and zero eigenvalues.

- ensure that smoother and filter get the same Pstar and Pinf in diffuse steps
time-shift
Marco Ratto 2015-10-13 17:26:39 +02:00
parent 05fc096569
commit 0aa7e15d58
2 changed files with 24 additions and 29 deletions

View File

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

View File

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