Tag

ar Archives - Análise Macro

{tidyverts}: séries temporais no R

By | Data Science

{tidyverts} é uma família de pacotes de R criada para ser a próxima geração de ferramentas para modelagem e previsão de séries temporais, substituindo o famoso pacote {forecast}.

Utilizando uma interface simples e integrada com os pacotes do tidyverse, é possível construir uma ampla gama de modelos de previsão univariados e multivariados: ARIMA, VAR, suavização exponencial via espaço de estado (ETS), modelo linear (TSLM), autorregressivo (AR), passeio aleatório (RW), autoregressão de rede neural (NNETAR), Prophet, etc.

Neste exercício, daremos uma breve introdução aplicada a modelagem e previsão de séries temporais usando os pacotes do {tidyverts}.

Conhecendo os pacotes

Um breve resumo do que a família de pacotes do {tidyverts} tem a oferecer:

fable

  • Coleção de modelos univariados e multivariados de previsão
  • Modelagem de séries temporais em formato "tidy"
  • Especificação de modelos utiliza terminologia de fórmula (y ~ x)

fabletools

  • Extensões e ferramentas para construção de modelos
  • Combinação de modelos, previsão hierárquica e extração de resultados
  • Obtenção de medidas de acurácia e visualização de dados

feasts

  • Decomposição de séries temporais
  • Extração e visualização de componentes de séries temporais
  • Análise de autocorrelação, testes de raiz unitária, etc.

tsibble

  • Estrutura de dados tidy para séries temporais no R
  • Funções para tratamento de dados
  • Objeto orientado aos dados e a modelos, integrado ao tidyverse

Fluxo de trabalho para previsão

Com o tidyverts o processo de construir um modelo de previsão pode ser dividido em poucos passos:

Com esse esquema em mente, vamos ilustrar esse processo com um exercício prático e didático: construir um modelo de previsão para a taxa de crescimento do PIB brasileiro.

Pacotes

Para reproduzir o exercício a seguir você precisará dos seguintes pacotes:

Dados tidy

Utilizaremos o dataset global_economy armazenado como um objeto tsibble, trazendo variáveis econômicas em frequência anual para diversos países. Nosso interesse é a série da taxa de crescimento do PIB brasileiro:

Visualização de dados

Visualização é uma etapa essencial para entender os dados, o que permite identificar padrões e modelos apropriados. No nosso exemplo, criamos um gráfico de linha para plotar a série do PIB brasileiro usando a função autoplot():

Podemos também plotar os correlogramas ACF e PACF para identificar o processo estocástico da série, obtendo alguns modelos candidatos:

Especificação do modelo

Existem muitos modelos de séries temporais diferentes que podem ser usados para previsão, e especificar um modelo apropriado para os dados é essencial para produzir previsões.

Os modelos no framework do fable são especificados usando funções com nomenclatura abreviada do nome do modelo (por exemplo, ARIMA(), AR(), VAR(), etc.), cada uma usando uma interface de fórmula (y ~ x). As variáveis de resposta são especificadas à esquerda da fórmula e a estrutura do modelo é escrita à direita.

Por exemplo, um modelo ARIMA(1,0,2) para a taxa de crescimento do PIB pode ser especificado com: ARIMA(Growth ~ pdq(1, 0, 2)).

Neste caso, a variável resposta é Growth e está sendo modelada usando a estrutura de um modelo ARMA(1, 2) especificada na função especial pdq().

Existem diversas funções especiais para definir a estrutura do modelo e em ambos os lados da fórmula pode ser aplicado transformações. Consulte detalhes da documentação do fable.

Estimar o modelo

Identificado um modelo (ou mais) apropriado, podemos em seguida fazer a estimação usando a função model()1.Neste exemplo, estimaremos os seguintes modelos: ARIMA(1,0,2), ARIMA(1,0,0), ARIMA(0,0,2), o algoritmo de seleção automatizada do auto ARIMA criado pelo prof. Rob Hyndman e um passeio aleatório.

Diagnóstico do modelo

O objeto resultante é uma "tabela de modelo" ou mable, com a saída de cada modelo em cada coluna:

Para obter os critérios de informação use a função glance():

