Combiner deux séries chronologiques en faisant la moyenne des points de données

10

Je voudrais combiner les prévisions et les rétrodiffusions (c'est-à-dire les valeurs passées prévues) d'un ensemble de données de séries chronologiques en une seule série temporelle en minimisant l'erreur quadratique moyenne de prédiction.

Disons que j'ai des séries chronologiques de 2001-2010 avec un écart pour l'année 2007. J'ai pu prévoir 2007 en utilisant les données de 2001-2007 (ligne rouge - appelée Yf ) et effectuer une rétrodiffusion en utilisant les données de 2008-2009 (clair ligne bleue - appelez-la Yb ).

Je voudrais combiner les points de données de Yf et Yb en un point de données imputé Y_i pour chaque mois. Idéalement, je voudrais obtenir le poids w tel qu'il minimise l'erreur de prédiction quadratique moyenne (MSPE) de Yi . Si cela n'est pas possible, comment pourrais-je simplement trouver la moyenne entre les deux points de données des séries chronologiques?

Yi=wYf+(1w)Yb

Comme exemple rapide:

tt_f <- ts(1:12, start = 2007, freq = 12)
tt_b <- ts(10:21, start=2007, freq=12)

tt_f
     Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec
2007   1   2   3   4   5   6   7   8   9  10  11  12
tt_b
     Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec
2007  10  11  12  13  14  15  16  17  18  19  20  21

Je voudrais obtenir (juste montrer la moyenne ... Minimiser idéalement le MSPE)

tt_i
     Jan Feb Mar Apr May Jun  Jul  Aug  Sep  Oct  Nov  Dec
2007 5.5 6.5 7.5 8.5 9.5 10.5 11.5 12.5 13.5 14.5 15.5 16.5

entrez la description de l'image ici

OSlOlSO
la source
Quel est le modèle de prévision (arima, ets, certains autres)? (+1) pour la suggestion d'approche, j'ai une fois pensé à cette façon, mais je suis resté dans Attente-Maximisation après interpolation. En principe, la période d'apprentissage pourrait être importante, pour donner un poids plus élevé au modèle basé sur des informations plus importantes (prévision rouge sur l'image). Certains critères de précision pourraient également être potentiellement utiles pour établir des pondérations, pour ne pas être liés de façon aussi déterministe aux longueurs des séries chronologiques.
Dmitrij Celov
Désolé de laisser de côté le modèle de prévision. Celui ci-dessus utilise simplement la predictfonction du package de prévision. Cependant, je pense que je vais utiliser le modèle de prévision HoltWinters pour prévoir et rétrograder. J'ai des séries chronologiques avec peu <50 comptes, et j'ai essayé la prévision de régression de Poisson - mais pour une raison quelconque, des prédictions très faibles.
OSlOlSO
Les données de comptage semblent avoir une pause exactement à l'endroit que vous montrez, les prévisions et les rétrogradations illustrent également la même chose. Dans Poisson vous avez fait une régression de sur le temps tendance t ? log(counts)t
Dmitrij Celov
Avez-vous juste des comptes ou des séries chronologiques connexes supplémentaires sans NAvaleurs? Il semble que rendre la période d'apprentissage MSPE pourrait être trompeur car les sous-périodes sont bien décrites par des tendances linéaires, mais dans la période manquée, une baisse quelque part se produit, et cela pourrait en fait être n'importe quel point. À noter également que les prévisions étant colinéaires, leur moyenne introduira deux ruptures structurelles au lieu d'une apparente.
Dmitrij Celov
Désolé de ne revenir que maintenant @Dmitij. Quelle est cette «pause» dont vous parlez? J'ai fait le log (décompte) pour la régression GLM. Et il y a un sous-ensemble des données de comptage qui ont des comptages inférieurs à <6, ce qui me forcera à l'utiliser. Je n'ai que les comptes. Si vous regardez cette question, vous aurez une idée des données dont je dispose. Les chiffres ci-dessus ne concernent que le groupe d'âge «15up». Si cela a du sens?
OSlOlSO

Réponses:

0

En supposant que vous ayez les erreurs de prédiction au carré pour les prévisions et le backcast individuellement, je recommanderais ceci: Soit w un vecteur de longueur 12, soit m le mois qui vous intéresse.

w=rep(NA,12);
for(w in 1:12){
w[m]=SPE_Backcast[m]/(SPE_Backcast[m]+SPE_Forecast[m]);
}

Maintenant, w est le poids de la prévision et 1-w est le poids du backcast.

Dennis Jaheruddin
la source
Cela semble pondérer plus fortement la valeur la plus basse (au point que les nombres négatifs peuvent finir par avoir des poids> 1). À quoi ça sert? Aussi, ligne deuxs/w/m/
naught101
Comment obtiendriez-vous des erreurs de prédiction au carré négatif?
Owe Jessen
3

t

Y^t:=E(Yt|Y1:r,Ys:n)
Yu:v:=[Yu,Yu+1,,Yv]uvr+1s1ntY^t|1:r,s:n

Y^tt

αtYtt

αtYt

