Tag

PACF 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.

 

 

Análise exploratória de dados macroeconômicos no R

By | Data Science

Neste post iremos revelar algumas coisas que nunca te contaram sobre análise exploratória e como usá-la para ter uma visão geral aplicada a dados macroeconômicos.

Antes de tudo, precisamos entender onde a análise exploratória de dados - do inglês exploratory data analysis (EDA) - está inserida no contexto de uma análise descritiva ou em modelos que usem dados macroeconômicos. Para tais contextos, é fundamental conhecer os dados antes de partir para qualquer exercício empírico, ou seja, queremos uma fotografia que mostre um panorama geral sobre os dados. Esse primeiro passo é extremamente útil para identificar possíveis "pontos cegos" que gerariam problemas no seu modelo ou que poderiam ser interpretados de forma errônea em sua análise conjuntural, por exemplo.

Em outras palavras, a famosa expressão garbage in, garbage out (lixo entra, lixo sai) resume perfeitamente a importância da análise exploratória. Você precisa saber se os dados a serem utilizados possuem a qualidade (características) necessária para fazer uma análise ou se estão simplesmente cheios de sujeiras (outliers, valores ausentes, quebras, etc.). É neste momento em que você aprenderá mais sobre os dados, identificando padrões e comportamentos, assim como saberá o que precisará fazer (tratamentos) para torná-los úteis.

Mas de que tipo de dados estamos falando?

Em geral, os dados macroeconômicos mais usados possuem uma estrutura de série temporal, mas outras estruturas como dados em painel, microdados, etc. também possuem aplicações em macroeconomia. Focando em séries temporais, pode-se destacar algumas coisas que você deve ficar de olho ao fazer uma análise exploratória de dados:

  • Sazonalidade;
  • Tendência;
  • Autocorrelação;
  • Estacionariedade.

Algumas estatísticas e gráficos que irão te ajudar a inspecionar estes padrões e comportamentos:

  • Média, mediana, desvio padrão e IQR;
  • Gráfico de histograma;
  • Gráfico de linha;
  • Gráfico de sazonalidade;
  • Correlogramas ACF e PACF;
  • Testes de estacionariedade ADF, KPSS e PP.

Parece ser bastante coisa para se preocupar em uma análise exploratória e realmente é - podendo ainda ampliarmos este escopo -, mas se usarmos as ferramentas adequadas podemos colocar tudo isso em prática de maneira rápida e eficiente, direcionando o foco na análise propriamente dita. Na linguagem R, existem diversos pacotes modernos com utilidades para análise exploratória de dados, exploraremos a seguir alguns destes pacotes.

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

Dados

Para exemplificar uma análise exploratória de dados macroeconômicos, usaremos um conjunto de dados que traz informações sobre indicadores econômicos mensais da economia norte-americana. A fonte dos dados é o FRED e os mesmos já estão salvos em um dataset no R:

Estatísticas descritivas

As medidas de estatística descritiva, como média, desvio padrão, percentis, etc. servem para obter uma visão geral dos dados. É um bom primeiro passo se você não tem expertise sobre a variável com a qual irá desenvolver uma análise. O pacote {skimr} faz esse trabalho de calcular estas estatísticas de uma maneira simples e bem apresentada, basta apontar o objeto com os dados:

Note que, além das estatísticas descritivas, também são apresentadas informações como nº e taxa de valores ausentes, gráfico de histograma, valores mínimos e máximas, etc. - a depender do tipo de variável na qual será computado tais cálculos -, que são informações bastante úteis para identificar possíveis problemas nos dados.

Histograma

Talvez apenas com estatísticas descritivas não seja possível ter uma visão clara sobre o comportamento da variável de interesse, ou seja, como os dados estão distribuídos. Para resolver isso, é conveniente gerar um gráfico de histograma, que pode ser criado com o {ggplot2}:

A visualização gráfica dos dados é muito importante pois nos permite rapidamente identificar nos dados algumas coisas interessantes, como neste caso do histograma. A distribuição dos dados apresenta uma cauda alongada a direita, ou seja, possivelmente há algumas poucas observações dessa variável (duração do desemprego) com valores mais "extremos". A questão que surge é: em qual período do tempo aconteceram estes valores? Ou seja, qual é a tendência da variável?

Tendência

O jeito mais direto de identificar a tendência de uma variável é através de um gráfico de linha. Abaixo geramos um gráfico de linha e adicionamos uma linha de suavização, que pode facilitar o rápido entendimento em alguns casos:

Dessa forma, conseguimos identificar que no período mais recente, ou seja, nas últimas observações a partir de 2010, há uma tendência de aumento no tempo de duração do desemprego, superando o histórico observado nas décadas anteriores. Note que, com apenas dois gráficos e algumas estatísticas descritivas, já conseguimos insumos interessantes para uma análise mais aprofundada.

Sazonalidade

A olho nu no gráfico anterior não parece haver comportamento que indique sazonalidade, mas como poderíamos identificar tal comportamento em uma variável? Novamente, a análise gráfica pode auxiliar nessa tarefa. O gráfico de sazonalidade gerado abaixo basicamente é um gráfico de linha, com a exceção de que o eixo X mostra os dados da sazonalidade observada da variável. No caso de dados em frequência mensal, o eixo X será os meses.

O gráfico facilita identificar mais claramente padrões sazonais, que para essa variável não há, além de ser mais fácil de visualizar em quais anos que o padrão muda.

Estacionariedade

Outro ponto importante, principalmente em contextos de modelagem econométrica, é a estacionariedade da série, ou seja, a média e a variância são constantes ao longo do tempo? Quando em uma variável estes pressupostos não são verdadeiros, dizemos que a série possui raiz unitária (é não-estacionária), de modo que os choques que a variável sofre geram um efeito permanente. Parece ter sido esse o caso da variável em questão, a duração do desemprego. Vimos que as flutuações da variável se alteraram consideravelmente, e isso tem fortes implicações relacionadas a teorias econômicas que tratam de ciclos. Mas, fugindo da teoria, como verificamos de maneira prática se a variável é estacionária? O pacote {forecast} possui uma excelente função permitindo aplicar testes, como o ADF, KPSS e PP, que já retornam o número de diferenças necessárias para a série ser estacionária:

Se o valor retornado for maior do que zero, significa que a série é não-estacionária e precisa ser diferenciada na ordem do valor retornado para ser estacionária.

Autocorrelação

Por fim, outra questão importante em séries temporais é a identificação de possíveis correlações (a relação linear) entre os valores defasados da série. Os correlogramas ACF e PACF podem ajudar neste ponto. Como a série não possui sazonalidade mas possui uma certa tendência, as autocorrelações iniciais tendem a ser grandes e positivas pois as observações próximas no tempo também estão próximas em valor. Assim, a função de autocorrelação (ACF) de uma série temporal com tendência tende a ter valores positivos que diminuem lentamente à medida que as defasagens aumentam.

Se fôssemos, por exemplo, implementar uma modelagem ARIMA nessa série, seria apropriado gerar os correlogramas na série estacionária, ou seja, a variável duração do desemprego na primeira diferença.

Saiba mais

Este exercício buscou navegar pelos principais padrões e comportamentos de dados macroeconômicos, usando ferramentas do R para identificá-los. você pode se aprofundar sobre os assuntos relacionados nestes posts do blog da 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:

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