Prever casos de COVID-19 apresenta alta relevância para podermos melhor planejar como lidar com situações futuras.

A literatura indica que um modelo ARIMA é adequado para tratar deste problema (BEVENUTO et al., 2020; POURGHASEMI et al., 2020; DEHESH; MARDANI-FARD; DEHESH, 2020).

Nesse contexto, adotamos modelo ARIMA para prever novos casos diários de COVID-19 para o município de Barretos - SP. Usamos período de extensão similar ou um pouco superior às pesquisas previmente mencionadas.

Usamos abordagem algorítmica no R que acelera o processo de modelagem adotando ARIMA.

Esclarecendo, em um modelo ARIMA (p,d,q), p e q indicam lags de AR e MA, respectivamente. Já o d indica quantas vezes os dados foram diferenciados (diferenciação essa usualmente empregada para tornar os dados estacionários). Deste modo, o modelo ARIMA é um ARMA(p,q) que diferencia os dados d vezes (POURGHASEMI et al., 2020).

Vamos ao código.

———————————————————————————————————

Código.


Faz a leitura de pacotes.

library(xts)
## Carregando pacotes exigidos: zoo
## 
## Attaching package: 'zoo'
## The following objects are masked from 'package:base':
## 
##     as.Date, as.Date.numeric
library(dplyr)
## 
## Attaching package: 'dplyr'
## The following objects are masked from 'package:xts':
## 
##     first, last
## The following objects are masked from 'package:stats':
## 
##     filter, lag
## The following objects are masked from 'package:base':
## 
##     intersect, setdiff, setequal, union
library(tseries)
## Registered S3 method overwritten by 'quantmod':
##   method            from
##   as.zoo.data.frame zoo
library(forecast)
library(tsbox)
## Warning: package 'tsbox' was built under R version 4.1.3
library(TSstudio)
## Warning: package 'TSstudio' was built under R version 4.1.3
## 
## Attaching package: 'TSstudio'
## The following object is masked from 'package:tsbox':
## 
##     ts_plot



Seta a pasta e e importa dados.

# Seta a pasta
setwd('C:/Users/Usuario/Documents/covid_clima_R')


# Importa dados.
covid_barret <- read.table("dados_covid_Barretos.csv", header = TRUE, quote = "\"", sep = ";", dec = ",")


Efetua análises descritivas nos dados para identificar possíveis inconsistências.

# Identifica a existência de NAs na coluna numérica.
sum(is.na(covid_barret$casosNovos))
## [1] 0
## Também vemos dados faltantes da coluna de tipo character.
sum(covid_barret$Data_Medicao == "")
## [1] 0
# Visualiza summary para checar se existem valores suspeitos. De acordo com outras fontes de dados de COVID, os dados não aparentam suspeitos. 
summary(covid_barret)
##  Data_Medicao         casosNovos    
##  Length:148         Min.   :  0.00  
##  Class :character   1st Qu.:  7.50  
##  Mode  :character   Median : 30.00  
##                     Mean   : 33.26  
##                     3rd Qu.: 48.25  
##                     Max.   :193.00


Trata do DF covid_barret para obtermos objeto que possibilite modelagem temporal.

# Transforma a coluna que trata de datas para formato de data.
covid_barret[,1] <- as.Date(covid_barret[,1], '%d/%m/%Y')


# Temos melhor noção da extensão temporal da série.
summary(covid_barret$Data_Medicao)
##         Min.      1st Qu.       Median         Mean      3rd Qu.         Max. 
## "2020-05-25" "2020-06-30" "2020-08-06" "2020-08-06" "2020-09-12" "2020-10-19"
# Transforma o DF para formato de xts.
covid_barret_xts <- xts(covid_barret$casosNovos, covid_barret$Data_Medicao) 


# Renomeia coluna de covid_barret_ts.
colnames(covid_barret_xts) <- "casos_novos"


Visualiza a série temporal.

covid_barret_xts %>% plot.ts(main="Novos casos diários de COVID-19 ")


Neste ponto, podemos selecionar o modelo ARIMA mais adequado à série temporal de duas formas: uma mais manual e outro mais programática/algorítmica.

Primeira descrevendo a manual, é investigada a estacionaridade da série, isso formalmente por meio de testes (como Dickey-Fuller aumentado; Ljung-Box e KPSS). Caso não constatada, a série deve ser transformada (usualmente por diferenças ou log) até que seja obtida estacionaridade. Caso contatada estacionaridade, manter a série temporal que a apresenta.

Em sequência, com base em plots de ACF e PACF, são selecionadas ordens dos termos AR e MA. Os modelos selecionados são estimados. O melhor modelo é selecionado critério de informação (como AIC, BIC, AICc).