Os critérios de informação indicam que, dos modelos estimados, o modelo automatizado ARIMA(1,1,1) apresentou o menor valor de AICc - seguido pelos demais identificados pelos correlogramas ACF e PACF. Com a função gg_tsresiduals() podemos verificar o comportamento dos resíduos deste modelo, indicando que os resíduos se comportam como ruído branco:

Um teste de autocorrelação (Ljung Box) retorna um p-valor grande, também indicando que os resíduos são ruído branco:

Também pode ser interessante visualizar o ajuste do modelo. Utilize a função augment() para obter os valores estimados:

Previsão

Com o modelo escolhido, previsões podem ser geradas com a função forecast() indicando um horizonte de escolha.

Perceba que os pontos de previsão médios gerados são bastante similares a um processo de passeio aleatório (equivalente a um ARIMA(0,1,0)). O trabalho adicional de especificar termos AR e MA trouxe pouca diferença para os pontos de previsão neste exemplo, apesar de ser perceptível que os intervalos de confiança do modelo auto ARIMA são mais estreitos do que de um passeio aleatório.

Além disso, a previsão fora da amostra gerada ficou bastante aquém dos dados reais para a taxa de crescimento do PIB brasileiro observados no horizonte em questão, configurando apenas um exercício didático.

Saiba mais

Estes são apenas alguns dos recursos e ferramentas disponíveis na família de pacotes do tidyverts. Para uma referência aprofundada, confira o livro Forecasting: Principles and Practice, 3rd Edition, de Hyndman e Athanasopoulos (2021).

Aprenda com maior profundidade sobre sobre os temas abordados nos cursos de Séries Temporais e de Previsão Macro. Faça parte do Clube AM para acesso completo aos códigos de R e Python deste e de outros exercícios.

Confira outros exercícios aplicados com pacotes do tidyverts:

 


[1] A função suporta estimação dos modelos com computação paralela usando o pacote future, veja detalhes na documentação e este post para saber mais sobre o tema.

 

 

Modelos ARIMA na abordagem bayesiana

By | Data Science

A boa e velha econometria nos proporciona métodos que são ótimos para relacionar variáveis e construir previsões, sendo quase sempre o primeiro ponto de partida para praticantes, além de ser a base de grande parte dos modelos "famosos" da atualidade. Como exemplo, em problemas de previsão de séries temporais a família de modelos ARIMA, popularizada por Box e Jenkins (1970), costuma ser a primeira opção que vem à mente.

Uma das suposições destes modelos é a de que os erros — ou seja, a diferença entre o que é observado e o que é estimado — seguem uma distribuição normal, o que no mundo real nem sempre é factível com os dados que temos em mãos. E então, o que fazer nessa situação? Devemos descartar os modelos ARIMA e usar outra classe de modelos? Ou devemos descartar os dados, pois, claramente, "eles não se encaixam no modelo"?

Bom, nada disso! Em primeiro lugar, eu afirmaria que os modelos ARIMA ainda podem ser úteis. Em segundo lugar, neste exercício apresentarei uma visão diferente no que se refere ao método de estimação do modelo, trazendo uma breve introdução à abordagem bayesiana. Por fim, exemplificarei com um modelo ARIMA simples as diferenças entre previsões geradas pelas duas visões, isto é, a frequentista versus a bayesiana.

O foco aqui é ser objetivo, apresentando brevemente os conceitos básicos, as vantagens e diferenças entre as abordagens, em uma tentativa bem humilde de fechar o gap entre as duas visões em termos introdutórios. Para mais detalhes e aprofundamento nos tópicos confira os cursos de Séries Temporais e Estatística Bayesiana.

ARIMA

Para não complicar, vamos considerar um modelo autoregressivo (AR) simples neste exercício. Como este modelo se parece?

yt = c + ϕ1yt-1 + ϕ2 yt-2 + + ϕpyt-p + εt

onde:

c → uma constante;

ϕ1, ⋯, ϕp → parâmetros desconhecidos do modelo;

εt → termo de erro que segue uma distribuição normal, εt N(μ, σ2).

O modelo é autoregressivo pois, como pode ser observado, se trata de uma regressão da variável contra ela mesma (defasagens). Esse modelo é comumente denominado com o acrônimo AR(p), onde p é a ordem de defasagens da variável de interesse yt e é um caso especial de um modelo ARIMA(p, 0, 0)1.

Ok, mas visualmente, como um processo AR(p) se parece?

