fixed handling of correlation in covariance of measurement errors
parent
c87e208eb2
commit
30afa5f415
|
@ -313,6 +313,33 @@ Y = DynareDataset.data-trend;
|
||||||
% 3. Initial condition of the Kalman filter
|
% 3. Initial condition of the Kalman filter
|
||||||
%------------------------------------------------------------------------------
|
%------------------------------------------------------------------------------
|
||||||
kalman_algo = DynareOptions.kalman_algo;
|
kalman_algo = DynareOptions.kalman_algo;
|
||||||
|
|
||||||
|
% resetting measurement errors covariance matrix for univariate filters
|
||||||
|
no_correlation_flag = 1;
|
||||||
|
if (kalman_algo == 2) || (kalman_algo == 4)
|
||||||
|
if isequal(H,0)
|
||||||
|
H = zeros(nobs,1);
|
||||||
|
else
|
||||||
|
if all(all(abs(H-diag(diag(H)))<1e-14))% ie, the covariance matrix is diagonal...
|
||||||
|
H = diag(H);
|
||||||
|
else
|
||||||
|
no_correlation_flag = 0;
|
||||||
|
end
|
||||||
|
end
|
||||||
|
if no_correlation_flag
|
||||||
|
mmm = mm;
|
||||||
|
else
|
||||||
|
Z = [Z, eye(pp)];
|
||||||
|
T = blkdiag(T,zeros(pp));
|
||||||
|
Q = blkdiag(Q,H);
|
||||||
|
R = blkdiag(R,eye(pp));
|
||||||
|
Pstar = blkdiag(Pstar,H);
|
||||||
|
Pinf = blckdiag(Pinf,zeros(pp));
|
||||||
|
mmm = mm+pp;
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
|
||||||
diffuse_periods = 0;
|
diffuse_periods = 0;
|
||||||
switch DynareOptions.lik_init
|
switch DynareOptions.lik_init
|
||||||
case 1% Standard initialization with the steady state of the state equation.
|
case 1% Standard initialization with the steady state of the state equation.
|
||||||
|
@ -363,17 +390,6 @@ switch DynareOptions.lik_init
|
||||||
end
|
end
|
||||||
if (kalman_algo==4)
|
if (kalman_algo==4)
|
||||||
% Univariate Diffuse Kalman Filter
|
% Univariate Diffuse Kalman Filter
|
||||||
if no_correlation_flag
|
|
||||||
mmm = mm;
|
|
||||||
else
|
|
||||||
Z = [Z, eye(pp)];
|
|
||||||
T = blkdiag(T,zeros(pp));
|
|
||||||
Q = blkdiag(Q,H);
|
|
||||||
R = blkdiag(R,eye(pp));
|
|
||||||
Pstar = blkdiag(Pstar,H);
|
|
||||||
Pinf = blckdiag(Pinf,zeros(pp));
|
|
||||||
mmm = mm+pp;
|
|
||||||
end
|
|
||||||
[dLIK,tmp,a,Pstar] = univariate_kalman_filter_d(DynareDataset.missing.aindex,DynareDataset.missing.number_of_observations,DynareDataset.missing.no_more_missing_observations, ...
|
[dLIK,tmp,a,Pstar] = univariate_kalman_filter_d(DynareDataset.missing.aindex,DynareDataset.missing.number_of_observations,DynareDataset.missing.no_more_missing_observations, ...
|
||||||
Y, 1, size(Y,2), ...
|
Y, 1, size(Y,2), ...
|
||||||
zeros(mmm,1), Pinf, Pstar, ...
|
zeros(mmm,1), Pinf, Pstar, ...
|
||||||
|
@ -498,9 +514,20 @@ if ((kalman_algo==1) || (kalman_algo==3))% Multivariate Kalman Filter
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
if ( (singularity_flag) || (kalman_algo==2) || (kalman_algo==4) )% Univariate Kalman Filter
|
if ( singularity_flag || (kalman_algo==2) || (kalman_algo==4) )
|
||||||
|
% Univariate Kalman Filter
|
||||||
|
% resetting measurement error covariance matrix when necessary %
|
||||||
if singularity_flag
|
if singularity_flag
|
||||||
if no_correlation
|
if isequal(H,0)
|
||||||
|
H = zeros(nobs,1);
|
||||||
|
else
|
||||||
|
if all(all(abs(H-diag(diag(H)))<1e-14))% ie, the covariance matrix is diagonal...
|
||||||
|
H = diag(H);
|
||||||
|
else
|
||||||
|
no_correlation_flag = 0;
|
||||||
|
end
|
||||||
|
end
|
||||||
|
if no_correlation_flag
|
||||||
mmm = mm;
|
mmm = mm;
|
||||||
else
|
else
|
||||||
Z = [Z, eye(pp)];
|
Z = [Z, eye(pp)];
|
||||||
|
@ -510,9 +537,9 @@ if ( (singularity_flag) || (kalman_algo==2) || (kalman_algo==4) )% Univariate Ka
|
||||||
Pstar = blkdiag(Pstar,H);
|
Pstar = blkdiag(Pstar,H);
|
||||||
Pinf = blckdiag(Pinf,zeros(pp));
|
Pinf = blckdiag(Pinf,zeros(pp));
|
||||||
mmm = mm+pp;
|
mmm = mm+pp;
|
||||||
a = [a; zeros(pp,1)];
|
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
LIK = univariate_kalman_filter(DynareDataset.missing.aindex,DynareDataset.missing.number_of_observations,DynareDataset.missing.no_more_missing_observations,Y,diffuse_periods+1,size(Y,2), ...
|
LIK = univariate_kalman_filter(DynareDataset.missing.aindex,DynareDataset.missing.number_of_observations,DynareDataset.missing.no_more_missing_observations,Y,diffuse_periods+1,size(Y,2), ...
|
||||||
a,Pstar, ...
|
a,Pstar, ...
|
||||||
DynareOptions.kalman_tol, ...
|
DynareOptions.kalman_tol, ...
|
||||||
|
|
Loading…
Reference in New Issue