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.
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)
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é.
Montez ce modèle.
mdl = smt.ARMA(y, order=(1, 0)).fit()
p(mdl.summary())
Le résultat est le suivant. 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.
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
Lors du montage sur ARMA (1, 1)
mdl = smt.ARMA(y, order=(1, 1)).fit()
Et c'est suffisant
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)
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.
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