Está intentando pronosticar una serie de tiempo de composición . Es decir, tiene tres componentes que están limitados a estar entre 0 y 1 y sumar 1.
Puede abordar este problema utilizando el suavizado exponencial estándar, utilizando una transformación logística generalizada adecuada. Hubo una presentación sobre esto por parte de Koehler, Snyder, Ord & Beaumont en el Simposio Internacional de Pronóstico 2010 , que se convirtió en un documento ( Snyder et al., 2017, International Journal of Forecasting ).
Pasemos por esto con sus datos. Lea los datos en una matriz obs
de series de tiempo:
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"
))
Puede verificar si esto funcionó escribiendo
obs
Ahora, tiene algunos ceros allí, lo que será un problema una vez que tome los logaritmos. Una solución simple es configurar todo lo que sea menos que un pequeño en ese :ϵϵ
epsilon <- 0.0001
obs[obs<epsilon] <- epsilon
Ahora las filas modificadas ya no suman 1. Podemos rectificar eso (aunque creo que esto podría empeorar el pronóstico):
obs <- obs/matrix(rowSums(obs),nrow=nrow(obs),ncol=ncol(obs),byrow=FALSE)
Ahora transformamos los datos según la página 35 de la presentación:
zz <- log(obs[,-ncol(obs)]/obs[,ncol(obs)])
colnames(zz) <- head(colnames(obs),-1)
zz
Cargue el forecast
paquete y establezca un horizonte de 5 puntos de tiempo:
library(forecast)
horizon <- 5
Ahora modele y pronostique los datos transformados columna por columna. Aquí simplemente estoy llamando ets()
, que intentará ajustar un modelo de suavizado exponencial de espacio de estado. Resulta que utiliza un suavizado exponencial único para las tres series, pero especialmente si tiene más de 15 períodos de tiempo, puede seleccionar modelos de tendencia. O si tiene datos mensuales, explique a R que tiene una estacionalidad potencial, al usar ts()
con frequency=12
- luego ets()
verá modelos estacionales.
baz <- apply(zz,2,function(xx)forecast(ets(xx),horizon=horizon)["mean"])
forecasts.transformed <- cbind(baz[[1]]$mean,baz[[2]]$mean)
A continuación, transformamos los pronósticos según la página 38 de la presentación:
forecasts <- cbind(exp(forecasts.transformed),1)/(1+rowSums(exp(forecasts.transformed)))
Finalmente, tracemos historias y pronósticos:
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))
EDITAR: acaba de aparecer un documento sobre pronósticos de series de tiempo de composición . No lo he leído, pero puede ser de interés.