Любопытный случай моделирования ARIMA с использованием R

Я заметил нечто странное, подгоняя модель ARMA с помощью функций arma{tseries} и arima{stats} в R.

Существует радикальное различие в процедурах оценки, принятых двумя функциями: фильтром Калмана в arima{stats} и оценкой ML в arma{tseries}.

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

Ну кажется, что они могут!

Создайте приведенный ниже временной ряд и добавьте 2 выброса.

set.seed(1010)
ts.sim <- abs(arima.sim(list(order = c(1,0,0), ar = 0.7), n = 50))
ts.sim[8] <- ts.sim[12]*8
ts.sim[35] <- ts.sim[32]*8

Соответствуйте модели ARMA с помощью двух функций.

# Works perfectly fine
arima(ts.sim, order = c(1,0,0))
# Works perfectly fine
arma(ts.sim, order = c(1,0))

Изменить уровень таймсерии в 1 миллиард раз

# Introduce a multiplicative shift
ts.sim.1 <- ts.sim*1000000000
options(scipen = 999)
summary(ts.sim.1)

Установите модель ARMA, используя 2 функции:

# Works perfectly fine
arma(ts.sim.1, order = c(1,0))

# Does not work
arima(ts.sim.1, order = c(1,0,0))

## Error in solve.default(res$hessian * n.used, A): system is 
 computationally singular: reciprocal condition number = 1.90892e-19

Я обнаружил эту проблему, когда программное обеспечение SAS успешно смогло запустить процедуру proc x12 для проведения теста на сезонность, но та же функция на R выдала мне ошибку, указанную выше. Это заставило меня задуматься и посмотреть на результаты SAS со скептицизмом, но оказалось, что это может быть как-то связано с arima{stats}.

Может ли кто-нибудь попытаться уточнить причину вышеуказанной ошибки, которая ограничивает нас в подгонке модели с использованием arima{stats}?


person Shreyes    schedule 08.04.2015    source источник


Ответы (1)


Проблема возникает в функции stats::arima при вычислении ковариационной матрицы коэффициентов. Код не очень устойчив к эффектам масштабирования из-за больших чисел и дает сбой при вычислении обратной матрицы Гессе в этой строке:

var <- crossprod(A, solve(res$hessian * n.used, A))

Проблема решается простым масштабированием данных. Например

arima(ts.sim.1/100, order = c(1,0,0))

буду работать.

Однако функция tseries::arma не работает "идеально". Он возвращает предупреждающее сообщение:

В arma(ts.sim.1, order = c(1, 0)) : отрицательная полуопределенность Гессе

Этого также можно избежать путем масштабирования:

arma(ts.sim.1/1000, order = c(1,0))
person Rob Hyndman    schedule 09.04.2015
comment
Спасибо за ваш комментарий Роб. Причина, по которой я сказал, что результаты arma() были идеальными, заключалась в том, что коэффициенты, которые моя бета-оценка остается почти такой же, а мой перехват увеличивается на миллиард, что интуитивно понятно. Вы правы, масштабирование устраняет проблему, которую мы видим в функции arima(), но по-прежнему удивительно, что оценка даже не выполнялась с использованием arima(). - person Shreyes; 10.04.2015
comment
Если я уменьшу исходные данные на 10, должен ли я увеличить на 10 остаточные значения, полученные Arima? - person Frank; 22.02.2020
comment
Это зависит от того, что вы хотите сделать с остатками. Если вы просто проверяете, что это белый шум, масштаб не имеет значения. Если вы хотите использовать их для вычисления отклонения одношагового прогноза (например), вам нужно будет изменить их масштаб. - person Rob Hyndman; 22.02.2020