- 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 stepstime-shift
parent
05fc096569
commit
0aa7e15d58
|
@ -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
|
||||
|
|
|
@ -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
|
||||
|
|
Loading…
Reference in New Issue