A validade deste modelo selecionado é conferida por teste que investiga propriedades de ruído branco, usualmente focalizando autocorrelação nos resíduos. Caso a última seja existente, deve-se novamente olhar ACF e PACF para selecionar lags e reestimar modelo até que os resíduos dele não apresentem autocorrelação. Após isso ser satisfeito, é feita previsão adotando este último modelo (HYNDMAN; ATHANASOPOULOS, 2018; DEHESH; MARDANI-FARD; DEHESH, 2020).

Todavia, este processo iterativo pode tornar-se bastante longo devido à grande quantidade de possibilidades existentes de combinações de AR, MA e de integração. Ainda, a seleção de lags de AR e MA com base nos mencionados plots usualmente não segue uma regra formal consolidada, tornando a escolha do modelo não tão simples e precisa.

Nesse contexto, é sugerido usar a função auto.arima no R. Tal função é um algoritmo que combina testes de raiz unitária, minimização do AICc e MLE para obter um modelo ARIMA (HYNDMAN; ATHANASOPOULOS, 2018). Essa função adota procedimentos similares ao descrito para selecionar o melhor modelo. Todavia, tal função não cobre a investigação de autocorrelação nos resíduos, assim, esta testagem deve ser efetuada a parte.

Empregamos a função auto.arima e testamos o modelo selecionado.

# O modelo ARIMA é estimado. Os parâmetros são selecionados para buscar em todos os modelos (stepwise = FALSE) e também são evitadas aproximações que poderiam impossibilitar a escolha de modelo de menor AICc (approximation = FALSE). A função está programada inclusive para considerar modelos ARIMA sazonais.
aut_arima <- auto.arima(covid_barret_xts, stepwise = FALSE, approximation = FALSE)


# Vimos summary do modelo selecionado. Ele é um ARIMA(4,1,1). 
summary(aut_arima)
## Series: covid_barret_xts 
## ARIMA(4,1,1) 
## 
## Coefficients:
##          ar1      ar2      ar3      ar4      ma1
##       0.0809  -0.1880  -0.1527  -0.2573  -0.8804
## s.e.  0.0922   0.0865   0.0919   0.0962   0.0575
## 
## sigma^2 estimated as 900:  log likelihood=-707.29
## AIC=1426.57   AICc=1427.17   BIC=1444.51
## 
## Training set error measures:
##                    ME     RMSE     MAE  MPE MAPE      MASE        ACF1
## Training set 2.880538 29.38614 20.4653 -Inf  Inf 0.7749611 -0.04931025
# Teste de Ljung-Box. É um teste de portmanteau (Hyndman; Athanasopoulos, 2018). Sua hipótese nula é que se autocorrelações em conjunto são iguais a 0. Como seu valor p > 0.1, a hipótese nula não é rejeitada.
Box.test(residuals(aut_arima), 20)
## 
##  Box-Pierce test
## 
## data:  residuals(aut_arima)
## X-squared = 14.426, df = 20, p-value = 0.8083
# Visualiza raízes unitárias. Um indicativo da validade do modelo é elas estarem situadas dentro do círculo unitário.
autoplot(aut_arima)


O teste de Ljung-Box indica a aceitabilidade do modelo (LEVY et al, 2021). Reforçando tal aceitabilidade, constatamos que as raízes AR e MA encontram-se dentro do círculo unitário, indicando que o processo ARIMA é (dada covariância) estacionário e invertível (POURGHASEMI et al., 2020).

Assim, podemos visualizar previsões (neste caso, selecionamos um mês) usando o modelo ARIMA(4,1,1).

autoplot(forecast(aut_arima), h = 30)


———————————————————————————————————


Breve descrição do todo.


Neste Markdown, mostramos como adotar um procedimento algorítmico para modelar uma série temporal por meio do modelo ARIMA. Na função que adota tal procedimento, selecionamos parâmetros que torna a seleção de modelos mais abrangentes e mais segura a escolha de modelo de modelo de menor AICc.

Também foram demonstrados testes que investigam a validade do modelo selecionado. Em posse do modelo selecionado e aprovado pelos testes, fizemos previsões.


———————————————————————————————————


Referências.


BENVENUTO, Domenico et al. Application of the ARIMA model on the COVID-2019 epidemic dataset. Data in brief, v. 29, p. 105340, 2020.

DEHESH, Tania; MARDANI-FARD, H. A.; DEHESH, Paria. Forecasting of covid-19 confirmed cases in different countries with arima models. MedRxiv, 2020.

HYNDMAN, Rob J.; ATHANASOPOULOS, George. Forecasting: principles and practice. OTexts, 2018.

LEVY, Matthew J. et al. Correlation between emergency medical services suspected COVID-19 patients and daily hospitalizations. Prehospital Emergency Care, v. 25, n. 6, p. 785-789, 2021.

POURGHASEMI, Hamid Reza et al. Assessment of the outbreak risk, mapping and infection behavior of COVID-19: Application of the autoregressive integrated-moving average (ARIMA) and polynomial models. Plos one, v. 15, n. 7, p. e0236238, 2020.