Вопрос или проблема
У меня возникла проблема с пониманием функции predict()
в statsmodels
для ARIMA. Вот пример набора данных:
url="https://raw.githubusercontent.com/marcopeix/AppliedTimeSeriesAnalysisWithPython/refs/heads/main/data/jj.csv"
df = pd.read_csv(url)[:60]
df = df.set_index('date')
fit = ARIMA(df, order=(2,0,0)).fit()
df['pred'] = fit.predict()
df.head()
data pred
date
1960-01-01 0.71 3.218801
1960-04-01 0.63 0.745162
1960-07-02 0.85 0.678675
1960-10-01 0.44 0.811431
1961-01-01 0.61 0.584120
Кажется, что первое значение сильно переоценено. Также похоже, что предсказания смещены на одно значение после первого. То есть pred[i+1]
хорошо совпадает со значениями data[i]
. Я думал, что это может быть связано с разностями, но я явно указываю ARIMA не делать разностей (p,0,0)
.
Ответ или решение
При использовании модели ARIMA в библиотеке statsmodels
может возникнуть ситуация, когда первая предсказанная величина сильно превышает ожидаемое значение. В вашем случае это наблюдается в результате выполнения следующего кода:
url="https://raw.githubusercontent.com/marcopeix/AppliedTimeSeriesAnalysisWithPython/refs/heads/main/data/jj.csv"
df = pd.read_csv(url)[:60]
df = df.set_index('date')
fit = ARIMA(df, order=(2,0,0)).fit()
df['pred'] = fit.predict()
df.head()
Давайте разберёмся, почему происходит такое поведение:
-
Инициализация модели: ARIMA-модели требуют начальные значения для своих прогностических уравнений. Для процесса ARIMA(2,0,0) используется два предыдущих наблюдения для предсказания следующего значения. Однако первая предсказанная величина (в вашем случае
pred[0]
) создается на основе начальных значений, которые могут быть неоптимальными, поскольку для их расчета нужно больше данных. В результате может возникнуть аномально высокое предсказание. -
Смещение предсказаний: Вы заметили, что предсказания, начиная со второго значения, очень близки к фактическим наблюдениям. Это связано с тем, что ARIMA использует предыдущие значения временного ряда для прогнозирования. Поскольку первые предсказания требуют больше предыдущих значений, они могут быть смещенными. Это также может вызвать эффект «кэширования», когда предсказания сопоставляются с реальными значениями, начиная со второго пункта.
-
Деференцирование: Хотя вы указали порядок дифференцирования как 0, это не исключает проблему начальных значений. Даже без дифференцирования, для модели необходимы подходящие начальные условия. Ваша модель использует значения, которые могут быть не отражены должным образом для первого предсказания.
Решения проблемы:
-
Пропуск первого значения: Вы можете игнорировать первое предсказанное значение и начинать анализ с второго.
-
Прогнозирование через
forecast()
: Вместо того чтобы использоватьpredict()
, попробуйте методforecast()
, который может более аккуратно учитывать начальные значения. Например:df['pred'] = fit.get_prediction(start=df.index[1], dynamic=False).predicted_mean
-
Увеличение данных: Убедитесь, что у вас достаточно данных для моделирования. Если возможно, попробуйте использовать полную выборку или еще большее количество предыдущих наблюдений.
-
Оценка модели: Также стоит рассмотреть альтернативные методы оценки модели (например AIC, BIC) для выбора наилучших параметров (p, d, q).
Таким образом, понимание этих аспектов ARIMA поможет вам корректно интерпретировать результаты и улучшить предсказания.