#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()
Я получаю сюжет, который выглядит так
Первое значение-это то, что действительно имеет значение в этой модели, и составляет 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
позволяет только принять состояние, которое действительно произошло.