Sie versuchen, eine kompositorische Zeitreihe vorherzusagen. Das heißt, Sie haben drei Komponenten, die alle zwischen 0 und 1 liegen und sich zu 1 addieren müssen.
Sie können dieses Problem mithilfe der standardmäßigen exponentiellen Glättung mithilfe einer geeigneten verallgemeinerten logistischen Transformation beheben. Auf dem Internationalen Symposium für Prognosen 2010 gab es eine Präsentation von Koehler, Snyder, Ord & Beaumont , die sich in ein Papier verwandelte ( Snyder et al., 2017, International Journal of Forecasting ).
Lassen Sie uns dies mit Ihren Daten durchgehen. Lesen Sie die Daten in eine Matrix obs
von Zeitreihen:
obs <- structure(c(0.03333333, 0.03810624, 0, 0.03776683, 0.06606607,
0.03900325, 0.03125, 0, 0.04927885, 0.0610687, 0.03846154, 0,
0.06028636, 0.09646302, 0.04444444, 0.01111111, 0.02309469, 0.03846154,
0.03119869, 0.01201201, 0.02058505, 0.015625, 0, 0.01802885,
0.02290076, 0, 0, 0.03843256, 0.05144695, 0.06666667, 0.9555556,
0.9387991, 0.9615385, 0.9310345, 0.9219219, 0.9404117, 0.953125,
1, 0.9326923, 0.9160305, 0.9615385, 1, 0.9012811, 0.85209, 0.8888889
), .Dim = c(15L, 3L), .Dimnames = list(NULL, c("Series 1", "Series 2",
"Series 3")), .Tsp = c(1, 15, 1), class = c("mts", "ts", "matrix"
))
Sie können überprüfen, ob dies funktioniert hat, indem Sie tippen
obs
Jetzt haben Sie ein paar Nullen, was ein Problem sein wird, wenn Sie Logarithmen nehmen. Eine einfache Lösung besteht darin, alles, was weniger als ein kleines auf dieses :ϵϵ
epsilon <- 0.0001
obs[obs<epsilon] <- epsilon
Jetzt summieren sich die geänderten Zeilen nicht mehr zu 1. Wir können das korrigieren (obwohl ich denke, dass dies die Prognose verschlechtern könnte):
obs <- obs/matrix(rowSums(obs),nrow=nrow(obs),ncol=ncol(obs),byrow=FALSE)
Jetzt transformieren wir die Daten gemäß Seite 35 der Präsentation:
zz <- log(obs[,-ncol(obs)]/obs[,ncol(obs)])
colnames(zz) <- head(colnames(obs),-1)
zz
Laden Sie das forecast
Paket und legen Sie einen Horizont von 5 Zeitpunkten fest:
library(forecast)
horizon <- 5
Modellieren und prognostizieren Sie nun die transformierten Daten spaltenweise. Hier rufe ich einfach an ets()
, was versuchen wird, ein exponentielles Glättungsmodell für den Zustandsraum anzupassen. Es stellt sich heraus, dass für alle drei Serien eine einzige exponentielle Glättung verwendet wird. Insbesondere wenn Sie jedoch mehr als 15 Zeiträume haben, werden möglicherweise Trendmodelle ausgewählt. Oder wenn Sie monatliche Daten haben, erklären Sie R, dass Sie eine potenzielle Saisonalität haben, indem Sie ts()
mit frequency=12
- verwenden. Dann ets()
werden saisonale Modelle betrachtet.
baz <- apply(zz,2,function(xx)forecast(ets(xx),horizon=horizon)["mean"])
forecasts.transformed <- cbind(baz[[1]]$mean,baz[[2]]$mean)
Als nächstes transformieren wir die Prognosen gemäß Seite 38 der Präsentation zurück:
forecasts <- cbind(exp(forecasts.transformed),1)/(1+rowSums(exp(forecasts.transformed)))
Lassen Sie uns abschließend Geschichten und Prognosen zeichnen:
plot(obs[,1],ylim=c(0,1),xlim=c(1,nrow(obs)+horizon),type="n",ylab="")
for ( ii in 1:ncol(obs) ) {
lines(obs[,ii],type="o",pch=19,col=ii)
lines(forecasts[,ii],type="o",pch=21,col=ii,lty=2)
}
legend("left",inset=.01,lwd=1,col=1:ncol(obs),pch=19,legend=colnames(obs))
EDIT: Ein Artikel über die Vorhersage kompositorischer Zeitreihen ist gerade erschienen. Ich habe es nicht gelesen, aber es könnte von Interesse sein.