Problemas com a previsão de séries temporais

8

Eu tenho uma pergunta sobre modelagem de séries temporais em R. meus dados consistem na seguinte matriz:

1   0.03333333 0.01111111 0.9555556
2   0.03810624 0.02309469 0.9387991
3   0.00000000 0.03846154 0.9615385
4   0.03776683 0.03119869 0.9310345
5   0.06606607 0.01201201 0.9219219
6   0.03900325 0.02058505 0.9404117
7   0.03125000 0.01562500 0.9531250
8   0.00000000 0.00000000 1.0000000
9   0.04927885 0.01802885 0.9326923
10  0.06106870 0.02290076 0.9160305
11  0.03846154 0.00000000 0.9615385
12  0.00000000 0.00000000 1.0000000
13  0.06028636 0.03843256 0.9012811
14  0.09646302 0.05144695 0.8520900
15  0.04444444 0.06666667 0.8888889

essas matrizes têm no total 200 linhas.

como você pode ver em cada situação, a soma de cada linha é 1, que se torna porque os valores são a porcentagem de um todo. por exemplo, a linha 1 contém 3,33% da variável a, 1,11% da variável 2 e 95,5% da verificável 3. o primeiro número indica o ano em que os valores são medidos.

minha meta é fazer uma previsão para os próximos 5 anos, portanto, do ano 200 ao 205.

Eu posso fazer isso fazendo três previsões de séries temporais normais. Mas para essa previsão, a soma total nunca é igual a 1, o que é muito importante. Normalmente, são utilizadas técnicas como arima e suavização exponencial.

Alguém conhece um método para fazer uma previsão para esse problema?

karmabob
fonte
Você sabe se essas são proporções discretas (por exemplo, número de unidades nas categorias A, B e C, considerando o número total de unidades) ou proporções contínuas? Se eles são discretos, você sabe o número total de unidades em cada momento?
gung - Restabelece Monica
Sim, esses valores são provenientes de unidades discretas, calculei essas proporções com o uso do número total.
karmabob

Respostas:

8

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 obsde 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 forecastpacote 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))

previsões composicionais

EDIT: apareceu um artigo sobre previsão de séries temporais composicionais . Eu não li, mas pode ser do seu interesse.

Stephan Kolassa
fonte
Obrigado @stephan Kolassa, é exatamente isso que eu quero dizer. Alguém sabe se existe um pacote de ferramentas em R para fazer uma previsão com séries temporais composicionais.
karmabob
Acho que não, e esses autores não fazem parte do grupo "sempre escreva um pacote R complementar para qualquer publicação". Mas sua abordagem é bastante simples e não deve exigir mais de cinco linhas para pré-processar suas séries temporais, após o qual você pode usar as ferramentas padrão (por exemplo, ets()no forecastpacote para suavização exponencial do espaço de estado).
Stephan Kolassa
Meu conhecimento matemático não é tão bom. você pode ajudar no pré-processamento dos dados? quando os dados estiverem no formato correto, eu posso fazer o processo de previsão.
26415 karmabob
Eu estava vagando, se você encontrou algum tempo para me ajudar com o problema que tive com as séries temporais de composição?
karmabob
Aqui está. Desculpe, demorou um pouco; Na verdade, fiquei sem entender a apresentação e tive que limpar minha cabeça.
Stephan Kolassa