web-dev-qa-db-fra.com

commencer une série chronologique quotidienne en R

J'ai une série chronologique quotidienne sur le nombre de visiteurs sur le site Web. ma série commence du 01/06/2014 à aujourd'hui 14/10/2015, donc je souhaite prédire le nombre de visiteurs pour l’avenir. Comment puis-je lire ma série avec R? Je pense:

series <- ts(visitors, frequency=365, start=c(2014, 6)) 

si oui, et après avoir exécuté mon modèle de série chronologique, arimadata=auto.arima(), je souhaite prédire le nombre de visiteurs pour les 60 prochains jours. Comment puis-je le faire?

h=..?
forecast(arimadata,h=..), 

la valeur de h devrait être quoi? merci d'avance pour votre aide

9
max

La spécification ts est incorrecte; si vous configurez cela en observations quotidiennes, vous devez spécifier quel jour de l'année 2014 est le 1er juin et le spécifier dans start:

## Create a daily Date object - helps my work on dates
inds <- seq(as.Date("2014-06-01"), as.Date("2015-10-14"), by = "day")

## Create a time series object
set.seed(25)
myts <- ts(rnorm(length(inds)),     # random data
           start = c(2014, as.numeric(format(inds[1], "%j"))),
           frequency = 365)

Notez que je spécifie start en tant que c(2014, as.numeric(format(inds[1], "%j"))). Tout ce qui est compliqué consiste à déterminer le jour de l'année le 1er juin:

> as.numeric(format(inds[1], "%j"))
[1] 152

Une fois que vous avez cela, vous êtes effectivement là:

## use auto.arima to choose ARIMA terms
fit <- auto.arima(myts)
## forecast for next 60 time points
fore <- forecast(fit, h = 60)
## plot it
plot(fore)

 enter image description here

Cela semble approprié compte tenu des données aléatoires que j'ai fournies ...

Vous devrez sélectionner les arguments appropriés pour auto.arima() en fonction de vos données.

Notez que les étiquettes en abscisse font référence à 0,5 (la moitié) d'une année.

Faire ceci via Zoo

Cela pourrait être plus facile à faire via un objet Zoo créé en utilisant le paquetage Zoo:

## create the Zoo object as before
set.seed(25)
myzoo <- Zoo(rnorm(length(inds)), inds)

Notez que vous n'avez maintenant pas besoin de spécifier les informations start ou frequency; utilisez simplement inds calculé plus tôt à partir de l’objet quotidien Date.

Procéder comme avant

## use auto.arima to choose ARIMA terms
fit <- auto.arima(myts)
## forecast for next 60 time points
fore <- forecast(fit, h = 60)

Le tracé posera cependant un problème, car l’axe des x est en nombre de jours depuis l’époque (1970-01-01), nous devons donc supprimer le tracé automatique de cet axe, puis dessiner le nôtre. C'est facile car nous avons inds

## plot it
plot(fore, xaxt = "n")    # no x-axis 
Axis(inds, side = 1)

Cela ne produit que quelques tiques étiquetées; si vous voulez plus de contrôle, dites à R où vous voulez les ticks et les étiquettes:

## plot it
plot(fore, xaxt = "n")    # no x-axis 
Axis(inds, side = 1,
     at = seq(inds[1], tail(inds, 1) + 60, by = "3 months"),
     format = "%b %Y")

Ici, on trace tous les 3 mois.

16
Gavin Simpson

Time Series Object ne fonctionne pas bien avec la création de séries chronologiques quotidiennes. Je vais vous suggérer d'utiliser la bibliothèque du zoo.

Library(Zoo)
Zoo(visitors, seq(from = as.Date("2014-06-01"), to = as.Date("2015-10-14"), by = 1))
3
Amol Modi

Voici un guide pas à pas pour la prévision de données quotidiennes avec une saisonnalité multiple en R. Sauf si la série chronologique est très longue, la méthode la plus simple consiste simplement à définir l'attribut de fréquence sur 7.

y <- ts(x, frequency=7)

Ensuite, n’importe laquelle des méthodes de prévision de séries chronologiques habituelles devrait produire des prévisions raisonnables. Par exemple

library(forecast)
fit <- ets(y)
fc <- forecast(fit)
plot(fc)

Lorsque la série chronologique est suffisamment longue pour prendre plus d’une année, il peut être nécessaire de tenir compte de la saisonnalité annuelle ainsi que de la saisonnalité. Dans ce cas, un modèle saisonnier multiple tel que TBATS est requis.

y <- msts(x, seasonal.periods=c(7,365.25))
fit <- tbats(y)
fc <- forecast(fit)
plot(fc)

Cela devrait refléter le schéma hebdomadaire ainsi que le schéma annuel plus long. La période 365.25 est la durée moyenne d’une année tenant compte des années bissextiles. Dans certains pays, des durées alternatives ou supplémentaires peuvent être nécessaires.

Il est plus difficile de saisir le caractère saisonnier associé à des événements en mouvement tels que Pâques ou le nouvel an chinois. Même avec des données mensuelles, cela peut être délicat car les festivals peuvent tomber en mars ou en avril (pour Pâques) ou en janvier ou en février (pour le nouvel an chinois). Les modèles saisonniers habituels ne le permettent pas. La meilleure façon de gérer les effets de vacances en mouvement est d’utiliser des variables nominales. Cependant, ni les modèles ETS ni TBATS n'autorisent les covariables. Un modèle d’espace à états de même forme que TBATS mais comportant plusieurs sources d’erreur et des covariables pourrait être utilisé, mais nous n’avons aucun code R pour le faire.

Au lieu de cela, nous pouvons utiliser un modèle de régression avec des erreurs ARIMA, dans lequel les termes de régression incluent tous les effets de vacances factices ainsi que la saisonnalité annuelle plus longue. À moins de plusieurs décennies de données, il est généralement raisonnable de supposer que la forme saisonnière annuelle reste inchangée d'une année à l'autre. Les termes de Fourier peuvent donc être utilisés pour modéliser la saisonnalité annuelle. Supposons que nous utilisions K = 5 termes de Fourier pour modéliser la saisonnalité annuelle, et que les variables nominales de vacances soient dans le vecteur vacances avec 100 valeurs futures dans vacancesf. Ensuite, le code suivant ira à un modèle approprié.

y <- ts(x, frequency=7)
z <- fourier(ts(x, frequency=365.25), K=5)
zf <- fourierf(ts(x, frequency=365.25), K=5, h=100)
fit <- auto.arima(y, xreg=cbind(z,holiday), seasonal=FALSE)
fc <- forecast(fit, xreg=cbind(zf,holidayf), h=100)

L'ordre K peut être choisi en minimisant l'AIC du modèle ajusté.

2
Vikas Kukreti

Voici comment j'ai créé une série chronologique quand on m'a donné des observations quotidiennes, avec quelques observations manquantes. @ gavin-simpson a beaucoup aidé. Espérons que cela sauve un peu de chagrin à quelqu'un.

Les données d'origine ressemblaient à ceci:

library(lubridate)
set.seed(42)
minday = as.Date("2001-01-01")
maxday = as.Date("2005-12-31")
dates <- seq(minday, maxday, "days")
dates <- dates[sample(1:length(dates),length(dates)/4)] # create some holes
df <- data.frame(date=sort(dates), val=sin(seq(from=0, to=2*pi, length=length(dates))))

Pour créer une série temporelle avec ces données, j'ai créé un cadre de données «factice» avec une ligne par date et fusionné avec le cadre de données existant:

df <- merge(df, data.frame(date=seq(minday, maxday, "days")), all=T)

Cette base de données peut être convertie en une série temporelle. Les dates manquantes sont NA.

nts <- ts(df$val, frequency=365, start=c(year(minday), as.numeric(format(minday, "%j"))))
plot(nts)

 holey sin wave

1
keithpjolley
series <- ts(visitors, frequency=365, start=c(2014, 152)) 

Le numéro 152 correspond au 01-06-2014 puisqu'il part du numéro 152 en raison de la fréquence = 365 Pour une prévision sur 60 jours, h = 60.

forecast(arimadata , h=60)
0
lalit panwar