Au moins dans les versions multiplicatives, les procédures de prévision «ad hoc» comme Holt-Winters reposent sur des modèles stochastiques sans algorithmes FI simples car ils ne peuvent pas être mis sous forme SS. La formule de lissage peut probablement être approximée à l'aide du modèle SS, mais il est beaucoup plus simple d'utiliser des modèles de séries chronologiques structurelles avec des transformations logarithmiques. Les fonctions «KalmanSmooth», «tsSmooth» et «StructTS» du package de statistiques R peuvent faire l'affaire. Vous devriez jeter un œil aux livres de Harvey ou de Durbin et Koopman cités dans les pages d'aide de R. L'algorithme de lissage peut fournir une variance conditionnelle pour le estiméYtet peut être utilisé pour construire des intervalles de lissage, qui ont généralement tendance à être plus grands au milieu de l'écart. Notez cependant que l'estimation des modèles structurels peut être difficile.

AP <- log10(AirPassengers) 
## Fit a Basic Structural Model
fit <- StructTS(AP, type = "BSM")

## Fit with a gap
AP.gap <- AP
AP.gap[73:96] <- NA
fit.gap <- StructTS(AP.gap, type = "BSM", optim.control = list(trace = TRUE))

# plot in orginal (non-logged) scale
plot(AirPassengers, col = "black", ylab = "AirPass")
AP.missing <- ts(AirPassengers[73:96], start=1955, , freq=12)
lines(AP.missing, col = "grey", lwd = 1)

## smooth and sum 'level' and 'sea' to retrieve series
sm <- tsSmooth(fit.gap)
fill <- apply(as.matrix(sm[ , c(1,3)]), 1, sum)
AP.fill <- ts(fill[73:96], start=1955, , freq=12)
lines(10^AP.fill, col = "red", lwd = 1)

Remplissage lissé

Yves
la source
2

Je trouve intéressante votre approche suggérée, celle de prendre les moyens des lancers avant et arrière.

Une chose qui mérite d'être soulignée est que dans tout système présentant une structure chaotique, les prévisions sont susceptibles d'être plus précises sur des périodes plus courtes. Ce n'est pas le cas pour tous les systèmes, par exemple un pendule amorti pourrait être modélisé par une fonction avec la mauvaise période, auquel cas toutes les prévisions à moyen terme sont susceptibles d'être fausses, tandis que celles à long terme vont toutes l'être très précis, car le système converge vers zéro. Mais il me semble, d'après le graphique de la question, que cela pourrait être une hypothèse raisonnable à faire ici.

Cela implique que nous pourrions être mieux en nous appuyant davantage sur les données prévisionnelles pour la première partie de la période manquante, et davantage sur les données rétrospectives pour la dernière partie. La manière la plus simple de le faire serait d'utiliser un poids décroissant linéairement pour la prévision, et l'inverse pour le back-cast:

> n <- [number of missing datapoints] 
> w <- seq(1, 0, by = -1/(n+1))[2:(n+1)]

Cela donne un peu de poids au backcast sur le premier élément. Vous pouvez également utiliser n-1, sans les indices à la fin, si vous souhaitez utiliser uniquement la valeur de prévision sur le premier point interpolé.

> w
 [1] 0.92307692 0.84615385 0.76923077 0.69230769 0.61538462 0.53846154
 [7] 0.46153846 0.38461538 0.30769231 0.23076923 0.15384615 0.07692308

Je n'ai pas vos données, alors essayons ceci sur le jeu de données AirPassenger dans R. Je vais juste supprimer une période de deux ans près du centre:

> APearly <- ts(AirPassengers[1:72], start=1949, freq=12)
> APlate <- ts(AirPassengers[97:144], start=1957, freq=12)
> APmissing <- ts(AirPassengers[73:96], start=1955, freq=12)
> plot(AirPassengers)
# plot the "missing data" for comparison
> lines(APmissing, col="#eeeeee")
# use the HoltWinters algorithm to predict the mean:
> APforecast <- hw(APearly)[2]$mean
> lines(APforecast, col="red")
# HoltWinters doesn't appear to do backcasting, so reverse the ts, forecast, 
# and reverse again (feel free to edit if there's a better process)
> backwards <- ts(rev(APlate), freq=12)
> backcast <- hw(backwards)[2]$mean
> APbackcast <- ts(rev(backcast), start=1955, freq=12)
> lines(APbackcast, col='blue')
# now the magic: 
> n <- 24 
> w <- seq(1, 0, by=-1/(n+1))[2:(n+1)]
> interpolation = APforecast * w + (1 - w) * APbackcast
> lines(interpolation, col='purple', lwd=2)

Et il y a votre interpolation.

sortie graphique

Bien sûr, ce n'est pas parfait. Je suppose que cela est dû au fait que les modèles de la première partie des données sont différents de ceux de la dernière partie (le pic de juillet à août n'est pas si fort les années précédentes). Mais comme vous pouvez le voir sur l'image, c'est clairement mieux que les prévisions ou la coulée arrière seules. J'imagine que vos données peuvent obtenir des résultats légèrement moins fiables, car il n'y a pas une si forte variation saisonnière.

Je suppose que vous pourriez essayer cela, y compris les intervalles de confiance, mais je ne suis pas sûr de la validité de le faire aussi simplement que cela.

rien101
la source