Я пытаюсь реализовать фильтр Кима и Нельсона в модели Нельсона-Зигеля с переключением режимов.
Код, который я использую, аналогичен коду GAUSS, предоставленному Кимом на его персональном веб-сайте (http://econ.korea.ac.kr/~cjkim/MARKOV/programs/kim_je.opt).
Мой фильтр Kim настроен следующим образом
function [output] = LogLikelihood(parameter1, yy)
for iter = 1:T
% Kalman filter
B_TL00 = mu_state0 + F * B_LL0; % beta_{t|t-1}^{0,0}
B_TL01 = mu_state1 + F * B_LL0;
B_TL10 = mu_state0 + F * B_LL1;
B_TL11 = mu_state1 + F * B_LL1;
P_TL00 = F * P_LL0 * F' + Q; % P_{t|t-1}^{0,0}
P_TL01 = F * P_LL0 * F' + Q;
P_TL10 = F * P_LL1 * F' + Q;
P_TL11 = F * P_LL1 * F' + Q;
F_CAST00= yy(iter,:)'- H * B_TL00; % Conditional forecast error: eta_{t|t-1}^{0,0}
F_CAST01= yy(iter,:)'- H * B_TL01;
F_CAST10= yy(iter,:)'- H * B_TL10;
F_CAST11= yy(iter,:)'- H * B_TL11;
SS00= H * P_TL00 * H' +R; % Conditional variance of forecast error: f_{t|t-1}^({0,0}
SS01= H * P_TL01 * H' +R;
SS10= H * P_TL10 * H' +R;
SS11= H * P_TL11 * H' +R;
B_TT00 = B_TL00 + (P_TL00 * H') * inv(SS00) * F_CAST00; % beta_{t|t}^{0,0}
B_TT01 = B_TL01 + (P_TL01 * H') * inv(SS01) * F_CAST01;
B_TT10 = B_TL10 + (P_TL10 * H') * inv(SS10) * F_CAST10;
B_TT11 = B_TL11 + (P_TL11 * H') * inv(SS11) * F_CAST11;
P_TT00 = (eye(3) - (P_TL00 * H') * inv(SS00) * H ) * P_TL00; % P_{t|t}^{0,0}
P_TT01 = (eye(3) - (P_TL01 * H') * inv(SS01) * H ) * P_TL01;
P_TT10 = (eye(3) - (P_TL10 * H') * inv(SS10) * H ) * P_TL10;
P_TT11 = (eye(3) - (P_TL11 * H') * inv(SS11) * H ) * P_TL11;
% Hamilton filter
PR_VL00= V_PROB(F_CAST00,SS00)* Q_Pr*Prob0; % Pr[St,Yt|Yt-1]
PR_VL01= V_PROB(F_CAST01,SS01)*(1-Q_Pr)*Prob0;
PR_VL10= V_PROB(F_CAST10,SS10)*(1-P_Pr)*Prob1;
PR_VL11= V_PROB(F_CAST11,SS11)* P_Pr*Prob1;
% CONDITIONAL DENSITY TIMES WEIGHT
PR_VAL=PR_VL00+PR_VL01+PR_VL10+PR_VL11;
% WEIGHTED AVERAGE OF CONDITIONAL DENSITIES: f(y_t|Y_{t-1})
PRO_00=PR_VL00/PR_VAL; % Pr[St,St-1|Yt], 4th equation p.105 Flowchart
PRO_01=PR_VL01/PR_VAL;
PRO_10=PR_VL10/PR_VAL;
PRO_11=PR_VL11/PR_VAL;
Prob0=PRO_00+PRO_10; % Pr[St=0|Yt], 5th equation p.105 Flowchart
Prob1=PRO_01+PRO_11; % Pr[St=1|Yt]
% Collapsing terms
B_LL0=(PRO_00*B_TT00 + PRO_10*B_TT10)/Prob0; % beta_{t|t}^{0}
B_LL1=(PRO_01*B_TT01 + PRO_11*B_TT11)/Prob1; % beta_{t|t}^{1}
P_LL0=(PRO_00*(P_TT00+(B_LL0-B_TT00)*(B_LL0-B_TT00)')+ ... % P_{t|t}^{0}
PRO_10*(P_TT10+(B_LL0-B_TT10)*(B_LL0-B_TT10)'))/Prob0;
P_LL1=(PRO_01*(P_TT01+(B_LL1-B_TT01)*(B_LL1-B_TT01)')+ ... % P_{t|t}^{1}
PRO_11*(P_TT11+(B_LL1-B_TT11)*(B_LL1-B_TT11)'))/Prob1;
LL(iter) = -log(PR_VAL);
end
% Sum over all observations (you may use a `burning period' of a few observations - but check if it matters)
output = sum( LL(5:end) );
end
Моя проблема: когда я пытаюсь максимизировать логарифмическое правдоподобие с помощью fmincon (), я получаю предупреждение о том, что моя "матрица является единственной, закрытьв единственном числе или в плохом масштабе ".
Причина, по которой я получаю это предупреждение, заключается в том, что все параметры в моем цикле for содержат значения NaN. Однако я понятия не имею, почему это так.
В качестве справки, когда я запускаю только функцию логарифмического правдоподобия один раз, я получаю значение логарифмического логизма в качестве выходного сигнала, так что только часть максимизации вызывает предупреждение.
Надеюсь, вы, ребята, можете мне помочь. Не стесняйтесьзадавать мне дополнительные вопросы о коде или вещах, которые я, возможно, пробовал, прежде чем публиковать их на форуме.