Added new initialization mode ofr the Kalman filter and smoother.
parent
664997eec8
commit
b281830983
|
@ -118,25 +118,50 @@ if options_.lik_init == 1 % Kalman filter
|
||||||
end
|
end
|
||||||
Pstar = lyapunov_symm(T,R*Q*transpose(R),options_.qz_criterium,options_.lyapunov_complex_threshold);
|
Pstar = lyapunov_symm(T,R*Q*transpose(R),options_.qz_criterium,options_.lyapunov_complex_threshold);
|
||||||
Pinf = [];
|
Pinf = [];
|
||||||
elseif options_.lik_init == 2 % Old Diffuse Kalman filter
|
elseif options_.lik_init == 2 % Old Diffuse Kalman filter
|
||||||
if kalman_algo ~= 2
|
if kalman_algo ~= 2
|
||||||
kalman_algo = 1;
|
kalman_algo = 1;
|
||||||
end
|
end
|
||||||
Pstar = options_.Harvey_scale_factor*eye(np);
|
Pstar = options_.Harvey_scale_factor*eye(np);
|
||||||
Pinf = [];
|
Pinf = [];
|
||||||
elseif options_.lik_init == 3 % Diffuse Kalman filter
|
elseif options_.lik_init == 3 % Diffuse Kalman filter
|
||||||
if kalman_algo ~= 4
|
if kalman_algo ~= 4
|
||||||
kalman_algo = 3;
|
kalman_algo = 3;
|
||||||
end
|
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);
|
||||||
elseif options_.lik_init == 4
|
elseif options_.lik_init == 4 % Start from the solution of the Riccati equation.
|
||||||
% 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,nobs)),H);
|
[err, Pstar] = kalman_steady_state(transpose(T),R*Q*transpose(R),transpose(build_selection_matrix(mf,np,nobs)),H);
|
||||||
mexErrCheck('kalman_steady_state',err);
|
mexErrCheck('kalman_steady_state',err);
|
||||||
Pinf = [];
|
Pinf = [];
|
||||||
if kalman_algo~=2
|
if kalman_algo~=2
|
||||||
kalman_algo = 1;
|
kalman_algo = 1;
|
||||||
end
|
end
|
||||||
|
elseif options_.lik_init == 5 % Old diffuse Kalman filter only for the non stationary variables
|
||||||
|
[eigenvect, eigenv] = eig(T);
|
||||||
|
eigenv = diag(eigenv);
|
||||||
|
nstable = length(find(abs(abs(eigenv)-1) > 1e-7));
|
||||||
|
unstable = find(abs(abs(eigenv)-1) < 1e-7);
|
||||||
|
V = eigenvect(:,unstable);
|
||||||
|
indx_unstable = find(sum(abs(V),2)>1e-5);
|
||||||
|
stable = find(sum(abs(V),2)<1e-5);
|
||||||
|
nunit = length(eigenv) - nstable;
|
||||||
|
Pstar = options_.Harvey_scale_factor*eye(np);
|
||||||
|
if kalman_algo ~= 2
|
||||||
|
kalman_algo = 1;
|
||||||
|
end
|
||||||
|
R_tmp = R(stable, :);
|
||||||
|
T_tmp = T(stable,stable);
|
||||||
|
if DynareOptions.lyapunov_fp == 1
|
||||||
|
Pstar_tmp = lyapunov_symm(T_tmp,Q,DynareOptions.lyapunov_fixed_point_tol,DynareOptions.lyapunov_complex_threshold, 3, R_tmp);
|
||||||
|
elseif DynareOptions.lyapunov_db == 1
|
||||||
|
Pstar_tmp = disclyap_fast(T_tmp,R_tmp*Q*R_tmp',DynareOptions.lyapunov_doubling_tol);
|
||||||
|
elseif DynareOptions.lyapunov_srs == 1
|
||||||
|
Pstar_tmp = lyapunov_symm(T_tmp,Q,DynareOptions.lyapunov_fixed_point_tol,DynareOptions.lyapunov_complex_threshold, 4, R_tmp);
|
||||||
|
else
|
||||||
|
Pstar_tmp = lyapunov_symm(T_tmp,R_tmp*Q*R_tmp',DynareOptions.qz_criterium,DynareOptions.lyapunov_complex_threshold);
|
||||||
|
end
|
||||||
|
Pstar(stable, stable) = Pstar_tmp;
|
||||||
|
Pinf = [];
|
||||||
end
|
end
|
||||||
kalman_tol = options_.kalman_tol;
|
kalman_tol = options_.kalman_tol;
|
||||||
riccati_tol = options_.riccati_tol;
|
riccati_tol = options_.riccati_tol;
|
||||||
|
|
|
@ -373,7 +373,6 @@ switch DynareOptions.lik_init
|
||||||
error(['diffuse filter: options_.kalman_algo can only be equal ' ...
|
error(['diffuse filter: options_.kalman_algo can only be equal ' ...
|
||||||
'to 0 (default), 3 or 4'])
|
'to 0 (default), 3 or 4'])
|
||||||
end
|
end
|
||||||
|
|
||||||
[Z,T,R,QT,Pstar,Pinf] = schur_statespace_transformation(Z,T,R,Q,DynareOptions.qz_criterium);
|
[Z,T,R,QT,Pstar,Pinf] = schur_statespace_transformation(Z,T,R,Q,DynareOptions.qz_criterium);
|
||||||
Zflag = 1;
|
Zflag = 1;
|
||||||
% Run diffuse kalman filter on first periods.
|
% Run diffuse kalman filter on first periods.
|
||||||
|
@ -453,6 +452,32 @@ switch DynareOptions.lik_init
|
||||||
Pinf = [];
|
Pinf = [];
|
||||||
a = zeros(mm,1);
|
a = zeros(mm,1);
|
||||||
Zflag = 0;
|
Zflag = 0;
|
||||||
|
elseif options_.lik_init == 5 % Old diffuse Kalman filter only for the non stationary variables
|
||||||
|
[eigenvect, eigenv] = eig(T);
|
||||||
|
eigenv = diag(eigenv);
|
||||||
|
nstable = length(find(abs(abs(eigenv)-1) > 1e-7));
|
||||||
|
unstable = find(abs(abs(eigenv)-1) < 1e-7);
|
||||||
|
V = eigenvect(:,unstable);
|
||||||
|
indx_unstable = find(sum(abs(V),2)>1e-5);
|
||||||
|
stable = find(sum(abs(V),2)<1e-5);
|
||||||
|
nunit = length(eigenv) - nstable;
|
||||||
|
Pstar = options_.Harvey_scale_factor*eye(np);
|
||||||
|
if kalman_algo ~= 2
|
||||||
|
kalman_algo = 1;
|
||||||
|
end
|
||||||
|
R_tmp = R(stable, :);
|
||||||
|
T_tmp = T(stable,stable);
|
||||||
|
if DynareOptions.lyapunov_fp == 1
|
||||||
|
Pstar_tmp = lyapunov_symm(T_tmp,Q,DynareOptions.lyapunov_fixed_point_tol,DynareOptions.lyapunov_complex_threshold, 3, R_tmp);
|
||||||
|
elseif DynareOptions.lyapunov_db == 1
|
||||||
|
Pstar_tmp = disclyap_fast(T_tmp,R_tmp*Q*R_tmp',DynareOptions.lyapunov_doubling_tol);
|
||||||
|
elseif DynareOptions.lyapunov_srs == 1
|
||||||
|
Pstar_tmp = lyapunov_symm(T_tmp,Q,DynareOptions.lyapunov_fixed_point_tol,DynareOptions.lyapunov_complex_threshold, 4, R_tmp);
|
||||||
|
else
|
||||||
|
Pstar_tmp = lyapunov_symm(T_tmp,R_tmp*Q*R_tmp',DynareOptions.qz_criterium,DynareOptions.lyapunov_complex_threshold);
|
||||||
|
end
|
||||||
|
Pstar(stable, stable) = Pstar_tmp;
|
||||||
|
Pinf = [];
|
||||||
otherwise
|
otherwise
|
||||||
error('dsge_likelihood:: Unknown initialization approach for the Kalman filter!')
|
error('dsge_likelihood:: Unknown initialization approach for the Kalman filter!')
|
||||||
end
|
end
|
||||||
|
|
Loading…
Reference in New Issue