Podemos visualizar uma série temporal que segue um processo, por exemplo, de AR(1) com uma simulação simples (estou usando o R para isso), conforme abaixo:

Estimador MQO

Você deve ter notado que valores para a constante e para o primeiro parâmetro do AR(1)e ϕ1 , "caíram do céu". Na vida real, fora da simulação, devemos estimar esses valores, eles são desconhecidos. Portanto, como os parâmetros do modelo são estimados?

Existem algumas maneiras de estimar os parâmetros do modelo, o padrão comum é através do estimador de mínimos quadrados ordinários (MQO), onde o objetivo é encontrar valores ótimos para os parâmetros e ϕp do modelo minimizando a soma dos quadrados dos resíduos, sob diversas premissas. Ao usar essa abordagem, os parâmetros do modelo autoregressivo são fixos: cada observação t da série temporal y é associada com um mesmo valor estimado do parâmetro ϕp.

Isso é factível? E se você acredita que o valor ϕp não deveria ser fixo? Como poderíamos incorporar essa crença ao modelo? É aqui que entra a abordagem bayesiana! Mas antes, vamos dar uma olhada em dados reais para tentar entender a importância e uma motivação adjacente do assunto.

Exemplo: IPCA

Como exemplo, abaixo apresento visualizações gráficas da série do IPCA sazonalmente ajustado, uma medida de inflação divulgada pelo IBGE, expresso em variação % ao mês.

Note que pela distribuição dos dados o IPCA apresenta uma média de aproximadamente 0,5% com uma cauda pesada à direita. Isso é característico do que chamam de outliers ou valores extremos e pode ser um problema em métodos econométricos. Além disso, a série apresenta uma autocorrelação significativa na primeira defasagem, o que pode ser um sinal para modelagem ARIMA, se supormos que tal classe de modelos univariados é suficiente em explicar a inflação.

Dada essa simples inspeção visual dos dados o que frequentistas e bayesianos poderiam tirar de conclusão? Um frequentista diria, dentre outras coisas, que a variância da série é a mesma para qualquer janela amostral, enquanto que um bayesiano diria que a variância pode variar.

Nessa mesma linha, um frequentista poderia estimar um modelo autoregressivo por MQO para explicar a inflação, mas ao fazê-lo estaria encontrando um valor fixo associado a defasagens da inflação, o que é equivalente a dizer que a maldita inércia inflacionária — um fenômeno econômico — não se alterou em todos esses mais de 20 anos de Plano Real. Isso é plausível? Certamente não é uma pergunta trivial de ser respondida, mas exercícios prévios do colega Vitor Wilher sugerem que a inércia inflacionária vem mudando recentemente.

Ou seja, são nesses pontos, para citar apenas alguns, que as abordagens divergem. Em outras palavras, frequentistas e bayesianos fazem diferentes suposições sobre os dados e sobre os parâmetros de um modelo em questão.

Portanto, voltando à questão, como a modelagem bayesiana incorpora sua visão sobre os parâmetros ao modelo?

A abordagem bayesiana

Na abordagem bayesiana, ao invés de tentarmos encontrar um valor ótimo para os parâmetros do modelo, nesse caso um AR(p), começaríamos por assumir um distribuição de probabilidade a priori para os mesmos e, então, usaríamos o teorema de Bayes. Ou seja, em nosso exemplo o que muda é que você assume uma distribuição a priori para os valores desconhecidos de c, ϕ1,,ϕp, σ2, antes mesmo dos dados serem observados.

Mas de onde essa distribuição a priori vem? Bom, há muito o que se discutir sobre esse ponto, mas em resumo:

  • Estudos prévios ou trabalhos publicados;
  • Intuição do analista/pesquisador;
  • Conhecimento da área/expertise;
  • Conveniência;
  • Métodos não paramétricos e outras fontes de dados.

Você pode pensar nessa distribuição a priori como uma crença/conhecimento prévio ou, no caso de você possuir estimativas prévias dos parâmetros do modelo, essas estimativas prévias se tornam a distribuição a priori.

Voltando ao exemplo do IPCA, supondo que queiramos estimar um modelo AR(1), yt = c + ϕ1yt-1 + εt, como definiríamos distribuições a priori para os parâmetros? Vamos começar admitindo que não sabemos muito sobre os parâmetros, apenas sabemos que para um AR(1) ser estacionário o parâmetro ϕ1 precisar ser menor do que 1 em módulo2, então vamos assumir distribuições genéricas:

Como é um primeiro modelo, vamos ser bem vagos sobre as escolhas. Partindo de um entendimento básico sobre o modelo, sabemos que o parâmetro  para caracterizar um processo estacionário e que a variância dos erros deve ser positiva. Dessa forma utilizaremos, respectivamente, a distribuição uniforme e a gamma inversa e, quando não, a normal, assumindo os valores abaixo:

Essas são as nossas priors, como é referido no jargão bayesiano. Visualmente, como essas distribuições se parecem? Vamos plotar um gráfico (novamente, estou usando o R aqui):

A interpretação destas distribuições a priori é de que não estamos informando em nosso modelo AR(1) bayesiano sobre quais poderiam ser os valores dos parâmetros. A estimativa final, pelo teorema de Bayes, dependerá dos dados observados e das priors assumidas. Vamos definir isso brevemente:

O que essa equação nos diz, em termos simples? A priori é a probabilidade de algo acontecer antes de incluirmos a probabilidade dos dados (verossimilhança), e a posteriori é a probabilidade após a incorporação dos dados. Ou seja, o teorema de Bayes nos fornece um método para atualizar nossa crença sobre parâmetros desconhecidos para cada informação nova (observações), condicionando a probabilidade aos dados observados.

Para estimar um modelo AR(p) na abordagem bayesiana será utilizado, geralmente, um método chamado Monte Carlo Markov Chain (MCMC). Apesar do nome apavorante, é um procedimento relativamente simples. O objetivo é "caminhar" aleatoriamente por um espaço de parâmetros para encontrar as estimativas e, assim, desenhar uma estimativa da posteriori, a nossa distribuição de principal interesse.

Comparação

Agora vamos comparar as estimativas de um modelo AR(1) para o IPCA geradas pela visão frequentista vs. bayesiana3. Indo direto ao ponto, abaixo plotamos os resultados:

Aqui eu omito a distribuição a posteriori, que representaria a incerteza da estimativa bayesiana, exibindo apenas a a estimativa média dessa distribuição.

Note que as estimativas pontuais dentro da amostra são praticamente idênticas (eu separei em dois gráficos para melhor visualizar cada linha), refletindo semelhanças nos parâmetros estimados da abordagem bayesiana e da frequentista. O valor estimado para a constante é aproximadamente 0,20 e 0,19, respectivamente, enquanto que o é 0,6 e 0,6. Por quê? A razão é decorrente do fato que a estimativa pontual do método frequentista, por MQO, é, em verdade, a mesma coisa que maximizar a probabilidade a posteriori de uma regressão linear bayesiana, que no caso representa a moda da distribuição.

Ok, mas comparamos somente estimativas pontuais um passo a frente dentro da amostra. O que acontece se compararmos ambas as abordagens em termos de previsão fora da amostra? No gráfico acima as últimas 12 observações do IPCA foram omitidas dos modelos, justamente para ter um período pseudo fora da amostra que nos permita gerar previsões e compará-las com os dados observados, podendo dessa forma avaliar a performance preditiva de cada modelo para dados que os mesmos ainda não conhecem.

Gerando previsões pseudo fora da amostra 12 períodos (meses) a frente, temos os seguintes resultados:

Comentários

Apesar de ambas as previsões serem visivelmente ruins — acredito eu que não devido ao método de estimação em si, mas sim por conta da especificação/modelo simples para os dados e pela janela amostral (choques) "desfavorável" —, podemos notar uma grande diferença nas previsões pontuais e nos intervalos. A abordagem frequentista simplesmente previu o retorno a média da série (o que nesse caso é menos pior), enquanto que a abordagem bayesiana previu uma deflação (o que não é a realidade brasileira no momento).

Pela simplicidade da especificação do modelo AR em questão não podemos esperar bons resultados, por qualquer método de estimação considerado, e uma comparação mais exigente e justa implementaria a técnica de validação cruzada, o que eu não fiz neste exercício. Além disso, questões adjacentes como a inspeção dos resíduos e dos parâmetros são importantes para diagnosticar o modelo, as quais também deixamos de lado aqui.

