Analyse quotidienne des séries chronologiques


25

J'essaie de faire une analyse des séries chronologiques et je suis nouveau dans ce domaine. J'ai un décompte quotidien d'un événement de 2006-2009 et je veux y adapter un modèle de série chronologique. Voici les progrès que j'ai réalisés:

timeSeriesObj = ts(x,start=c(2006,1,1),frequency=365.25)
plot.ts(timeSeriesObj)

L'intrigue résultante que j'obtiens est:

Diagramme de série chronologique

Afin de vérifier s'il y a une saisonnalité et une tendance dans les données ou non, je suis les étapes mentionnées dans cet article :

ets(x)
fit <- tbats(x)
seasonal <- !is.null(fit$seasonal)
seasonal

et dans le blog de Rob J Hyndman :

library(fma)
fit1 <- ets(x)
fit2 <- ets(x,model="ANN")

deviance <- 2*c(logLik(fit1) - logLik(fit2))
df <- attributes(logLik(fit1))$df - attributes(logLik(fit2))$df 
#P value
1-pchisq(deviance,df)

Les deux cas indiquent qu'il n'y a pas de saisonnalité.

Lorsque je trace les ACF et PACF de la série, voici ce que j'obtiens:

ACF PACF

Mes questions sont:

  1. Est-ce la façon de gérer les données de séries chronologiques quotidiennes? Cette page suggère que je devrais examiner les tendances hebdomadaires et annuelles, mais l'approche n'est pas claire pour moi.

  2. Je ne sais pas comment procéder une fois que j'ai les parcelles ACF et PACF.

  3. Puis-je simplement utiliser la fonction auto.arima?

    fit <- arima (myts, order = c (p, d, q)

***** Mise à jour des résultats Auto.Arima ******

Lorsque je modifie la fréquence des données à 7 selon les commentaires de Rob Hyndman ici , auto.arima sélectionne un modèle ARIMA saisonnier et sort:

Series: timeSeriesObj 
ARIMA(1,1,2)(1,0,1)[7]                    

Coefficients:
       ar1      ma1     ma2    sar1     sma1
      0.89  -1.7877  0.7892  0.9870  -0.9278
s.e.   NaN      NaN     NaN  0.0061   0.0162

sigma^2 estimated as 21.72:  log likelihood=-4319.23
AIC=8650.46   AICc=8650.52   BIC=8682.18 

****** Vérification de la saisonnalité mise à jour ******

Lorsque je teste la saisonnalité avec la fréquence 7, elle produit True mais avec la saisonnalité 365,25, elle produit false. Est-ce suffisant pour conclure à un manque de saisonnalité annuelle?

timeSeriesObj = ts(x,start=c(2006,1,1),frequency=7)
fit <- tbats(timeSeriesObj)
seasonal <- !is.null(fit$seasonal)
seasonal

résultats:

True

tandis que

timeSeriesObj = ts(x,start=c(2006,1,1),frequency=365.25)
fit <- tbats(timeSeriesObj)
seasonal <- !is.null(fit$seasonal)
seasonal

résultats:

False

Quelle sortie str(x)donne?
S.Kolassa - Rétablir Monica

Il donne num [1: 1460] 17 12 12 17 13 14 14 5 12 21 ...
statBeginner

Pourriez-vous publier les données?
prévisionniste

Malheureusement je ne peux pas.
statBeginner

3
OK, je compterais sur l'inspection visuelle et les connaissances du domaine en plus des tests statistiques pour détecter la saisonnalité. À votre question de savoir si arima peut gérer la saisonnalité multiple - Bien sûr, ARIMA gérera tout type de saisonnalité, Rsimple n'a pas la capacité de la gérer. Je rechercherais des solutions commerciales s'il y a un coût d'inventaire / de fabrication élevé pour le produit que vous essayez de prévoir. Ra des limites sévères pour la prévision des tâches comme la vôtre. Regardez les questions sur les prévisions quotidiennes ailleurs sur ce site.
prévisionniste

Réponses:


25

Votre ACF et votre PACF indiquent que vous avez au moins une saisonnalité hebdomadaire, ce qui est illustré par les pics aux décalages 7, 14, 21 et ainsi de suite.

Vous pouvez également avoir une saisonnalité annuelle, bien que cela ne ressorte pas de votre série chronologique.

Votre meilleur pari, étant donné les saisonnalités potentiellement multiples, peut être un tbatsmodèle, qui modélise explicitement plusieurs types de saisonnalité. Chargez le forecastpackage:

library(forecast)

Votre sortie de str(x)indique que xne contient pas encore d'informations sur la possibilité d'avoir plusieurs saisonnalités. Regardez ?tbatset comparez la sortie de str(taylor). Attribuez les saisonnalités:

x.msts <- msts(x,seasonal.periods=c(7,365.25))

Vous pouvez maintenant adapter un tbatsmodèle. (Soyez patient, cela peut prendre un certain temps.)

model <- tbats(x.msts)

Enfin, vous pouvez prévoir et tracer:

plot(forecast(model,h=100))

Vous ne devriez pas utiliser arima()ou auto.arima(), puisque ceux - ci ne peuvent gérer un seul type de saisonnalité: soit hebdomadaire ou annuelle. Ne me demandez pas ce que auto.arima()feraient vos données. Il peut choisir l'une des saisonnalités ou les ignorer complètement.


EDIT pour répondre à des questions supplémentaires à partir d'un commentaire:

  1. Comment puis-je vérifier si les données ont une saisonnalité annuelle ou non? Puis-je créer une autre série de nombre total d'événements par mois et utiliser son ACF pour en décider?

Le calcul d'un modèle sur des données mensuelles pourrait être une possibilité. Ensuite, vous pourriez, par exemple, comparer les AIC entre les modèles avec et sans saisonnalité.

Cependant, je préfère utiliser un échantillon de résistance pour évaluer les modèles de prévision. Tenez les 100 derniers points de données. Ajustez un modèle avec une saisonnalité annuelle et hebdomadaire au reste des données (comme ci-dessus), puis ajustez-en un avec seulement une saisonnalité hebdomadaire, par exemple, en utilisant auto.arima()un tsavec frequency=7. Prévision en utilisant les deux modèles dans la période d'exclusion. Vérifiez laquelle a une erreur plus faible, en utilisant MAE, MSE ou tout ce qui est le plus pertinent pour votre fonction de perte. S'il y a peu de différence entre les erreurs, optez pour le modèle plus simple; sinon, utilisez celui avec l'erreur la plus faible.

La preuve du pudding se trouve dans l'alimentation et la preuve du modèle de série chronologique dans les prévisions.

Pour améliorer les choses, n'utilisez pas un seul échantillon d'exclusion (qui peut être trompeur, étant donné la légère hausse à la fin de votre série), mais utilisez des prévisions d'origine glissantes, également connues sous le nom de «validation croisée des séries chronologiques» . (Je recommande fortement que tout le manuel de prévision en ligne gratuit .

  1. Ainsi, les modèles saisonniers ARIMA ne peuvent généralement pas gérer plusieurs saisonnalités? Est-ce une propriété du modèle lui-même ou est-ce simplement la façon dont les fonctions de R sont écrites?

Les modèles ARIMA standard gèrent la saisonnalité par différenciation saisonnière. Pour les données mensuelles saisonnières, vous ne modéliseriez pas la série chronologique brute, mais la série chronologique des différences entre mars 2015 et mars 2014, entre février 2015 et février 2014 et ainsi de suite. (Pour obtenir des prévisions à l'échelle d'origine, vous devez bien sûr à nouveau faire la différence.)

Il n'y a pas de moyen immédiatement évident d'étendre cette idée à plusieurs saisons.

Bien sûr, vous pouvez faire quelque chose en utilisant ARIMAX, par exemple, en incluant des variables mensuelles pour modéliser la saisonnalité annuelle, puis modéliser les résidus en utilisant ARIMA saisonnier hebdomadaire. Si vous voulez le faire dans R, utilisez ts(x,frequency=7), créez une matrice de variables mensuelles et introduisez-la dans le xregparamètre de auto.arima().

Je ne me souviens d'aucune publication qui étend spécifiquement ARIMA à plusieurs saisons, même si je suis sûr que quelqu'un a fait quelque chose dans le sens de mon paragraphe précédent.


Voici quelques questions que j'ai basées sur votre réponse: 1. Comment puis-je vérifier si les données ont une saisonnalité annuelle ou non? Puis-je créer une autre série de nombre total d'événements par mois et utiliser son acf pour le décider? 2. Donc, les modèles saisonniers ARIMA ne peuvent généralement pas gérer plusieurs saisonnalités? Est-ce une propriété du modèle lui-même ou est-ce simplement la façon dont les fonctions de R sont écrites?
statBeginner

Article mis à jour avec les résultats d'Auto.Arima avec saisonnalité hebdomadaire
statBeginner

1
@StephanKolassa, j'ai trouvé cet article d'AT & T il y a quelque temps qui utilise plusieurs ARIMA saisonniers. Un modèle tel que celui de l'article n'est pas possible dans la Rmesure où il Rn'a pas la capacité de gérer l'ARIMA multisaisonnier.
prévisionniste

2
@forecaster: cool, merci! Il semble qu'ils font une double différenciation dans l'équation 3.1. Je suis un peu inquiet de perdre beaucoup de données de cette façon. Malheureusement, ils ne comparent pas leurs résultats à une simple référence, par exemple, les demandes de la semaine dernière. Ce que j'aime, c'est comment ils étudient également les combinaisons de prévisions entre leur DSARIMA et un tbatsmodèle similaire .
S.Kolassa - Rétablir Monica le

3
@StephanKolassa Je suis d'accord, je suis un grand partisan de l'utilisation de prévisions naïves comme référence, comme le soutiennent les principes de prévision d'Armstrong et n'ajoutent de la complexité que si cela améliore la précision. Je me suis retrouvé dans le 2 centile supérieur dans quelques compétitions de kaggle en utilisant des méthodes naïves dans mes ensembles.
prévisionniste

4

Le meilleur moyen de décomposer les données saisonnières à l'aide des packages R existants est ceemdan () dans Rlibeemd. Cette technique extrait la saisonnalité de plusieurs périodes. Les valeurs par défaut fonctionnent bien. Il utilise la transformée de Hilbert-Huang au lieu de la transformée de Fourier. La transformée de Fourier présente un grave inconvénient en ce qu'elle ne peut traiter des données linéaires fixes que lorsque la plupart des séries d'intérêt ne le sont pas. Par exemple, la marche aléatoire y_t = y_ {t-1} + e_t est la marche aléatoire la plus simple et fréquemment rencontrée. D'autres méthodes maintiennent l'amplitude de la variation saisonnière fixe lorsqu'elle varie souvent dans la pratique.


1
Veuillez consulter le didacticiel et la référence de base de MathJax pour obtenir de l'aide sur la manière de mettre les mathématiques dans les réponses. Veuillez également fournir une justification de la revendication du " meilleur " (ou envisager de modifier la revendication) - elle devrait être au moins aussi bonne que toutes les autres options, pas seulement la plupart d'entre elles.
Glen_b -Reinstate Monica

2
Il vaut peut-être la peine de mentionner que ce package est sur CRAN
Glen_b -Reinstate Monica

3

Les questions que vous soulevez ont été traitées dans R Time Series Forecasting: Questions concernant ma sortie . Veuillez lire attentivement ma réponse détaillée et tous les commentaires de la discussion, y compris ceux de la question d'origine, car je pense qu'ils sont pertinents pour votre problème. Vous pouvez en fait prendre les données fournies dans le message et les utiliser comme moment d'enseignement pour vous-même. Utilisez toute la discussion comme une introduction à ce que vous devez faire.


1
Merci beaucoup! J'utiliserai les données de ce post pour essayer les choses.
statBeginner
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.