Você está tentando prever uma série temporal composicional . Ou seja, você tem três componentes que são todos restritos a ficar entre 0 e 1 e adicionar até 1.
Você pode solucionar esse problema usando a suavização exponencial padrão, usando uma transformação logística generalizada apropriada. Houve uma apresentação disso por Koehler, Snyder, Ord & Beaumont no Simpósio Internacional de Previsão de 2010 , que se transformou em um artigo ( Snyder et al., 2017, International Journal of Forecasting ).
Vamos andar com isso com seus dados. Leia os dados em uma matriz obs
de séries temporais:
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"
))
Você pode verificar se isso funcionou digitando
obs
Agora, você tem alguns zeros, o que será um problema quando você usar os logaritmos. Uma solução simples é definir tudo que é menor que um pequeno para esse :ϵϵ
epsilon <- 0.0001
obs[obs<epsilon] <- epsilon
Agora as linhas modificadas não somam mais 1. Podemos corrigir isso (embora eu ache que isso pode piorar a previsão):
obs <- obs/matrix(rowSums(obs),nrow=nrow(obs),ncol=ncol(obs),byrow=FALSE)
Agora, transformamos os dados conforme a página 35 da apresentação:
zz <- log(obs[,-ncol(obs)]/obs[,ncol(obs)])
colnames(zz) <- head(colnames(obs),-1)
zz
Carregue o forecast
pacote e defina um horizonte de 5 pontos no tempo:
library(forecast)
horizon <- 5
Agora modele e preveja os dados transformados coluna por coluna. Aqui estou simplesmente chamando ets()
, que tentará ajustar um modelo de suavização exponencial de espaço de estado. Acontece que ele usa suavização exponencial única para todas as três séries, mas especialmente se você tiver mais de 15 períodos, ele poderá selecionar modelos de tendência. Ou, se você tiver dados mensais, explique a R que você tem uma sazonalidade potencial, usando ts()
com frequency=12
- e ets()
analisará os modelos sazonais.
baz <- apply(zz,2,function(xx)forecast(ets(xx),horizon=horizon)["mean"])
forecasts.transformed <- cbind(baz[[1]]$mean,baz[[2]]$mean)
Em seguida, retrocedemos as previsões conforme a página 38 da apresentação:
forecasts <- cbind(exp(forecasts.transformed),1)/(1+rowSums(exp(forecasts.transformed)))
Por fim, vamos traçar históricos e previsões:
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: apareceu um artigo sobre previsão de séries temporais composicionais . Eu não li, mas pode ser do seu interesse.