Em suma, estimamos um modelo AR(1) para o IPCA por dois métodos diferentes que fundamentalmente fazem a mesma coisa: eles usam a defasagem da inflação para explicá-la. A primeira abordagem foi um modelo autoregressivo clássico, usando o método dos mínimos quadrados ordinários (MQO). O segundo foi um mesmo modelo autoregressivo, mas com estimação bayesiana, explorando a ideia de usar distribuições a priori para obter estimativas pontuais de distribuições a posteriori. Apesar disso, os resultados não foram satisfatórios. Ou seja, há trabalho ainda a se fazer, além de outros modelos a se testar.

Se o assunto te interessou e se você quiser saber mais sobre os temas abordados, dê uma olhada nos cursos de Séries Temporais e Estatística Bayesiana. Para ter acesso aos códigos deste exercício faça parte do Clube AM.

 


1,2 Veja mais em Hyndman e Athanasopoulos (2021).

3 Aqui eu relaxei a restrição de distribuição uniforme para o parâmetro  por recomendação dos desenvolvedores do pacote utilizado e por falha de inicialização da estimação. A priori desse parâmetro passou então para .

 

Referências

Box, G. E. P., & Jenkins, G. M. (1970). Time series analysis: Forecasting and control. Holden-Day.

Durbin, J., & Koopman, S. J. (2012). Time series analysis by state space methods (Vol. 38). OUP Oxford.

Hyndman, R.J., & Athanasopoulos, G. (2021) Forecasting: principles and practice, 3rd edition, OTexts: Melbourne, Australia. OTexts.com/fpp3. Accessed on 2022-07-20.

Previsão da inflação (EUA) com fatores textuais do FOMC

By | Data Science

Reflexo da era da informação, atualmente não se faz mais política monetária sem uma boa dose de comunicados, atas, entrevistas, conferências, etc. Os chamados central bankers atuam, sobretudo, como comunicadores e qualquer pequena nuance em sua comunicação (futuros passos da política monetária) pode ser um sinal para alvoroço nos "mercados".

Nesse sentido, uma área da literatura econômica que vem prosperando busca investigar o chamado canal informacional (de transmissão) da política monetária, propiciando uma intersecção entre métodos econométricos e de machine learning. Como exemplo, Lucca e Trebbi (2009) exploram a relação entre mudanças nos comunicados (statements) do Federal Open Market Committee (FOMC) com variáveis macroeconômicas, como taxas de juros, mostrando que há poder preditivo no conteúdo informacional dos comunicados. De forma similar, Ferreira (2022) expande um modelo VAR usando fatores textuais extraídos dos comunicados do FOMC, mostrando que a técnica (denominada VAR-teXt) é útil para finalidade de previsão.

Mais informalmente, neste espaço da Análise Macro já exploramos a extração de sentimentos e de tópicos latentes dos comunicados do Banco Central do Brasil (BCB). De forma a avançar mais nessa área, no exercício de hoje exploramos, de forma similar a Ferreira (2022), a utilidade de tópicos latentes extraídos dos comunicados do FOMC, por um modelo LDA, na previsão da inflação norte-americana, medida pelo CPI. O objetivo é comparar um modelo econométrico simples, tal como um AR-GAP de Faust e Wright (2013), em especificações com e sem os fatores textuais.

Uma visão geral

O exercício de previsão em questão consiste em extrair os dados de interesse das devidas fontes (FRED-MD e FOMC/FED), realizar o pré processamento e extração de fatores textuais e, por fim, treinar duas especificações de modelos simples para o CPI: AR e AR-teXt (i.e., um modelo autoregressivo com fatores textuais como variáveis exógenas). O diagrama abaixo ilustra os principais procedimentos:

Recomenda-se a leitura prévia dos textos a seguir, assim como referências correspondentes, para uma boa compreensão do exercício proposto:

Dados e especificação

Os modelos são estimados em frequência trimestral, onde a variável de interesse, o CPI, é medido como a variação percentual em relação ao trimestre imediatamente anterior.

As fontes de dados são:

  • CPI (variável endógena) é proveniente do banco de dados FRED-MD (código CPIAUCSL), veja McCracken e NG (2016);
  • Tópicos textuais (variáveis exógenas) são extraídos através do modelo LDA, tendo como origem os statements do FOMC/FED.

As especificações dos modelos são:

