Licença
This work is licensed under the Creative Commons
Attribution-ShareAlike 4.0 International License. To view a copy of this
license, visit http://creativecommons.org/licenses/by-sa/4.0/ or send a
letter to Creative Commons, PO Box 1866, Mountain View, CA 94042,
USA.
Citação
Sugestão de citação: FIGUEIREDO, Adriano Marcos Rodrigues. Exemplo
Séries Temporais: modeltime - IPCA Var. Mensal. Campo Grande-MS, Brasil:
RStudio/Rpubs, 2023. Disponível em https://rpubs.com/amrofi/modeltime_ipca.
Introdução
Os dados vem do pacote sidrar, seguindo o exemplo da Análise Macro
(2022), atualizados para a consulta eletrônica em 06/04/2023.
Carregar pacotes
# # https://analisemacro.com.br/data-science/modelagem-e-previsao-com-o-modeltime/
library(sidrar)
library(magrittr)
library(dplyr)
library(lubridate)
library(timetk)
library(rsample)
library(modeltime)
library(parsnip)
library(generics)
library(yardstick)
library(ggplot2)
Passo 1: dados
# IPCA (% a.m.): coleta de dados online do SIDRA/IBGE
# Brasil, variação mensal - dez 1979 a fev 2023
raw_ipca <- sidrar::get_sidra(api = "/t/1737/n1/all/v/63/p/all/d/v63%202")
## Tratamento de dados ----
# recortou após jan 1999
# mudou nome da coluna Valor para ipca
# mudou de data.frame para tibble
# mudou coluna Mês (Código) para data YYYY-MM-DD
# posicionou no dia 01 de cada mês
dados <- raw_ipca %>%
dplyr::mutate(
date = lubridate::ym(`Mês (Código)`),
ipca = `Valor`,
.keep = "none"
) %>%
dplyr::filter(date >= lubridate::ymd("1999-01-01")) %>%
dplyr::as_tibble()
dados
# # A tibble: 282 × 2
# date ipca
# <date> <dbl>
# 1 1999-01-01 0.7
# 2 1999-02-01 1.05
# 3 1999-03-01 1.1
# 4 1999-04-01 0.56
# 5 1999-05-01 0.3
# 6 1999-06-01 0.19
# 7 1999-07-01 1.09
# 8 1999-08-01 0.56
# 9 1999-09-01 0.31
# 10 1999-10-01 1.19
# # … with 272 more rows
#
Visualização de
dados
# usou timetk para plotar
timetk::plot_time_series(
.data = dados,
.date_var = date,
.value = ipca,
.title = "IPCA (% a.m.) - Brasil - Variação mensal",
.x_lab = "Ano",
.y_lab = "(% a.m. - Variação mensal)",
.interactive = TRUE
)
Passo 2: separar
amostras treino x teste
# Separar amostra de "treino" e de "teste" (i.e. pseudo fora da amostra)
amostras <- rsample::initial_time_split(data = dados, prop = 0.95)
amostras
## <Training/Testing/Total>
## <275/15/290>
rsample::training(amostras) # treino
rsample::testing(amostras) # teste
#
Passo 3: modelagem
## Modelo 1: auto ARIMA ----
fit_auto_arima <- modeltime::arima_reg() %>%
parsnip::set_engine(engine = "auto_arima") %>% # usa forecast::auto.arima
generics::fit(
ipca ~ date, # interface de fórmula do modeltime (date não é um regressor)
data = rsample::training(amostras) # amostra de treino
)
fit_auto_arima
## parsnip model object
##
## Series: outcome
## ARIMA(1,0,0)(2,0,1)[12] with non-zero mean
##
## Coefficients:
## ar1 sar1 sar2 sma1 mean
## 0.6281 0.8541 -0.0054 -0.6918 0.5400
## s.e. 0.0470 0.1768 0.0900 0.1684 0.0866
##
## sigma^2 = 0.09064: log likelihood = -58.75
## AIC=129.5 AICc=129.81 BIC=151.2
## Modelo 2: passeio aleatório (random walk) ----
fit_rw <- modeltime::naive_reg(seasonal_period = 12) %>% # sazonalidade
parsnip::set_engine(engine = "naive") %>%
generics::fit(
ipca ~ date,
data = rsample::training(amostras)
)
fit_rw
## parsnip model object
##
## NAIVE
## --------
## Model:
## # A tibble: 1 × 2
## date value
## <date> <dbl>
## 1 2021-11-01 0.95
Passo 4: avaliar
modelos
# Diagnóstico de resíduos (normalidade e autocorrelação)
fit_auto_arima %>%
modeltime::modeltime_table() %>% # adicionar modelos para uma "tabela de modelos"
modeltime::modeltime_calibrate( # cálculo de resíduos dos modelos
new_data = rsample::training(amostras)
) %>%
modeltime::modeltime_residuals() %>% # extrai resíduos
modeltime::modeltime_residuals_test() # aplica testes de normalidade e autocorrelação
#
Passo 5: previsão
modelos %>% # Reestima modelos e gera 12 pontos de previsão fora da amostra
modeltime::modeltime_calibrate(new_data = rsample::testing(amostras)) %>%
modeltime::modeltime_refit(data = dados) %>% # reestima modelos com amostra completa
modeltime::modeltime_forecast(h = 12, actual_data = dados) %>%
modeltime::plot_modeltime_forecast()
LS0tDQp0aXRsZTogIkV4ZW1wbG8gU8OpcmllcyBUZW1wb3JhaXM6IG1vZGVsdGltZSAtIElQQ0EgVmFyLiBNZW5zYWwiDQphdXRob3I6ICJBZHJpYW5vIE1hcmNvcyBSb2RyaWd1ZXMgRmlndWVpcmVkbywgKmUtbWFpbDogYWRyaWFuby5maWd1ZWlyZWRvQHVmbXMuYnIqIg0KZGF0ZTogImByIGZvcm1hdChTeXMuRGF0ZSgpLCAnJWQgJUIgJVknKWAiDQpvdXRwdXQ6DQogIGh0bWxfZG9jdW1lbnQ6DQogICAgY29kZV9kb3dubG9hZDogeWVzDQogICAgdGhlbWU6IGRlZmF1bHQNCiAgICBudW1iZXJfc2VjdGlvbnM6IHllcw0KICAgIHRvYzogeWVzDQogICAgdG9jX2Zsb2F0OiBubw0KICAgIGRmX3ByaW50OiBwYWdlZA0KICAgIGZpZ19jYXB0aW9uOiB5ZXMNCi0tLQ0KDQpgYGB7ciBzZXR1cCwgaW5jbHVkZT1GQUxTRX0NCmtuaXRyOjpvcHRzX2NodW5rJHNldChlY2hvID0gVFJVRSkNCmBgYA0KDQojIExpY2Vuw6dhIHsjTGljZW7Dp2EgLnVubnVtYmVyZWR9DQoNClRoaXMgd29yayBpcyBsaWNlbnNlZCB1bmRlciB0aGUgQ3JlYXRpdmUgQ29tbW9ucyBBdHRyaWJ1dGlvbi1TaGFyZUFsaWtlIDQuMCBJbnRlcm5hdGlvbmFsIExpY2Vuc2UuIFRvIHZpZXcgYSBjb3B5IG9mIHRoaXMgbGljZW5zZSwgdmlzaXQgPGh0dHA6Ly9jcmVhdGl2ZWNvbW1vbnMub3JnL2xpY2Vuc2VzL2J5LXNhLzQuMC8+IG9yIHNlbmQgYSBsZXR0ZXIgdG8gQ3JlYXRpdmUgQ29tbW9ucywgUE8gQm94IDE4NjYsIE1vdW50YWluIFZpZXcsIENBIDk0MDQyLCBVU0EuDQoNCiFbTGljZW5zZTogQ0MgQlktU0EgNC4wXShodHRwczovL21pcnJvcnMuY3JlYXRpdmVjb21tb25zLm9yZy9wcmVzc2tpdC9idXR0b25zLzg4eDMxL3BuZy9ieS1zYS5wbmcpe3dpZHRoPSIyNSUifQ0KDQojIENpdGHDp8OjbyB7I0NpdGHDp8OjbyAudW5udW1iZXJlZH0NCg0KU3VnZXN0w6NvIGRlIGNpdGHDp8OjbzogRklHVUVJUkVETywgQWRyaWFubyBNYXJjb3MgUm9kcmlndWVzLiBFeGVtcGxvIFPDqXJpZXMgVGVtcG9yYWlzOiBtb2RlbHRpbWUgLSBJUENBIFZhci4gTWVuc2FsLiBDYW1wbyBHcmFuZGUtTVMsIEJyYXNpbDogUlN0dWRpby9ScHVicywgMjAyMy4gRGlzcG9uw612ZWwgZW0gPGh0dHBzOi8vcnB1YnMuY29tL2Ftcm9maS9tb2RlbHRpbWVfaXBjYT4uDQoNCiMgSW50cm9kdcOnw6NvIHsjSW50cm9kdcOnw6NvIC51bm51bWJlcmVkfQ0KDQpPcyBkYWRvcyB2ZW0gZG8gcGFjb3RlIHNpZHJhciwgc2VndWluZG8gbyBleGVtcGxvIGRhIEFuw6FsaXNlIE1hY3JvICgyMDIyKSwgYXR1YWxpemFkb3MgcGFyYSBhIGNvbnN1bHRhIGVsZXRyw7RuaWNhIGVtIDA2LzA0LzIwMjMuDQoNCiMjIENhcnJlZ2FyIHBhY290ZXMNCg0KYGBge3IgcGFjb3RlcywgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRX0NCiMgIyBodHRwczovL2FuYWxpc2VtYWNyby5jb20uYnIvZGF0YS1zY2llbmNlL21vZGVsYWdlbS1lLXByZXZpc2FvLWNvbS1vLW1vZGVsdGltZS8NCg0KbGlicmFyeShzaWRyYXIpDQpsaWJyYXJ5KG1hZ3JpdHRyKQ0KbGlicmFyeShkcGx5cikNCmxpYnJhcnkobHVicmlkYXRlKQ0KbGlicmFyeSh0aW1ldGspDQpsaWJyYXJ5KHJzYW1wbGUpDQpsaWJyYXJ5KG1vZGVsdGltZSkNCmxpYnJhcnkocGFyc25pcCkNCmxpYnJhcnkoZ2VuZXJpY3MpDQpsaWJyYXJ5KHlhcmRzdGljaykNCmxpYnJhcnkoZ2dwbG90MikNCmBgYA0KDQojIFBhc3NvIDE6IGRhZG9zDQoNCmBgYHtyIHBhc3NvMSwgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRX0NCg0KIyBJUENBICglIGEubS4pOiBjb2xldGEgZGUgZGFkb3Mgb25saW5lIGRvIFNJRFJBL0lCR0UNCiMgQnJhc2lsLCB2YXJpYcOnw6NvIG1lbnNhbCAtIGRleiAxOTc5IGEgZmV2IDIwMjMNCnJhd19pcGNhIDwtIHNpZHJhcjo6Z2V0X3NpZHJhKGFwaSA9ICIvdC8xNzM3L24xL2FsbC92LzYzL3AvYWxsL2QvdjYzJTIwMiIpDQojIyBUcmF0YW1lbnRvIGRlIGRhZG9zIC0tLS0NCiMgcmVjb3J0b3UgYXDDs3MgamFuIDE5OTkNCiMgbXVkb3Ugbm9tZSBkYSBjb2x1bmEgVmFsb3IgcGFyYSBpcGNhDQojIG11ZG91IGRlIGRhdGEuZnJhbWUgcGFyYSB0aWJibGUNCiMgbXVkb3UgY29sdW5hIE3DqnMgKEPDs2RpZ28pIHBhcmEgZGF0YSBZWVlZLU1NLUREDQojIHBvc2ljaW9ub3Ugbm8gZGlhIDAxIGRlIGNhZGEgbcOqcw0KZGFkb3MgPC0gcmF3X2lwY2EgJT4lDQogIGRwbHlyOjptdXRhdGUoDQogICAgZGF0ZSAgPSBsdWJyaWRhdGU6OnltKGBNw6pzIChDw7NkaWdvKWApLA0KICAgIGlwY2EgPSBgVmFsb3JgLA0KICAgIC5rZWVwID0gIm5vbmUiDQogICkgJT4lDQogIGRwbHlyOjpmaWx0ZXIoZGF0ZSA+PSBsdWJyaWRhdGU6OnltZCgiMTk5OS0wMS0wMSIpKSAlPiUNCiAgZHBseXI6OmFzX3RpYmJsZSgpDQoNCmRhZG9zDQoNCiMgIyBBIHRpYmJsZTogMjgyIMOXIDINCiMgICAgZGF0ZSAgICAgICAgaXBjYQ0KIyAgICA8ZGF0ZT4gICAgIDxkYmw+DQojICAxIDE5OTktMDEtMDEgIDAuNyANCiMgIDIgMTk5OS0wMi0wMSAgMS4wNQ0KIyAgMyAxOTk5LTAzLTAxICAxLjEgDQojICA0IDE5OTktMDQtMDEgIDAuNTYNCiMgIDUgMTk5OS0wNS0wMSAgMC4zIA0KIyAgNiAxOTk5LTA2LTAxICAwLjE5DQojICA3IDE5OTktMDctMDEgIDEuMDkNCiMgIDggMTk5OS0wOC0wMSAgMC41Ng0KIyAgOSAxOTk5LTA5LTAxICAwLjMxDQojIDEwIDE5OTktMTAtMDEgIDEuMTkNCiMgIyDigKYgd2l0aCAyNzIgbW9yZSByb3dzDQojDQpgYGANCg0KIyMgVmlzdWFsaXphw6fDo28gZGUgZGFkb3MNCg0KYGBge3IgdmlzdWFsZGFkb3MsIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0V9DQoNCiMgdXNvdSB0aW1ldGsgcGFyYSBwbG90YXINCnRpbWV0azo6cGxvdF90aW1lX3NlcmllcygNCiAgLmRhdGEgICAgID0gZGFkb3MsDQogIC5kYXRlX3ZhciA9IGRhdGUsDQogIC52YWx1ZSAgICA9IGlwY2EsDQogIC50aXRsZSAgICA9ICJJUENBICglIGEubS4pIC0gQnJhc2lsIC0gVmFyaWHDp8OjbyBtZW5zYWwiLA0KICAueF9sYWIgICAgPSAiQW5vIiwNCiAgLnlfbGFiICAgID0gIiglIGEubS4gLSBWYXJpYcOnw6NvIG1lbnNhbCkiLA0KICAuaW50ZXJhY3RpdmUgPSBUUlVFDQopIA0KYGBgDQoNCiMgUGFzc28gMjogc2VwYXJhciBhbW9zdHJhcyB0cmVpbm8geCB0ZXN0ZQ0KDQpgYGB7ciBwYXNzbzIsIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0V9DQoNCiMgU2VwYXJhciBhbW9zdHJhIGRlICJ0cmVpbm8iIGUgZGUgInRlc3RlIiAoaS5lLiBwc2V1ZG8gZm9yYSBkYSBhbW9zdHJhKQ0KYW1vc3RyYXMgPC0gcnNhbXBsZTo6aW5pdGlhbF90aW1lX3NwbGl0KGRhdGEgPSBkYWRvcywgcHJvcCA9IDAuOTUpDQogDQphbW9zdHJhcw0KDQpyc2FtcGxlOjp0cmFpbmluZyhhbW9zdHJhcykgIyB0cmVpbm8NCg0KcnNhbXBsZTo6dGVzdGluZyhhbW9zdHJhcykgIyB0ZXN0ZQ0KIw0KYGBgDQoNCiMgUGFzc28gMzogbW9kZWxhZ2VtDQoNCmBgYHtyIHBhc3NvMywgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRX0NCg0KIyMgTW9kZWxvIDE6IGF1dG8gQVJJTUEgLS0tLQ0KZml0X2F1dG9fYXJpbWEgPC0gbW9kZWx0aW1lOjphcmltYV9yZWcoKSAlPiUNCiAgcGFyc25pcDo6c2V0X2VuZ2luZShlbmdpbmUgPSAiYXV0b19hcmltYSIpICU+JSAgIyB1c2EgZm9yZWNhc3Q6OmF1dG8uYXJpbWENCiAgZ2VuZXJpY3M6OmZpdCgNCiAgICBpcGNhIH4gZGF0ZSwgIyBpbnRlcmZhY2UgZGUgZsOzcm11bGEgZG8gbW9kZWx0aW1lIChkYXRlIG7Do28gw6kgdW0gcmVncmVzc29yKQ0KICAgIGRhdGEgPSByc2FtcGxlOjp0cmFpbmluZyhhbW9zdHJhcykgIyBhbW9zdHJhIGRlIHRyZWlubw0KICApDQpmaXRfYXV0b19hcmltYQ0KDQojIyBNb2RlbG8gMjogcGFzc2VpbyBhbGVhdMOzcmlvIChyYW5kb20gd2FsaykgLS0tLQ0KZml0X3J3IDwtIG1vZGVsdGltZTo6bmFpdmVfcmVnKHNlYXNvbmFsX3BlcmlvZCA9IDEyKSAlPiUgIyBzYXpvbmFsaWRhZGUNCiAgcGFyc25pcDo6c2V0X2VuZ2luZShlbmdpbmUgPSAibmFpdmUiKSAlPiUNCiAgZ2VuZXJpY3M6OmZpdCgNCiAgICBpcGNhIH4gZGF0ZSwNCiAgICBkYXRhID0gcnNhbXBsZTo6dHJhaW5pbmcoYW1vc3RyYXMpDQogICkNCg0KZml0X3J3DQoNCmBgYA0KDQojIFBhc3NvIDQ6IGF2YWxpYXIgbW9kZWxvcw0KDQpgYGB7ciBwYXNzbzQsIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0V9DQoNCiMgRGlhZ27Ds3N0aWNvIGRlIHJlc8OtZHVvcyAobm9ybWFsaWRhZGUgZSBhdXRvY29ycmVsYcOnw6NvKQ0KZml0X2F1dG9fYXJpbWEgJT4lDQogIG1vZGVsdGltZTo6bW9kZWx0aW1lX3RhYmxlKCkgJT4lICAjIGFkaWNpb25hciBtb2RlbG9zIHBhcmEgdW1hICJ0YWJlbGEgZGUgbW9kZWxvcyINCiAgbW9kZWx0aW1lOjptb2RlbHRpbWVfY2FsaWJyYXRlKCAgICMgY8OhbGN1bG8gZGUgcmVzw61kdW9zIGRvcyBtb2RlbG9zDQogICAgbmV3X2RhdGEgPSByc2FtcGxlOjp0cmFpbmluZyhhbW9zdHJhcykNCiAgKSAlPiUNCiAgbW9kZWx0aW1lOjptb2RlbHRpbWVfcmVzaWR1YWxzKCkgJT4lICMgZXh0cmFpIHJlc8OtZHVvcw0KICBtb2RlbHRpbWU6Om1vZGVsdGltZV9yZXNpZHVhbHNfdGVzdCgpICMgYXBsaWNhIHRlc3RlcyBkZSBub3JtYWxpZGFkZSBlIGF1dG9jb3JyZWxhw6fDo28NCg0KIw0KYGBgDQoNCiMjIFBlcmZvcm1hbmNlIHByZWRpdGl2YSBkbyBhdXRvX2FyaW1hDQoNCmBgYHtyIHBlcmZvcm1hbmNlLCBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFfQ0KDQojIFByZXZpc8OjbyAocHNldWRvKSBmb3JhIGRhIGFtb3N0cmENCm1vZGVsb3MgPC0gbW9kZWx0aW1lOjptb2RlbHRpbWVfdGFibGUoZml0X2F1dG9fYXJpbWEsIGZpdF9ydykNCnByZXZpc29lcyA8LSBtb2RlbG9zICAlPiUNCiAgbW9kZWx0aW1lOjptb2RlbHRpbWVfY2FsaWJyYXRlKA0KICAgIG5ld19kYXRhID0gcnNhbXBsZTo6dHJhaW5pbmcoYW1vc3RyYXMpDQogICkgJT4lDQogIG1vZGVsdGltZTo6bW9kZWx0aW1lX2ZvcmVjYXN0KA0KICAgIGggICAgICAgICAgID0gbnJvdyhyc2FtcGxlOjp0ZXN0aW5nKGFtb3N0cmFzKSksICMgbsK6IGRlIG1lc2VzIHAvIHByZXZpc8Ojbw0KICAgIGFjdHVhbF9kYXRhID0gZGFkb3MgIyBwYXJhIGNvbXBhcmFyIGNvbSBkYWRvcyBvYnNlcnZhZG9zDQogICkNCg0KIyMgVmlzdWFsaXphciBwcmV2aXPDtWVzIC0tLS0NCm1vZGVsdGltZTo6cGxvdF9tb2RlbHRpbWVfZm9yZWNhc3QocHJldmlzb2VzKSANCg0KIyMgTcOpdHJpY2FzIGRlIGFjdXLDoWNpYSAocHNldWRvIGZvcmEgZGEgYW1vc3RyYSkgLS0tLQ0KbW9kZWx0aW1lOjptb2RlbHRpbWVfYWNjdXJhY3koDQogIG9iamVjdCAgICAgPSBtb2RlbG9zLA0KICBuZXdfZGF0YSAgID0gcnNhbXBsZTo6dGVzdGluZyhhbW9zdHJhcyksDQogIG1ldHJpY19zZXQgPSB5YXJkc3RpY2s6Om1ldHJpY19zZXQoeWFyZHN0aWNrOjptYWUsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHlhcmRzdGljazo6cm1zZSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB5YXJkc3RpY2s6Om1hc2UpICMgbcOpdHJpY2FzDQopDQoNCmBgYA0KDQojIFBhc3NvIDU6IHByZXZpc8Ojbw0KDQpgYGB7ciBwYXNzbzUsIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0V9DQoNCg0KbW9kZWxvcyAlPiUgIyBSZWVzdGltYSBtb2RlbG9zIGUgZ2VyYSAxMiBwb250b3MgZGUgcHJldmlzw6NvIGZvcmEgZGEgYW1vc3RyYQ0KICBtb2RlbHRpbWU6Om1vZGVsdGltZV9jYWxpYnJhdGUobmV3X2RhdGEgPSByc2FtcGxlOjp0ZXN0aW5nKGFtb3N0cmFzKSkgJT4lDQogIG1vZGVsdGltZTo6bW9kZWx0aW1lX3JlZml0KGRhdGEgPSBkYWRvcykgJT4lICMgcmVlc3RpbWEgbW9kZWxvcyBjb20gYW1vc3RyYSBjb21wbGV0YQ0KICBtb2RlbHRpbWU6Om1vZGVsdGltZV9mb3JlY2FzdChoID0gMTIsIGFjdHVhbF9kYXRhID0gZGFkb3MpICU+JQ0KICBtb2RlbHRpbWU6OnBsb3RfbW9kZWx0aW1lX2ZvcmVjYXN0KCkNCg0KYGBgDQoNCiMgUmVmZXLDqm5jaWFzDQoNCkFuw6FsaXNlIE1hY3JvICgyMDIyKS4gTW9kZWxhZ2VtIGUgcHJldmlzw6NvIGNvbSBvIHttb2RlbHRpbWV9LiBEaXNwb27DrXZlbCBlbTogPGh0dHBzOi8vYW5hbGlzZW1hY3JvLmNvbS5ici9kYXRhLXNjaWVuY2UvbW9kZWxhZ2VtLWUtcHJldmlzYW8tY29tLW8tbW9kZWx0aW1lLz4uDQo=