SAUDAÇÕES!

Seja bem vindo à página do professor Pedro Albuquerque. Para saber mais sobre meu currículo, disciplinas ministradas e interesses de pesquisa, navegue no menu disponível no topo da página.

quinta-feira, 27 de setembro de 2012

Previsão de Séries Temporais usando Holt Winters.


Usualmente, quado desejamos fazer previsão há uma série de informações sobre o mercado que deveríamos levar em conta. Por exemplo, as vendas de produtos são muitas vezes sazonais, e podemos esperar que as tendências sejam sustentadas por períodos curtos, os quais podem se alterar.

Se temos por exemplo um produto inovador bem-sucedido, as vendas aumentarão inicialmente, mas depois estabilizarão antes de decrescer devido aos concorrentes que entram no mercado. Esse tipo de informação pode ser adequadamente modelada pelo método Holt-Winters.

A nomenclatura usada aqui define a mudança no nível de um período de tempo para o período seguinte, como inclinação (slope). Os padrões sazonais também podem mudar devido aos caprichos da moda e da variação do clima.

O método de Holt-Winters foi sugerido por Holt (1957) e Winters (1960), que
trabalharam no School of Industrial Administration em Carnegie Institute
of Technology
.

O método usa médias móveis ponderadas exponencialemente para atualizar as estimativas da média ajustada sazonalmente (chamada de nível), inclinação e sazonalidade.

Considere uma série temporal $\{x_{t}\}$ com período igual a $p$. O método Holt-Winters utiliza as seguintes equações:


onde $a_{t}$, $b_{t}$ e $s_{t}$ são as estimativas para o nível, inclinação e efeito da sazonalidade no período $t$. Os parâmetros $\alpha$, $\beta$ e $\gamma$ são os parâmetros de suavização.

A previsão para valores futuros $x_{n+k}$ em $k$ períodos a frente após a $n$-ésima observação é dada da seguinte forma:


onde $a_{n}$ é o nível estimado, $b_{n}$ é a inclinação estimada e $a_{n}+kb_{n}$ é o nível estimado no tempo $n+k$ e $s_{n}+k-p$ é a estimativa do peso exponencializado para o efeito sazonal no tempo $n=k-p$. Outra forma do método Holt-Winters é com efeito sazonal multiplicativo. Nesse caso, o conjunto de equações é dado por:


A equação de previsão para o período $x_{n} + k$ torna-se:


Os parâmetros podem ser fixados no R ou então estimados de modo a minimizar o erro de previsão. Em outras palavras, quando os parâmetros não são informados, o R procura pelos valores que minimizam o erro de previsão.

Usando o método Holt-Winters no R.

Para realizar a estimação e posterior previsão pelo método Holt-Winters no R utilizamos a função HoltWinters.

Para esse exemplo, considere a base de dados das concentrações atmosféricas de CO2 expressos em partes por milhão (ppm).

O nome da base em CSV é denominada BaseCO2.csv.

O primeiro passo é ler a base de dados no R:

#Lê a base de dados
dados.df<-read.csv("http://dl.dropbox.com/u/36068691/BaseCO2.csv")

#Imprime as variáveis existentes
names(dados.df)

#Cria a série temporal
serie<-ts(dados.df$CO2,start=c(1959,1),end=c(1997,12),frequency=12)
Os dados também foram transformados no formato ts com a primeira observação referente a Janeiro de 1959 e a última em Dezembro de 1997. O argumento frequency=12 informa ao R que cada período (de um ano) é composto por 12 observações. Em outras palavras, informa ao R que a frequência da série é mensal. Em seguida utilizamos a função HoltWinters:
#Realiza o método Holt-Winters
holt <- HoltWinters(serie)

#Plota a série temporal
plot(holt)

#Plota a decomposição da serie
plot(fitted(holt))
A série temporal observada juntamente com seus valores preditos pelo modelo são representados no gráfico abaixo:
O método decompõem a série temporal. Essa decomposição é apresentada a seguir:
A previsão para o próximo ano com um intervalo de confiança de 95% é dado pelo seguinte comando:
#Realiza a previsão para 12 meses a frente
p <- predict(holt, 12, prediction.interval = TRUE, level = 0.95)
plot(holt, p)
Cujo resultado é apresentado pelo gráfico abaixo:
Caso não haja sazonalidade evidente, podemos fazer:
#Realiza o método Holt-Winters sem efeito sazonal
holt <- HoltWinters(serie, gamma = FALSE)
Para maiores detalhes do método Holt-Winters indico o texto The Holt-Winters Forecasting Procedure.