Partindo da construção de uma medida de tendência, τt, do CPI, πt, definimos o "gap" da inflação como gt = πt − τt e consideramos essa medida nos modelos abaixo, tal como em Faust e Wright (2013).

  • AR(p): gt = α1 gt-1 + … + αpgt-p + ϵt
  • AR-teXt(p,s): gt = α1 gt-1 + … + αpgt-p + βsxt-s + ϵt

onde αi e βi são coeficientes dos modelos, xt são as variáveis exógenas e ϵt é o erro do modelo.

Em nosso exercício geramos previsão 10 trimestres à frente (pseudo fora da amostra) e, então, adicionamos de volta a tendência, τt, para obter a previsão "final". A amostra utilizada é de 1998 até a observação mais recente do ano atual, 2022.

Visualização de dados

Abaixo plotamos um gráfico de linha da série de interesse, o CPI dos Estados Unidos em variação percentual trimestral:

E na imagem a seguir trazemos a estrutura textual de apenas um dos statements do FOMC/FED que foram extraídos (web scraping) de forma online para construção dos fatores textuais.

Vale pontuar que a estrutura textual dos comunicados pode variar consideravelmente no tempo.

Resultados

Os procedimentos brevemente descritos acima foram implementados através da linguagem R usando, para estimação, o pacote {fable} (veja um tutorial aqui)). Os modelos foram treinados usando validação cruzada, considerando uma janela amostral crescente, partindo de 60 observações iniciais e adicionando 1 observação a cada iteração. O cálculo de métricas de acurácia foi realizado por horizonte preditivo (1, 2, ..., 10 trimestres).

A seguir resumimos os resultados de acurácia em um gráfico que mostra o RMSE por horizonte de previsão dos dois modelos considerados:

Comentários

  • Modelo com fatores textuais parece performar melhor no curto prazo em relação ao benchmark (AR);
  • Os resultados apresentados estão em linha com o encontrado por Ferreira et al. (2020), que considera uma abordagem vetorial com diferente método de estimação (e aqui não aplicamos testes estatísticos para comparar previsões);
  • Pontua-se que a performance do modelo proposto, AR-teXt, pode ser consideravelmente sensível a escolha do número de tópicos definidos, assim como ao tratamento dos dados textuais;
  • O modelo de tópicos LDA é intensivo computacionalmente.

Códigos de R para replicação estão disponíveis para membros do Clube AM da Análise Macro.

Referências

Faust, J., & Wright, J. H. (2013). Forecasting inflation. In Handbook of economic forecasting (Vol. 2, pp. 2-56). Elsevier.

Ferreira, L. N. (2022). Forecasting with VAR-teXt and DFM-teXt Models: exploring the predictive power of central bank communication. BCB Working Paper Serie No. 559.

Lucca, D. O., & Trebbi, F. (2009). Measuring central bank communication: an automated approach with application to FOMC statements. National Bureau of Economic Research (No. w15367).

McCracken, M. W., & Ng, S. (2016). FRED-MD: A monthly database for macroeconomic research. Journal of Business & Economic Statistics, 34(4), 574-589.

{tidyverts}: séries temporais no R

By | Data Science

{tidyverts} é uma família de pacotes de R criada para ser a próxima geração de ferramentas para modelagem e previsão de séries temporais, substituindo o famoso pacote {forecast}.

Utilizando uma interface simples e integrada com os pacotes do tidyverse, é possível construir uma ampla gama de modelos de previsão univariados e multivariados: ARIMA, VAR, suavização exponencial via espaço de estado (ETS), modelo linear (TSLM), autorregressivo (AR), passeio aleatório (RW), autoregressão de rede neural (NNETAR), Prophet, etc.

Neste exercício, daremos uma breve introdução aplicada a modelagem e previsão de séries temporais usando os pacotes do {tidyverts}.

Conhecendo os pacotes

Um breve resumo do que a família de pacotes do {tidyverts} tem a oferecer:

fable

  • Coleção de modelos univariados e multivariados de previsão
  • Modelagem de séries temporais em formato "tidy"
  • Especificação de modelos utiliza terminologia de fórmula (y ~ x)

fabletools

  • Extensões e ferramentas para construção de modelos
  • Combinação de modelos, previsão hierárquica e extração de resultados
  • Obtenção de medidas de acurácia e visualização de dados

feasts

  • Decomposição de séries temporais
  • Extração e visualização de componentes de séries temporais
  • Análise de autocorrelação, testes de raiz unitária, etc.

