Jai quatre séries chronologiques différentes de mesures horaires:
- La consommation de chaleur à lintérieur dune maison
- La température à lextérieur de la maison
- Le rayonnement solaire
- 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:
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:
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.
- Je suppose que vous avez des données horaires, alors assurez-vous que votre objet TS est configuré avec une fréquence de 24.
- 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.
- Incluez les variables fictives dans
xreg
argument, avec toutes les covariables (comme températu re). - 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
. - 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.
- 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.
- Si 4/5/6 ne fonctionne pas, ALORS commencez à vous soucier des fonctions de transfert. Vous devez explorer avant vous pouvez marcher.
- 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
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.
predict()
est utilisé pour les prévisions, tandis quefitted()
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.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.stats
etforecast
est quelles ne correspondent pas aux fonctions de transfert prober . La documentation de la fonctionstats::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 fonctionTSA::arimax
soit le chemin à suivre pourR
.