Auto.arima avec des données quotidiennes: comment capturer la saisonnalité / périodicité?

21

Je monte un modèle ARIMA sur une série temporelle quotidienne. Les données sont collectées quotidiennement du 02-01-2010 au 30-07-2011 et concernent les ventes de journaux. Puisqu'une tendance hebdomadaire des ventes peut être trouvée (la quantité moyenne quotidienne d'exemplaires vendus est généralement la même du lundi au vendredi, puis augmente le samedi et le dimanche), j'essaie de saisir cette "saisonnalité". Compte tenu des données de vente "données", je crée la série chronologique comme suit:

salests<-ts(data,start=c(2010,1),frequency=365)

puis j'utilise la fonction auto.arima (.) pour sélectionner le meilleur modèle ARIMA via le critère AIC. Le résultat est toujours un modèle ARIMA non saisonnier, mais si j'essaie un modèle SARIMA avec la syntaxe suivante comme exemple:

sarima1<-arima(salests, order = c(2,1,2), seasonal = list(order = c(1, 0, 1), period = 7))

Je peux obtenir de meilleurs résultats. Y a-t-il quelque chose qui cloche dans la spécification ts command / arima? Le schéma hebdomadaire est très fort, donc je ne m'attendrais pas à autant de difficultés à le capturer. Toute aide serait très utile. Merci, Giulia Deppieri

Mise à jour:

J'ai déjà changé certains arguments. Plus précisément, la procédure sélectionne ARIMA (4,1,3) comme le meilleur modèle lorsque je mets D=7, mais AIC et les autres bons indices d'ajustement et prévisions) ne s'améliorent pas du tout. Je suppose qu'il y a des erreurs dues à la confusion entre la saisonnalité et la périodicité ..?!

Appel Auto.arima utilisé et sortie obtenue:

modArima<-auto.arima(salests,D=7,max.P = 5, max.Q = 5)



 ARIMA(2,1,2) with drift         : 1e+20
 ARIMA(0,1,0) with drift         : 5265.543
 ARIMA(1,1,0) with drift         : 5182.772
 ARIMA(0,1,1) with drift         : 1e+20
 ARIMA(2,1,0) with drift         : 5137.279
 ARIMA(2,1,1) with drift         : 1e+20
 ARIMA(3,1,1) with drift         : 1e+20
 ARIMA(2,1,0)                    : 5135.382
 ARIMA(1,1,0)                    : 5180.817
 ARIMA(3,1,0)                    : 5117.714
 ARIMA(3,1,1)                    : 1e+20
 ARIMA(4,1,1)                    : 5045.236
 ARIMA(4,1,1) with drift         : 5040.53
 ARIMA(5,1,1) with drift         : 1e+20
 ARIMA(4,1,0) with drift         : 5112.614
 ARIMA(4,1,2) with drift         : 4953.417
 ARIMA(5,1,3) with drift         : 1e+20
 ARIMA(4,1,2)                    : 4960.516
 ARIMA(3,1,2) with drift         : 1e+20
 ARIMA(5,1,2) with drift         : 1e+20
 ARIMA(4,1,3) with drift         : 4868.669
 ARIMA(5,1,4) with drift         : 1e+20
 ARIMA(4,1,3)                    : 4870.92
 ARIMA(3,1,3) with drift         : 1e+20
 ARIMA(4,1,4) with drift         : 4874.095

 Best model: ARIMA(4,1,3) with drift        

Je suppose donc que la fonction arima doit être utilisée comme:

bestOrder <- cbind(modArima$arma[1],modArima$arma[5],modArima$arma[2])
sarima1<-arima(salests, order = c(4,1,3))

sans paramètres de composants saisonniers et spécifications de période. Les données et l'analyse exploratoire montrent que le même schéma hebdomadaire peut être considéré approximativement pour chaque semaine, à la seule exception d'août 2010 (où une augmentation constante des ventes est enregistrée). Malheureusement, je n'ai aucune expertise en modélisation de série temporelle, en fait j'essaie cette approche afin de trouver une solution alternative à d'autres modèles paramétriques et non paramétriques que j'ai essayé d'adapter à ces données problématiques. J'ai également de nombreuses variables numériques dépendantes mais elles ont montré une faible puissance pour expliquer la variable de réponse: sans aucun doute, la partie la plus difficile à modéliser est la composante temporelle. De plus, la construction de variables muettes pour représenter les mois et les jours de la semaine s'est avérée ne pas être une solution robuste.

Giulia
la source

Réponses:

28

En cas de saisonnalité hebdomadaire, définissez la période saisonnière sur 7.

salests <- ts(data,start=2010,frequency=7) 
modArima <- auto.arima(salests)

Notez que la sélection de la différenciation saisonnière n'était pas très bonne auto.arima()jusqu'à très récemment. Si vous utilisez la v2.xx du forecastpackage, définissez D=1l'appel à auto.arima()pour forcer la différenciation saisonnière. Si vous utilisez la v3.xx du forecastpackage, la sélection automatique de Dfonctionne bien mieux (en utilisant un test OCSB au lieu d'un test CH).

N'essayez pas de comparer l'AIC pour des modèles avec différents niveaux de différenciation. Ils ne sont pas directement comparables. Vous ne pouvez comparer de manière fiable l'AIC qu'avec des modèles ayant les mêmes ordres de différenciation.

Vous n'avez pas besoin de réajuster le modèle après avoir appelé auto.arima(). Il renverra un objet Arima, comme si vous aviez appelé arima()avec l'ordre de modèle sélectionné.

Rob Hyndman
la source
merci d'avoir signalé ma stupide erreur. Je retire ma réponse.
mpiktas
1
Merci beaucoup pour vos suggestions très utiles. J'utilise la version 2.19 du package de prévision, j'ai donc suivi vos conseils et défini le paramètre D égal à 1 dans l'appel auto.arima (). Maintenant, le meilleur modèle sélectionné pour les séries de salests est un ARIMA (1,0,0) avec une moyenne non nulle. Dois-je m'attendre à la spécification de la partie saisonnalité pour le meilleur modèle renvoyé, je veux dire des valeurs de P, D, Q, ou au moins pour D?
Giulia
2
Tant que vos données ont une fréquence autre que 1, les modèles saisonniers ARIMA seront pris en compte. Si un modèle non saisonnier est retourné, alors soit la saisonnalité est très faible, soit les données ne sont pas dans un objet ts avec une fréquence> 1.
Rob Hyndman
15

Le problème lié à l'ajustement de l'ARIMA saisonnier aux données quotidiennes est que la "composante saisonnière" ne peut fonctionner que le week-end ou peut-être uniquement les jours de semaine, donc globalement il y a une "composante saisonnière" non significative. Maintenant, ce que vous devez faire est d'augmenter votre ensemble de données avec 6 variables indicatrices représentant les jours de la semaine et peut-être des indicateurs mensuels pour représenter les effets annuels. Envisagez maintenant d'incorporer des événements tels que les vacances et d'inclure tout effet de plomb, de contamination ou de décalage autour de ces variables connues. Non, il peut y avoir des valeurs inhabituelles (impulsions) ou des changements de niveau ou des tendances temporelles locales dans les données. De plus, les effets du jour de la semaine peuvent avoir changé au fil du temps, par exemple il n'y a pas eu d'effet samedi pour les 20 premières semaines mais un effet samedi pour les 50 dernières semaines.

IrishStat
la source
Dans ce cas (IrishStat), cela ne serait-il pas une technique de modélisation mixte au lieu d'ARIMA. Les retards ne sont enregistrés nulle part dans ARIMA, à l'exception du test Box Jlung. Auto.arima (récent) corrige tout, y compris la mise à l'échelle des données, les fluctuations saisonnières (c'est pourquoi je trouve les meilleurs paramètres p, d, q).
wackyanil
Elle s'appelle une fonction de transfert et reflète une approche synergique, voir autobox.com/pdfs/capable.pd à partir de la diapositive 42. Auto.arima peut fonctionner pour des cas simples mais n'est pas assez général à mon avis. Si vous avez un ensemble de données en tête, posez une nouvelle question et incluez-le.
IrishStat
@IrishStat vouliez-vous dire ARIMA avec intervention? jour de la semaine étant des variables muettes? et variables factices similaires pour les vacances?
Enthousiaste
Oui ... ce serait mon approche des données quotidiennes
IrishStat
0

Pour déterminer l'ordre de saisonnalité de mes ts (données quotidiennes sur 3 ans), j'ai utilisé ce code dans Matlab:

s = 0; min = 1e + 07; n = longueur (x); pour i = 1: 400 diff = x (i + 1: n) -x (1: ni); s (i) = somme (abs (diff)); si (s (i)

Cela me donne 365, ce qui est logique.

nkabouche
la source
1
Bienvenue sur le site. Je ne sais pas comment cela répond à la question d'origine et je ne sais pas ce que le code que vous avez publié ne fait que le regarder. Peut-être pourriez-vous développer un peu la réponse?
einar
1
Comment votre solution gère-t-elle les effets fixes du jour de la semaine, les effets fixes du jour du mois, les effets de la semaine du mois, les effets du jour du mois, les effets de plomb et de décalage des vacances , lundi après un jour férié du vendredi, vendredi avant un jour férié du lundi, effets mensuels, effets hebdomadaires, changements des effets du jour de la semaine dans le temps, impulsions, changements de niveau / pas?
IrishStat
le code Matlab s = 0; min = 1e + 07; n = longueur (x); pour i = 1: 400 diff = x (i + 1: n) -x (1: ni); s (i) = somme (abs (diff)); if (s (i) <min) min = s (i); i end end
nkabouche