tsibble

  • Estrutura de dados tidy para séries temporais no R
  • Funções para tratamento de dados
  • Objeto orientado aos dados e a modelos, integrado ao tidyverse

Fluxo de trabalho para previsão

Com o tidyverts o processo de construir um modelo de previsão pode ser dividido em poucos passos:

Com esse esquema em mente, vamos ilustrar esse processo com um exercício prático e didático: construir um modelo de previsão para a taxa de crescimento do PIB brasileiro.

Pacotes

Para reproduzir o exercício a seguir você precisará dos seguintes pacotes:

library(fable) # CRAN v0.3.1
library(fabletools) # CRAN v0.3.2
library(tsibble) # CRAN v1.1.1
library(tsibbledata) # CRAN v0.4.0
library(feasts) # CRAN v0.2.2
library(dplyr) # CRAN v1.0.7
library(tidyr) # CRAN v1.2.0
library(ggplot2) # CRAN v3.3.5

 

Dados tidy

Utilizaremos o dataset global_economy armazenado como um objeto tsibble, trazendo variáveis econômicas em frequência anual para diversos países. Nosso interesse é a série da taxa de crescimento do PIB brasileiro:

pib_br <- tsibbledata::global_economy %>% 
dplyr::filter(Country == "Brazil") %>% 
dplyr::select(Year, Growth) %>% 
tidyr::drop_na()
pib_br

# # A tsibble: 57 x 2 [1Y]
# Year Growth
# <dbl> <dbl>
# 1 1961 10.3 
# 2 1962 5.22 
# 3 1963 0.875
# 4 1964 3.49 
# 5 1965 3.05 
# 6 1966 4.15 
# 7 1967 4.92 
# 8 1968 11.4 
# 9 1969 9.74 
# 10 1970 8.77 
# # ... with 47 more rows

Visualização de dados

Visualização é uma etapa essencial para entender os dados, o que permite identificar padrões e modelos apropriados. No nosso exemplo, criamos um gráfico de linha para plotar a série do PIB brasileiro usando a função autoplot():

pib_br %>% 
fabletools::autoplot(Growth) +
ggplot2::labs(title = "Crescimento anual do PIB do Brasil", y = "%")

Podemos também plotar os correlogramas ACF e PACF para identificar o processo estocástico da série, obtendo alguns modelos candidatos:

pib_br %>% 
feasts::gg_tsdisplay(Growth, plot_type = "partial")

Especificação do modelo

Existem muitos modelos de séries temporais diferentes que podem ser usados para previsão, e especificar um modelo apropriado para os dados é essencial para produzir previsões.

Os modelos no framework do fable são especificados usando funções com nomenclatura abreviada do nome do modelo (por exemplo, ARIMA(), AR(), VAR(), etc.), cada uma usando uma interface de fórmula (y ~ x). As variáveis de resposta são especificadas à esquerda da fórmula e a estrutura do modelo é escrita à direita.

Por exemplo, um modelo ARIMA(1,0,2) para a taxa de crescimento do PIB pode ser especificado com: ARIMA(Growth ~ pdq(1, 0, 2)).

Neste caso, a variável resposta é Growth e está sendo modelada usando a estrutura de um modelo ARMA(1, 2) especificada na função especial pdq().

Existem diversas funções especiais para definir a estrutura do modelo e em ambos os lados da fórmula pode ser aplicado transformações. Consulte detalhes da documentação do fable.

Estimar o modelo

Identificado um modelo (ou mais) apropriado, podemos em seguida fazer a estimação usando a função model()1.Neste exemplo, estimaremos os seguintes modelos: ARIMA(1,0,2), ARIMA(1,0,0), ARIMA(0,0,2), o algoritmo de seleção automatizada do auto ARIMA criado pelo prof. Rob Hyndman e um passeio aleatório.


fit <- pib_br %>%
fabletools::model(
arima102 = fable::ARIMA(Growth ~ pdq(1, 0, 2)),
arima100 = fable::ARIMA(Growth ~ pdq(1, 0, 0)),
arima002 = fable::ARIMA(Growth ~ pdq(0, 0, 2)),
auto_arima = fable::ARIMA(Growth),
random_walk = fable::RW(Growth)
)

Diagnóstico do modelo

O objeto resultante é uma "tabela de modelo" ou mable, com a saída de cada modelo em cada coluna:


