0001 function [AHess, DLIK, LIK] = AHessian(T,R,Q,H,P,Y,DT,DYss,DOm,DH,DP,start,mf,kalman_tol,riccati_tol)
0002
0003
0004
0005
0006
0007
0008
0009
0010
0011
0012
0013
0014
0015
0016
0017
0018
0019
0020
0021
0022
0023
0024
0025
0026
0027
0028
0029 k = size(DT,3);
0030 smpl = size(Y,2);
0031 pp = size(Y,1);
0032 mm = size(T,2);
0033 a = zeros(mm,1);
0034 Om = R*Q*transpose(R);
0035 t = 0;
0036 oldK = 0;
0037 notsteady = 1;
0038 F_singular = 1;
0039
0040 lik = zeros(smpl,1);
0041 LIK = Inf;
0042 if nargout > 1,
0043 DLIK = zeros(k,1);
0044 end
0045 AHess = zeros(k,k);
0046 Da = zeros(mm,k);
0047 Dv = zeros(length(mf),k);
0048
0049
0050
0051
0052
0053 while notsteady & t<smpl
0054 t = t+1;
0055 v = Y(:,t)-a(mf);
0056 F = P(mf,mf) + H;
0057 if rcond(F) < kalman_tol
0058 if ~all(abs(F(:))<kalman_tol)
0059 return
0060 else
0061 a = T*a;
0062 P = T*P*transpose(T)+Om;
0063 end
0064 else
0065 F_singular = 0;
0066 iF = inv(F);
0067 K = P(:,mf)*iF;
0068 lik(t) = log(det(F))+transpose(v)*iF*v;
0069
0070 [DK,DF,DP1] = computeDKalman(T,DT,DOm,P,DP,DH,mf,iF,K);
0071
0072 for ii = 1:k
0073 Dv(:,ii) = -Da(mf,ii) - DYss(mf,ii);
0074 Da(:,ii) = DT(:,:,ii)*(a+K*v) + T*(Da(:,ii)+DK(:,:,ii)*v + K*Dv(:,ii));
0075 if t>=start && nargout > 1
0076 DLIK(ii,1) = DLIK(ii,1) + trace( iF*DF(:,:,ii) ) + 2*Dv(:,ii)'*iF*v - v'*(iF*DF(:,:,ii)*iF)*v;
0077 end
0078 end
0079 vecDPmf = reshape(DP(mf,mf,:),[],k);
0080
0081 if t>=start
0082 AHess = AHess + Dv'*iF*Dv + .5*(vecDPmf' * kron(iF,iF) * vecDPmf);
0083 end
0084 a = T*(a+K*v);
0085 P = T*(P-K*P(mf,:))*transpose(T)+Om;
0086 DP = DP1;
0087 end
0088 notsteady = max(max(abs(K-oldK))) > riccati_tol;
0089 oldK = K;
0090 end
0091
0092 if F_singular
0093 error('The variance of the forecast error remains singular until the end of the sample')
0094 end
0095
0096
0097 if t < smpl
0098 t0 = t+1;
0099 while t < smpl
0100 t = t+1;
0101 v = Y(:,t)-a(mf);
0102 for ii = 1:k
0103 Dv(:,ii) = -Da(mf,ii)-DYss(mf,ii);
0104 Da(:,ii) = DT(:,:,ii)*(a+K*v) + T*(Da(:,ii)+DK(:,:,ii)*v + K*Dv(:,ii));
0105 if t>=start && nargout >1
0106 DLIK(ii,1) = DLIK(ii,1) + trace( iF*DF(:,:,ii) ) + 2*Dv(:,ii)'*iF*v - v'*(iF*DF(:,:,ii)*iF)*v;
0107 end
0108 end
0109 if t>=start
0110 AHess = AHess + Dv'*iF*Dv;
0111 end
0112 a = T*(a+K*v);
0113 lik(t) = transpose(v)*iF*v;
0114 end
0115 AHess = AHess + .5*(smpl+t0-1)*(vecDPmf' * kron(iF,iF) * vecDPmf);
0116 if nargout > 1
0117 for ii = 1:k
0118
0119 end
0120 end
0121 lik(t0:smpl) = lik(t0:smpl) + log(det(F));
0122
0123
0124
0125
0126
0127 end
0128
0129 AHess = -AHess;
0130 if nargout > 1,
0131 DLIK = DLIK/2;
0132 end
0133
0134 lik = (lik + pp*log(2*pi))/2;
0135
0136 LIK = sum(lik(start:end));
0137
0138
0139 function [DK,DF,DP1] = computeDKalman(T,DT,DOm,P,DP,DH,mf,iF,K)
0140
0141 k = size(DT,3);
0142 tmp = P-K*P(mf,:);
0143
0144 for ii = 1:k
0145 DF(:,:,ii) = DP(mf,mf,ii) + DH(:,:,ii);
0146 DiF(:,:,ii) = -iF*DF(:,:,ii)*iF;
0147 DK(:,:,ii) = DP(:,mf,ii)*iF + P(:,mf)*DiF(:,:,ii);
0148 Dtmp = DP(:,:,ii) - DK(:,:,ii)*P(mf,:) - K*DP(mf,:,ii);
0149 DP1(:,:,ii) = DT(:,:,ii)*tmp*T' + T*Dtmp*T' + T*tmp*DT(:,:,ii)' + DOm(:,:,ii);
0150 end
0151
0152
0153
0154
0155