[PYTHON] Adapté au modèle ARMA, ARIMA

introduction

Dans cet article, nous décrivons comment adapter des données de séries temporelles données au modèle AR, au modèle AM et au modèle ARMA à l'aide de python.

Fonction à utiliser

La fonction statsmodels.tsa.arima_model.ARMA.fit est utilisée. Cliquez ici pour plus de détails (https://www.statsmodels.org/devel/generated/statsmodels.tsa.arima_model.ARMA.fit.html#statsmodels.tsa.arima_model.ARMA.fit)

Montage du modèle AR

A titre d'exemple, nous allons adapter le modèle AR (1).

y_t = 1 + 0.5 y_{t-1} + \epsilon_t

Cependant, $ \ epsilon_t $ est le bruit blanc normal de dispersion 1. Définissez également $ y_0 = 2 $.

#Un sort magique qui donne une belle apparence à la capture de module et aux graphiques
import matplotlib as mpl
import matplotlib.pyplot as plt
plt.style.use('seaborn')
mpl.rcParams['font.family'] = 'serif'
%matplotlib inline
import numpy as np
import statsmodels.api as sm
import statsmodels.tsa.api as smt
p = print

#Créer une colonne de données à tracer
#Cette fois, saisissez des données à 1000 reprises
y = np.zeros(1000)
np.random.seed(42)
epsilon = np.random.standard_normal(1000)
y[0] = 2
for t in range(1,1000):
    y[t] = 1 + 0.5 * y[t-1] + epsilon[t]

#Jetez un œil aux données de séries chronologiques à tracer
plt.plot(y)
plt.xlabel('time')
plt.ylabel('value')
plt.title('time-value plot');

Le graphique suivant est tracé. img.png

Montez ce modèle.

mdl = smt.ARMA(y, order=(1, 0)).fit()
p(mdl.summary())

Le résultat est le suivant. キャプチャ.PNG On peut voir que le terme constant est 2,0336 et le coefficient du modèle AR est 0,4930, ce qui est proche de la valeur réelle de 2,0,5. De plus, ce modèle était un modèle AR qui incluait le terme constant 2, mais si l'on sait que le terme constant est 0,

mdl = smt.ARMA(y, order=(1, 0)).fit(trend='nc')

Et c'est suffisant.

Montage du modèle MA

Tout ce que vous avez à faire est de changer le numéro dans l'ordre =, part. Par exemple, lors du montage sur MA (1),

mdl = smt.ARMA(y, order=(0, 1)).fit()

Et c'est suffisant

Montage du modèle ARMA

Lors du montage sur ARMA (1, 1)

mdl = smt.ARMA(y, order=(1, 1)).fit()

Et c'est suffisant

Si vous ne pouvez pas considérer l'ordre d'ARMA en premier lieu

La fonction sm.tsa.arma_order_select_ic peut être utilisée pour estimer l'ordre optimal en fonction de la quantité d'informations. Cliquez ici pour plus de détails sur la fonction (https://www.statsmodels.org/stable/generated/statsmodels.tsa.stattools.arma_order_select_ic.html)

Estimation de l'ordre du modèle ARMA

L'ordre est estimé à l'aide des données chronologiques du modèle de modèle AR (1) décrit ci-dessus. En d'autres termes, si vous pouvez estimer que la commande est (1,0), vous réussissez.

from statsmodels.tsa.arima_process import arma_generate_sample

y = np.zeros(1000)
np.random.seed(42)
epsilon = np.random.standard_normal(1000)
y[0] = 2
for t in range(1,1000):
    y[t] = 1 + 0.5 * y[t-1] + epsilon[t]

sm.tsa.arma_order_select_ic(y)

Le résultat est le suivant. キャプチャ.PNG

La commande (1,0) a été estimée de manière optimale. La matrice représente la valeur de BIC Les lignes représentent l'ordre AR et les colonnes représentent l'ordre AM.

Si vous souhaitez utiliser AIC, ou si vous souhaitez évaluer à la fois avec AIC et BIC, décrivez comme suit.

#Lors de l'utilisation de l'AIC
sm.tsa.arma_order_select_ic(y, ic='aic')
#Lorsque vous souhaitez évaluer en même temps sur la base de deux normes de quantité d'information
sm.tsa.arma_order_select_ic(y, ic=['aic', 'bic'])

Il est également possible d'effectuer un levé en modifiant la valeur maximale de l'ordre, ou d'estimer après avoir supposé que le terme constant = 0.

Recommended Posts

Adapté au modèle ARMA, ARIMA
Analyse des séries chronologiques 2 Stabilité, modèle ARMA / ARIMA
[Introduction au modèle SEIR] Essayez d'ajuster les données COVID-19 ♬
Montage du modèle avec lmfit
[Introduction au modèle de maladie infectieuse] J'ai essayé de m'adapter et de jouer
[Introduction au modèle SIR] Considérez le résultat de l'ajustement de Diamond Princess ♬
Comment convertir le modèle Tensorflow en Lite