Usted está tratando de previsión de una composición de series de tiempo. Es decir, usted tiene tres componentes que son todos restringido a estar entre 0 y 1 y añadir hasta 1.
Puede solucionar este problema utilizando el estándar de suavizado exponencial, mediante una adecuada generalizada transformación logística. Hubo una presentación sobre este por Koehler, Snyder, Ord & Beaumont en el 2010 Simposio Internacional sobre la Previsión. Yo no soy consciente de que un artículo de revista u otra publicación de haber salido de esto, pero siempre de correo de los autores y preguntar si la presentación no es suficiente.
Vamos a caminar a pesar de que este con sus datos. La lectura de los datos en una matriz obs
de tiempo de la serie:
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"
))
Usted puede comprobar si esta trabajado escribiendo
obs
Ahora, usted tiene un par de ceros en hay, que será un problema una vez que usted toma logaritmos. Una solución simple es el conjunto de todo lo que es menos que un pequeño $\epsilon$ a $\epsilon$:
epsilon <- 0.0001
obs[obs<epsilon] <- epsilon
Ahora las filas modificadas no sumar 1 más. Podemos rectificar (aunque creo que esto podría hacer que el pronóstico es peor):
obs <- obs/matrix(rowSums(obs),nrow=nrow(obs),ncol=ncol(obs),byrow=FALSE)
Ahora transformar los datos como por la página 35 de la presentación:
zz <- log(obs[,-ncol(obs)]/obs[,ncol(obs)])
colnames(zz) <- head(colnames(obs),-1)
zz
La carga de la forecast
paquete y establecer un horizonte de 5 puntos en el tiempo:
library(forecast)
horizon <- 5
Ahora modelo y pronóstico de la transformación de los datos de la columna por columna. Aquí estoy simplemente llamando ets()
, que intentará encajar un estado del espacio de modelo de suavizado exponencial. Resulta que se utiliza una sola de suavizado exponencial para las tres series, pero especialmente si usted tiene más de 15 períodos de tiempo, puede seleccionar tendencia de los modelos. O si usted tiene un plan de datos mensual, explicar a R que tiene un potencial de estacionalidad, mediante el uso de ts()
con frequency=12
- a continuación, ets()
se verá en los 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 nos backtransform los pronósticos, como por la página 38 de la presentación:
forecasts <- cbind(exp(forecasts.transformed),1)/(1+rowSums(exp(forecasts.transformed)))
Por último, vamos a la trama de la historia y las previsiones:
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: un papel en la composición de las series de tiempo de previsión acaba de aparecer. Yo no lo he leído, pero puede ser de interés.