226 lines
5.8 KiB
Matlab
226 lines
5.8 KiB
Matlab
% Program calculating the posterior density
|
|
% 1. define xparam
|
|
% 2. call model setup & reduction program
|
|
% 3. prepare state space variables and kalman-filter setup
|
|
% 4. evaluate likelihood with kalman filter
|
|
% 5. evaluate prior
|
|
%------------------------------------------------------------------------------
|
|
%------------------------------------------------------------------------------
|
|
function [fval,cost_flag,atT,innov,ys,trend_coeff] = ...
|
|
mj_optmumlik(xparam1,gend,rawdata,algo);
|
|
|
|
% algo = 1: computes filter + likelihood
|
|
% alog = 2: computes filter + likelihood + smoother
|
|
|
|
global M_ oo_ estim_params_ options_
|
|
global bayestopt_ dr1_test_ trend_coeff_ xparam_test
|
|
|
|
xparam_test = xparam1;
|
|
cost_flag = 1;
|
|
if options_.mode_compute ~= 1 && any(xparam1 < bayestopt_.lb)
|
|
k = find(xparam1 < bayestopt_.lb);
|
|
fval = bayestopt_.penalty+sum(bayestopt_.lb(k)-xparam1(k));
|
|
cost_flag = 0;
|
|
return;
|
|
end
|
|
if options_.mode_compute ~= 1 && any(xparam1 > bayestopt_.ub)
|
|
k = find(xparam1 > bayestopt_.ub);
|
|
fval = bayestopt_.penalty+sum(xparam1(k)-bayestopt_.ub(k));
|
|
cost_flag = 0;
|
|
return;
|
|
end
|
|
|
|
nobs = size(options_.varobs,1);
|
|
|
|
q = M_.Sigma_e;
|
|
for i=1:estim_params_.nvx
|
|
k =estim_params_.var_exo(i,1);
|
|
q(k,k) = xparam1(i)*xparam1(i);
|
|
end
|
|
|
|
offset = estim_params_.nvx;
|
|
h = zeros(nobs,nobs);
|
|
for i=1:estim_params_.nvn
|
|
k =estim_params_.var_endo(i,1);
|
|
h(k,k) = xparam1(i+offset)*xparam1(i+offset);
|
|
end
|
|
|
|
offset = offset+estim_params_.nvn;
|
|
for i=1:estim_params_.ncx
|
|
k1 =estim_params_.corrx(i,1);
|
|
k2 =estim_params_.corrx(i,2);
|
|
q(k1,k2) = xparam1(i+offset)*sqrt(q(k1,k1)*q(k2,k2));
|
|
q(k2,k1) = q(k1,k2);
|
|
end
|
|
|
|
offset = offset+estim_params_.ncx;
|
|
for i=1:estim_params_.ncn
|
|
k1 =estim_params_.corrn(i,1);
|
|
k2 =estim_params_.corrn(i,2);
|
|
h(k1,k2) = xparam1(i+offset)*sqrt(h(k1,k1)*h(k2,k2));
|
|
h(k2,k1) = h(k1,k2);
|
|
end
|
|
|
|
offset = offset+estim_params_.ncn;
|
|
for i=1:estim_params_.np
|
|
%this dosn't work with struct field M_.param
|
|
%assignin('base',deblank(estim_params_.param_names(i,:)),xparam1(i+offset));
|
|
tmpvalue = xparam1(i+offset);
|
|
eval('caller',[ deblank(estim_params_.param_names(i,:)) ' = tmpvalue;']);
|
|
end
|
|
|
|
%------------------------------------------------------------------------------
|
|
% 2. call model setup & reduction program
|
|
%------------------------------------------------------------------------------
|
|
|
|
[A,B,ys] = dynare_resolve;
|
|
|
|
if dr1_test_(1) == 1
|
|
fval = bayestopt_.penalty*exp(dr1_test_(2));
|
|
cost_flag = 0;
|
|
return;
|
|
elseif dr1_test_(1) == 2;
|
|
fval = bayestopt_.penalty*exp(dr1_test_(2));
|
|
cost_flag = 0;
|
|
return;
|
|
elseif dr1_test_(1) == 3;
|
|
fval = bayestopt_.penalty*exp(dr1_test_(2));
|
|
cost_flag = 0;
|
|
return;
|
|
end
|
|
|
|
if options_.loglinear == 1
|
|
ys1 = log(ys(bayestopt_.mfys));
|
|
else
|
|
ys1 = ys(bayestopt_.mfys);
|
|
end
|
|
|
|
aa = A;
|
|
|
|
np = size(A,1);
|
|
mf = eye(np);
|
|
mf = bayestopt_.mf;
|
|
|
|
% Set initial values @
|
|
|
|
|
|
at = zeros(np,gend+1);
|
|
gconst = log(2*pi);
|
|
lik = zeros(gend,1);
|
|
|
|
if options_.lik_init == 1
|
|
p0 = lyapunov_symm(aa,B*q*B');
|
|
elseif options_.lik_init == 2
|
|
p0=eye(np)*10.0;
|
|
end
|
|
pt = p0;
|
|
BqB = B*q*B';
|
|
|
|
trend_coeff = zeros(nobs,1);
|
|
if bayestopt_.with_trend == 1
|
|
nx1 = estim_params_.nvx+estim_params_.nvn+estim_params_.ncx+ ...
|
|
estim_params_.ncn;
|
|
for i=1:nobs
|
|
trend_coeff(i) = eval(bayestopt_.trend_coeff{i});
|
|
end
|
|
end
|
|
|
|
not_steady = 1;
|
|
ldetf_old = NaN;
|
|
warning_state = warning;
|
|
warning off;
|
|
if algo == 1
|
|
for t = 1:gend
|
|
if not_steady
|
|
ptt1 = aa*pt*aa'+BqB;
|
|
f = ptt1(mf,mf)+h;
|
|
ldetf = log(det(f));
|
|
finv = inv(f);
|
|
if any(isinf(finv)) | ~isreal(ldetf)
|
|
disp('singularity in Kalman filter');
|
|
fval = bayestopt_.penalty;
|
|
warning(warning_state);
|
|
cost_flag = 0;
|
|
dr1_test_(1) = 4;
|
|
return
|
|
end
|
|
pt = ptt1-ptt1(:,mf)*finv*ptt1(mf,:);
|
|
if abs(ldetf-ldetf_old) < 1e-12
|
|
not_steady = 0;
|
|
end
|
|
ldetf_old = ldetf;
|
|
end
|
|
att1 = aa*at(:,t);
|
|
v = rawdata(t,:)'-att1(mf,:)-ys1;
|
|
if bayestopt_.with_trend == 1
|
|
v = v - trend_coeff*t;
|
|
end
|
|
at(:,t+1) = att1+ptt1(:,mf)*finv*v;
|
|
if t > options_.presample
|
|
lik(t,1) = ldetf+v'*finv*v;
|
|
end
|
|
end
|
|
elseif algo == 2
|
|
PPt = zeros(np^2,gend);
|
|
for t = 1:gend
|
|
if not_steady
|
|
ptt1 = aa*pt*aa'+BqB;
|
|
f = ptt1(mf,mf)+h;
|
|
ldetf = log(det(f));
|
|
finv = inv(f);
|
|
if any(isinf(finv)) | ~isreal(ldetf)
|
|
% disp('singularity in Kalman filter');
|
|
fval = bayestopt_.penalty;
|
|
warning(warning_state);
|
|
cost_flag = 0;
|
|
dr1_test_(1) = 4;
|
|
return
|
|
end
|
|
pt = ptt1-ptt1(:,mf)*finv*ptt1(mf,:);
|
|
if abs(ldetf-ldetf_old) < 1e-12
|
|
not_steady = 0;
|
|
end
|
|
ldetf_old = ldetf;
|
|
end
|
|
att1 = aa*at(:,t);
|
|
v = rawdata(t,:)' - att1(mf,:) - ys1;
|
|
if bayestopt_.with_trend == 1
|
|
v = v - trend_coeff*t;
|
|
end
|
|
at(:,t+1) = att1+ptt1(:,mf)*finv*v;
|
|
PPt(:,t) = pt(:);
|
|
if t > options_.presample
|
|
lik(t,1) = ldetf+v'*finv*v;
|
|
end
|
|
end
|
|
atT =zeros(np,gend+1);
|
|
atT(:,gend+1) = at(:,gend+1);
|
|
innov = zeros(M_.exo_nbr,gend);
|
|
for t = gend:-1:1
|
|
pt = reshape(PPt(:,t),np,np);
|
|
ptt1 = aa*pt*aa'+BqB;
|
|
Pstar = pt*aa'*pinv(ptt1);
|
|
atT(:,t) = at(:,t)+Pstar*(atT(:,t+1)-aa*at(:,t));
|
|
shocks1 = atT(:,t+1)-aa*atT(:,t);
|
|
innov(:,t) = B\shocks1;
|
|
end
|
|
end
|
|
|
|
warning(warning_state);
|
|
|
|
likelihood = 0.5*sum(nobs*gconst+lik(options_.presample+1:end));
|
|
|
|
if imag(likelihood) ~= 0
|
|
|
|
likelihood = 10000000;
|
|
end
|
|
|
|
% ------------------------------------------------------------------------------
|
|
% PRIOR SPECIFICATION
|
|
% ------------------------------------------------------------------------------
|
|
|
|
lnprior = priordens(xparam1, bayestopt_.pshape, bayestopt_.p1, bayestopt_.p2, bayestopt_.p3, bayestopt_.p4 );
|
|
|
|
fval = (likelihood-lnprior);
|
|
|
|
% 11/18/03 MJ changed input parameters for priordens() |