J'ai quatre séries chronologiques différentes de mesures horaires:
- La consommation de chaleur à l'intérieur d'une maison
- La température à l'extérieur de la maison
- Le rayonnement solaire
- La vitesse du vent
Je veux pouvoir prédire la consommation de chaleur à l'intérieur de la maison. Il y a une nette tendance saisonnière, à la fois sur une base annuelle et sur une base quotidienne. Puisqu'il existe une corrélation claire entre les différentes séries, je souhaite les ajuster à l'aide d'un modèle ARIMAX. Cela peut être fait dans R, en utilisant la fonction arimax du paquet TSA.
J'ai essayé de lire la documentation sur cette fonction et de lire sur les fonctions de transfert, mais jusqu'à présent, 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)
Donne moi:
où la ligne noire représente les données mesurées réelles et la ligne verte représente mon modèle ajusté en comparaison. Non seulement ce n'est pas un bon modèle, mais il est clair que quelque chose ne va pas.
Je reconnais que ma connaissance des modèles ARIMAX et des fonctions de transfert est limitée. Dans la fonction arimax (), (si j'ai bien compris), xtransf est la série temporelle exogène que je souhaite utiliser (à l'aide de fonctions de transfert) pour prédire ma série temporelle principale. Mais quelle est la différence entre xreg et xtransf?
Plus généralement, qu'est-ce que j'ai mal fait? Je voudrais pouvoir obtenir un meilleur ajustement que celui obtenu à partir de lm (chaleur ~ temp radi vent * temps).
Modifications: sur la base de certains commentaires, j'ai 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 "numéro jour de l'année" et time, l'heure du jour. La température est à nouveau la température extérieure. Cela me donne le résultat suivant:
ce qui est meilleur, mais pas à la hauteur de ce que je pensais voir.
la source
predict()
est utilisé pour les prévisions, alors quefitted()
le modèle est ajusté sur la période historique. Si vous souhaitez une aide plus spécifique, vous devez poster un exemple reproductible avec du code.heat
à augmenter linéairement avec l'heure du jour, puis à reculer lorsque l'heure revient à 1. Si vous utilisez des variables nominales, chaque heure de la journée produira son propre effet. Parcourez mon exemple de code et faites très attention à la façon dont je construis mon objet xreg.stats
etforecast
est qu’elles ne conviennent pas aux fonctions de transfert de prober. La documentation de lastats::arima
fonction indique ce qui suit: Si un terme xreg est inclus, une régression linéaire (avec un terme constant si include.mean est true et en l'absence de différenciation) est équipée d'un modèle ARMA pour le terme d'erreur. Donc, si vous avez réellement besoin d’adapter des fonctions de transfert, il semble que cetteTSA::arimax
fonction soit la solutionR
.J'utilise R depuis un certain temps pour faire des prévisions de charge et je peux vous suggérer d'utiliser
forecast
package et ses fonctions inestimables (commeauto.arima
).Vous pouvez construire un modèle ARIMA avec la commande suivante:
avec
y
votre prévision (je supposedayy
),order
l'ordre de votre modèle (en tenant compte de la saisonnalité) etexogenous_data
votre température, le rayonnement solaire, etc. La fonctionauto.arima
vous aide à trouver l'ordre optimal du modèle. Vous pouvez trouver un bref tutoriel sur le paquet `previsions ' ici .la source
Personnellement, je ne comprends pas les fonctions de transfert, mais je pense que vous avez compris
xtransf
etxreg
inversé. Au moins dans la base de R,arima
c'estxreg
qu'il contient vos variables exogènes. J'ai l'impression qu'une fonction de transfert décrit comment (les données décalées affectent les valeurs futures) plutôt que quoi .Je voudrais essayer d'utiliser
xreg
pour vos variables exogènes, peut-être en utilisantarima
siarimax
demande une fonction de transfert. Le problème est que votre modèle est quotidien, mais que vos données ont une saisonnalité journalière et annuelle, et je ne suis pas sûr pour le moment si une première différence (leorder=(*, 1, *)
) va prendre en charge cela ou pas. (Vous ne obtiendrez certainement pas de prévisions magiques tout au long de l'année avec un modèle qui prend uniquement en compte la saisonnalité quotidienne.)PS Quelle est la
time
que vous utilisez dans votrelm
? Heure de l'horloge ou un numéro d'observation 1-up? Je pense que vous pourriez obtenir quelque chose en utilisant un modèle à effets mixtes (lmer
dans lelme4
package), bien que je n’aie pas compris si cela rend compte correctement de l’autocorrélation qui se produira dans une série chronologique. Si ce n'est pas pris en compte, ce quilm
n'est pas le cas, vous obtiendrez peut-être un ajustement intéressant, mais votre idée de la précision de vos prédictions sera beaucoup trop optimiste.la source