Comment adapter un modèle ARIMAX avec R?

Jai quatre séries chronologiques différentes de mesures horaires:

  1. La consommation de chaleur à lintérieur dune maison
  2. La température à lextérieur de la maison
  3. Le rayonnement solaire
  4. La vitesse du vent

Je veux pouvoir prédire la consommation de chaleur à lintérieur de la maison . Il existe une tendance saisonnière claire, à la fois sur une base annuelle et sur une base quotidienne. Puisquil existe une corrélation claire entre les différentes séries, je souhaite les ajuster à laide dun modèle ARIMAX. Cela peut être fait en R, en utilisant la fonction arimax du package TSA.

Jai essayé de lire la documentation sur cette fonction, et de lire sur les fonctions de transfert, mais pour linstant, mon code:

regParams = ts.union(ts(dayy)) transferParams = ts.union(ts(temp)) model10 = arimax(heat,order=c(2,1,1),seasonal=list(order=c(0,1,1),period=24),xreg=regParams,xtransf=transferParams,transfer=list(c(1,1)) pred10 = predict(model10, newxreg=regParams) 

me donne: saisissez la description de limage ici

où la ligne noire correspond au réel données mesurées, et la ligne verte est mon modèle ajusté en comparaison. Non seulement ce nest pas un bon modèle, mais il est clair que quelque chose ne va pas.

Jadmets que ma connaissance des modèles ARIMAX et des fonctions de transfert est limitée. Dans la fonction arimax (), (pour autant que jai compris), xtransf est la série temporelle exogène que je souhaite utiliser (en utilisant des fonctions de transfert) pour prédire ma série temporelle principale. Mais quelle est vraiment la différence entre xreg et xtransf?

Plus généralement, quest-ce que jai fait de mal? Jaimerais pouvoir obtenir un meilleur ajustement que celui obtenu à partir de lm (heat ~ temp radi wind * time).

Modifications: Sur la base de certains commentaires, jai supprimé le transfert et ajouté xreg à la place:

regParams = ts.union(ts(dayy), ts(temp), ts(time)) model10 = arimax(heat,order=c(2,1,1),seasonal=list(order=c(0,1,1),period=24),xreg=regParams) 

où dayy est le « nombre jour de lannée », et time est lheure du jour. La température est à nouveau la température extérieure. Cela me donne le résultat suivant:

entrez la description de limage ici

qui est mieux, mais pas à peu près ce que je mattendais à voir.

Réponse

Vous allez avoir un peu de mal à modéliser une série avec 2 niveaux de saisonnalité en utilisant un modèle ARIMA . La mise en place de ces paramètres dépend fortement de la configuration correcte. Avez-vous déjà envisagé un modèle linéaire simple? Ils sont beaucoup plus rapides et plus faciles à ajuster que les modèles ARIMA, et si vous utilisez des variables fictives pour vos différents niveaux de saisonnalité, ils sont souvent assez précis.

  1. Je suppose que vous avez des données horaires, alors assurez-vous que votre objet TS est configuré avec une fréquence de 24.
  2. Vous pouvez modéliser d’autres niveaux de saisonnalité à laide de variables fictives. Par exemple, vous pouvez souhaiter un ensemble de variables fictives 0/1 représentant le mois de lannée.
  3. Incluez les variables fictives dans xreg argument, avec toutes les covariables (comme températu re).
  4. Ajuster le modèle avec la fonction arima dans la base R. Cette fonction peut gérer les modèles ARMAX grâce à lutilisation de largument xreg.
  5. Essayez les fonctions Arima et auto.arima dans le package de prévisions. auto.arima est sympa car il trouvera automatiquement les bons paramètres pour votre modèle arima. Cependant, il faudra TOUJOURS pour sadapter à votre jeu de données.
  6. Essayez la fonction tslm dans le package arima, en utilisant des variables fictives pour chaque niveau de saisonnalité. Cela sadaptera beaucoup plus rapidement que le modèle Arima, et peut même fonctionner mieux dans votre situation.
  7. Si 4/5/6 ne fonctionne pas, ALORS commencez à vous soucier des fonctions de transfert. Vous devez explorer avant vous pouvez marcher.
  8. Si vous prévoyez de faire des prévisions dans le futur, vous devrez dabord prévoir vos variables xreg. Cest facile pour les mannequins saisonniers, mais vous devrez réfléchir à la façon de faire un bonnes prévisions météorologiques. Peut-être utiliser la médiane des données historiques?

Voici un exemple de la façon dont jaborderais ceci:

#Setup a fake time series set.seed(1) library(lubridate) index <- ISOdatetime(2010,1,1,0,0,0)+1:8759*60*60 month <- month(index) hour <- hour(index) usage <- 1000+10*rnorm(length(index))-25*(month-6)^2-(hour-12)^2 usage <- ts(usage,frequency=24) #Create monthly dummies. Add other xvars to this matrix xreg <- model.matrix(~as.factor(month))[,2:12] colnames(xreg) <- c("Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec") #Fit a model library(forecast) model <- Arima(usage, order=c(0,0,0), seasonal=list(order=c(1,0,0), period=24), xreg=xreg) plot(usage) lines(fitted(model),col=2) #Benchmark against other models model2 <- tslm(usage~as.factor(month)+as.factor(hour)) model3 <- tslm(usage~as.factor(month)) model4 <- rep(mean(usage),length(usage)) #Compare the 4 models library(plyr) #for rbind.fill ACC <- rbind.fill( data.frame(t(accuracy(model))), data.frame(t(accuracy(model2))), data.frame(t(accuracy(model3))), data.frame(t(accuracy(model4,usage))) ) ACC <- round(ACC,2) ACC <- cbind(Type=c("Arima","LM1","Monthly Mean","Mean"),ACC) ACC[order(ACC$MAE),] 

Commentaires

  • Quest-ce que la fonction fit (). Si jutilise cela, jobtiens de bien meilleurs résultats quavec Predict (model10, newxreg = regParams).
  • @utdiscant: predict() est utilisé pour les prévisions, tandis que fitted() renvoie lajustement du modèle sur la période historique. Si vous voulez une aide plus spécifique, vous devriez publier un exemple reproductible avec du code.
  • @utdiscant: aussi, si vous utilisez dayy comme xreg, vous courez le risque de surajustement, car vous navez que 24 observations par jour. Vous pourriez obtenir de meilleurs résultats de prévision si vous utilisez le mois de lannée.
  • @utdiscant: De plus, vos xreg basés sur le temps doivent être des variables factices . La façon dont vous lavez modélisée maintenant est que vous vous attendez à ce que heat augmente linéairement avec lheure de la journée, puis redescende lorsque lheure revient à 1. Si vous utilisez des variables fictives, chaque lheure du jour obtiendra leffet propre de '. Parcourez mon exemple de code et portez une attention particulière à la façon dont je construis mon objet xreg.
  • Lun des inconvénients des fonctions ARIMA dans les packages stats et forecast est quelles ne correspondent pas aux fonctions de transfert prober . La documentation de la fonction stats::arima indique ce qui suit: Si un terme xreg est inclus, une régression linéaire (avec un terme constant si include.mean est vrai et il ny a pas de différence ) est équipé dun modèle ARMA pour le terme derreur. Donc, si vous avez réellement besoin dajuster des fonctions de transfert, il semble que la fonction TSA::arimax soit le chemin à suivre pour R.

Answer

Jutilise R pour faites des prévisions de charge pendant un certain temps et je peux vous suggérer dutiliser le package forecast et ses fonctions inestimables (comme auto.arima).

Vous pouvez créer un modèle ARIMA avec la commande suivante:

model = arima(y, order, xreg = exogenous_data) 

avec y votre prédicteur (I supposons dayy), order lordre de votre modèle (compte tenu de la saisonnalité) et exogenous_data votre température, rayonnement solaire, etc. La fonction auto.arima vous aide à trouver lordre optimal des modèles. Vous pouvez trouver un bref tutoriel sur le package `prévisions » ici .

Commentaires

  • Ce quil faut prévoir, cest la chaleur (la consommation de chaleur de la maison).

Réponse

I personnellement, je ne comprends pas les fonctions de transfert, mais je pense que vous avez inversé xtransf et xreg. Au moins dans la base de R « s arima, cest xreg qui contient vos variables exogènes. Jai limpression quune fonction de transfert décrit comment (les données décalées affectent les valeurs futures) plutôt que quoi .

Jessaierais dutiliser xreg pour vos variables exogènes, peut-être en utilisant arima si arimax exige une fonction de transfert. Le problème est que votre modèle est quotidien, mais vos données ont les deux saisonnalité quotidienne et annuelle, et je ne sais pas pour le moment si une première différence (le order=(*, 1, *)) prendra en charge cela ou non. (Vous nobtiendrez certainement pas de prévisions magiques toute lannée avec un modèle qui ne prend en compte que la saisonnalité quotidienne.)

PS Quel est le time que vous utilisez dans votre lm? Heure dhorloge littérale ou numéro dobservation 1-up? Je pense que vous pourriez obtenir quelque chose en utilisant un modèle à effets mixtes (lmer dans le package lme4), bien que je n « ai pas compris si faire cela explique correctement l » autocorrélation qui se produira dans une série chronologique. Si ce nest pas pris en compte, ce que ne fait pas un lm, vous pourriez obtenir un ajustement intéressant, mais votre conception de la précision de votre prédiction sera bien trop optimiste.

Commentaires

  • Jai à la fois lheure de la mesure et le " jour de lannée " de la mesure.

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *