A previsão de séries temporais fornece informações para a tomada de decisão baseada em dados em diversas áreas do conhecimento. Nesse contexto, a obtenção de estimativas precisas pelos modelos de séries temporais é importante. Para melhorar o desempenho dos modelos de previsão, estratégias de modelagem combinada são comumente usadas. A combinação pode aumentar a qualidade dos modelos e reduzir a variância das previsões. Uma alternativa de combinação consiste em se combinar as previsões de modelos individuais de uma mesma série temporal [1].
Neste texto, diferentes técnicas de combinação de preditores de séries temporais serão avaliadas. Como caso de estudo, uma série temporal conhecida será utilizada. Para esta aplicação, os modelos individuais e as técnicas de combinação usadas serão apresentados brevemente.
Os modelos autorregressivos (AR) usam os valores passados de uma série temporal e os modelos de médias móveis (MA) usam os erros de previsões passadas para realizar previsões. Pode-se combinar modelos AR e MA, dando origem aos modelos autorregressivos de médias móveis (ARMA). Para a aplicação dos modelos ARMA, a série temporal deve ser estacionária, isto é, as propriedades estatísticas que descrevem seu comportamento devem ser constantes ao longo do tempo. Para atingir a estacionaridade da série, pode-se usar a diferenciação, ou seja, tomar diferenças entre os valores da série, por exemplo \(y_t-y_{t-1}\). Obtida uma série estacionária, pode-se usar os modelos autorregressivos integrados de médias móveis (ARIMA). O modelo ARIMA não sazonal é mostrado abaixo:
\[y'_{t} = c + \phi_1 y'_{t-1} + ... + \phi_p y'_{t-p} + \theta_1 \varepsilon_{t-1} + ... + \theta_q \varepsilon_{t-q} + \varepsilon_t\]
em que \(y'_t\) é a série diferenciada, \(\varepsilon_t\), \(\varepsilon_{t-1}\), …, \(\varepsilon_{t-q}\) são ruídos brancos, \(\theta_i\) e \(\phi_i\) são coeficientes e \(c\) é a constante da equação de regressão.
O modelo ARIMA pode ser indicado \(ARIMA(p,d,q)\), em que \(p\) é a ordem da parcela autorregressiva, \(d\) é o número de diferenciações, \(q\) é a ordem da parcela de médias móveis. Os modelos ARIMA também podem ser usados para séries temporais que possuam sazonalidade, incluindo-se termos sazonais adicionais ao modelo. O modelo ARIMA sazonal pode ser indicado por \(ARIMA(p,d,q)(P,D,Q)[m]\), em que \(P\), \(D\) e \(Q\) são as ordens da parcela sazonal, e \(m\) é a sazonalidade da série [2].
Os modelos ETS são modelos de previsão referentes aos métodos de suavização exponencial simples, de Holt e Holt-Winters. A tríade (E,T,S) representa as componentes de erro, tendência e sazonalidade, respectivamente. A notação ETS(\(\cdot,\cdot,\cdot\)) indica a manifestação de cada componente, podendo ser aditiva (letra A), multiplicativa (letra M), ou sem determinada componente (letra N). Existem diversas opções de modelos ETS e pode-se representá-los usando o conceito de Modelos de Estados de Espaço:
\[\begin{align} y_{t} & = \psi \dot{\textbf{x}}_{t-1} + \varepsilon_t\label{eq:state-space-model-a}\\ \dot{\textbf{x}}_t & = F \dot{\textbf{x}}_{t-1} + g \varepsilon_t\label{eq:state-space-model-b} \end{align}\]
em que \(y_t\) é o valor da série no instante de tempo \(t\), \({\varepsilon_t}\) é um ruído branco e \(F\), \(g\) e \(\psi\) são coeficientes do modelo. \(\dot{\textbf{x}}_t\) é chamado vetor de estado e contém as componentes do modelo A primeira equação descreve a relação entre os valores da série temporal e as componentes, e a segunda equação expressa a evolução temporal das componentes [2].
A combinação leva em consideração as estimativas de \(k\) modelos individuais \(y_{k,t}\) para um determinado valor a que se deseja prever, \(y_t\), no instante de tempo \(t\). No geral, a combinação pode ser expressa da seguinte maneira:
\[\hat{y}_t=\varphi(y_{1,t},y_{2,t},\cdots,y_{i,t},\cdots,y_{k,t})\] em que \(y_{i,t}\) é a previsão do \(iº\) modelo para o valor da série no instante de tempo \(t\) e \(\varphi\) é uma função de combinação [3].
Neste método, a média aritmética simples (SA) dos preditores para cada observação é calculada. Desse modo, todos os preditores recebem o mesmo peso [4].
A mediana (MED) dos preditores para cada observação é calculada neste método. Os pesos atribuídos variam com o tempo, já que a cada instante de tempo, o resultado da combinação será a mediana dos preditores individuais [3].
Para a combinação de preditores, o método dos mínimos quadrados (MMQ) é usado para estimar um modelo de regressão linear múltipla. O conjunto de treinamento é usado para construir o modelo, de modo que a série temporal original é a variável dependente e os valores ajustados pelos modelos são as variáveis independentes. Assim, os pesos dos preditores são estimados pelo modelo de regressão construído, para se obter a combinação no conjunto de teste [4].
Existem várias medidas para avaliar o desempenho de modelos de previsão. O objetivo é medir o erro cometido pelo método ao realizar previsões. Neste texto, serão usados a Raiz do Erro Quadrático Médio (RMSE), ou Root Mean Squared Error, em inglês, e o Erro Absoluto Médio (MAE), ou Mean Absolute Error, em inglês. O RMSE avalia a raiz da média dos erros quadráticos e o MAE calcula a média dos erros absolutos. Quanto menores os seus valores, melhor o desempenho do modelo. O RMSE e o MAE podem ser calculados conforme mostrado a seguir.
\[RMSE=\sqrt{\frac{\sum^{n}_{t=1}{(\hat{y}_t-y_t)^2}}{n}}\] \[MAE=\frac{\sum^{n}_{t=1}{|\hat{y}_t-y_t|}}{n}\]
em que \(\hat{y}_t\) é o valor previsto por um modelo, \(y_t\) é o respectivo valor original da série no instante de tempo \(t\) e \(n\) é o número de valores previstos.
Neste texto, foi usado uma série temporal conhecida e disponível no próprio R, a série ldeaths. São dados mensais do número de mortes decorrentes de doenças no pulmão registradas no Reino Unido, de 1974 a 1980. A série possui 72 observações. Para usá-la, basta carregar o conjunto de dados ao qual ela pertence UKLungDeaths usando a função data.
# Carrega o conjunto de dados da série ldeaths
data(UKLungDeaths)
# Visualiza a série
plot(ldeaths, type = 'o', pch = 20)
A série ldeaths foi separada em conjunto de treinamento e teste. Os modelos foram construídos usando o conjunto de treinamento e destinou-se o conjunto de teste para realizar previsões e avaliar o desempenho dos modelos. O conjunto de treino correspondeu aos 70% iniciais da série e o conjunto de teste foi os 30% finais da série.
# Tamanho da série temporal
n <- length(ldeaths)
# Proporção dos conjuntos de treinamento e teste
p.treino <- 0.7
p.teste <- 0.3
# Tamanho dos conjuntos de treinamento e teste
n.treino <- round(n * p.treino)
n.teste <- round(n * p.teste)
# Separação dos dados
ldeaths.treino <- head(ldeaths, n.treino)
ldeaths.teste <- tail(ldeaths, n.teste)
A tabela abaixo mostra o tamanho dos conjuntos de treinamento e teste para a série ldeaths.
## ldeaths treino teste
## 72 50 22
Após a separação, os dados de treinamento e teste foram convertidos em objetos da classe ts, para possuírem atributos de séries temporais. Em R, é importante se trabalhar com objetos ts, pois os pacotes muitas vezes recorrem à atributos desta classe, como frequência e sazonalidade, para a construção dos modelos.
# Salva como série temporal
ldeaths.treino <- ts(ldeaths.treino, frequency = frequency(ldeaths), start = start(ldeaths))
ldeaths.teste <- ts(ldeaths.teste, frequency = frequency(ldeaths), end = end(ldeaths))
Os modelos foram construídos usando o pacote forecast [5]. Primeiramente, deve-se instalar e carregar o pacote no R.
install.packages(forecast)
library(forecast)
Em seguida, os modelos ARIMA e ETS foram construídos usando respectivamente as funções auto.arima e ets.
# Constrói os modelos ARIMA e ETS
mod.arima <- auto.arima(ldeaths.treino)
mod.ets <- ets(ldeaths.treino)
Para verificar os modelos construídos, geralmente pode-se usar a função summary, ou, no caso dos modelos do pacote forecast, a função print também funciona, trazendo uma descrição mais sucinta dos modelos.
print(mod.arima)
## Series: ldeaths.treino
## ARIMA(0,0,2)(1,1,0)[12] with drift
##
## Coefficients:
## ma1 ma2 sar1 drift
## 0.195 -0.340 -0.569 -6.505
## s.e. 0.178 0.195 0.123 2.647
##
## sigma^2 estimated as 105618: log likelihood=-274.1
## AIC=558.2 AICc=560.1 BIC=566.4
print(mod.ets)
## ETS(M,N,M)
##
## Call:
## ets(y = ldeaths.treino)
##
## Smoothing parameters:
## alpha = 0.1374
## gamma = 1e-04
##
## Initial states:
## l = 2196.0248
## s = 1.244 0.9391 0.8361 0.6724 0.678 0.7328
## 0.7553 0.8705 1.132 1.306 1.445 1.389
##
## sigma: 0.1063
##
## AIC AICc BIC
## 749.7 763.8 778.4
Foi selecionado um modelo ARIMA sazonal com drift, usando um termo autorregressivo sazonal, uma diferenciação sazonal e dois termos de médias móveis não sazonal. O modelo ETS usou componentes de erro e sazonalidade multiplicativas, e sem componente de tendência.
Os modelos construídos foram usados para realizar previsões no conjunto de teste. O objetivo é avaliar a capacidade dos modelos de realizar previsões em um intervalo desconhecido, que não tinha sido usado ainda. Para os modelos do pacote forecast, foi usada a função de mesmo nome, passando o argumento h para indicar o horizonte de previsões, isto é, o número de valores a serem previstos. O horizonte é igual ao tamanho do conjunto de teste, n.teste.
# Realiza previsões dos modelos ARIMA e ETS
fct.arima <- forecast(mod.arima, h = n.teste)
fct.ets <- forecast(mod.ets, h = n.teste)
A figura abaixo mostra o gráfico das previsões dos modelos ARIMA e ETS no conjunto de teste.
Por fim, as previsões dos modelos foram armazenadas em um data.frame, para facilitar a combinação em R.
# Tabela com as previsões no conjunto de teste
fct.teste <- data.frame(cbind(arima = fct.arima$mean, ets = fct.ets$mean))
Após serem realizadas as previsões, foi possível combinar os modelos. A média artimética simples, mediana e o método dos mínimos quadrados foram implementados através das seguintes funções:
# Função para a combinação pela média simples
SA <- function(forecasts) {
return(apply(forecasts, 1, mean))
}
# Função para a combinação pela mediana
MED <- function(forecasts) {
return(apply(forecasts, 1, median))
}
# Funções para a combinação pelo Método dos Mínimos Quadrados
MMQ <- function(target, fitted) {
col.names <- colnames(fitted)
df <- cbind(target, fitted)
colnames(df) <- c("target", col.names)
mod <- lm(formula = target~., data = df)
return(mod)
}
MMQ.forecast <- function(model, forecasts) {
return(predict(model, newdata = forecasts))
}
Em seguida, as funções foram aplicadas para realizar as combinações.
# Média simples
fct.mean <- SA(fct.teste)
# Mediana
fct.median <- MED(fct.teste)
# Método dos Mínimos Quadrados
mod.mmq <- MMQ(ldeaths.treino, cbind(arima = mod.arima$fitted, ets = mod.ets$fitted))
fct.mmq <- MMQ.forecast(mod.mmq, fct.teste)
A partir dos valores originais da série ldeaths no conjunto de testes e dos valores previstos por cada modelo de previsão, foi possível avaliar o desempenho dos modelos usando o RMSE e o MAE. Para calcular o RMSE e MAE, foram usadas as seguintes funções:
# Função para calcular o RMSE
rmse <- function(previsto, original) {
return(sqrt(mean((as.numeric(previsto) - as.numeric(original))^2)))
}
# Função para calcular o MAE
mae <- function(previsto, original) {
return(mean(abs((as.numeric(previsto) - as.numeric(original)))))
}
Em seguida, as funções foram usadas para avaliar o desempenho dos modelos individuais e combinados.
# Calcula o RMSE
rmse.arima <- rmse(fct.arima$mean, ldeaths.teste)
rmse.ets <- rmse(fct.ets$mean, ldeaths.teste)
rmse.mean <- rmse(fct.mean, ldeaths.teste)
rmse.median <- rmse(fct.median, ldeaths.teste)
rmse.mmq <- rmse(fct.mmq, ldeaths.teste)
# Calcula o MAE
mae.arima <- mae(fct.arima$mean, ldeaths.teste)
mae.ets <- mae(fct.ets$mean, ldeaths.teste)
mae.mean <- mae(fct.mean, ldeaths.teste)
mae.median <- mae(fct.median, ldeaths.teste)
mae.mmq <- mae(fct.mmq, ldeaths.teste)
Os resultados do RMSE e MAE são mostrados na tabela abaixo.
## arima ets mean median mmq
## RMSE 169.4 190.5 157.2 157.2 162.8
## MAE 149.1 126.7 118.9 118.9 120.4
Comparando os dois modelos individuais, o ARIMA obteve RMSE inferior em comparação ao ETS. Por outro lado, o ETS atingiu MAE inferior em comparação ao ARIMA. Segundo as medidas de erro usadas, não houve diferenças significativas entre os dois modelos. Em relação aos modelos combinados, a média e a mediana atingiram resultados iguais, o que era esperado, visto que foram combinados apenas dois modelos individuais. Dito isto, a média e a mediana obtiveram valores de RMSE e MAE inferiores em relação ao MMQ. Portanto, a média e mediana foram melhores com comparação ao método dos mínimos quadrados. Ao se comparar os resultados dos modelos individuais e combinados, as três alternativas de combinação usadas obtiveram valores de RMSE e MAE inferiores aos modelos individuais. Segundo estes resultados, para a série estudada e o horizonte de previsões adotado, as combinações foram superiores em relação modelos individuais.
Este texto avaliou a aplicação de modelos esemble para previsão de séries temporais em linguagem R. Uma série temporal conhecida foi usada como caso de estudo. A combinação mostrou desempenho superior em relação aos modelos individuais usados para o caso de estudo adotado.