Merge remote-tracking branch 'marco/master'
commit
ef1cf5f062
|
@ -1,5 +1,5 @@
|
||||||
function [AHess] = AHessian(T,R,Q,H,P,Y,DT,DYss,DOm,DH,DP,start,mf,kalman_tol,riccati_tol)
|
function [AHess, DLIK, LIK] = AHessian(T,R,Q,H,P,Y,DT,DYss,DOm,DH,DP,start,mf,kalman_tol,riccati_tol)
|
||||||
% function [AHess] = AHessian(T,R,Q,H,P,Y,DT,DYss,DOm,DH,DP,start,mf,kalman_tol,riccati_tol)
|
% function [AHess, DLIK, LIK] = AHessian(T,R,Q,H,P,Y,DT,DYss,DOm,DH,DP,start,mf,kalman_tol,riccati_tol)
|
||||||
%
|
%
|
||||||
% computes the asymptotic hessian matrix of the log-likelihood function of
|
% computes the asymptotic hessian matrix of the log-likelihood function of
|
||||||
% a state space model (notation as in kalman_filter.m in DYNARE
|
% a state space model (notation as in kalman_filter.m in DYNARE
|
||||||
|
@ -28,6 +28,7 @@ function [AHess] = AHessian(T,R,Q,H,P,Y,DT,DYss,DOm,DH,DP,start,mf,kalman_tol,ri
|
||||||
|
|
||||||
k = size(DT,3); % number of structural parameters
|
k = size(DT,3); % number of structural parameters
|
||||||
smpl = size(Y,2); % Sample size.
|
smpl = size(Y,2); % Sample size.
|
||||||
|
pp = size(Y,1); % Maximum number of observed variables.
|
||||||
mm = size(T,2); % Number of state variables.
|
mm = size(T,2); % Number of state variables.
|
||||||
a = zeros(mm,1); % State vector.
|
a = zeros(mm,1); % State vector.
|
||||||
Om = R*Q*transpose(R); % Variance of R times the vector of structural innovations.
|
Om = R*Q*transpose(R); % Variance of R times the vector of structural innovations.
|
||||||
|
@ -36,6 +37,11 @@ function [AHess] = AHessian(T,R,Q,H,P,Y,DT,DYss,DOm,DH,DP,start,mf,kalman_tol,ri
|
||||||
notsteady = 1; % Steady state flag.
|
notsteady = 1; % Steady state flag.
|
||||||
F_singular = 1;
|
F_singular = 1;
|
||||||
|
|
||||||
|
lik = zeros(smpl,1); % Initialization of the vector gathering the densities.
|
||||||
|
LIK = Inf; % Default value of the log likelihood.
|
||||||
|
if nargout > 1,
|
||||||
|
DLIK = zeros(k,1); % Initialization of the score.
|
||||||
|
end
|
||||||
AHess = zeros(k,k); % Initialization of the Hessian
|
AHess = zeros(k,k); % Initialization of the Hessian
|
||||||
Da = zeros(mm,k); % State vector.
|
Da = zeros(mm,k); % State vector.
|
||||||
Dv = zeros(length(mf),k);
|
Dv = zeros(length(mf),k);
|
||||||
|
@ -59,17 +65,21 @@ function [AHess] = AHessian(T,R,Q,H,P,Y,DT,DYss,DOm,DH,DP,start,mf,kalman_tol,ri
|
||||||
F_singular = 0;
|
F_singular = 0;
|
||||||
iF = inv(F);
|
iF = inv(F);
|
||||||
K = P(:,mf)*iF;
|
K = P(:,mf)*iF;
|
||||||
|
lik(t) = log(det(F))+transpose(v)*iF*v;
|
||||||
|
|
||||||
[DK,DF,DP1] = computeDKalman(T,DT,DOm,P,DP,DH,mf,iF,K);
|
[DK,DF,DP1] = computeDKalman(T,DT,DOm,P,DP,DH,mf,iF,K);
|
||||||
|
|
||||||
for ii = 1:k
|
for ii = 1:k
|
||||||
Dv(:,ii) = -Da(mf,ii) - DYss(mf,ii);
|
Dv(:,ii) = -Da(mf,ii) - DYss(mf,ii);
|
||||||
Da(:,ii) = DT(:,:,ii)*(a+K*v) + T*(Da(:,ii)+DK(:,:,ii)*v + K*Dv(:,ii));
|
Da(:,ii) = DT(:,:,ii)*(a+K*v) + T*(Da(:,ii)+DK(:,:,ii)*v + K*Dv(:,ii));
|
||||||
|
if t>=start && nargout > 1
|
||||||
|
DLIK(ii,1) = DLIK(ii,1) + trace( iF*DF(:,:,ii) ) + 2*Dv(:,ii)'*iF*v - v'*(iF*DF(:,:,ii)*iF)*v;
|
||||||
|
end
|
||||||
end
|
end
|
||||||
vecDPmf = reshape(DP(mf,mf,:),[],k);
|
vecDPmf = reshape(DP(mf,mf,:),[],k);
|
||||||
iPmf = inv(P(mf,mf));
|
% iPmf = inv(P(mf,mf));
|
||||||
if t>=start
|
if t>=start
|
||||||
AHess = AHess + Dv'*iPmf*Dv + .5*(vecDPmf' * kron(iPmf,iPmf) * vecDPmf);
|
AHess = AHess + Dv'*iF*Dv + .5*(vecDPmf' * kron(iF,iF) * vecDPmf);
|
||||||
end
|
end
|
||||||
a = T*(a+K*v);
|
a = T*(a+K*v);
|
||||||
P = T*(P-K*P(mf,:))*transpose(T)+Om;
|
P = T*(P-K*P(mf,:))*transpose(T)+Om;
|
||||||
|
@ -92,13 +102,23 @@ function [AHess] = AHessian(T,R,Q,H,P,Y,DT,DYss,DOm,DH,DP,start,mf,kalman_tol,ri
|
||||||
for ii = 1:k
|
for ii = 1:k
|
||||||
Dv(:,ii) = -Da(mf,ii)-DYss(mf,ii);
|
Dv(:,ii) = -Da(mf,ii)-DYss(mf,ii);
|
||||||
Da(:,ii) = DT(:,:,ii)*(a+K*v) + T*(Da(:,ii)+DK(:,:,ii)*v + K*Dv(:,ii));
|
Da(:,ii) = DT(:,:,ii)*(a+K*v) + T*(Da(:,ii)+DK(:,:,ii)*v + K*Dv(:,ii));
|
||||||
|
if t>=start && nargout >1
|
||||||
|
DLIK(ii,1) = DLIK(ii,1) + trace( iF*DF(:,:,ii) ) + 2*Dv(:,ii)'*iF*v - v'*(iF*DF(:,:,ii)*iF)*v;
|
||||||
|
end
|
||||||
end
|
end
|
||||||
if t>=start
|
if t>=start
|
||||||
AHess = AHess + Dv'*iPmf*Dv;
|
AHess = AHess + Dv'*iF*Dv;
|
||||||
end
|
end
|
||||||
a = T*(a+K*v);
|
a = T*(a+K*v);
|
||||||
|
lik(t) = transpose(v)*iF*v;
|
||||||
end
|
end
|
||||||
AHess = AHess + .5*(smpl+t0-1)*(vecDPmf' * kron(iPmf,iPmf) * vecDPmf);
|
AHess = AHess + .5*(smpl+t0-1)*(vecDPmf' * kron(iF,iF) * vecDPmf);
|
||||||
|
if nargout > 1
|
||||||
|
for ii = 1:k
|
||||||
|
% DLIK(ii,1) = DLIK(ii,1) + (smpl-t0+1)*trace( iF*DF(:,:,ii) );
|
||||||
|
end
|
||||||
|
end
|
||||||
|
lik(t0:smpl) = lik(t0:smpl) + log(det(F));
|
||||||
% for ii = 1:k;
|
% for ii = 1:k;
|
||||||
% for jj = 1:ii
|
% for jj = 1:ii
|
||||||
% H(ii,jj) = trace(iPmf*(.5*DP(mf,mf,ii)*iPmf*DP(mf,mf,jj) + Dv(:,ii)*Dv(:,jj)'));
|
% H(ii,jj) = trace(iPmf*(.5*DP(mf,mf,ii)*iPmf*DP(mf,mf,jj) + Dv(:,ii)*Dv(:,jj)'));
|
||||||
|
@ -107,6 +127,13 @@ function [AHess] = AHessian(T,R,Q,H,P,Y,DT,DYss,DOm,DH,DP,start,mf,kalman_tol,ri
|
||||||
end
|
end
|
||||||
|
|
||||||
AHess = -AHess;
|
AHess = -AHess;
|
||||||
|
if nargout > 1,
|
||||||
|
DLIK = DLIK/2;
|
||||||
|
end
|
||||||
|
% adding log-likelihhod constants
|
||||||
|
lik = (lik + pp*log(2*pi))/2;
|
||||||
|
|
||||||
|
LIK = sum(lik(start:end)); % Minus the log-likelihood.
|
||||||
% end of main function
|
% end of main function
|
||||||
|
|
||||||
function [DK,DF,DP1] = computeDKalman(T,DT,DOm,P,DP,DH,mf,iF,K)
|
function [DK,DF,DP1] = computeDKalman(T,DT,DOm,P,DP,DH,mf,iF,K)
|
||||||
|
|
|
@ -439,9 +439,10 @@ end
|
||||||
|
|
||||||
if analytic_derivation
|
if analytic_derivation
|
||||||
no_DLIK = 0;
|
no_DLIK = 0;
|
||||||
|
full_Hess = 0;
|
||||||
DLIK = [];
|
DLIK = [];
|
||||||
AHess = [];
|
AHess = [];
|
||||||
if nargin<7 || isempty(derivatives_info)
|
if nargin<8 || isempty(derivatives_info)
|
||||||
[A,B,nou,nou,Model,DynareOptions,DynareResults] = dynare_resolve(Model,DynareOptions,DynareResults);
|
[A,B,nou,nou,Model,DynareOptions,DynareResults] = dynare_resolve(Model,DynareOptions,DynareResults);
|
||||||
if ~isempty(EstimatedParameters.var_exo)
|
if ~isempty(EstimatedParameters.var_exo)
|
||||||
indexo=EstimatedParameters.var_exo(:,1);
|
indexo=EstimatedParameters.var_exo(:,1);
|
||||||
|
@ -453,12 +454,25 @@ if analytic_derivation
|
||||||
else
|
else
|
||||||
indparam=[];
|
indparam=[];
|
||||||
end
|
end
|
||||||
|
|
||||||
|
if full_Hess,
|
||||||
|
[dum, DT, DOm, DYss, dum2, D2T, D2Om, D2Yss] = getH(A, B, Model,DynareResults,0,indparam,indexo);
|
||||||
|
else
|
||||||
[dum, DT, DOm, DYss] = getH(A, B, Model,DynareResults,0,indparam,indexo);
|
[dum, DT, DOm, DYss] = getH(A, B, Model,DynareResults,0,indparam,indexo);
|
||||||
|
end
|
||||||
else
|
else
|
||||||
DT = derivatives_info.DT;
|
DT = derivatives_info.DT;
|
||||||
DOm = derivatives_info.DOm;
|
DOm = derivatives_info.DOm;
|
||||||
DYss = derivatives_info.DYss;
|
DYss = derivatives_info.DYss;
|
||||||
if isfield(derivatives_info,'no_DLIK')
|
if isfield(derivatives_info,'full_Hess'),
|
||||||
|
full_Hess = derivatives_info.full_Hess;
|
||||||
|
end
|
||||||
|
if full_Hess,
|
||||||
|
D2T = derivatives_info.D2T;
|
||||||
|
D2Om = derivatives_info.D2Om;
|
||||||
|
D2Yss = derivatives_info.D2Yss;
|
||||||
|
end
|
||||||
|
if isfield(derivatives_info,'no_DLIK'),
|
||||||
no_DLIK = derivatives_info.no_DLIK;
|
no_DLIK = derivatives_info.no_DLIK;
|
||||||
end
|
end
|
||||||
clear('derivatives_info');
|
clear('derivatives_info');
|
||||||
|
@ -471,6 +485,17 @@ if analytic_derivation
|
||||||
DH=zeros([size(H),length(xparam1)]);
|
DH=zeros([size(H),length(xparam1)]);
|
||||||
DQ=zeros([size(Q),length(xparam1)]);
|
DQ=zeros([size(Q),length(xparam1)]);
|
||||||
DP=zeros([size(T),length(xparam1)]);
|
DP=zeros([size(T),length(xparam1)]);
|
||||||
|
if full_Hess,
|
||||||
|
for j=1:size(D2Yss,1),
|
||||||
|
tmp(j,:,:) = blkdiag(zeros(offset,offset), squeeze(D2Yss(j,:,:)));
|
||||||
|
end
|
||||||
|
D2Yss = tmp;
|
||||||
|
D2T = D2T(iv,iv,:,:);
|
||||||
|
D2Om = D2Om(iv,iv,:,:);
|
||||||
|
D2Yss = D2Yss(iv,:,:);
|
||||||
|
D2H=zeros([size(H),length(xparam1),length(xparam1)]);
|
||||||
|
D2P=zeros([size(T),length(xparam1),length(xparam1)]);
|
||||||
|
end
|
||||||
for i=1:EstimatedParameters.nvx
|
for i=1:EstimatedParameters.nvx
|
||||||
k =EstimatedParameters.var_exo(i,1);
|
k =EstimatedParameters.var_exo(i,1);
|
||||||
DQ(k,k,i) = 2*sqrt(Q(k,k));
|
DQ(k,k,i) = 2*sqrt(Q(k,k));
|
||||||
|
@ -478,11 +503,23 @@ if analytic_derivation
|
||||||
kk = find(abs(dum) < 1e-12);
|
kk = find(abs(dum) < 1e-12);
|
||||||
dum(kk) = 0;
|
dum(kk) = 0;
|
||||||
DP(:,:,i)=dum;
|
DP(:,:,i)=dum;
|
||||||
|
if full_Hess
|
||||||
|
for j=1:i,
|
||||||
|
dum = lyapunov_symm(T,D2Om(:,:,i,j),DynareOptions.qz_criterium,DynareOptions.lyapunov_complex_threshold);
|
||||||
|
kk = (abs(dum) < 1e-12);
|
||||||
|
dum(kk) = 0;
|
||||||
|
D2P(:,:,i,j)=dum;
|
||||||
|
D2P(:,:,j,i)=dum;
|
||||||
|
end
|
||||||
|
end
|
||||||
end
|
end
|
||||||
offset = EstimatedParameters.nvx;
|
offset = EstimatedParameters.nvx;
|
||||||
for i=1:EstimatedParameters.nvn
|
for i=1:EstimatedParameters.nvn
|
||||||
k = EstimatedParameters.var_endo(i,1);
|
k = EstimatedParameters.var_endo(i,1);
|
||||||
DH(k,k,i+offset) = 2*sqrt(H(k,k));
|
DH(k,k,i+offset) = 2*sqrt(H(k,k));
|
||||||
|
if full_Hess
|
||||||
|
D2H(k,k,i+offset,i+offset) = 2;
|
||||||
|
end
|
||||||
end
|
end
|
||||||
offset = offset + EstimatedParameters.nvn;
|
offset = offset + EstimatedParameters.nvn;
|
||||||
for j=1:EstimatedParameters.np
|
for j=1:EstimatedParameters.np
|
||||||
|
@ -490,6 +527,21 @@ if analytic_derivation
|
||||||
kk = find(abs(dum) < 1e-12);
|
kk = find(abs(dum) < 1e-12);
|
||||||
dum(kk) = 0;
|
dum(kk) = 0;
|
||||||
DP(:,:,j+offset)=dum;
|
DP(:,:,j+offset)=dum;
|
||||||
|
if full_Hess
|
||||||
|
DTj = DT(:,:,j+offset);
|
||||||
|
DPj = dum;
|
||||||
|
for i=1:j,
|
||||||
|
DTi = DT(:,:,i+offset);
|
||||||
|
DPi = DP(:,:,i+offset);
|
||||||
|
D2Tij = D2T(:,:,i,j);
|
||||||
|
D2Omij = D2Om(:,:,i,j);
|
||||||
|
tmp = D2Tij*Pstar*T' + T*Pstar*D2Tij' + DTi*DPj*T' + DTj*DPi*T' + T*DPj*DTi' + T*DPi*DTj' + DTi*Pstar*DTj' + DTj*Pstar*DTi' + D2Omij;
|
||||||
|
dum = lyapunov_symm(T,tmp,DynareOptions.qz_criterium,DynareOptions.lyapunov_complex_threshold);
|
||||||
|
dum(abs(dum)<1.e-12) = 0;
|
||||||
|
D2P(:,:,i+offset,j+offset) = dum;
|
||||||
|
D2P(:,:,j+offset,i+offset) = dum;
|
||||||
|
end
|
||||||
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
@ -515,6 +567,10 @@ if ((kalman_algo==1) || (kalman_algo==3))% Multivariate Kalman Filter
|
||||||
end
|
end
|
||||||
if nargout==11
|
if nargout==11
|
||||||
[AHess] = AHessian(T,R,Q,H,Pstar,Y,DT,DYss,DOm,DH,DP,start,Z,kalman_tol,riccati_tol);
|
[AHess] = AHessian(T,R,Q,H,Pstar,Y,DT,DYss,DOm,DH,DP,start,Z,kalman_tol,riccati_tol);
|
||||||
|
if full_Hess,
|
||||||
|
Hess = get_Hessian(T,R,Q,H,Pstar,Y,DT,DYss,DOm,DH,DP,D2T,D2Yss,D2Om,D2H,D2P,start,Z,kalman_tol,riccati_tol);
|
||||||
|
Hess0 = getHessian(Y,T,DT,D2T, R*Q*transpose(R),DOm,D2Om,Z,DYss,D2Yss);
|
||||||
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
else
|
else
|
||||||
|
@ -587,7 +643,19 @@ end
|
||||||
% ------------------------------------------------------------------------------
|
% ------------------------------------------------------------------------------
|
||||||
% 5. Adds prior if necessary
|
% 5. Adds prior if necessary
|
||||||
% ------------------------------------------------------------------------------
|
% ------------------------------------------------------------------------------
|
||||||
|
if analytic_derivation
|
||||||
|
if full_Hess,
|
||||||
|
[lnprior, dlnprior, d2lnprior] = priordens(xparam1,BayesInfo.pshape,BayesInfo.p6,BayesInfo.p7,BayesInfo.p3,BayesInfo.p4);
|
||||||
|
AHess = Hess + d2lnprior;
|
||||||
|
else
|
||||||
|
[lnprior, dlnprior] = priordens(xparam1,BayesInfo.pshape,BayesInfo.p6,BayesInfo.p7,BayesInfo.p3,BayesInfo.p4);
|
||||||
|
end
|
||||||
|
if no_DLIK==0
|
||||||
|
DLIK = DLIK - dlnprior';
|
||||||
|
end
|
||||||
|
else
|
||||||
lnprior = priordens(xparam1,BayesInfo.pshape,BayesInfo.p6,BayesInfo.p7,BayesInfo.p3,BayesInfo.p4);
|
lnprior = priordens(xparam1,BayesInfo.pshape,BayesInfo.p6,BayesInfo.p7,BayesInfo.p3,BayesInfo.p4);
|
||||||
|
end
|
||||||
fval = (likelihood-lnprior);
|
fval = (likelihood-lnprior);
|
||||||
|
|
||||||
% Update DynareOptions.kalman_algo.
|
% Update DynareOptions.kalman_algo.
|
||||||
|
|
|
@ -1,5 +1,5 @@
|
||||||
function [fval,llik,cost_flag,ys,trend_coeff,info] = DsgeLikelihood_hh(xparam1,DynareDataset,DynareOptions,Model,EstimatedParameters,BayesInfo,DynareResults)
|
function [fval,llik,cost_flag,ys,trend_coeff,info] = DsgeLikelihood_hh(xparam1,DynareDataset,DynareOptions,Model,EstimatedParameters,BayesInfo,DynareResults)
|
||||||
% function [fval,cost_flag,ys,trend_coeff,info] = DsgeLikelihood(xparam1,gend,data,data_index,number_of_observations,no_more_missing_observations)
|
% function [fval,llik,cost_flag,ys,trend_coeff,info] = DsgeLikelihood_hh(xparam1,DynareDataset,DynareOptions,Model,EstimatedParameters,BayesInfo,DynareResults)
|
||||||
% Evaluates the posterior kernel of a dsge model.
|
% Evaluates the posterior kernel of a dsge model.
|
||||||
%
|
%
|
||||||
% INPUTS
|
% INPUTS
|
||||||
|
@ -11,6 +11,7 @@ function [fval,llik,cost_flag,ys,trend_coeff,info] = DsgeLikelihood_hh(xparam1,D
|
||||||
% no_more_missing_observations [integer]
|
% no_more_missing_observations [integer]
|
||||||
% OUTPUTS
|
% OUTPUTS
|
||||||
% fval : value of the posterior kernel at xparam1.
|
% fval : value of the posterior kernel at xparam1.
|
||||||
|
% llik : probabilities at each time point
|
||||||
% cost_flag : zero if the function returns a penalty, one otherwise.
|
% cost_flag : zero if the function returns a penalty, one otherwise.
|
||||||
% ys : steady state of original endogenous variables
|
% ys : steady state of original endogenous variables
|
||||||
% trend_coeff :
|
% trend_coeff :
|
||||||
|
@ -52,11 +53,14 @@ if nargin==1
|
||||||
return
|
return
|
||||||
end
|
end
|
||||||
|
|
||||||
|
% Initialization of the returned variables and others...
|
||||||
fval = [];
|
fval = [];
|
||||||
ys = [];
|
ys = [];
|
||||||
trend_coeff = [];
|
trend_coeff = [];
|
||||||
cost_flag = 1;
|
cost_flag = 1;
|
||||||
llik=NaN;
|
llik=NaN;
|
||||||
|
info = 0;
|
||||||
|
singularity_flag = 0;
|
||||||
|
|
||||||
if DynareOptions.block == 1
|
if DynareOptions.block == 1
|
||||||
error('DsgeLikelihood_hh:: This routine (called if mode_compute==5) is not compatible with the block option!')
|
error('DsgeLikelihood_hh:: This routine (called if mode_compute==5) is not compatible with the block option!')
|
||||||
|
@ -159,8 +163,6 @@ end
|
||||||
Model.Sigma_e = Q;
|
Model.Sigma_e = Q;
|
||||||
Model.H = H;
|
Model.H = H;
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
%------------------------------------------------------------------------------
|
%------------------------------------------------------------------------------
|
||||||
% 2. call model setup & reduction program
|
% 2. call model setup & reduction program
|
||||||
%------------------------------------------------------------------------------
|
%------------------------------------------------------------------------------
|
||||||
|
@ -223,8 +225,31 @@ 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
|
||||||
|
if (kalman_algo == 2) || (kalman_algo == 4)
|
||||||
|
if isequal(H,0)
|
||||||
|
H = zeros(nobs,1);
|
||||||
|
mmm = mm;
|
||||||
|
else
|
||||||
|
if all(all(abs(H-diag(diag(H)))<1e-14))% ie, the covariance matrix is diagonal...
|
||||||
|
H = diag(H);
|
||||||
|
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));
|
||||||
|
H = zeros(nobs,1);
|
||||||
|
mmm = mm+pp;
|
||||||
|
end
|
||||||
|
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.
|
||||||
|
@ -271,11 +296,18 @@ switch DynareOptions.lik_init
|
||||||
if isinf(dLIK)
|
if isinf(dLIK)
|
||||||
% Go to univariate diffuse filter if singularity problem.
|
% Go to univariate diffuse filter if singularity problem.
|
||||||
kalman_algo = 4;
|
kalman_algo = 4;
|
||||||
|
singularity_flag = 1;
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
if (kalman_algo==4)
|
if (kalman_algo==4)
|
||||||
% Univariate Diffuse Kalman Filter
|
% Univariate Diffuse Kalman Filter
|
||||||
if no_correlation_flag
|
if singularity_flag
|
||||||
|
if isequal(H,0)
|
||||||
|
H = zeros(nobs,1);
|
||||||
|
mmm = mm;
|
||||||
|
else
|
||||||
|
if all(all(abs(H-diag(diag(H)))<1e-14))% ie, the covariance matrix is diagonal...
|
||||||
|
H = diag(H);
|
||||||
mmm = mm;
|
mmm = mm;
|
||||||
else
|
else
|
||||||
Z = [Z, eye(pp)];
|
Z = [Z, eye(pp)];
|
||||||
|
@ -284,8 +316,13 @@ switch DynareOptions.lik_init
|
||||||
R = blkdiag(R,eye(pp));
|
R = blkdiag(R,eye(pp));
|
||||||
Pstar = blkdiag(Pstar,H);
|
Pstar = blkdiag(Pstar,H);
|
||||||
Pinf = blckdiag(Pinf,zeros(pp));
|
Pinf = blckdiag(Pinf,zeros(pp));
|
||||||
|
H = zeros(nobs,1);
|
||||||
mmm = mm+pp;
|
mmm = mm+pp;
|
||||||
end
|
end
|
||||||
|
end
|
||||||
|
% no need to test again for correlation elements
|
||||||
|
singularity_flag = 0;
|
||||||
|
end
|
||||||
[dLIK,dlik,a,Pstar] = univariate_kalman_filter_d(DynareDataset.missing.aindex,DynareDataset.missing.number_of_observations,DynareDataset.missing.no_more_missing_observations, ...
|
[dLIK,dlik,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, ...
|
||||||
|
@ -298,9 +335,9 @@ switch DynareOptions.lik_init
|
||||||
kalman_algo = 1;
|
kalman_algo = 1;
|
||||||
end
|
end
|
||||||
if isequal(H,0)
|
if isequal(H,0)
|
||||||
[err,Pstar] = kalman_steady_state(transpose(T),R*Q*transpose(R),transpose(build_selection_matrix(mf,np,length(mf))));
|
[err,Pstar] = kalman_steady_state(transpose(T),R*Q*transpose(R),transpose(build_selection_matrix(Z,np,length(Z))));
|
||||||
else
|
else
|
||||||
[err,Pstar] = kalman_steady_state(transpose(T),R*Q*transpose(R),transpose(build_selection_matrix(mf,np,length(mf))),H);
|
[err,Pstar] = kalman_steady_state(transpose(T),R*Q*transpose(R),transpose(build_selection_matrix(Z,np,length(Z))),H);
|
||||||
end
|
end
|
||||||
if err
|
if err
|
||||||
disp(['DsgeLikelihood:: I am not able to solve the Riccati equation, so I switch to lik_init=1!']);
|
disp(['DsgeLikelihood:: I am not able to solve the Riccati equation, so I switch to lik_init=1!']);
|
||||||
|
@ -316,8 +353,6 @@ end
|
||||||
% 4. Likelihood evaluation
|
% 4. Likelihood evaluation
|
||||||
%------------------------------------------------------------------------------
|
%------------------------------------------------------------------------------
|
||||||
|
|
||||||
singularity_flag = 0;
|
|
||||||
|
|
||||||
if ((kalman_algo==1) || (kalman_algo==3))% Multivariate Kalman Filter
|
if ((kalman_algo==1) || (kalman_algo==3))% Multivariate Kalman Filter
|
||||||
if no_missing_data_flag
|
if no_missing_data_flag
|
||||||
[LIK,lik] = kalman_filter(Y,diffuse_periods+1,size(Y,2), ...
|
[LIK,lik] = kalman_filter(Y,diffuse_periods+1,size(Y,2), ...
|
||||||
|
@ -333,6 +368,11 @@ if ((kalman_algo==1) || (kalman_algo==3))% Multivariate Kalman Filter
|
||||||
T,Q,R,H,Z,mm,pp,rr,Zflag,diffuse_periods);
|
T,Q,R,H,Z,mm,pp,rr,Zflag,diffuse_periods);
|
||||||
end
|
end
|
||||||
if isinf(LIK)
|
if isinf(LIK)
|
||||||
|
if kalman_algo == 1
|
||||||
|
kalman_algo = 2;
|
||||||
|
else
|
||||||
|
kalman_algo = 4;
|
||||||
|
end
|
||||||
singularity_flag = 1;
|
singularity_flag = 1;
|
||||||
else
|
else
|
||||||
if DynareOptions.lik_init==3
|
if DynareOptions.lik_init==3
|
||||||
|
@ -342,9 +382,16 @@ 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);
|
||||||
|
mmm = mm;
|
||||||
|
else
|
||||||
|
if all(all(abs(H-diag(diag(H)))<1e-14))% ie, the covariance matrix is diagonal...
|
||||||
|
H = diag(H);
|
||||||
mmm = mm;
|
mmm = mm;
|
||||||
else
|
else
|
||||||
Z = [Z, eye(pp)];
|
Z = [Z, eye(pp)];
|
||||||
|
@ -353,10 +400,12 @@ if ( (singularity_flag) || (kalman_algo==2) || (kalman_algo==4) )% Univariate Ka
|
||||||
R = blkdiag(R,eye(pp));
|
R = blkdiag(R,eye(pp));
|
||||||
Pstar = blkdiag(Pstar,H);
|
Pstar = blkdiag(Pstar,H);
|
||||||
Pinf = blckdiag(Pinf,zeros(pp));
|
Pinf = blckdiag(Pinf,zeros(pp));
|
||||||
|
H = zeros(nobs,1);
|
||||||
mmm = mm+pp;
|
mmm = mm+pp;
|
||||||
a = [a; zeros(pp,1)];
|
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
end
|
||||||
|
|
||||||
[LIK,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,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, ...
|
||||||
|
|
|
@ -188,7 +188,7 @@ if any(idemoments.ino),
|
||||||
iweak = length(find(idemoments.jweak_pair(:,j)));
|
iweak = length(find(idemoments.jweak_pair(:,j)));
|
||||||
if iweak,
|
if iweak,
|
||||||
[jx,jy]=find(jmap_pair==j);
|
[jx,jy]=find(jmap_pair==j);
|
||||||
jstore=[jstore jx(1) jy(1)]';
|
jstore=[jstore' jx(1) jy(1)]';
|
||||||
if SampleSize > 1
|
if SampleSize > 1
|
||||||
disp([' [',name{jx(1)},',',name{jy(1)},'] are PAIRWISE collinear (with tol = 1.e-10) for ',num2str((iweak)/SampleSize*100),'% of MC runs!' ])
|
disp([' [',name{jx(1)},',',name{jy(1)},'] are PAIRWISE collinear (with tol = 1.e-10) for ',num2str((iweak)/SampleSize*100),'% of MC runs!' ])
|
||||||
else
|
else
|
||||||
|
|
|
@ -353,7 +353,7 @@ if ~options_.mh_posterior_mode_estimation && options_.cova_compute
|
||||||
end
|
end
|
||||||
|
|
||||||
if options_.mode_check == 1 && ~options_.mh_posterior_mode_estimation
|
if options_.mode_check == 1 && ~options_.mh_posterior_mode_estimation
|
||||||
mode_check('objective_function',xparam1,hh,dataset_,options_,M_,estim_params_,bayestopt_,oo_);
|
mode_check(objective_function,xparam1,hh,dataset_,options_,M_,estim_params_,bayestopt_,oo_);
|
||||||
end
|
end
|
||||||
|
|
||||||
if ~options_.mh_posterior_mode_estimation
|
if ~options_.mh_posterior_mode_estimation
|
||||||
|
|
|
@ -41,6 +41,8 @@ function [ys,params1,check] = evaluate_steady_state_file(ys_init,exo_ss,params,f
|
||||||
|
|
||||||
if steadystate_flag == 1
|
if steadystate_flag == 1
|
||||||
% old format
|
% old format
|
||||||
|
assignin('base','tmp_00_',params);
|
||||||
|
evalin('base','M_.params=tmp_00_; clear(''tmp_00_'')');
|
||||||
h_steadystate = str2func([fname '_steadystate']);
|
h_steadystate = str2func([fname '_steadystate']);
|
||||||
[ys,check] = h_steadystate(ys_init, exo_ss);
|
[ys,check] = h_steadystate(ys_init, exo_ss);
|
||||||
params1 = evalin('base','M_.params');
|
params1 = evalin('base','M_.params');
|
||||||
|
|
377
matlab/getH.m
377
matlab/getH.m
|
@ -1,4 +1,4 @@
|
||||||
function [H, dA, dOm, Hss, gp, info] = getH(A, B, M_,oo_,kronflag,indx,indexo)
|
function [H, dA, dOm, Hss, gp, d2A, d2Om, H2ss] = getH(A, B, M_,oo_,kronflag,indx,indexo)
|
||||||
|
|
||||||
% computes derivative of reduced form linear model w.r.t. deep params
|
% computes derivative of reduced form linear model w.r.t. deep params
|
||||||
%
|
%
|
||||||
|
@ -31,10 +31,29 @@ yy0=oo_.dr.ys(I);
|
||||||
% yy0 = [ yy0; oo_.dr.ys(find(M_.lead_lag_incidence(j,:)))];
|
% yy0 = [ yy0; oo_.dr.ys(find(M_.lead_lag_incidence(j,:)))];
|
||||||
% end
|
% end
|
||||||
dyssdtheta=zeros(length(oo_.dr.ys),M_.param_nbr);
|
dyssdtheta=zeros(length(oo_.dr.ys),M_.param_nbr);
|
||||||
|
if nargout>5,
|
||||||
|
[residual, gg1, gg2] = feval([M_.fname,'_static'],oo_.dr.ys, oo_.exo_steady_state', M_.params);
|
||||||
|
[df, gp, d2f] = feval([M_.fname,'_params_derivs'],yy0, oo_.exo_steady_state', ...
|
||||||
|
M_.params, oo_.dr.ys, 1, dyssdtheta);
|
||||||
|
d2f = get_all_resid_2nd_derivs(d2f,length(oo_.dr.ys),M_.param_nbr);
|
||||||
|
d2f = d2f(:,indx,indx);
|
||||||
|
if isempty(find(gg2)),
|
||||||
|
for j=1:length(indx),
|
||||||
|
d2yssdtheta(:,:,j) = -gg1\d2f(:,:,j);
|
||||||
|
end
|
||||||
|
else
|
||||||
|
gam = d2f*0;
|
||||||
|
for j=1:length(indx),
|
||||||
|
d2yssdtheta(:,:,j) = -gg1\(d2f(:,:,j)+gam(:,:,j));
|
||||||
|
end
|
||||||
|
end
|
||||||
|
else
|
||||||
|
[residual, gg1] = feval([M_.fname,'_static'],oo_.dr.ys, oo_.exo_steady_state', M_.params);
|
||||||
df = feval([M_.fname,'_params_derivs'],yy0, oo_.exo_steady_state', ...
|
df = feval([M_.fname,'_params_derivs'],yy0, oo_.exo_steady_state', ...
|
||||||
M_.params, oo_.dr.ys, 1, dyssdtheta);
|
M_.params, oo_.dr.ys, 1, dyssdtheta);
|
||||||
[residual, gg1] = feval([M_.fname,'_static'],oo_.dr.ys, oo_.exo_steady_state', M_.params);
|
end
|
||||||
dyssdtheta = -gg1\df;
|
dyssdtheta = -gg1\df;
|
||||||
|
|
||||||
if any(any(isnan(dyssdtheta))),
|
if any(any(isnan(dyssdtheta))),
|
||||||
[U,T] = schur(gg1);
|
[U,T] = schur(gg1);
|
||||||
global options_
|
global options_
|
||||||
|
@ -45,15 +64,29 @@ if any(any(isnan(dyssdtheta))),
|
||||||
[U,T] = ordschur(U,T,e1);
|
[U,T] = ordschur(U,T,e1);
|
||||||
T = T(k+1:end,k+1:end);
|
T = T(k+1:end,k+1:end);
|
||||||
dyssdtheta = -U(:,k+1:end)*(T\U(:,k+1:end)')*df;
|
dyssdtheta = -U(:,k+1:end)*(T\U(:,k+1:end)')*df;
|
||||||
|
if nargout>5,
|
||||||
|
for j=1:length(indx),
|
||||||
|
d2yssdtheta(:,:,j) = -U(:,k+1:end)*(T\U(:,k+1:end)')*d2f(:,:,j);
|
||||||
end
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
if nargout>5,
|
||||||
|
[df, gp, d2f, gpp] = feval([M_.fname,'_params_derivs'],yy0, oo_.exo_steady_state', ...
|
||||||
|
M_.params, oo_.dr.ys, 1, dyssdtheta);
|
||||||
|
H2ss = d2yssdtheta(oo_.dr.order_var,:,:);
|
||||||
|
[residual, g1, g2, g3] = feval([M_.fname,'_dynamic'],yy0, oo_.exo_steady_state', ...
|
||||||
|
M_.params, oo_.dr.ys, 1);
|
||||||
|
else
|
||||||
[df, gp] = feval([M_.fname,'_params_derivs'],yy0, oo_.exo_steady_state', ...
|
[df, gp] = feval([M_.fname,'_params_derivs'],yy0, oo_.exo_steady_state', ...
|
||||||
M_.params, oo_.dr.ys, 1, dyssdtheta);
|
M_.params, oo_.dr.ys, 1, dyssdtheta);
|
||||||
[residual, g1, g2 ] = feval([M_.fname,'_dynamic'],yy0, oo_.exo_steady_state', ...
|
[residual, g1, g2 ] = feval([M_.fname,'_dynamic'],yy0, oo_.exo_steady_state', ...
|
||||||
M_.params, oo_.dr.ys, 1);
|
M_.params, oo_.dr.ys, 1);
|
||||||
|
end
|
||||||
|
|
||||||
Hss = dyssdtheta(oo_.dr.order_var,indx);
|
Hss = dyssdtheta(oo_.dr.order_var,indx);
|
||||||
dyssdtheta = dyssdtheta(I,:);
|
dyssdtheta = dyssdtheta(I,:);
|
||||||
[nr, nc]=size(g2);
|
[nr, nc]=size(g2);
|
||||||
|
[m, nelem]=size(g1);
|
||||||
nc = sqrt(nc);
|
nc = sqrt(nc);
|
||||||
ns = max(max(M_.lead_lag_incidence));
|
ns = max(max(M_.lead_lag_incidence));
|
||||||
gp2 = gp*0;
|
gp2 = gp*0;
|
||||||
|
@ -73,19 +106,9 @@ end
|
||||||
gp = gp+gp2;
|
gp = gp+gp2;
|
||||||
gp = gp(:,:,indx);
|
gp = gp(:,:,indx);
|
||||||
param_nbr = length(indx);
|
param_nbr = length(indx);
|
||||||
|
if nargout>5,
|
||||||
% order_var = [oo_.dr.order_var; ...
|
param_nbr_2 = param_nbr*(param_nbr+1)/2;
|
||||||
% [size(oo_dr.ghx,2)+1:size(oo_dr.ghx,2)+size(oo_.dr.transition_auxiliary_variables,1)]' ];
|
end
|
||||||
% [A(order_var,order_var),B(order_var,:)]=dynare_resolve;
|
|
||||||
% [A,B,ys,info]=dynare_resolve;
|
|
||||||
% if info(1) > 0
|
|
||||||
% H = [];
|
|
||||||
% A0 = [];
|
|
||||||
% B0 = [];
|
|
||||||
% dA = [];
|
|
||||||
% dOm = [];
|
|
||||||
% return
|
|
||||||
% end
|
|
||||||
|
|
||||||
m = size(A,1);
|
m = size(A,1);
|
||||||
n = size(B,2);
|
n = size(B,2);
|
||||||
|
@ -93,9 +116,15 @@ n = size(B,2);
|
||||||
|
|
||||||
|
|
||||||
klen = M_.maximum_endo_lag + M_.maximum_endo_lead + 1;
|
klen = M_.maximum_endo_lag + M_.maximum_endo_lead + 1;
|
||||||
k1 = M_.lead_lag_incidence(find([1:klen] ~= M_.maximum_endo_lag+1),:);
|
k11 = M_.lead_lag_incidence(find([1:klen] ~= M_.maximum_endo_lag+1),:);
|
||||||
a = g1(:,nonzeros(k1'));
|
a = g1(:,nonzeros(k11'));
|
||||||
da = gp(:,nonzeros(k1'),:);
|
da = gp(:,nonzeros(k11'),:);
|
||||||
|
if nargout > 5,
|
||||||
|
nelem = size(g1,2);
|
||||||
|
g22 = get_all_2nd_derivs(gpp,m,nelem,M_.param_nbr);
|
||||||
|
g22 = g22(:,:,indx,indx);
|
||||||
|
d2a = g22(:,nonzeros(k11'),:,:);
|
||||||
|
end
|
||||||
kstate = oo_.dr.kstate;
|
kstate = oo_.dr.kstate;
|
||||||
|
|
||||||
GAM1 = zeros(M_.endo_nbr,M_.endo_nbr);
|
GAM1 = zeros(M_.endo_nbr,M_.endo_nbr);
|
||||||
|
@ -103,22 +132,26 @@ Dg1 = zeros(M_.endo_nbr,M_.endo_nbr,param_nbr);
|
||||||
% nf = find(M_.lead_lag_incidence(M_.maximum_endo_lag+2,:));
|
% nf = find(M_.lead_lag_incidence(M_.maximum_endo_lag+2,:));
|
||||||
% GAM1(:, nf) = -g1(:,M_.lead_lag_incidence(M_.maximum_endo_lag+2,nf));
|
% GAM1(:, nf) = -g1(:,M_.lead_lag_incidence(M_.maximum_endo_lag+2,nf));
|
||||||
|
|
||||||
k = find(kstate(:,2) == M_.maximum_endo_lag+2 & kstate(:,3));
|
k1 = find(kstate(:,2) == M_.maximum_endo_lag+2 & kstate(:,3));
|
||||||
GAM1(:, kstate(k,1)) = -a(:,kstate(k,3));
|
GAM1(:, kstate(k1,1)) = -a(:,kstate(k1,3));
|
||||||
Dg1(:, kstate(k,1), :) = -da(:,kstate(k,3),:);
|
Dg1(:, kstate(k1,1), :) = -da(:,kstate(k1,3),:);
|
||||||
k = find(kstate(:,2) > M_.maximum_endo_lag+2 & kstate(:,3));
|
if nargout > 5,
|
||||||
kk = find(kstate(:,2) > M_.maximum_endo_lag+2 & ~kstate(:,3));
|
D2g1 = zeros(M_.endo_nbr,M_.endo_nbr,param_nbr,param_nbr);
|
||||||
nauxe = 0;
|
D2g1(:, kstate(k1,1), :, :) = -d2a(:,kstate(k1,3),:,:);
|
||||||
if ~isempty(k),
|
|
||||||
ax(:,k)= -a(:,kstate(k,3));
|
|
||||||
ax(:,kk)= 0;
|
|
||||||
dax(:,k,:)= -da(:,kstate(k,3),:);
|
|
||||||
dax(:,kk,:)= 0;
|
|
||||||
nauxe=size(ax,2);
|
|
||||||
GAM1 = [ax GAM1];
|
|
||||||
Dg1 = cat(2,dax,Dg1);
|
|
||||||
clear ax
|
|
||||||
end
|
end
|
||||||
|
% k = find(kstate(:,2) > M_.maximum_endo_lag+2 & kstate(:,3));
|
||||||
|
% kk = find(kstate(:,2) > M_.maximum_endo_lag+2 & ~kstate(:,3));
|
||||||
|
% nauxe = 0;
|
||||||
|
% if ~isempty(k),
|
||||||
|
% ax(:,k)= -a(:,kstate(k,3));
|
||||||
|
% ax(:,kk)= 0;
|
||||||
|
% dax(:,k,:)= -da(:,kstate(k,3),:);
|
||||||
|
% dax(:,kk,:)= 0;
|
||||||
|
% nauxe=size(ax,2);
|
||||||
|
% GAM1 = [ax GAM1];
|
||||||
|
% Dg1 = cat(2,dax,Dg1);
|
||||||
|
% clear ax
|
||||||
|
% end
|
||||||
|
|
||||||
|
|
||||||
[junk,cols_b,cols_j] = find(M_.lead_lag_incidence(M_.maximum_endo_lag+1, ...
|
[junk,cols_b,cols_j] = find(M_.lead_lag_incidence(M_.maximum_endo_lag+1, ...
|
||||||
|
@ -127,84 +160,95 @@ GAM0 = zeros(M_.endo_nbr,M_.endo_nbr);
|
||||||
Dg0 = zeros(M_.endo_nbr,M_.endo_nbr,param_nbr);
|
Dg0 = zeros(M_.endo_nbr,M_.endo_nbr,param_nbr);
|
||||||
GAM0(:,cols_b) = g1(:,cols_j);
|
GAM0(:,cols_b) = g1(:,cols_j);
|
||||||
Dg0(:,cols_b,:) = gp(:,cols_j,:);
|
Dg0(:,cols_b,:) = gp(:,cols_j,:);
|
||||||
|
if nargout > 5,
|
||||||
|
D2g0 = zeros(M_.endo_nbr,M_.endo_nbr,param_nbr,param_nbr);
|
||||||
|
D2g0(:, cols_b, :, :) = g22(:,cols_j,:,:);
|
||||||
|
end
|
||||||
% GAM0 = g1(:,M_.lead_lag_incidence(M_.maximum_endo_lag+1,:));
|
% GAM0 = g1(:,M_.lead_lag_incidence(M_.maximum_endo_lag+1,:));
|
||||||
|
|
||||||
|
|
||||||
k = find(kstate(:,2) == M_.maximum_endo_lag+1 & kstate(:,4));
|
k2 = find(kstate(:,2) == M_.maximum_endo_lag+1 & kstate(:,4));
|
||||||
GAM2 = zeros(M_.endo_nbr,M_.endo_nbr);
|
GAM2 = zeros(M_.endo_nbr,M_.endo_nbr);
|
||||||
Dg2 = zeros(M_.endo_nbr,M_.endo_nbr,param_nbr);
|
Dg2 = zeros(M_.endo_nbr,M_.endo_nbr,param_nbr);
|
||||||
% nb = find(M_.lead_lag_incidence(1,:));
|
% nb = find(M_.lead_lag_incidence(1,:));
|
||||||
% GAM2(:, nb) = -g1(:,M_.lead_lag_incidence(1,nb));
|
% GAM2(:, nb) = -g1(:,M_.lead_lag_incidence(1,nb));
|
||||||
GAM2(:, kstate(k,1)) = -a(:,kstate(k,4));
|
GAM2(:, kstate(k2,1)) = -a(:,kstate(k2,4));
|
||||||
Dg2(:, kstate(k,1), :) = -da(:,kstate(k,4),:);
|
Dg2(:, kstate(k2,1), :) = -da(:,kstate(k2,4),:);
|
||||||
naux = 0;
|
if nargout > 5,
|
||||||
k = find(kstate(:,2) < M_.maximum_endo_lag+1 & kstate(:,4));
|
D2g2 = zeros(M_.endo_nbr,M_.endo_nbr,param_nbr,param_nbr);
|
||||||
kk = find(kstate(:,2) < M_.maximum_endo_lag+1 );
|
D2g2(:, kstate(k2,1), :, :) = -d2a(:,kstate(k2,4),:,:);
|
||||||
if ~isempty(k),
|
end% naux = 0;
|
||||||
ax(:,k)= -a(:,kstate(k,4));
|
% k = find(kstate(:,2) < M_.maximum_endo_lag+1 & kstate(:,4));
|
||||||
ax = ax(:,kk);
|
% kk = find(kstate(:,2) < M_.maximum_endo_lag+1 );
|
||||||
dax(:,k,:)= -da(:,kstate(k,4),:);
|
% if ~isempty(k),
|
||||||
dax = dax(:,kk,:);
|
% ax(:,k)= -a(:,kstate(k,4));
|
||||||
naux = size(ax,2);
|
% ax = ax(:,kk);
|
||||||
GAM2 = [GAM2 ax];
|
% dax(:,k,:)= -da(:,kstate(k,4),:);
|
||||||
Dg2 = cat(2,Dg2,dax);
|
% dax = dax(:,kk,:);
|
||||||
end
|
% naux = size(ax,2);
|
||||||
|
% GAM2 = [GAM2 ax];
|
||||||
GAM0 = blkdiag(GAM0,eye(naux));
|
% Dg2 = cat(2,Dg2,dax);
|
||||||
Dg0 = cat(1,Dg0,zeros(naux+nauxe,M_.endo_nbr,param_nbr));
|
% end
|
||||||
Dg0 = cat(2,Dg0,zeros(m+nauxe,naux,param_nbr));
|
%
|
||||||
Dg0 = cat(2,zeros(m+nauxe,nauxe,param_nbr),Dg0);
|
% GAM0 = blkdiag(GAM0,eye(naux));
|
||||||
|
% Dg0 = cat(1,Dg0,zeros(naux+nauxe,M_.endo_nbr,param_nbr));
|
||||||
GAM2 = [GAM2 ; A(M_.endo_nbr+1:end,:)];
|
% Dg0 = cat(2,Dg0,zeros(m+nauxe,naux,param_nbr));
|
||||||
Dg2 = cat(1,Dg2,zeros(naux+nauxe,m,param_nbr));
|
% Dg0 = cat(2,zeros(m+nauxe,nauxe,param_nbr),Dg0);
|
||||||
Dg2 = cat(2,zeros(m+nauxe,nauxe,param_nbr),Dg2);
|
%
|
||||||
GAM2 = [zeros(m+nauxe,nauxe) [GAM2; zeros(nauxe,m)]];
|
% GAM2 = [GAM2 ; A(M_.endo_nbr+1:end,:)];
|
||||||
GAM0 = [[zeros(m,nauxe);(eye(nauxe))] [GAM0; zeros(nauxe,m)]];
|
% Dg2 = cat(1,Dg2,zeros(naux+nauxe,m,param_nbr));
|
||||||
|
% Dg2 = cat(2,zeros(m+nauxe,nauxe,param_nbr),Dg2);
|
||||||
|
% GAM2 = [zeros(m+nauxe,nauxe) [GAM2; zeros(nauxe,m)]];
|
||||||
|
% GAM0 = [[zeros(m,nauxe);(eye(nauxe))] [GAM0; zeros(nauxe,m)]];
|
||||||
|
|
||||||
GAM3 = -g1(:,length(yy0)+1:end);
|
GAM3 = -g1(:,length(yy0)+1:end);
|
||||||
% GAM3 = -g1(oo_.dr.order_var,length(yy0)+1:end);
|
% GAM3 = -g1(oo_.dr.order_var,length(yy0)+1:end);
|
||||||
GAM3 = [GAM3; zeros(naux+nauxe,size(GAM3,2))];
|
% GAM3 = [GAM3; zeros(naux+nauxe,size(GAM3,2))];
|
||||||
% Dg3 = -gp(oo_.dr.order_var,length(yy0)+1:end,:);
|
% Dg3 = -gp(oo_.dr.order_var,length(yy0)+1:end,:);
|
||||||
Dg3 = -gp(:,length(yy0)+1:end,:);
|
Dg3 = -gp(:,length(yy0)+1:end,:);
|
||||||
Dg3 = cat(1,Dg3,zeros(naux+nauxe,size(GAM3,2),param_nbr));
|
if nargout>5,
|
||||||
|
D2g3 = -g22(:,length(yy0)+1:end,:,:);
|
||||||
|
clear g22 d2a
|
||||||
|
end
|
||||||
|
% Dg3 = cat(1,Dg3,zeros(naux+nauxe,size(GAM3,2),param_nbr));
|
||||||
|
|
||||||
auxe = zeros(0,1);
|
% auxe = zeros(0,1);
|
||||||
k0 = kstate(find(kstate(:,2) >= M_.maximum_endo_lag+2),:);;
|
% k0 = kstate(find(kstate(:,2) >= M_.maximum_endo_lag+2),:);;
|
||||||
i0 = find(k0(:,2) == M_.maximum_endo_lag+2);
|
% i0 = find(k0(:,2) == M_.maximum_endo_lag+2);
|
||||||
for i=M_.maximum_endo_lag+3:M_.maximum_endo_lag+2+M_.maximum_endo_lead,
|
% for i=M_.maximum_endo_lag+3:M_.maximum_endo_lag+2+M_.maximum_endo_lead,
|
||||||
i1 = find(k0(:,2) == i);
|
% i1 = find(k0(:,2) == i);
|
||||||
n1 = size(i1,1);
|
% n1 = size(i1,1);
|
||||||
j = zeros(n1,1);
|
% j = zeros(n1,1);
|
||||||
for j1 = 1:n1
|
% for j1 = 1:n1
|
||||||
j(j1) = find(k0(i0,1)==k0(i1(j1),1));
|
% j(j1) = find(k0(i0,1)==k0(i1(j1),1));
|
||||||
end
|
% end
|
||||||
auxe = [auxe; i0(j)];
|
% auxe = [auxe; i0(j)];
|
||||||
i0 = i1;
|
% i0 = i1;
|
||||||
end
|
% end
|
||||||
auxe = [(1:size(auxe,1))' auxe(end:-1:1)];
|
% auxe = [(1:size(auxe,1))' auxe(end:-1:1)];
|
||||||
n_ir1 = size(auxe,1);
|
% n_ir1 = size(auxe,1);
|
||||||
nr = m + n_ir1;
|
% nr = m + n_ir1;
|
||||||
GAM1 = [[GAM1 zeros(size(GAM1,1),naux)]; zeros(naux+nauxe,m+nauxe)];
|
% GAM1 = [[GAM1 zeros(size(GAM1,1),naux)]; zeros(naux+nauxe,m+nauxe)];
|
||||||
GAM1(m+1:end,:) = sparse(auxe(:,1),auxe(:,2),ones(n_ir1,1),n_ir1,nr);
|
% GAM1(m+1:end,:) = sparse(auxe(:,1),auxe(:,2),ones(n_ir1,1),n_ir1,nr);
|
||||||
Dg1 = cat(2,Dg1,zeros(M_.endo_nbr,naux,param_nbr));
|
% Dg1 = cat(2,Dg1,zeros(M_.endo_nbr,naux,param_nbr));
|
||||||
Dg1 = cat(1,Dg1,zeros(naux+nauxe,m+nauxe,param_nbr));
|
% Dg1 = cat(1,Dg1,zeros(naux+nauxe,m+nauxe,param_nbr));
|
||||||
|
|
||||||
Ax = A;
|
% Ax = A;
|
||||||
A1 = A;
|
% A1 = A;
|
||||||
Bx = B;
|
% Bx = B;
|
||||||
B1 = B;
|
% B1 = B;
|
||||||
for j=1:M_.maximum_endo_lead-1,
|
% for j=1:M_.maximum_endo_lead-1,
|
||||||
A1 = A1*A;
|
% A1 = A1*A;
|
||||||
B1 = A*B1;
|
% B1 = A*B1;
|
||||||
k = find(kstate(:,2) == M_.maximum_endo_lag+2+j );
|
% k = find(kstate(:,2) == M_.maximum_endo_lag+2+j );
|
||||||
Ax = [A1(kstate(k,1),:); Ax];
|
% Ax = [A1(kstate(k,1),:); Ax];
|
||||||
Bx = [B1(kstate(k,1),:); Bx];
|
% Bx = [B1(kstate(k,1),:); Bx];
|
||||||
end
|
% end
|
||||||
Ax = [zeros(m+nauxe,nauxe) Ax];
|
% Ax = [zeros(m+nauxe,nauxe) Ax];
|
||||||
A0 = A;
|
% A0 = A;
|
||||||
A=Ax; clear Ax A1;
|
% A=Ax; clear Ax A1;
|
||||||
B0=B;
|
% B0=B;
|
||||||
B = Bx; clear Bx B1;
|
% B = Bx; clear Bx B1;
|
||||||
|
|
||||||
m = size(A,1);
|
m = size(A,1);
|
||||||
n = size(B,2);
|
n = size(B,2);
|
||||||
|
@ -312,25 +356,35 @@ else % generalized sylvester equation
|
||||||
d(:,:,j) = Dg2(:,:,j)-elem(:,:,j)*A;
|
d(:,:,j) = Dg2(:,:,j)-elem(:,:,j)*A;
|
||||||
end
|
end
|
||||||
xx=sylvester3mr(a,b,c,d);
|
xx=sylvester3mr(a,b,c,d);
|
||||||
|
H=zeros(m*m+m*(m+1)/2,param_nbr+length(indexo));
|
||||||
|
if nargout>1,
|
||||||
|
dOm = zeros(m,m,param_nbr+length(indexo));
|
||||||
|
dA=zeros(m,m,param_nbr+length(indexo));
|
||||||
|
dB=zeros(m,n,param_nbr);
|
||||||
|
end
|
||||||
if ~isempty(indexo),
|
if ~isempty(indexo),
|
||||||
dSig = zeros(M_.exo_nbr,M_.exo_nbr);
|
dSig = zeros(M_.exo_nbr,M_.exo_nbr,length(indexo));
|
||||||
for j=1:length(indexo)
|
for j=1:length(indexo)
|
||||||
dSig(indexo(j),indexo(j)) = 2*sqrt(M_.Sigma_e(indexo(j),indexo(j)));
|
dSig(indexo(j),indexo(j),j) = 2*sqrt(M_.Sigma_e(indexo(j),indexo(j)));
|
||||||
y = B*dSig*B';
|
y = B*dSig(:,:,j)*B';
|
||||||
y = y(nauxe+1:end,nauxe+1:end);
|
% y = y(nauxe+1:end,nauxe+1:end);
|
||||||
H(:,j) = [zeros((m-nauxe)^2,1); dyn_vech(y)];
|
% H(:,j) = [zeros((m-nauxe)^2,1); dyn_vech(y)];
|
||||||
|
H(:,j) = [zeros(m^2,1); dyn_vech(y)];
|
||||||
if nargout>1,
|
if nargout>1,
|
||||||
dOm(:,:,j) = y;
|
dOm(:,:,j) = y;
|
||||||
end
|
end
|
||||||
dSig(indexo(j),indexo(j)) = 0;
|
% dSig(indexo(j),indexo(j)) = 0;
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
for j=1:param_nbr,
|
for j=1:param_nbr,
|
||||||
x = xx(:,:,j);
|
x = xx(:,:,j);
|
||||||
y = inva * (Dg3(:,:,j)-(elem(:,:,j)-GAM1*x)*B);
|
y = inva * (Dg3(:,:,j)-(elem(:,:,j)-GAM1*x)*B);
|
||||||
|
if nargout>1,
|
||||||
|
dB(:,:,j) = y;
|
||||||
|
end
|
||||||
y = y*M_.Sigma_e*B'+B*M_.Sigma_e*y';
|
y = y*M_.Sigma_e*B'+B*M_.Sigma_e*y';
|
||||||
x = x(nauxe+1:end,nauxe+1:end);
|
% x = x(nauxe+1:end,nauxe+1:end);
|
||||||
y = y(nauxe+1:end,nauxe+1:end);
|
% y = y(nauxe+1:end,nauxe+1:end);
|
||||||
if nargout>1,
|
if nargout>1,
|
||||||
dA(:,:,j+length(indexo)) = x;
|
dA(:,:,j+length(indexo)) = x;
|
||||||
dOm(:,:,j+length(indexo)) = y;
|
dOm(:,:,j+length(indexo)) = y;
|
||||||
|
@ -353,7 +407,120 @@ else % generalized sylvester equation
|
||||||
|
|
||||||
end
|
end
|
||||||
|
|
||||||
|
if nargout > 5,
|
||||||
|
tot_param_nbr = param_nbr + length(indexo);
|
||||||
|
tot_param_nbr_2 = tot_param_nbr*(tot_param_nbr+1)/2;
|
||||||
|
d = zeros(m,m,param_nbr_2);
|
||||||
|
d2A = zeros(m,m,tot_param_nbr,tot_param_nbr);
|
||||||
|
d2Om = zeros(m,m,tot_param_nbr,tot_param_nbr);
|
||||||
|
d2B = zeros(m,n,tot_param_nbr,tot_param_nbr);
|
||||||
|
cc=triu(ones(param_nbr,param_nbr));
|
||||||
|
[i2,j2]=find(cc);
|
||||||
|
cc = blkdiag( zeros(length(indexo),length(indexo)), cc);
|
||||||
|
[ipar2]=find(cc);
|
||||||
|
ctot=triu(ones(tot_param_nbr,tot_param_nbr));
|
||||||
|
ctot(1:length(indexo),1:length(indexo))=eye(length(indexo));
|
||||||
|
[itot2, jtot2]=find(ctot);
|
||||||
|
jcount=0;
|
||||||
|
for j=1:param_nbr,
|
||||||
|
for i=j:param_nbr,
|
||||||
|
elem1 = (D2g0(:,:,j,i)-D2g1(:,:,j,i)*A);
|
||||||
|
elem1 = D2g2(:,:,j,i)-elem1*A;
|
||||||
|
elemj0 = Dg0(:,:,j)-Dg1(:,:,j)*A;
|
||||||
|
elemi0 = Dg0(:,:,i)-Dg1(:,:,i)*A;
|
||||||
|
elem2 = -elemj0*xx(:,:,i)-elemi0*xx(:,:,j);
|
||||||
|
elem2 = elem2 + ( Dg1(:,:,j)*xx(:,:,i) + Dg1(:,:,i)*xx(:,:,j) )*A;
|
||||||
|
elem2 = elem2 + GAM1*( xx(:,:,i)*xx(:,:,j) + xx(:,:,j)*xx(:,:,i));
|
||||||
|
jcount=jcount+1;
|
||||||
|
d(:,:,jcount) = elem1+elem2;
|
||||||
|
end
|
||||||
|
end
|
||||||
|
xx2=sylvester3mr(a,b,c,d);
|
||||||
|
jcount = 0;
|
||||||
|
for j=1:param_nbr,
|
||||||
|
for i=j:param_nbr,
|
||||||
|
jcount=jcount+1;
|
||||||
|
x = xx2(:,:,jcount);
|
||||||
|
elem1 = (D2g0(:,:,j,i)-D2g1(:,:,j,i)*A);
|
||||||
|
elem1 = elem1 -( Dg1(:,:,j)*xx(:,:,i) + Dg1(:,:,i)*xx(:,:,j) );
|
||||||
|
elemj0 = Dg0(:,:,j)-Dg1(:,:,j)*A-GAM1*xx(:,:,j);
|
||||||
|
elemi0 = Dg0(:,:,i)-Dg1(:,:,i)*A-GAM1*xx(:,:,i);
|
||||||
|
elem0 = elemj0*dB(:,:,i)+elemi0*dB(:,:,j);
|
||||||
|
y = inva * (D2g3(:,:,j,i)-elem0-(elem1-GAM1*x)*B);
|
||||||
|
d2B(:,:,j+length(indexo),i+length(indexo)) = y;
|
||||||
|
d2B(:,:,i+length(indexo),j+length(indexo)) = y;
|
||||||
|
y = y*M_.Sigma_e*B'+B*M_.Sigma_e*y'+ ...
|
||||||
|
dB(:,:,j)*M_.Sigma_e*dB(:,:,i)'+dB(:,:,i)*M_.Sigma_e*dB(:,:,j)';
|
||||||
|
% x = x(nauxe+1:end,nauxe+1:end);
|
||||||
|
% y = y(nauxe+1:end,nauxe+1:end);
|
||||||
|
d2A(:,:,j+length(indexo),i+length(indexo)) = x;
|
||||||
|
d2A(:,:,i+length(indexo),j+length(indexo)) = x;
|
||||||
|
d2Om(:,:,j+length(indexo),i+length(indexo)) = y;
|
||||||
|
d2Om(:,:,i+length(indexo),j+length(indexo)) = y;
|
||||||
|
end
|
||||||
|
end
|
||||||
|
if ~isempty(indexo),
|
||||||
|
d2Sig = zeros(M_.exo_nbr,M_.exo_nbr,length(indexo));
|
||||||
|
for j=1:length(indexo)
|
||||||
|
d2Sig(indexo(j),indexo(j),j) = 2;
|
||||||
|
y = B*d2Sig(:,:,j)*B';
|
||||||
|
d2Om(:,:,j,j) = y;
|
||||||
|
% y = y(nauxe+1:end,nauxe+1:end);
|
||||||
|
% H(:,j) = [zeros((m-nauxe)^2,1); dyn_vech(y)];
|
||||||
|
% H(:,j) = [zeros(m^2,1); dyn_vech(y)];
|
||||||
|
% dOm(:,:,j) = y;
|
||||||
|
for i=1:param_nbr,
|
||||||
|
y = dB(:,:,i)*dSig(:,:,j)*B'+B*dSig(:,:,j)*dB(:,:,i)';
|
||||||
|
d2Om(:,:,j,i+length(indexo)) = y;
|
||||||
|
d2Om(:,:,i+length(indexo),j) = y;
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
return
|
return
|
||||||
|
|
||||||
|
function g22 = get_2nd_deriv(gpp,m,n,i,j),
|
||||||
|
|
||||||
|
g22=zeros(m,n);
|
||||||
|
is=find(gpp(:,3)==i);
|
||||||
|
is=is(find(gpp(is,4)==j));
|
||||||
|
|
||||||
|
if ~isempty(is),
|
||||||
|
g22(gpp(is,1),gpp(is,2))=gpp(is,5);
|
||||||
|
end
|
||||||
|
return
|
||||||
|
|
||||||
|
function g22 = get_all_2nd_derivs(gpp,m,n,npar),
|
||||||
|
|
||||||
|
g22=zeros(m,n,npar,npar);
|
||||||
|
% c=ones(npar,npar);
|
||||||
|
% c=triu(c);
|
||||||
|
% ic=find(c);
|
||||||
|
|
||||||
|
for is=1:length(gpp),
|
||||||
|
% d=zeros(npar,npar);
|
||||||
|
% d(gpp(is,3),gpp(is,4))=1;
|
||||||
|
% indx = find(ic==find(d));
|
||||||
|
g22(gpp(is,1),gpp(is,2),gpp(is,3),gpp(is,4))=gpp(is,5);
|
||||||
|
g22(gpp(is,1),gpp(is,2),gpp(is,4),gpp(is,3))=gpp(is,5);
|
||||||
|
end
|
||||||
|
|
||||||
|
return
|
||||||
|
|
||||||
|
function r22 = get_all_resid_2nd_derivs(rpp,m,npar),
|
||||||
|
|
||||||
|
r22=zeros(m,npar,npar);
|
||||||
|
% c=ones(npar,npar);
|
||||||
|
% c=triu(c);
|
||||||
|
% ic=find(c);
|
||||||
|
|
||||||
|
for is=1:length(rpp),
|
||||||
|
% d=zeros(npar,npar);
|
||||||
|
% d(rpp(is,2),rpp(is,3))=1;
|
||||||
|
% indx = find(ic==find(d));
|
||||||
|
r22(rpp(is,1),rpp(is,2),rpp(is,3))=rpp(is,4);
|
||||||
|
r22(rpp(is,1),rpp(is,3),rpp(is,2))=rpp(is,4);
|
||||||
|
end
|
||||||
|
|
||||||
|
return
|
|
@ -0,0 +1,258 @@
|
||||||
|
function [Hess] = get_Hessian(T,R,Q,H,P,Y,DT,DYss,DOm,DH,DP,D2T,D2Yss,D2Om,D2H,D2P,start,mf,kalman_tol,riccati_tol)
|
||||||
|
% function [Hess] = get_Hessian(T,R,Q,H,P,Y,DT,DYss,DOm,DH,DP,D2T,D2Yss,D2Om,D2H,D2P,start,mf,kalman_tol,riccati_tol)
|
||||||
|
%
|
||||||
|
% computes the hessian matrix of the log-likelihood function of
|
||||||
|
% a state space model (notation as in kalman_filter.m in DYNARE
|
||||||
|
% Thanks to Nikolai Iskrev
|
||||||
|
%
|
||||||
|
% NOTE: the derivative matrices (DT,DR ...) are 3-dim. arrays with last
|
||||||
|
% dimension equal to the number of structural parameters
|
||||||
|
% NOTE: the derivative matrices (D2T,D2Om ...) are 4-dim. arrays with last
|
||||||
|
% two dimensions equal to the number of structural parameters
|
||||||
|
|
||||||
|
% Copyright (C) 2011 Dynare Team
|
||||||
|
%
|
||||||
|
% This file is part of Dynare.
|
||||||
|
%
|
||||||
|
% Dynare is free software: you can redistribute it and/or modify
|
||||||
|
% it under the terms of the GNU General Public License as published by
|
||||||
|
% the Free Software Foundation, either version 3 of the License, or
|
||||||
|
% (at your option) any later version.
|
||||||
|
%
|
||||||
|
% Dynare is distributed in the hope that it will be useful,
|
||||||
|
% but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
% MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
% GNU General Public License for more details.
|
||||||
|
%
|
||||||
|
% You should have received a copy of the GNU General Public License
|
||||||
|
% along with Dynare. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
|
||||||
|
|
||||||
|
k = size(DT,3); % number of structural parameters
|
||||||
|
smpl = size(Y,2); % Sample size.
|
||||||
|
pp = size(Y,1); % Maximum number of observed variables.
|
||||||
|
mm = size(T,2); % Number of state variables.
|
||||||
|
a = zeros(mm,1); % State vector.
|
||||||
|
Om = R*Q*transpose(R); % Variance of R times the vector of structural innovations.
|
||||||
|
t = 0; % Initialization of the time index.
|
||||||
|
oldK = 0;
|
||||||
|
notsteady = 1; % Steady state flag.
|
||||||
|
F_singular = 1;
|
||||||
|
|
||||||
|
Hess = zeros(k,k); % Initialization of the Hessian
|
||||||
|
Da = zeros(mm,k); % State vector.
|
||||||
|
Dv = zeros(length(mf),k);
|
||||||
|
D2a = zeros(mm,k,k); % State vector.
|
||||||
|
D2v = zeros(length(mf),k,k);
|
||||||
|
|
||||||
|
C = zeros(length(mf),mm);
|
||||||
|
for ii=1:length(mf); C(ii,mf(ii))=1;end % SELECTION MATRIX IN MEASUREMENT EQ. (FOR WHEN IT IS NOT CONSTANT)
|
||||||
|
dC = zeros(length(mf),mm,k);
|
||||||
|
d2C = zeros(length(mf),mm,k,k);
|
||||||
|
|
||||||
|
s = zeros(pp,1); % CONSTANT TERM IN MEASUREMENT EQ. (FOR WHEN IT IS NOT CONSTANT)
|
||||||
|
ds = zeros(pp,1,k);
|
||||||
|
d2s = zeros(pp,1,k,k);
|
||||||
|
|
||||||
|
% for ii = 1:k
|
||||||
|
% DOm = DR(:,:,ii)*Q*transpose(R) + R*DQ(:,:,ii)*transpose(R) + R*Q*transpose(DR(:,:,ii));
|
||||||
|
% end
|
||||||
|
|
||||||
|
while notsteady & t<smpl
|
||||||
|
t = t+1;
|
||||||
|
v = Y(:,t)-a(mf);
|
||||||
|
F = P(mf,mf) + H;
|
||||||
|
if rcond(F) < kalman_tol
|
||||||
|
if ~all(abs(F(:))<kalman_tol)
|
||||||
|
return
|
||||||
|
else
|
||||||
|
a = T*a;
|
||||||
|
P = T*P*transpose(T)+Om;
|
||||||
|
end
|
||||||
|
else
|
||||||
|
F_singular = 0;
|
||||||
|
iF = inv(F);
|
||||||
|
K = P(:,mf)*iF;
|
||||||
|
|
||||||
|
[DK,DF,DP1] = computeDKalman(T,DT,DOm,P,DP,DH,mf,iF,K);
|
||||||
|
[D2K,D2F,D2P1] = computeD2Kalman(T,DT,D2T,D2Om,P,DP,D2P,DH,mf,iF,K,DK);
|
||||||
|
tmp = (a+K*v);
|
||||||
|
|
||||||
|
for ii = 1:k
|
||||||
|
Dv(:,ii) = -Da(mf,ii) - DYss(mf,ii);
|
||||||
|
% dai = da(:,:,ii);
|
||||||
|
dKi = DK(:,:,ii);
|
||||||
|
diFi = -iF*DF(:,:,ii)*iF;
|
||||||
|
dtmpi = Da(:,ii)+dKi*v+K*Dv(:,ii);
|
||||||
|
|
||||||
|
|
||||||
|
for jj = 1:ii
|
||||||
|
dFj = DF(:,:,jj);
|
||||||
|
diFj = -iF*DF(:,:,jj)*iF;
|
||||||
|
dKj = DK(:,:,jj);
|
||||||
|
d2Kij = D2K(:,:,jj,ii);
|
||||||
|
d2Fij = D2F(:,:,jj,ii);
|
||||||
|
d2iFij = -diFi*dFj*iF -iF*d2Fij*iF -iF*dFj*diFi;
|
||||||
|
dtmpj = Da(:,jj)+dKj*v+K*Dv(:,jj);
|
||||||
|
|
||||||
|
d2vij = -D2Yss(mf,jj,ii) - D2a(mf,jj,ii);
|
||||||
|
d2tmpij = D2a(:,jj,ii) + d2Kij*v + dKj*Dv(:,ii) + dKi*Dv(:,jj) + K*d2vij;
|
||||||
|
D2a(:,jj,ii) = D2T(:,:,jj,ii)*tmp + DT(:,:,jj)*dtmpi + DT(:,:,ii)*dtmpj + T*d2tmpij;
|
||||||
|
|
||||||
|
Hesst(ii,jj) = getHesst_ij(v,Dv(:,ii),Dv(:,jj),d2vij,iF,diFi,diFj,d2iFij,dFj,d2Fij);
|
||||||
|
end
|
||||||
|
Da(:,ii) = DT(:,:,ii)*tmp + T*dtmpi;
|
||||||
|
end
|
||||||
|
% vecDPmf = reshape(DP(mf,mf,:),[],k);
|
||||||
|
% iPmf = inv(P(mf,mf));
|
||||||
|
if t>=start
|
||||||
|
Hess = Hess + Hesst;
|
||||||
|
end
|
||||||
|
a = T*(a+K*v);
|
||||||
|
P = T*(P-K*P(mf,:))*transpose(T)+Om;
|
||||||
|
DP = DP1;
|
||||||
|
D2P = D2P1;
|
||||||
|
end
|
||||||
|
notsteady = max(max(abs(K-oldK))) > riccati_tol;
|
||||||
|
oldK = K;
|
||||||
|
end
|
||||||
|
|
||||||
|
if F_singular
|
||||||
|
error('The variance of the forecast error remains singular until the end of the sample')
|
||||||
|
end
|
||||||
|
|
||||||
|
|
||||||
|
if t < smpl
|
||||||
|
t0 = t+1;
|
||||||
|
while t < smpl
|
||||||
|
t = t+1;
|
||||||
|
v = Y(:,t)-a(mf);
|
||||||
|
tmp = (a+K*v);
|
||||||
|
for ii = 1:k,
|
||||||
|
Dv(:,ii) = -Da(mf,ii)-DYss(mf,ii);
|
||||||
|
dKi = DK(:,:,ii);
|
||||||
|
diFi = -iF*DF(:,:,ii)*iF;
|
||||||
|
dtmpi = Da(:,ii)+dKi*v+K*Dv(:,ii);
|
||||||
|
|
||||||
|
for jj = 1:ii,
|
||||||
|
dFj = DF(:,:,jj);
|
||||||
|
diFj = -iF*DF(:,:,jj)*iF;
|
||||||
|
dKj = DK(:,:,jj);
|
||||||
|
d2Kij = D2K(:,:,jj,ii);
|
||||||
|
d2Fij = D2F(:,:,jj,ii);
|
||||||
|
d2iFij = -diFi*dFj*iF -iF*d2Fij*iF -iF*dFj*diFi;
|
||||||
|
dtmpj = Da(:,jj)+dKj*v+K*Dv(:,jj);
|
||||||
|
|
||||||
|
d2vij = -D2Yss(mf,jj,ii) - D2a(mf,jj,ii);
|
||||||
|
d2tmpij = D2a(:,jj,ii) + d2Kij*v + dKj*Dv(:,ii) + dKi*Dv(:,jj) + K*d2vij;
|
||||||
|
D2a(:,jj,ii) = D2T(:,:,jj,ii)*tmp + DT(:,:,jj)*dtmpi + DT(:,:,ii)*dtmpj + T*d2tmpij;
|
||||||
|
|
||||||
|
Hesst(ii,jj) = getHesst_ij(v,Dv(:,ii),Dv(:,jj),d2vij,iF,diFi,diFj,d2iFij,dFj,d2Fij);
|
||||||
|
end
|
||||||
|
Da(:,ii) = DT(:,:,ii)*tmp + T*dtmpi;
|
||||||
|
end
|
||||||
|
if t>=start
|
||||||
|
Hess = Hess + Hesst;
|
||||||
|
end
|
||||||
|
a = T*(a+K*v);
|
||||||
|
end
|
||||||
|
% Hess = Hess + .5*(smpl+t0-1)*(vecDPmf' * kron(iPmf,iPmf) * vecDPmf);
|
||||||
|
% for ii = 1:k;
|
||||||
|
% for jj = 1:ii
|
||||||
|
% H(ii,jj) = trace(iPmf*(.5*DP(mf,mf,ii)*iPmf*DP(mf,mf,jj) + Dv(:,ii)*Dv(:,jj)'));
|
||||||
|
% end
|
||||||
|
% end
|
||||||
|
end
|
||||||
|
|
||||||
|
Hess = Hess + tril(Hess,-1)';
|
||||||
|
|
||||||
|
Hess = -Hess/2;
|
||||||
|
% end of main function
|
||||||
|
|
||||||
|
function Hesst_ij = getHesst_ij(e,dei,dej,d2eij,iS,diSi,diSj,d2iSij,dSj,d2Sij);
|
||||||
|
% computes (i,j) term in the Hessian
|
||||||
|
|
||||||
|
Hesst_ij = trace(diSi*dSj + iS*d2Sij) + e'*d2iSij*e + 2*(dei'*diSj*e + dei'*iS*dej + e'*diSi*dej + e'*iS*d2eij);
|
||||||
|
|
||||||
|
% end of getHesst_ij
|
||||||
|
|
||||||
|
function [DK,DF,DP1] = computeDKalman(T,DT,DOm,P,DP,DH,mf,iF,K)
|
||||||
|
|
||||||
|
k = size(DT,3);
|
||||||
|
tmp = P-K*P(mf,:);
|
||||||
|
|
||||||
|
for ii = 1:k
|
||||||
|
DF(:,:,ii) = DP(mf,mf,ii) + DH(:,:,ii);
|
||||||
|
DiF(:,:,ii) = -iF*DF(:,:,ii)*iF;
|
||||||
|
DK(:,:,ii) = DP(:,mf,ii)*iF + P(:,mf)*DiF(:,:,ii);
|
||||||
|
Dtmp = DP(:,:,ii) - DK(:,:,ii)*P(mf,:) - K*DP(mf,:,ii);
|
||||||
|
DP1(:,:,ii) = DT(:,:,ii)*tmp*T' + T*Dtmp*T' + T*tmp*DT(:,:,ii)' + DOm(:,:,ii);
|
||||||
|
end
|
||||||
|
|
||||||
|
% end of computeDKalman
|
||||||
|
|
||||||
|
function [d2K,d2S,d2P1] = computeD2Kalman(A,dA,d2A,d2Om,P0,dP0,d2P0,DH,mf,iF,K0,dK0);
|
||||||
|
% computes the second derivatives of the Kalman matrices
|
||||||
|
% note: A=T in main func.
|
||||||
|
|
||||||
|
k = size(dA,3);
|
||||||
|
tmp = P0-K0*P0(mf,:);
|
||||||
|
[ns,no] = size(K0);
|
||||||
|
|
||||||
|
% CPC = C*P0*C'; CPC = .5*(CPC+CPC');iF = inv(CPC);
|
||||||
|
% APC = A*P0*C';
|
||||||
|
% APA = A*P0*A';
|
||||||
|
|
||||||
|
|
||||||
|
d2K = zeros(ns,no,k,k);
|
||||||
|
d2S = zeros(no,no,k,k);
|
||||||
|
d2P1 = zeros(ns,ns,k,k);
|
||||||
|
|
||||||
|
for ii = 1:k
|
||||||
|
dAi = dA(:,:,ii);
|
||||||
|
dFi = dP0(mf,mf,ii);
|
||||||
|
d2Omi = d2Om(:,:,ii);
|
||||||
|
diFi = -iF*dFi*iF;
|
||||||
|
dKi = dK0(:,:,ii);
|
||||||
|
for jj = 1:k
|
||||||
|
dAj = dA(:,:,jj);
|
||||||
|
dFj = dP0(mf,mf,jj);
|
||||||
|
d2Omj = d2Om(:,:,jj);
|
||||||
|
dFj = dP0(mf,mf,jj);
|
||||||
|
diFj = -iF*dFj*iF;
|
||||||
|
dKj = dK0(:,:,jj);
|
||||||
|
|
||||||
|
d2Aij = d2A(:,:,jj,ii);
|
||||||
|
d2Pij = d2P0(:,:,jj,ii);
|
||||||
|
d2Omij = d2Om(:,:,jj,ii);
|
||||||
|
|
||||||
|
% second order
|
||||||
|
|
||||||
|
d2Fij = d2Pij(mf,mf) ;
|
||||||
|
|
||||||
|
% d2APC = d2Aij*P0*C' + A*d2Pij*C' + A*P0*d2Cij' + dAi*dPj*C' + dAj*dPi*C' + A*dPj*dCi' + A*dPi*dCj' + dAi*P0*dCj' + dAj*P0*dCi';
|
||||||
|
d2APC = d2Pij(:,mf);
|
||||||
|
|
||||||
|
d2iF = -diFi*dFj*iF -iF*d2Fij*iF -iF*dFj*diFi;
|
||||||
|
|
||||||
|
d2Kij= d2Pij(:,mf)*iF + P0(:,mf)*d2iF + dP0(:,mf,jj)*diFi + dP0(:,mf,ii)*diFj;
|
||||||
|
|
||||||
|
d2KCP = d2Kij*P0(mf,:) + K0*d2Pij(mf,:) + dKi*dP0(mf,:,jj) + dKj*dP0(mf,:,ii) ;
|
||||||
|
|
||||||
|
dtmpi = dP0(:,:,ii) - dK0(:,:,ii)*P0(mf,:) - K0*dP0(mf,:,ii);
|
||||||
|
dtmpj = dP0(:,:,jj) - dK0(:,:,jj)*P0(mf,:) - K0*dP0(mf,:,jj);
|
||||||
|
d2tmp = d2Pij - d2KCP;
|
||||||
|
|
||||||
|
d2AtmpA = d2Aij*tmp*A' + A*d2tmp*A' + A*tmp*d2Aij' + dAi*dtmpj*A' + dAj*dtmpi*A' + A*dtmpj*dAi' + A*dtmpi*dAj' + dAi*tmp*dAj' + dAj*tmp*dAi';
|
||||||
|
|
||||||
|
d2K(:,:,ii,jj) = d2Kij; %#ok<NASGU>
|
||||||
|
d2P1(:,:,ii,jj) = d2AtmpA + d2Omij; %#ok<*NASGU>
|
||||||
|
d2S(:,:,ii,jj) = d2Fij;
|
||||||
|
% d2iS(:,:,ii,jj) = d2iF;
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
% end of computeD2Kalman
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
function ldens = lpdfgam(x,a,b);
|
function [ldens,Dldens,D2ldens] = lpdfgam(x,a,b);
|
||||||
% Evaluates the logged GAMMA PDF at x.
|
% Evaluates the logged GAMMA PDF at x.
|
||||||
%
|
%
|
||||||
% INPUTS
|
% INPUTS
|
||||||
|
@ -38,3 +38,21 @@ if length(a)==1
|
||||||
else
|
else
|
||||||
ldens(idx) = -gammaln(a(idx)) - a(idx).*log(b(idx)) + (a(idx)-1).*log(x(idx)) - x(idx)./b(idx) ;
|
ldens(idx) = -gammaln(a(idx)) - a(idx).*log(b(idx)) + (a(idx)-1).*log(x(idx)) - x(idx)./b(idx) ;
|
||||||
end
|
end
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
if nargout >1
|
||||||
|
if length(a)==1
|
||||||
|
Dldens(idx) = (a-1)./(x(idx)) - ones(length(idx),1)/b ;
|
||||||
|
else
|
||||||
|
Dldens(idx) = (a(idx)-1)./(x(idx)) - ones(length(idx),1)./b(idx) ;
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
if nargout == 3
|
||||||
|
if length(a)==1
|
||||||
|
D2ldens(idx) = -(a-1)./(x(idx)).^2;
|
||||||
|
else
|
||||||
|
D2ldens(idx) = -(a(idx)-1)./(x(idx)).^2;
|
||||||
|
end
|
||||||
|
end
|
|
@ -1,4 +1,4 @@
|
||||||
function ldens = lpdfgbeta(x,a,b,aa,bb);
|
function [ldens,Dldens,D2ldens] = lpdfgbeta(x,a,b,aa,bb);
|
||||||
% Evaluates the logged BETA PDF at x.
|
% Evaluates the logged BETA PDF at x.
|
||||||
%
|
%
|
||||||
% INPUTS
|
% INPUTS
|
||||||
|
@ -39,3 +39,21 @@ if length(a)==1
|
||||||
else
|
else
|
||||||
ldens(idx) = -betaln(a(idx),b(idx)) + (a(idx)-1).*log(x(idx)-aa(idx)) + (b(idx)-1).*log(bb(idx)-x(idx)) - (a(idx)+b(idx)-1).*log(bb(idx)-aa(idx));
|
ldens(idx) = -betaln(a(idx),b(idx)) + (a(idx)-1).*log(x(idx)-aa(idx)) + (b(idx)-1).*log(bb(idx)-x(idx)) - (a(idx)+b(idx)-1).*log(bb(idx)-aa(idx));
|
||||||
end
|
end
|
||||||
|
|
||||||
|
|
||||||
|
if nargout >1
|
||||||
|
if length(a)==1
|
||||||
|
Dldens(idx) = (a-1)./(x(idx)-aa) - (b-1)./(bb-x(idx)) ;
|
||||||
|
else
|
||||||
|
Dldens(idx) = (a(idx)-1)./(x(idx)-aa(idx)) - (b(idx)-1)./(bb(idx)-x(idx));
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
|
||||||
|
if nargout == 3
|
||||||
|
if length(a)==1
|
||||||
|
D2ldens(idx) = -(a-1)./(x(idx)-aa).^2 - (b-1)./(bb-x(idx)).^2 ;
|
||||||
|
else
|
||||||
|
D2ldens(idx) = -(a(idx)-1)./(x(idx)-aa(idx)).^2 - (b(idx)-1)./(bb(idx)-x(idx)).^2;
|
||||||
|
end
|
||||||
|
end
|
|
@ -1,4 +1,4 @@
|
||||||
function ldens = lpdfig1(x,s,nu)
|
function [ldens,Dldens,D2ldens] = lpdfig1(x,s,nu)
|
||||||
% Evaluates the logged INVERSE-GAMMA-1 PDF at x.
|
% Evaluates the logged INVERSE-GAMMA-1 PDF at x.
|
||||||
%
|
%
|
||||||
% X ~ IG1(s,nu) if X = sqrt(Y) where Y ~ IG2(s,nu) and Y = inv(Z) with Z ~ G(nu/2,2/s) (Gamma distribution)
|
% X ~ IG1(s,nu) if X = sqrt(Y) where Y ~ IG2(s,nu) and Y = inv(Z) with Z ~ G(nu/2,2/s) (Gamma distribution)
|
||||||
|
@ -42,3 +42,20 @@ if length(s)==1
|
||||||
else
|
else
|
||||||
ldens(idx) = log(2) - gammaln(.5*nu(idx)) - .5*nu(idx).*(log(2)-log(s(idx))) - (nu(idx)+1).*log(x(idx)) - .5*s(idx)./(x(idx).*x(idx)) ;
|
ldens(idx) = log(2) - gammaln(.5*nu(idx)) - .5*nu(idx).*(log(2)-log(s(idx))) - (nu(idx)+1).*log(x(idx)) - .5*s(idx)./(x(idx).*x(idx)) ;
|
||||||
end
|
end
|
||||||
|
|
||||||
|
if nargout >1
|
||||||
|
if length(s)==1
|
||||||
|
Dldens(idx) = - (nu+1)./(x(idx)) + s./(x(idx).^3) ;
|
||||||
|
else
|
||||||
|
Dldens(idx) = - (nu(idx)+1)./(x(idx)) + s(idx)./(x(idx).^3) ;
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
if nargout == 3
|
||||||
|
if length(s)==1
|
||||||
|
D2ldens(idx) = (nu+1)./(x(idx).^2) - 3*s(idx)./(x(idx).^4) ;
|
||||||
|
else
|
||||||
|
D2ldens(idx) = (nu(idx)+1)./(x(idx).^2) - 3*s(idx)./(x(idx).^4) ;
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
function ldens = lpdfig2(x,s,nu)
|
function [ldens,Dldens,D2ldens] = lpdfig2(x,s,nu)
|
||||||
% Evaluates the logged INVERSE-GAMMA-2 PDF at x.
|
% Evaluates the logged INVERSE-GAMMA-2 PDF at x.
|
||||||
%
|
%
|
||||||
% X ~ IG2(s,nu) if X = inv(Z) where Z ~ G(nu/2,2/s) (Gamma distribution)
|
% X ~ IG2(s,nu) if X = inv(Z) where Z ~ G(nu/2,2/s) (Gamma distribution)
|
||||||
|
@ -42,3 +42,19 @@ if length(s)==1
|
||||||
else
|
else
|
||||||
ldens(idx) = -gammaln(.5*nu(idx)) - (.5*nu(idx)).*(log(2)-log(s(idx))) - .5*(nu(idx)+2).*log(x(idx)) -.5*s(idx)./x(idx);
|
ldens(idx) = -gammaln(.5*nu(idx)) - (.5*nu(idx)).*(log(2)-log(s(idx))) - .5*(nu(idx)+2).*log(x(idx)) -.5*s(idx)./x(idx);
|
||||||
end
|
end
|
||||||
|
|
||||||
|
if nargout >1
|
||||||
|
if length(s)==1
|
||||||
|
Dldens(idx) = - .5*(nu+2)./(x(idx)) + .5*s./x(idx).^2;
|
||||||
|
else
|
||||||
|
Dldens(idx) = - .5*(nu(idx)+2)./(x(idx)) + .5*s(idx)./x(idx).^2;
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
if nargout == 3
|
||||||
|
if length(s)==1
|
||||||
|
D2ldens(idx) = .5*(nu+2)./(x(idx)).^2 - s./x(idx).^3;
|
||||||
|
else
|
||||||
|
D2ldens(idx) = .5*(nu(idx)+2)./(x(idx)).^2 - s(idx)./x(idx).^3;
|
||||||
|
end
|
||||||
|
end
|
|
@ -1,4 +1,4 @@
|
||||||
function ldens = lpdfnorm(x,a,b)
|
function [ldens,Dldens,D2ldens] = lpdfnorm(x,a,b)
|
||||||
% Evaluates the logged UNIVARIATE GAUSSIAN PDF at x.
|
% Evaluates the logged UNIVARIATE GAUSSIAN PDF at x.
|
||||||
%
|
%
|
||||||
% INPUTS
|
% INPUTS
|
||||||
|
@ -33,3 +33,11 @@ function ldens = lpdfnorm(x,a,b)
|
||||||
if nargin<3, b=1; end
|
if nargin<3, b=1; end
|
||||||
if nargin<2, a=0; end
|
if nargin<2, a=0; end
|
||||||
ldens = -log(b) -.5*log(2*pi) - .5*((x-a)./b).*((x-a)./b) ;
|
ldens = -log(b) -.5*log(2*pi) - .5*((x-a)./b).*((x-a)./b) ;
|
||||||
|
|
||||||
|
if nargout >1
|
||||||
|
Dldens = - (1/b)*((x-a)/b) ;
|
||||||
|
end
|
||||||
|
|
||||||
|
if nargout == 3
|
||||||
|
D2ldens = - (1/b)^2 ;
|
||||||
|
end
|
|
@ -1,4 +1,4 @@
|
||||||
function mode_check(func,x,fval,hessian,DynareDataset,DynareOptions,Model,EstimatedParameters,BayesInfo,DynareResults)
|
function mode_check(fun,x,hessian,DynareDataset,DynareOptions,Model,EstimatedParameters,BayesInfo,DynareResults)
|
||||||
|
|
||||||
% function mode_check(x,fval,hessian,gend,data,lb,ub)
|
% function mode_check(x,fval,hessian,gend,data,lb,ub)
|
||||||
% Checks the maximum likelihood mode
|
% Checks the maximum likelihood mode
|
||||||
|
@ -91,7 +91,7 @@ for plt = 1:nbplt,
|
||||||
end
|
end
|
||||||
for i=1:length(z)
|
for i=1:length(z)
|
||||||
xx(kk) = z(i);
|
xx(kk) = z(i);
|
||||||
[fval, exit_flag] = feval(fun,x,DynareDataset,DynareOptions,Model,EstimatedParameters,BayesInfo,DynareResults);
|
[fval, exit_flag] = feval(fun,xx,DynareDataset,DynareOptions,Model,EstimatedParameters,BayesInfo,DynareResults);
|
||||||
if exit_flag
|
if exit_flag
|
||||||
y(i,1) = fval;
|
y(i,1) = fval;
|
||||||
else
|
else
|
||||||
|
|
|
@ -46,7 +46,7 @@ icount=0;
|
||||||
nx=length(x);
|
nx=length(x);
|
||||||
xparam1=x;
|
xparam1=x;
|
||||||
%ftol0=1.e-6;
|
%ftol0=1.e-6;
|
||||||
htol_base = max(1.e-5, ftol0);
|
htol_base = max(1.e-7, ftol0);
|
||||||
flagit=0; % mode of computation of hessian in each iteration
|
flagit=0; % mode of computation of hessian in each iteration
|
||||||
ftol=ftol0;
|
ftol=ftol0;
|
||||||
gtol=1.e-3;
|
gtol=1.e-3;
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
function logged_prior_density = priordens(x, pshape, p6, p7, p3, p4,initialization)
|
function [logged_prior_density, dlprior, d2lprior] = priordens(x, pshape, p6, p7, p3, p4,initialization)
|
||||||
% Computes a prior density for the structural parameters of DSGE models
|
% Computes a prior density for the structural parameters of DSGE models
|
||||||
%
|
%
|
||||||
% INPUTS
|
% INPUTS
|
||||||
|
@ -81,6 +81,11 @@ if tt1
|
||||||
if isinf(logged_prior_density)
|
if isinf(logged_prior_density)
|
||||||
return
|
return
|
||||||
end
|
end
|
||||||
|
if nargout == 2,
|
||||||
|
[tmp, dlprior(id1)]=lpdfgbeta(x(id1),p6(id1),p7(id1),p3(id1),p4(id1));
|
||||||
|
elseif nargout == 3
|
||||||
|
[tmp, dlprior(id1), d2lprior(id1)]=lpdfgbeta(x(id1),p6(id1),p7(id1),p3(id1),p4(id1));
|
||||||
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
if tt2
|
if tt2
|
||||||
|
@ -88,10 +93,20 @@ if tt2
|
||||||
if isinf(logged_prior_density)
|
if isinf(logged_prior_density)
|
||||||
return
|
return
|
||||||
end
|
end
|
||||||
|
if nargout == 2,
|
||||||
|
[tmp, dlprior(id2)]=lpdfgam(x(id2)-p3(id2),p6(id2),p7(id2));
|
||||||
|
elseif nargout == 3
|
||||||
|
[tmp, dlprior(id2), d2lprior(id2)]=lpdfgam(x(id2)-p3(id2),p6(id2),p7(id2));
|
||||||
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
if tt3
|
if tt3
|
||||||
logged_prior_density = logged_prior_density + sum(lpdfnorm(x(id3),p6(id3),p7(id3))) ;
|
logged_prior_density = logged_prior_density + sum(lpdfnorm(x(id3),p6(id3),p7(id3))) ;
|
||||||
|
if nargout == 2,
|
||||||
|
[tmp, dlprior(id3)]=lpdfnorm(x(id3),p6(id3),p7(id3));
|
||||||
|
elseif nargout == 3
|
||||||
|
[tmp, dlprior(id3), d2lprior(id3)]=lpdfnorm(x(id3),p6(id3),p7(id3));
|
||||||
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
if tt4
|
if tt4
|
||||||
|
@ -99,6 +114,11 @@ if tt4
|
||||||
if isinf(logged_prior_density)
|
if isinf(logged_prior_density)
|
||||||
return
|
return
|
||||||
end
|
end
|
||||||
|
if nargout == 2,
|
||||||
|
[tmp, dlprior(id4)]=lpdfig1(x(id4)-p3(id4),p6(id4),p7(id4));
|
||||||
|
elseif nargout == 3
|
||||||
|
[tmp, dlprior(id4), d2lprior(id4)]=lpdfig1(x(id4)-p3(id4),p6(id4),p7(id4));
|
||||||
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
if tt5
|
if tt5
|
||||||
|
@ -107,6 +127,12 @@ if tt5
|
||||||
return
|
return
|
||||||
end
|
end
|
||||||
logged_prior_density = logged_prior_density + sum(log(1./(p4(id5)-p3(id5)))) ;
|
logged_prior_density = logged_prior_density + sum(log(1./(p4(id5)-p3(id5)))) ;
|
||||||
|
if nargout >1,
|
||||||
|
dlprior(id5)=zeros(length(id5),1);
|
||||||
|
end
|
||||||
|
if nargout == 3
|
||||||
|
d2lprior(id5)=zeros(length(id5),1);
|
||||||
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
if tt6
|
if tt6
|
||||||
|
@ -114,4 +140,13 @@ if tt6
|
||||||
if isinf(logged_prior_density)
|
if isinf(logged_prior_density)
|
||||||
return
|
return
|
||||||
end
|
end
|
||||||
|
if nargout == 2,
|
||||||
|
[tmp, dlprior(id6)]=lpdfig2(x(id6)-p3(id6),p6(id6),p7(id6));
|
||||||
|
elseif nargout == 3
|
||||||
|
[tmp, dlprior(id6), d2lprior(id6)]=lpdfig2(x(id6)-p3(id6),p6(id6),p7(id6));
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
if nargout==3,
|
||||||
|
d2lprior = diag(d2lprior);
|
||||||
end
|
end
|
|
@ -98,7 +98,7 @@ function [DLIK] = score(T,R,Q,H,P,Y,DT,DYss,DOm,DH,DP,start,mf,kalman_tol,riccat
|
||||||
a = T*(a+K*v);
|
a = T*(a+K*v);
|
||||||
end
|
end
|
||||||
for ii = 1:k
|
for ii = 1:k
|
||||||
DLIK(ii,1) = DLIK(ii,1) + (smpl-t0+1)*trace( iF*DF(:,:,ii) );
|
% DLIK(ii,1) = DLIK(ii,1) + (smpl-t0+1)*trace( iF*DF(:,:,ii) );
|
||||||
end
|
end
|
||||||
|
|
||||||
end
|
end
|
||||||
|
|
Loading…
Reference in New Issue