Модели ARMAX и ARIMAX в Matlab: численно разные оценки - PullRequest
0 голосов
/ 19 июня 2020

Я получаю удивительные результаты при использовании функции "оценка" из класса arima в Matlab. Хотя я нашел ресурсы, касающиеся моделей ARIMAX или ARMAX, я не смог найти ничего, что упоминало бы о типах несоответствий, которые я получаю; Я бы ожидал, что arima (1,1,1), подходящая для серии Y, даст те же оценки, что и arima (1,0,1) для первой разности серии (т. Е. Соответствует «diff (Y)» ). Написание уравнений для обеих моделей показывает, что обе эквивалентны при использовании изменения переменной Yarmax = diff (Yarimax).

Однако ниже приведен код теста и результаты. Как видите, у этих несоответствий есть два аспекта: 1. Когда мы начинаем с моделируемых разностных серий (ARMAX), а затем объединяем эти серии для создания серии ARIMAX, есть небольшие различия, которые меня беспокоят (больше для воспроизводимости, чем для оценка, так как различия небольшие). Эти различия могут быть связаны с тем, что серия ARIMAX должна отбросить еще одно наблюдение X, тем не менее, я был бы признателен за предоставление правильных параметров для предоставления функций Matlab для получения тех же результатов. 2. Если начать с интегрированного ряда (ARIMAX) и затем провести его первое дифференцирование для оценки модели ARMAX, оценка ARIMAX будет «повсеместной» с точки зрения его компонентов AR и MA ...

    % parameters
    cst = 0;
    phi1 = 0.4;
    theta1 = -0.95;
    sigmaE2 = 1;
    beta = [3 -2 5];
    T = 1000;
    X = rand(T, 3)+[0,10,2];
    Y0 = 20;
    E0 = 0;

    % simulate and estimate ARMAX
    mdlArmaxUnknown = arima( 1,0,1 );
    mdlArmax = arima('AR',phi1,'D',0,'MA',theta1,'Constant',cst,'Beta',beta,'Variance',sigmaE2);
    armaxMaxPQ = max( [ mdlArmaxUnknown.P, mdlArmaxUnknown.Q ] ) + 1;
    rng(1); Yarmax = mdlArmax.simulate(T,'Y0',0,'X',X,'V0',sigmaE2,'E0',E0);
    armaxEst = mdlArmaxUnknown.estimate( Yarmax( armaxMaxPQ:end ), 'Y0', 0, 'X', X, 'display', 'off' );
    armaxSummary = armaxEst.summarize();

    % take the simulated ARMAX model and compound it, then estimate it as
    % an ARIMAX model
    mdlArimaxUnknown = arima( 1,1,1 );
    arimaxMaxPQ = max( [ mdlArimaxUnknown.P, mdlArimaxUnknown.Q ] ) + 1;
    Yarimax = cumsum( [ Y0; Yarmax ] );
    arimaxEst = mdlArimaxUnknown.estimate( Yarimax( arimaxMaxPQ:end ), 'Y0', Y0([1;1]), 'X', X, 'display', 'off' );
    arimaxSummary = arimaxEst.summarize();

    % compare ARMAX and ARIMAX
    results = table( armaxSummary.Table.Value, arimaxSummary.Table.Value, 'RowNames', arimaxSummary.Table.Properties.RowNames, 'VariableNames', {'armax','arimax'} );
    disp(results);

    % Now do the reverse: start with ARIMAX series, differentiate to get
    % ARMAX, and compare estimations
    mdlArimax = arima('AR',phi1,'D',1,'MA',theta1,'Constant',cst,'Beta',beta,'Variance',sigmaE2);
    rng(1); Yarimax = mdlArimax.simulate(T,'Y0',Y0([1;1]),'X',X,'V0',sigmaE2,'E0',E0);
    arimaxEst = mdlArmaxUnknown.estimate( Yarimax( arimaxMaxPQ:end ), 'Y0', Y0([1;1]), 'X', X, 'display', 'off' );
    arimaxSummary = arimaxEst.summarize();
    %ARMAX
    Yarmax = diff( Yarimax );
    armaxEst = mdlArmaxUnknown.estimate( Yarmax( armaxMaxPQ:end ), 'Y0', 0, 'X', X, 'display', 'off' );
    armaxSummary = armaxEst.summarize();
    results = table( armaxSummary.Table.Value, arimaxSummary.Table.Value, 'RowNames', arimaxSummary.Table.Properties.RowNames, 'VariableNames', {'armax','arimax'} );
    disp(results);

Достойные, но несовершенные результаты для первого теста:

                 armax       arimax 
                ________    ________

    Constant    -0.21152     0.10106
    AR{1}        0.37322     0.35694
    MA{1}       -0.88944    -0.72669
    Beta(1)         3.12      3.1908
    Beta(2)      -2.0455     -2.0918
    Beta(3)       5.1264      5.1049
    Variance      1.0618      1.3021

«Дикие» результаты для второго теста:

                 armax       arimax 
                ________    ________

    Constant    -0.22134     -4.3607
    AR{1}        0.36867     0.99999
    MA{1}       -0.84813    -0.12774
    Beta(1)       3.1323      3.2114
    Beta(2)      -2.0536     -2.0788
    Beta(3)       5.1406      5.1568
    Variance      1.1138      2.2961

Таким образом, вопрос охватывает оба этих случая: Я ищу для правильного использования параметров и функций Matlab (то есть из набора инструментов "econ"), которые позволяют мне использовать любую серию в первую очередь (разностную или интегрированную) и получать после этого правильные и численно эквивалентные оценки в любом случае. Спасибо!

...