fit

# # A mable: 1 x 5
# arima102 arima100 arima002
# <model> <model> <model>
# 1 <ARIMA(1,0,2) w/ mean> <ARIMA(1,0,0) w/ mean> <ARIMA(0,0,2) w/ mean>
# # ... with 2 more variables: auto_arima <model>, random_walk <model>

Para obter os critérios de informação use a função glance():


fabletools::glance(fit) %>% dplyr::arrange(AICc)

# # A tibble: 5 x 8
# .model sigma2 log_lik AIC AICc BIC ar_roots ma_roots
# <chr> <dbl> <dbl> <dbl> <dbl> <dbl> <list> <list>
# 1 auto_arima 12.8 -150. 307. 307. 313. <cpl [1]> <cpl [1]>
# 2 arima100 12.6 -152. 311. 311. 317. <cpl [1]> <cpl [0]>
# 3 arima102 12.8 -152. 313. 314. 323. <cpl [1]> <cpl [2]>
# 4 arima002 13.1 -153. 314. 315. 322. <cpl [0]> <cpl [2]>
# 5 random_walk 16.0 NA NA NA NA <NULL> <NULL>

Os critérios de informação indicam que, dos modelos estimados, o modelo automatizado ARIMA(1,1,1) apresentou o menor valor de AICc - seguido pelos demais identificados pelos correlogramas ACF e PACF. Com a função gg_tsresiduals() podemos verificar o comportamento dos resíduos deste modelo, indicando que os resíduos se comportam como ruído branco:


fit %>%
dplyr::select(auto_arima) %>%
feasts::gg_tsresiduals()

Um teste de autocorrelação (Ljung Box) retorna um p-valor grande, também indicando que os resíduos são ruído branco:


fabletools::augment(fit) %>%
dplyr::filter(.model == "auto_arima") %>%
fabletools::features(.innov, feasts::ljung_box, lag = 10, dof = 3)

# # A tibble: 1 x 3
# .model lb_stat lb_pvalue
# <chr> <dbl> <dbl>
# 1 auto_arima 8.63 0.281

Também pode ser interessante visualizar o ajuste do modelo. Utilize a função augment() para obter os valores estimados:


fit %>%
fabletools::augment() %>%
dplyr::filter(.model == "auto_arima") %>%
ggplot2::ggplot(ggplot2::aes(x = Year)) +
ggplot2::geom_line(ggplot2::aes(y = Growth, colour = "Observado")) +
ggplot2::geom_line(ggplot2::aes(y = .fitted, colour = "Modelo")) +
ggplot2::scale_colour_manual(
values = c(Observado = "#282f6b", Modelo = "#b22200")
) +
ggplot2::labs(title = "Crescimento anual do PIB do Brasil", colour = NULL)

Previsão

Com o modelo escolhido, previsões podem ser geradas com a função forecast() indicando um horizonte de escolha.


fit %>%
dplyr::select(auto_arima, random_walk) %>%
fabletools::forecast(h = 5) %>%
fabletools::autoplot(pib_br) +
ggplot2::facet_wrap(~.model)

Perceba que os pontos de previsão médios gerados são bastante similares a um processo de passeio aleatório (equivalente a um ARIMA(0,1,0)). O trabalho adicional de especificar termos AR e MA trouxe pouca diferença para os pontos de previsão neste exemplo, apesar de ser perceptível que os intervalos de confiança do modelo auto ARIMA são mais estreitos do que de um passeio aleatório.

Além disso, a previsão fora da amostra gerada ficou bastante aquém dos dados reais para a taxa de crescimento do PIB brasileiro observados no horizonte em questão, configurando apenas um exercício didático.

Saiba mais

Estes são apenas alguns dos recursos e ferramentas disponíveis na família de pacotes do tidyverts. Para uma referência aprofundada, confira o livro Forecasting: Principles and Practice, 3rd Edition, de Hyndman e Athanasopoulos (2021).

Confira outros exercícios aplicados com pacotes do tidyverts:


[1] A função suporta estimação dos modelos com computação paralela usando o pacote future, veja detalhes na documentação e este post para saber mais sobre o tema.

 

Receba diretamente em seu e-mail gratuitamente nossas promoções especiais
e conteúdos exclusivos sobre Análise de Dados!

Assinar Gratuitamente