Added new option (diffuse_kalman_tol) and fixed tolerance paremeters in diffuse smoother routines.
parent
e97e5c3407
commit
090c4fedbd
|
@ -5221,6 +5221,8 @@ singularity is encountered, Dynare by default automatically switches to the univ
|
|||
@item kalman_tol = @var{DOUBLE}
|
||||
@anchor{kalman_tol} Numerical tolerance for determining the singularity of the covariance matrix of the prediction errors during the Kalman filter (minimum allowed reciprocal of the matrix condition number). Default value is @code{1e-10}
|
||||
|
||||
@item diffuse_kalman_tol = @var{DOUBLE}
|
||||
@anchor{diffuse_kalman_tol} Numerical tolerance for determining the singularity of the covariance matrix of the prediction errors (@math{F_{\infty}}) and the rank of the covariance matrix of the state variables (@math{P_{\infty}}) during the Diffuse Kalman filter. Default value is @code{1e-8}
|
||||
|
||||
@item filter_covariance
|
||||
@anchor{filter_covariance} Saves the series of one step ahead error of
|
||||
|
|
|
@ -175,6 +175,7 @@ elseif options_.lik_init == 5 % Old diffuse Kalman filter only for th
|
|||
Pinf = [];
|
||||
end
|
||||
kalman_tol = options_.kalman_tol;
|
||||
diffuse_kalman_tol = options_.diffuse_kalman_tol;
|
||||
riccati_tol = options_.riccati_tol;
|
||||
data1 = Y-trend;
|
||||
% -----------------------------------------------------------------------------
|
||||
|
@ -200,7 +201,7 @@ if kalman_algo == 1 || kalman_algo == 3
|
|||
[alphahat,epsilonhat,etahat,ahat,P,aK,PK,decomp] = missing_DiffuseKalmanSmootherH1_Z(ST, ...
|
||||
Z,R1,Q,H,Pinf,Pstar, ...
|
||||
data1,vobs,np,smpl,data_index, ...
|
||||
options_.nk,kalman_tol,options_.filter_decomposition);
|
||||
options_.nk,kalman_tol,diffuse_kalman_tol,options_.filter_decomposition);
|
||||
if isinf(alphahat)
|
||||
if kalman_algo == 1
|
||||
kalman_algo = 2;
|
||||
|
@ -227,7 +228,7 @@ if kalman_algo == 2 || kalman_algo == 4
|
|||
[alphahat,epsilonhat,etahat,ahat,P,aK,PK,decomp] = missing_DiffuseKalmanSmootherH3_Z(ST, ...
|
||||
Z,R1,Q,diag(H), ...
|
||||
Pinf,Pstar,data1,vobs,np,smpl,data_index, ...
|
||||
options_.nk,kalman_tol,...
|
||||
options_.nk,kalman_tol,diffuse_kalman_tol, ...
|
||||
options_.filter_decomposition);
|
||||
end
|
||||
|
||||
|
|
|
@ -387,6 +387,7 @@ options_.nobs = NaN;
|
|||
options_.kalman_algo = 0;
|
||||
options_.fast_kalman = 0;
|
||||
options_.kalman_tol = 1e-10;
|
||||
options_.diffuse_kalman_tol = 1e-8;
|
||||
options_.use_univariate_filters_if_singularity_is_detected = 1;
|
||||
options_.riccati_tol = 1e-6;
|
||||
options_.lik_algo = 1;
|
||||
|
|
|
@ -1,6 +1,6 @@
|
|||
function [alphahat,epsilonhat,etahat,atilde,P,aK,PK,decomp] = missing_DiffuseKalmanSmootherH1_Z(T,Z,R,Q,H,Pinf1,Pstar1,Y,pp,mm,smpl,data_index,nk,kalman_tol,decomp_flag)
|
||||
function [alphahat,epsilonhat,etahat,atilde,P,aK,PK,decomp] = missing_DiffuseKalmanSmootherH1_Z(T,Z,R,Q,H,Pinf1,Pstar1,Y,pp,mm,smpl,data_index,nk,kalman_tol,diffuse_kalman_tol,decomp_flag)
|
||||
|
||||
% function [alphahat,epsilonhat,etahat,a,aK,PK,decomp] = DiffuseKalmanSmoother1(T,Z,R,Q,H,Pinf1,Pstar1,Y,pp,mm,smpl,data_index,nk,kalman_tol,decomp_flag)
|
||||
% function [alphahat,epsilonhat,etahat,a,aK,PK,decomp] = DiffuseKalmanSmoother1(T,Z,R,Q,H,Pinf1,Pstar1,Y,pp,mm,smpl,data_index,nk,kalman_tol,diffuse_kalman_tol,decomp_flag)
|
||||
% Computes the diffuse kalman smoother without measurement error, in the case of a non-singular var-cov matrix
|
||||
%
|
||||
% INPUTS
|
||||
|
@ -18,6 +18,7 @@ function [alphahat,epsilonhat,etahat,atilde,P,aK,PK,decomp] = missing_DiffuseKal
|
|||
% data_index [cell] 1*smpl cell of column vectors of indices.
|
||||
% nk number of forecasting periods
|
||||
% kalman_tol tolerance for reciprocal condition number
|
||||
% diffuse_kalman_tol tolerance for reciprocal condition number (for Finf) and the rank of Pinf
|
||||
% decomp_flag if true, compute filter decomposition
|
||||
%
|
||||
% OUTPUTS
|
||||
|
@ -38,7 +39,7 @@ function [alphahat,epsilonhat,etahat,atilde,P,aK,PK,decomp] = missing_DiffuseKal
|
|||
% Models", S.J. Koopman and J. Durbin (2003, in Journal of Time Series
|
||||
% Analysis, vol. 24(1), pp. 85-98).
|
||||
|
||||
% Copyright (C) 2004-2011 Dynare Team
|
||||
% Copyright (C) 2004-2015 Dynare Team
|
||||
%
|
||||
% This file is part of Dynare.
|
||||
%
|
||||
|
@ -80,7 +81,6 @@ Kstar = zeros(mm,pp,smpl);
|
|||
P = zeros(mm,mm,smpl+1);
|
||||
Pstar = zeros(spstar(1),spstar(2),smpl+1); Pstar(:,:,1) = Pstar1;
|
||||
Pinf = zeros(spinf(1),spinf(2),smpl+1); Pinf(:,:,1) = Pinf1;
|
||||
crit1 = 1.e-8;
|
||||
steady = smpl;
|
||||
rr = size(Q,1);
|
||||
QQ = R*Q*transpose(R);
|
||||
|
@ -91,7 +91,7 @@ epsilonhat = zeros(rr,smpl);
|
|||
r = zeros(mm,smpl+1);
|
||||
|
||||
t = 0;
|
||||
while rank(Pinf(:,:,t+1),crit1) && t<smpl
|
||||
while rank(Pinf(:,:,t+1),diffuse_kalman_tol) && t<smpl
|
||||
t = t+1;
|
||||
di = data_index{t};
|
||||
if isempty(di)
|
||||
|
@ -103,8 +103,8 @@ while rank(Pinf(:,:,t+1),crit1) && t<smpl
|
|||
ZZ = Z(di,:);
|
||||
v(di,t)= Y(di,t) - ZZ*a(:,t);
|
||||
Finf = ZZ*Pinf(:,:,t)*ZZ';
|
||||
if rcond(Finf) < kalman_tol
|
||||
if ~all(abs(Finf(:)) < kalman_tol)
|
||||
if rcond(Finf) < diffuse_kalman_tol
|
||||
if ~all(abs(Finf(:)) < diffuse_kalman_tol)
|
||||
% The univariate diffuse kalman filter should be used.
|
||||
alphahat = Inf;
|
||||
return
|
||||
|
@ -170,7 +170,7 @@ while notsteady && t<smpl
|
|||
F = ZZ*P(:,:,t)*ZZ' + H(di,di);
|
||||
if rcond(F) < kalman_tol
|
||||
alphahat = Inf;
|
||||
return
|
||||
return
|
||||
end
|
||||
iF(di,di,t) = inv(F);
|
||||
PZI = P(:,:,t)*ZZ'*iF(di,di,t);
|
||||
|
|
|
@ -1,4 +1,4 @@
|
|||
function [alphahat,epsilonhat,etahat,a,P,aK,PK,decomp] = missing_DiffuseKalmanSmootherH3_Z(T,Z,R,Q,H,Pinf1,Pstar1,Y,pp,mm,smpl,data_index,nk,kalman_tol,decomp_flag)
|
||||
function [alphahat,epsilonhat,etahat,a,P,aK,PK,decomp] = missing_DiffuseKalmanSmootherH3_Z(T,Z,R,Q,H,Pinf1,Pstar1,Y,pp,mm,smpl,data_index,nk,kalman_tol,diffuse_kalman_tol,decomp_flag)
|
||||
% function [alphahat,epsilonhat,etahat,a1,P,aK,PK,d,decomp] = missing_DiffuseKalmanSmootherH3_Z(T,Z,R,Q,H,Pinf1,Pstar1,Y,pp,mm,smpl,data_index,nk,kalman_tol,decomp_flag)
|
||||
% Computes the diffuse kalman smoother without measurement error, in the case of a singular var-cov matrix.
|
||||
% Univariate treatment of multivariate time series.
|
||||
|
@ -17,7 +17,8 @@ function [alphahat,epsilonhat,etahat,a,P,aK,PK,decomp] = missing_DiffuseKalmanSm
|
|||
% smpl: sample size
|
||||
% data_index [cell] 1*smpl cell of column vectors of indices.
|
||||
% nk number of forecasting periods
|
||||
% kalman_tol tolerance for zero divider
|
||||
% kalman_tol tolerance for zero divider
|
||||
% diffuse_kalman_tol tolerance for zero divider
|
||||
% decomp_flag if true, compute filter decomposition
|
||||
%
|
||||
% OUTPUTS
|
||||
|
@ -38,7 +39,7 @@ function [alphahat,epsilonhat,etahat,a,P,aK,PK,decomp] = missing_DiffuseKalmanSm
|
|||
% Models", S.J. Koopman and J. Durbin (2003, in Journal of Time Series
|
||||
% Analysis, vol. 24(1), pp. 85-98).
|
||||
|
||||
% Copyright (C) 2004-2011 Dynare Team
|
||||
% Copyright (C) 2004-2015 Dynare Team
|
||||
%
|
||||
% This file is part of Dynare.
|
||||
%
|
||||
|
@ -80,7 +81,6 @@ Pstar = zeros(spstar(1),spstar(2),smpl); Pstar(:,:,1) = Pstar1;
|
|||
Pinf = zeros(spinf(1),spinf(2),smpl); Pinf(:,:,1) = Pinf1;
|
||||
Pstar1 = Pstar;
|
||||
Pinf1 = Pinf;
|
||||
crit1 = 1.e-6;
|
||||
steady = smpl;
|
||||
rr = size(Q,1); % number of structural shocks
|
||||
QQ = R*Q*transpose(R);
|
||||
|
@ -92,7 +92,7 @@ r = zeros(mm,smpl);
|
|||
|
||||
t = 0;
|
||||
icc=0;
|
||||
newRank = rank(Pinf(:,:,1),crit1);
|
||||
newRank = rank(Pinf(:,:,1),diffuse_kalman_tol);
|
||||
while newRank && t < smpl
|
||||
t = t+1;
|
||||
a(:,t) = a1(:,t);
|
||||
|
@ -121,7 +121,7 @@ while newRank && t < smpl
|
|||
end
|
||||
end
|
||||
if newRank
|
||||
oldRank = rank(Pinf(:,:,t),crit1);
|
||||
oldRank = rank(Pinf(:,:,t),diffuse_kalman_tol);
|
||||
else
|
||||
oldRank = 0;
|
||||
end
|
||||
|
@ -134,7 +134,7 @@ while newRank && t < smpl
|
|||
Pinf(:,:,t+1) = T*Pinf(:,:,t)*T';
|
||||
P0=Pinf(:,:,t+1);
|
||||
if newRank,
|
||||
newRank = rank(Pinf(:,:,t+1),crit1);
|
||||
newRank = rank(Pinf(:,:,t+1),diffuse_kalman_tol);
|
||||
end
|
||||
if oldRank ~= newRank
|
||||
disp('univariate_diffuse_kalman_filter:: T does influence the rank of Pinf!')
|
||||
|
|
|
@ -101,7 +101,7 @@ class ParsingDriver;
|
|||
%token IDENTIFICATION INF_CONSTANT INITVAL INITVAL_FILE BOUNDS JSCALE INIT INFILE INVARS
|
||||
%token <string_val> INT_NUMBER
|
||||
%token INV_GAMMA_PDF INV_GAMMA1_PDF INV_GAMMA2_PDF IRF IRF_SHOCKS IRF_PLOT_THRESHOLD IRF_CALIBRATION
|
||||
%token KALMAN_ALGO KALMAN_TOL SUBSAMPLES OPTIONS TOLF
|
||||
%token KALMAN_ALGO KALMAN_TOL DIFFUSE_KALMAN_TOL SUBSAMPLES OPTIONS TOLF
|
||||
%token LAPLACE LIK_ALGO LIK_INIT LINEAR LOAD_IDENT_FILES LOAD_MH_FILE LOAD_PARAMS_AND_STEADY_STATE LOGLINEAR LOGDATA LYAPUNOV
|
||||
%token LYAPUNOV_FIXED_POINT_TOL LYAPUNOV_DOUBLING_TOL LYAPUNOV_SQUARE_ROOT_SOLVER_TOL LOG_DEFLATOR LOG_TREND_VAR LOG_GROWTH_FACTOR MARKOWITZ MARGINAL_DENSITY MAX MAXIT
|
||||
%token MFS MH_CONF_SIG MH_DROP MH_INIT_SCALE MH_JSCALE MH_MODE MH_NBLOCKS MH_REPLIC MH_RECOVER POSTERIOR_MAX_SUBSAMPLE_DRAWS MIN MINIMAL_SOLVING_PERIODS
|
||||
|
@ -1664,6 +1664,7 @@ estimation_options : o_datafile
|
|||
| o_filtered_vars
|
||||
| o_kalman_algo
|
||||
| o_kalman_tol
|
||||
| o_diffuse_kalman_tol
|
||||
| o_xls_sheet
|
||||
| o_xls_range
|
||||
| o_filter_step_ahead
|
||||
|
@ -2643,6 +2644,7 @@ o_filtered_vars : FILTERED_VARS { driver.option_num("filtered_vars", "1"); };
|
|||
o_relative_irf : RELATIVE_IRF { driver.option_num("relative_irf", "1"); };
|
||||
o_kalman_algo : KALMAN_ALGO EQUAL INT_NUMBER { driver.option_num("kalman_algo", $3); };
|
||||
o_kalman_tol : KALMAN_TOL EQUAL non_negative_number { driver.option_num("kalman_tol", $3); };
|
||||
o_diffuse_kalman_tol : DIFFUSE_KALMAN_TOL EQUAL non_negative_number { driver.option_num("diffuse_kalman_tol", $3); };
|
||||
o_marginal_density : MARGINAL_DENSITY EQUAL LAPLACE
|
||||
{ driver.option_str("mc_marginal_density", "laplace"); }
|
||||
| MARGINAL_DENSITY EQUAL MODIFIEDHARMONICMEAN
|
||||
|
|
|
@ -288,6 +288,7 @@ DATE -?[0-9]+([YyAa]|[Mm]([1-9]|1[0-2])|[Qq][1-4]|[Ww]([1-9]{1}|[1-4][0-9]|5[0-2
|
|||
<DYNARE_STATEMENT>nodiagnostic {return token::NODIAGNOSTIC;}
|
||||
<DYNARE_STATEMENT>kalman_algo {return token::KALMAN_ALGO;}
|
||||
<DYNARE_STATEMENT>kalman_tol {return token::KALMAN_TOL;}
|
||||
<DYNARE_STATEMENT>diffuse_kalman_tol {return token::DIFFUSE_KALMAN_TOL;}
|
||||
<DYNARE_STATEMENT>forecast {return token::FORECAST;}
|
||||
<DYNARE_STATEMENT>smoother {return token::SMOOTHER;}
|
||||
<DYNARE_STATEMENT>bayesian_irf {return token::BAYESIAN_IRF;}
|
||||
|
|
Loading…
Reference in New Issue