J'ai une série zoo avec de nombreuses valeurs manquantes. J'ai lu que cela auto.arima
peut imputer ces valeurs manquantes? Quelqu'un peut-il m'apprendre à le faire? Merci beaucoup!
C'est ce que j'ai essayé, mais sans succès:
fit <- auto.arima(tsx)
plot(forecast(fit))
Réponses:
Tout d'abord, sachez que
forecast
calcule les prédictions hors échantillon, mais vous êtes intéressé par les observations dans l'échantillon.Le filtre de Kalman gère les valeurs manquantes. Ainsi, vous pouvez prendre la forme d'espace d'état du modèle ARIMA à partir de la sortie renvoyée par
forecast::auto.arima
oustats::arima
et la transmettre àKalmanRun
.Modifier (correction dans le code basé sur la réponse de stats0007)
Dans une version précédente, je prenais la colonne des états filtrés liés à la série observée, mais je devrais utiliser la matrice entière et faire l'opération de matrice correspondante de l'équation d'observation, . (Merci à @ stats0007 pour les commentaires.) Ci-dessous, je mets à jour le code et trace en conséquence.yt= Zαt
J'utilise un
ts
objet comme une série d'échantillons au lieu dezoo
, mais il devrait être le même:Vous pouvez tracer le résultat (pour toute la série et pour toute l'année avec des observations manquantes au milieu de l'échantillon):
Vous pouvez répéter le même exemple en utilisant le lisseur Kalman au lieu du filtre Kalman. Il vous suffit de changer ces lignes:
Le traitement des observations manquantes au moyen du filtre de Kalman est parfois interprété comme une extrapolation de la série; lorsque le lisseur de Kalman est utilisé, les observations manquantes seraient remplies par interpolation dans la série observée.
la source
makeARIMA
définit les matrices de la forme de l'espace d'état et je dirais que la colonne prise parid
est correcte. Le vecteur dans l'équation d'observation est définimakeARIMA
comme:,Z <- c(1, rep.int(0, r - 1L), Delta)
oùDelta
est un vecteur contenant les coefficients du filtre de différenciation. S'il n'y a pas de filtre de différenciation (c'est-à-dire un modèle ARMAlength(tmp)==1
), alorsid
devrait être 1; sinon, la première colonne est liée à la série différenciée, tandis que l'élément suivant enZ
prenant la valeur 1 est lié à , l'indice qui doit être pris.Voici ma solution:
@ Javlacalle:
Thx pour votre message, très intéressant!
J'ai deux questions à votre solution, j'espère que vous pourrez m'aider:
Pourquoi utilisez-vous KalmanRun au lieu de KalmanSmooth? J'ai lu que KalmanRun est considéré comme une extrapolation, alors que la douceur serait une estimation.
Je ne reçois pas non plus votre pièce d'identité. Pourquoi n'utilisez-vous pas tous les composants en .Z? Je veux dire par exemple .Z donne 1, 0,0,0,0,1, -1 -> 7 valeurs. Cela signifierait que .smooth (dans votre cas pour les états KalmanRun) me donne 7 colonnes. Si je comprends bien, toutes les colonnes qui sont 1 ou -1 entrent dans le modèle.
Disons que la ligne numéro 5 est manquante dans AirPass. Ensuite, je prendrais la somme de la ligne 5 comme ceci: j'ajouterais de la valeur à la colonne 1 (parce que Z a donné 1), je n'ajouterais pas la colonne 2-4 (parce que Z dit 0), j'ajouterais la colonne 5 et je ajoutez la valeur négative de la colonne 7 (parce que Z indique -1)
Ma solution est-elle mauvaise? Ou sont-ils tous les deux d'accord? Pouvez-vous peut-être m'expliquer davantage?
la source