Почему мой сценарий не максимизирует вероятность логарифмирования правильно в фильтре Кима и Нельсона? - PullRequest
0 голосов
/ 01 мая 2019

Я пытаюсь реализовать фильтр Кима и Нельсона в модели Нельсона-Зигеля с переключением режимов.

Код, который я использую, аналогичен коду 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. Однако я понятия не имею, почему это так.

В качестве справки, когда я запускаю только функцию логарифмического правдоподобия один раз, я получаю значение логарифмического логизма в качестве выходного сигнала, так что только часть максимизации вызывает предупреждение.

Надеюсь, вы, ребята, можете мне помочь. Не стесняйтесьзадавать мне дополнительные вопросы о коде или вещах, которые я, возможно, пробовал, прежде чем публиковать их на форуме.

...