A necessidade de se realizar previsões a partir de dados coletados ao longo de intervalos de tempo é cada vez maior, ainda mais tratando-se de temas de interesse público, como aqueles relativos à economia, hidrologia/climatologia e, até mesmo, à saúde pública. Para a realização de tais análises, muitos e diversificados são os métodos que podem ser empregados. Neste tutorial, o método utilizado será o ARIMA que, de forma geral, pode ser definido como "modelo autorregressivo integrado de móveis móveis.
Para a aplicação desse modelo, faz-se necessário o entendimento dos termos “p”, “d” e “q”, pois o ajuste a ser realizado será em função de tais variáveis. As definições são as seguintes:
Dependendo do objeto com o qual se está trabalhando, ou seja, a depender da série temporal, o modelo ARIMA também poderá ser denominado como SARIMA. A adição da letra “S” advém da presença de sazonalidade na série.
Abaixo encontram-se as fórmulas:
\[ ARIMA(p,d,q) \]
\[ SARIMA(p,d,q)(P,D,Q)_x \]
A diferenciação entre letras maiúsculas e minúsculas se deve unicamente à sazonalidade do modelo. Enquanto as minúsculas referem-se às componentes não-sazonais, as maiúsculas referem-se às sazonais. O entendimento da terminologia é útil para a execução de análises e, principalmente, de previsões temporais.
Para o ajuste do ARIMA em ambiente R, deve-se recorrer ao pacote forecast
.
library(forecast)
Após a ativação do pacote acima, pode-se ter acesso à função Arima()
, cuja descrição dos termos que o compõe se encontra abaixo e pode ser acessada da seguinte forma: ?Arima
.
Arima(y, # Objeto que será analisado; nesse caso, uma série temporal
order = c(0, 0, 0), # Componente não-sazonal
seasonal = c(0, 0, 0), # Componente sazonal
xreg = NULL,
include.mean = TRUE,
include.drift = FALSE,
include.constant,
lambda = model$lambda,
biasadj = FALSE,
method = c("CSS-ML", "ML", "CSS"),
model = NULL,
x = y,
)
Para que os valores dos termos “p”, “d” e “q” sejam encontrados, e o ajuste seja viabilizado, deve-se recorrer às funções de autocorrelação e de autocorrelação parcial. Suponha que a série com a qual se esteja trabalhando é a seguinte:
plot.ts(AirPassengers) # Série temporal dafault
A série acima, denominada AirPassengers
, descreve o número de passageiros contabilizados mensalmente ao longo do período de 1949 - 1960. O modelo já se encontra implementado dentre os dataset do R.
Para a verificação das funções de autocorrelação e autocorrelação parcial, pode-se proceder da seguinte forma:
ggtsdisplay(AirPassengers)
A partir dos gráficos:
Para a determinação da ordem de autoregressão (p), do grau de diferenciação (d) e da componente de médias móveis (q), deve-se realizar a observação do comportamento dos “lags” manifestados por cada gráfico de autocorrelação (ACF e ÁCF). “Nos gráficos gerados, as linhas tracejadas azuis são os limites de significância ou intervalos de confiança; sempre que houver uma ultrapassagem, diz-se que há, ali, um lag com significância”
Para que o número de diferenciações seja encontrado com maior facilidade, as funções ndiffs()
e nsdiffs()
podem ser empregadas. Ambas retornam a quantidade de diferenciações necessárias para a estabilização da estacionariedade e da variânica da série.
A determinação dos valores dos termos pode não ser exata, uma vez que o autor da análise pode incorrer em diversos erros e gerar diversos tipos de modelos. Devido a isso, é necessária a utilizaçaõ de uma métrica com o o intuito de se aferir a qualidade do modelo gerado. Usualmente, se utiliza os valors de AIC e BIC, por exemplo, gerados após o ajuste do modelo.
Pois bem, entendendo essa dificuldade, dentre as ferramentas disponibilizadas pelo pacote forecast()
, está a função auto.arima()
.
Como dito anteriormente, essa função realiza a verificação dos possíveis modelos gerados a partir da série temporal em questão, visando ao ajuste ideal. Veja abaixo:
?auto.arima()
# Description
# Returns best ARIMA model according to either AIC, AICc or BIC value.
# The function conducts a search over possible model within the order constraints provided.
# Usage
auto.arima(
y, # Série temporal
d = NA, # Valor de "d" não sazonal estipulado
D = NA, # Valor de "D" sazonal estipulado
max.p = 5,
max.q = 5,
max.P = 2,
max.Q = 2,
max.order = 5,
max.d = 2,
max.D = 1,
start.p = 2,
start.q = 2,
start.P = 1,
start.Q = 1,
stationary = FALSE,
seasonal = TRUE,
ic = c("aicc", "aic", "bic"), # Critério de seleção do modelo
stepwise = TRUE, # Se TRUE, buscará a seleção mais rápida
nmodels = 94,
trace = FALSE,
approximation = (length(x) > 150 | frequency(x) > 12),
method = NULL,
truncate = NULL,
xreg = NULL,
test = c("kpss", "adf", "pp"),
test.args = list(),
seasonal.test = c("seas", "ocsb", "hegy", "ch"),
seasonal.test.args = list(),
allowdrift = TRUE,
allowmean = TRUE,
lambda = NULL,
biasadj = FALSE,
parallel = FALSE,
num.cores = 2,
x = y,
...
)
Para que uma verificação seja mais satisfatória e completa, coloque a função stepwise = FALSE
. O processo, a depender do tamanho da série analisada, poderá ser demorado.
Realizando o ajuste da série temporal AirPassengers com parte dos dados, para que se possa comparar os dados gerados.
modelo_treino <- ts(AirPassengers[1:120]) # Amostra treino
modelo_teste <- ts(AirPassengers[121:144]) # Amostra para confirmação
modelo <- auto.arima(modelo_treino, stepwise = FALSE) # Criação do modelo
A partir da geração do modelo, os seus atributos podem ser exibidos.
modelo
## Series: modelo_treino
## ARIMA(2,1,2) with drift
##
## Coefficients:
## ar1 ar2 ma1 ma2 drift
## 1.6431 -0.9066 -1.8743 0.9688 2.1761
## s.e. 0.0371 0.0361 0.0572 0.0595 0.7107
##
## sigma^2 estimated as 488.2: log likelihood=-537.51
## AIC=1087.03 AICc=1087.78 BIC=1103.7
Como pode-se perceber, o modelo ajustado foi um ARIMA, devido à ausência de componentes sazonais. Verificando a aproximação dos dados.
accuracy(modelo$fitted, modelo_treino)
## ME RMSE MAE MPE MAPE ACF1 Theil's U
## Test set 0.3246097 21.53481 17.21691 -0.5203958 7.005998 0.08174572 0.8001771
Os termos resultantes da acurácia acima são os seguintes:
Agora, se realizará a previsão para os próximos 24 períodos, o que permitirá a visualização da acurácia do modelo para a realização de previsões.
previsao <- forecast(modelo, h = 24)
Os dados gerados são os seguintes:
head(previsao$lower) # Limite inferior
## Time Series:
## Start = 121
## End = 126
## Frequency = 1
## 80% 95%
## 121 314.4380 299.4384
## 122 324.9450 306.0139
## 123 347.5203 327.4080
## 124 372.3897 352.1691
## 125 391.5983 371.3388
## 126 400.8089 380.3839
head(previsao$upper) # Limite superior
## Time Series:
## Start = 121
## End = 126
## Frequency = 1
## 80% 95%
## 121 371.1076 386.1071
## 122 396.4682 415.3992
## 123 423.5063 443.6186
## 124 448.7850 469.0056
## 125 468.1406 488.4001
## 126 477.9761 498.4010
Visualização:
autoplot(previsao, predict.colour = "red") + labs(x = "Tempo", y = "Passageiros",
title = "Previsao usando o forecast") +
theme_test() + scale_x_continuous(breaks = seq(0,150,15)) +
scale_y_continuous(breaks = seq(100, 600, 50)) + geom_vline(xintercept = 120, lty = "dashed")
Verificação da acurácia da previsão com a amostra teste:
accuracy(modelo_teste, as.numeric(previsao$mean))
## ME RMSE MAE MPE MAPE
## Test set -37.34932 67.58919 46.91646 -8.559127 10.94617
De acordo com a acurácia, podemos perceber que o modelo arima não é infalível, mas dependendo da qualidade do ajuste de dados, pode ser uma ferramenta poderosa para a análise de séries temporais. Cabe ressaltar que há outras ferramentas com as quais se pode realizar previsões, como as redes neurais, por exemplo.