24 comentários:

  1. Brother, boa tarde!

    Tens algum material em excel, sem addon, mostrando como aplicar Holt-Winters?

    Se tiver, por favor, unixborges arroba gmail

    No aguardo!

    ResponderExcluir
  2. Olá Paulo!
    Infelizmente não... Mas porque você não tenta o R ?
    Existe uma forma de usar o R no Excel:
    http://answers.oreilly.com/topic/1009-how-to-use-r-inside-microsoft-excel/

    ResponderExcluir
  3. Boa tarde, Pedro!
    Primeiramente parabéns pelo blog, você consegue nos passar conteúdos complexos de uma forma bem simples.
    Tenho uma série composta pelo número diário de pessoas que chegam em um determinado local durante dois anos. Exemplo:
    01/01/2011 - 50
    02/01/2011 - 52
    03/01/2011 - 45
    "
    "
    "
    30/12/2012 - 72
    31/12/2012 - 75
    Gostaria de aplicar Holt-Winters da mesma forma que você aplicou acima. Porém estou com dúvida quanto a frequência, no seu caso, você utilizou a frequência=12, pois é mensal, como faço no meu caso que é diário?
    Gostaria de obter a previsão também em valores numéricos, você sabe me informar como faço isto no R? Nos artigos relacionados ao assunto, só encontro o gráfico da previsão.
    Muito obrigada
    Simone Angelo

    ResponderExcluir
  4. Olá Simone,
    Você pode usar frequência como sendo 360 ou ainda 365.
    Quanto a previsão, você pode usar a função predict para obter os valores numéricos da previsão.

    ResponderExcluir
  5. Olá Pedro, obrigada pelo auxílio, porém devido a minha pequena experiência com o R, ainda não resolvi meu problema.

    Então, meu primeiro pensamento realmente foi usar frequência igual a 365. Porém, quando realizo o método Holt-Winters obtenho o erro seguinte:

    #Realiza o método Holt-Winters
    > holt <- HoltWinters(analises)
    Erro em decompose(ts(x[1L:wind], start = start(x), frequency = f), seasonal) :
    série temporal não tem período, ou tem menos de 2

    Acredito que isto acontece, pois apesar de eu ter 730 dados, ao colocar com frequência igual a 365, fico com apenas dois anos e é necessário um mínimo de três períodos, estou correta?

    Agora em relação aos valores da previsão realmente não consegui, não sei onde, nem a forma que devo colocar a função predict. Ex: Esta da seguinte forma:

    #Realiza a previsão para 30 dias a frente
    p <- predict(holt, 30, prediction.interval = TRUE, level = 0.95)
    plot(holt, p)

    Como usaria a função predict para obter somente os valores númericos? Após a função plot? De que maneira?
    predict (holt, p)?
    somente predict ?
    predict (holt~p)

    Grata

    ResponderExcluir
  6. Olá Simone,
    Quanto a frequência você está correta é necessário ao menos 3 pontos.
    Quanto a previsão, tente: predict(holt) .

    ResponderExcluir
  7. Olá Pedro,
    Em primeiro lugar quero te agradecer pelas excelentes dicas que constam aqui sobre esse método e te parabenizar pela iniciativa de um verdadeiro pesquisador, que é de fazer ciência dessa forma aberta e clara.
    Em segundo queria tirar uma dúvida, já que sou um iniciante no R. Eu percebi que você indicou uma frequência de 12. Eu pergunto se teria como eu colocar duas frequências? Digamos que eu tenho 25 medidas por cada mês para 6 anos.

    Desde já te agradeço!!!

    ResponderExcluir
    Respostas
    1. Olá Glayson,
      Obrigado pelo feedback.
      Quanto a sua questão acho que nesse pacote isso não é possível.
      Mas procure no Google que deve haver algum pacote capaz de lidar com essa situação.
      Grande abraço

      Excluir
  8. Olá Pedro. Você ensina a modelar na forma aditiva, não é? Você poderia me informar como modelo de modo multiplicativo? Abraço.

    ResponderExcluir
  9. Olá Luiz, basta colocar a opção seasonal ="multiplicative" ....Dê uma olhada na função: http://stat.ethz.ch/R-manual/R-patched/library/stats/html/HoltWinters.html .
    Grande abraço.

    ResponderExcluir
  10. Fala Pedro,

    Show de bola seu blog... Vou aplicar na empresa, minha dúvida é a seguinte... Como determino os valores de alfa , beta e gama para aplicar as fórmulas?

    Abraço

    ResponderExcluir
  11. Boa noite Pedro, preciso criar um ewma em R, saberia por onde comecar? Li que o holtwinter deixando beta e gamma como false cria um ewma, porém como fica os limites superior e inferior?

    ResponderExcluir
    Respostas
    1. Olá Felipe,
      Você pode tentar algo como:
      fit <- HoltWinters(dados,gamma=FALSE,beta=FALSE)
      plot(forecast(fit))
      Boa sorte...

      Excluir
  12. Este comentário foi removido pelo autor.

    ResponderExcluir
  13. Olá Pedro, gostaria de saber como ficará a frequência de valores se os dados forem anuais.
    Abraços!

    ResponderExcluir
  14. Boa tarde, Pedro!
    Primeiramente parabéns pelo blog, você consegue nos passar conteúdos complexos de uma forma bem simples.
    Tenho uma série composta pelo número diário em 2 anos. Exemplo:
    28/06/2014 - 5043
    29/06/2014 - 5250
    30/06/2014 - 4532
    03/07/2014 - 5689
    "
    "
    12/12/2015 - 7230
    13/12/2015 - 7521
    Gostaria de aplicar Holt-Winters da mesma forma que você aplicou acima. Porém estou com dúvida quanto a frequência, no seu caso, você utilizou a frequência=12, pois é mensal, como faço no meu caso que é diário? E também não são todos os dias que tenho a marcação como pode ver o exemplo.
    Também gostaria de fazer a decomposição desta série e as médias móveis. Como posso proceder, já que ele aparece o erro
    Error in decompose(x) : série temporal não tem período, ou tem menos de 2

    Obrigado
    João Augusto Simões

    ResponderExcluir
  15. Boa tarde, Pedro!
    Primeiramente parabéns pelo blog, você consegue nos passar conteúdos complexos de uma forma bem simples.
    Tenho uma série composta pelo número diário em 2 anos. Exemplo:
    28/06/2014 - 5043
    29/06/2014 - 5250
    30/06/2014 - 4532
    03/07/2014 - 5689
    "
    "
    12/12/2015 - 7230
    13/12/2015 - 7521
    Gostaria de aplicar Holt-Winters da mesma forma que você aplicou acima. Porém estou com dúvida quanto a frequência, no seu caso, você utilizou a frequência=12, pois é mensal, como faço no meu caso que é diário? E também não são todos os dias que tenho a marcação como pode ver o exemplo.
    Também gostaria de fazer a decomposição desta série e as médias móveis. Como posso proceder, já que ele aparece o erro
    Error in decompose(x) : série temporal não tem período, ou tem menos de 2

    Obrigado
    João Augusto Simões

    ResponderExcluir
  16. Olá, Pedro! Parabéns pelo seu BLOG!
    Gostaria de saber qual sua sugestão quando se tem os dados estatisticos mensais, porém há necessidade de previsão futura em semanas, dias, etc(periodos diferentes e menores ou maiores de mensais)?
    Obrigado,
    Márcio.

    ResponderExcluir
  17. Bom dia, Pedro!
    Parabéns pelo seu BLOG!
    Gostaria de saber como faço para tratar previsão futura sendo a estatística passada mensal e os períodos futuros a serem previstos em semanas, dias, etc(previsão futura diferente do período da estatística passada)
    Obrigado,
    Márcio.

    ResponderExcluir
  18. Olá, Pedro! Parabéns pelo seu BLOG!
    Gostaria de saber qual sua sugestão quando se tem os dados estatisticos mensais, porém há necessidade de previsão futura em semanas, dias, etc(periodos diferentes e menores ou maiores de mensais)?
    Obrigado,
    Márcio.

    ResponderExcluir
  19. Professor, estou tentando testar o método Holt-Winters no R porem está dando um erro não sei identificar o que estou fazendo de errado

    HoltWintersModel.3 <- HoltWinters(gas$x,
    + seasonal='mult')

    > HoltWintersModel.3
    [1] "Error in decompose(ts(x[1L:wind], start = start(x), frequency = f), seasonal) : \n time series has no or less than 2 periods\n"
    attr(,"class")
    [1] "try-error"
    attr(,"condition")


    ResponderExcluir
  20. Olá, boa noite!
    Esta matéria foi muito útil para mim que estou iniciando no R. Preciso modelar uma série com previsão diária. Faço: Série<-ts(ru.df$Ref,start=c(Ano,Mês,Dia),end=c(Ano,Mês,Dia),frequency=365). Todavia não esta dando certo. Você pode me ajudar?









    ResponderExcluir
  21. Por favor, como faço para testar a versão aditiva e multiplicativa do modelo Holt-WINTERS pela MAPE, MAD MSD ? ou seja testar qual método teve melhor desempenho de previsão através das estatísticas MAPE, MAD MSD.
    Preciso dos resultados no gráfico e numéricos de MAPE, MAD MSD.

    ResponderExcluir