Моделирование SARIMAX возможных путей

#python #statsmodels #arima #autoregressive-models #stochastic-process

Вопрос:

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

Здесь я использую стандартную демонстрацию со statsmodels страницы в качестве более простого примера:

 import numpy as np
import pandas as pd
from scipy.stats import norm
import statsmodels.api as sm
import matplotlib.pyplot as plt
from datetime import datetime
import requests
from io import BytesIO
 

Подгонка модели:

 wpi1 = requests.get('https://www.stata-press.com/data/r12/wpi1.dta').content
data = pd.read_stata(BytesIO(wpi1))
data.index = data.t
# Set the frequency
data.index.freq="QS-OCT"

# Fit the model
mod = sm.tsa.statespace.SARIMAX(data['wpi'], trend='c', order=(1,1,1))
res = mod.fit(disp=False)
print(res.summary())
 

Создание моделирования:

 res.simulate(len(data),  repetitions=10).plot();
 

Вот история:

введите описание изображения здесь

Вот моделирование:

введите описание изображения здесь

Моделируемые кривые настолько сильно разнесены и отделены друг от друга, что это не имеет смысла. Первоначальный исторический процесс не имеет такого большого различия. Что я неправильно понимаю? Как правильно выполнить симуляцию?

Ответ №1:

Когда вы не передаете начальное состояние, он использует первое предсказанное состояние для запуска моделирования вместе с его предсказанной ковариацией. Поскольку нет доступной информации для первого прогноза, он использует диффузный априор с дисперсией 1 000 000. Вот почему вы получаете широкий диапазон в своих временных рядах. Простое решение состоит в том, чтобы передать свое собственное начальное состояние с помощью smoothed_state .

Принимая ваш код выше, но используя

 initial = res.smoothed_state[:, 0]
res.simulate(len(data),
             repetitions=10,
             initial_state=initial).plot()

 

Я получаю сюжет, который выглядит так

10 моделирование от SARIMAX

Первое значение-это то, что действительно имеет значение в этой модели, и составляет 30,6. Вы могли бы добавить здесь некоторую случайность непосредственно, вычертив начальное состояние из другого (разумного) распределения. Распределение по умолчанию нецелесообразно для моделирования, поскольку оно имеет диффузный априор (однако оно очень разумно для оценки).

Другие Примечания

Еще одно небольшое примечание: вы не должны использовать trend="c" с. d=1 Вместо этого следует использовать trend="t" when d=1 , чтобы модель включала дрейф. Модель, которую вы оцениваете, должна быть

 mod = sm.tsa.statespace.SARIMAX(data["wpi"], trend="t", order=(1, 1, 1))
 

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

Комментарии:

1. Спасибо за ответ. Можете ли вы объяснить разницу между initial_state и anchor ? Кроме того, что res.smoothed_state на самом деле происходит?

2. smoothed_state является наилучшей оценкой состояния в момент времени 0 с использованием полной выборки. Это отличается от предсказанного состояния, которое использует информацию только до времени t для формирования состояния во времени t . Когда t=0 , вы можете себе представить, что это проблема, вот почему используется диффузный приор. anchor указывает модели, какой период predicted_state использовать, в то время initial_state как сообщает симулятору точное значение для использования. initial_state позволяет задать любое значение. anchor позволяет только принять состояние, которое действительно произошло.