Je comprends que nous devrions utiliser ARIMA pour modéliser une série chronologique non stationnaire. De plus, tout ce que j'ai lu dit que l'ARMA ne devrait être utilisé que pour des séries chronologiques stationnaires.
Ce que j'essaie de comprendre, c'est ce qui se passe dans la pratique lors d'une mauvaise classification d'un modèle et en supposant d = 0
pour une série chronologique non stationnaire? Par exemple:
controlData <- arima.sim(list(order = c(1,1,1), ar = .5, ma = .5), n = 44)
les données de contrôle ressemblent à ceci:
[1] 0.0000000 0.1240838 -1.4544087 -3.1943094 -5.6205257
[6] -8.5636126 -10.1573548 -9.2822666 -10.0174493 -11.0105225
[11] -11.4726127 -13.8827001 -16.6040541 -19.1966633 -22.0543414
[16] -24.8542959 -25.2883155 -23.6519271 -21.8270981 -21.4351267
[21] -22.6155812 -21.9189036 -20.2064343 -18.2516852 -15.5822178
[26] -13.2248230 -13.4220158 -13.8823855 -14.6122867 -16.4143756
[31] -16.8726071 -15.8499558 -14.0805114 -11.4016515 -9.3330560
[36] -7.5676563 -6.3691600 -6.8471371 -7.5982880 -8.9692152
[41] -10.6733419 -11.6865440 -12.2503202 -13.5314306 -13.4654890
En supposant que je ne savais pas que les données étaient ARIMA(1,1,1)
, je pourrais y jeter un œil pacf(controlData)
.
Ensuite, j'utilise Dickey-Fuller pour voir si les données ne sont pas stationnaires:
require('tseries')
adf.test(controlData)
# Augmented Dickey-Fuller Test
#
# data: controlData
# Dickey-Fuller = -2.4133, Lag order = 3, p-value = 0.4099
# alternative hypothesis: stationary
adf.test(controlData, k = 1)
# Augmented Dickey-Fuller Test
#
#data: controlData
# Dickey-Fuller = -3.1469, Lag order = 1, p-value = 0.1188
# alternative hypothesis: stationary
Donc, je pourrais supposer que les données sont ARIMA (2,0, *) Ensuite, utiliser auto.arima(controlData)
pour essayer d'obtenir un meilleur ajustement?
require('forecast')
naiveFit <- auto.arima(controlData)
naiveFit
# Series: controlData
# ARIMA(2,0,1) with non-zero mean
#
# Coefficients:
# ar1 ar2 ma1 intercept
# 1.4985 -0.5637 0.6427 -11.8690
# s.e. 0.1508 0.1546 0.1912 3.2647
#
# sigma^2 estimated as 0.8936: log likelihood=-64.01
# AIC=138.02 AICc=139.56 BIC=147.05
Donc, même si les données passées et futures sont ARIMA (1,1,1), je pourrais être tenté de les classer comme ARIMA (2,0,1). tsdata(auto.arima(controlData))
semble bien aussi.
Voici ce qu'un modeleur averti trouverait:
informedFit <- arima(controlData, order = c(1,1,1))
# informedFit
# Series: controlData
# ARIMA(1,1,1)
#
# Coefficients:
# ar1 ma1
# 0.4936 0.6859
# s.e. 0.1564 0.1764
#
# sigma^2 estimated as 0.9571: log likelihood=-62.22
# AIC=130.44 AICc=131.04 BIC=135.79
1) Pourquoi ces critères d'information sont-ils meilleurs que le modèle sélectionné par auto.arima(controlData)
?
Maintenant, je compare graphiquement les données réelles et les 2 modèles:
plot(controlData)
lines(fitted(naiveFit), col = "red")
lines(fitted(informedFit), col = "blue")
2) En jouant l'avocat du diable, quel genre de conséquences pourrais-je payer en utilisant un ARIMA (2, 0, 1) comme modèle? Quels sont les risques de cette erreur?
3) Je suis principalement préoccupé par les implications pour les prévisions à venir sur plusieurs périodes. Je suppose qu'ils seraient moins précis? Je cherche juste une preuve.
4) Souhaitez-vous suggérer une autre méthode de sélection des modèles? Y a-t-il des problèmes avec mon raisonnement en tant que modélisateur "non informé"?
Je suis vraiment curieux de savoir quelles sont les autres conséquences de ce type de mauvaise classification. J'ai cherché des sources et je n'ai rien trouvé. Toute la littérature que j'ai pu trouver ne touche qu'à ce sujet, au lieu de simplement dire que les données doivent être stationnaires avant d'effectuer ARMA, et si elles ne sont pas stationnaires, elles doivent être différenciées d fois.
Merci!
la source
Réponses:
Mon impression est que cette question n'a pas de réponse unique et entièrement générale, je n'explorerai donc que le cas le plus simple et de manière un peu informelle.
et son MSE sera
(le terme moyen du carré disparaît, ainsi que les produits croisés d'erreurs futures).
afin de prévoir le niveau du processus, nous aurons
qui en réalité, étant donné le vrai DGP sera
et donc
pendant que je répète pour plus de commodité
Donc, pour que le modèle différencié fonctionne mieux en termes de prédiction MSE, nous voulons
Donc, dans l'ensemble, sans discuter d'une méthode d'estimation spécifique, je pense que nous avons pu montrer de manière informelle que le modèle différencié devrait être plus performant en termes de prédiction MSE.
la source
Voilà une bonne question.
Comme je me rends compte, vous venez de considérer pacf mais cela ne suffit pas. ACF et PACF sont tous deux nécessaires pour sélectionner le meilleur modèle.
En revanche, les tests stationnaires sont faibles et sensibles et nécessitent un grand nombre de retards pour être testés.
De plus, il est préférable de rendre les séries chronologiques stationnaires avant d'appliquer un modèle. En gros, les modèles ARIMA considèrent simplement un cas particulier de non-stationnaire (de préférence en tendance).
Concernant vos questions, je ne suis pas sûr de la fonction auto.arima mais je suis sûr que le nombre de points de données dans votre exemple est petit. La simulation d'un modèle utilisant un nombre élevé de points de données répondrait bien à vos questions. Aussi, je vous conseille de considérer ACF des séries chronologiques ainsi que PACF. À propos de la sélection du modèle, la règle de base est de choisir le modèle le plus simple (notez que le modèle le plus simple après avoir rendu les séries chronologiques stationnaires).
Je vous renvoie à cette référence. Ce livre ne répond pas à toutes vos questions mais vous donne quelques indices.
----- section complémentaire ------- @nsw considérant une tendance dans vos données. Si vous considérez un modèle stationnaire, il en résulte une prédiction ascendante / descendante, mais en réalité les modèles ARMA sont conçus pour prédire des données plates. J'ai changé votre code pour refléter cette différence:
besoin («prévision»)
require ('tseries')
controlData <- arima.sim (list (order = c (1,1,1), ar = .5, ma = .5), n = 1000 )
acf (controlData)
ts.plot (controlData)
naiveFit <- arima (controlData, order = c (2,0,1))
trueFit <- arima (controlData, order = c (1,1,1))
PrnaiveFit <-forecast.Arima (naiveFit, 10)
PrtrueFit <- prévision.Arima (trueFit, 10)
matplot (cbind (PrnaiveFit $ moyenne, PrtrueFit $ moyenne), type = 'b', col = c ('rouge', 'vert'), ylab = c ('prédire ion'), pch = c ('n', 't'))
la source