1 Introdução

A etapa de processamento de dados é importante em qualquer análise, mas é comum a ocorrência de períodos sem informações disponíveis nos dados. Isto se deve a diversos fatores, como erros humanos ou falhas em equipamentos de medição. Estes dados ausentes, também conhecidos como falhas, são um dos principais problemas no estudo de séries temporais. Entre as estratégias usadas para resolver este problema, estão os métodos de preenchimento de falhas, também conhecidos como métodos de imputação de valores ausentes.

Neste texto, diferentes métodos de imputação de séries temporais univariadas serão aplicados. Uma simulação de valores ausentes será realizada, os resultados serão comparados e o melhor método será selecionado. Para esta aplicação, os métodos usados e o procedimento para a simulação serão apresentados brevemente.

2 Métodos

2.1 Métodos de imputação univariados

2.1.1 Interpolação

A interpolação permite estimar valores dentro de um intervalo conhecido, a partir dos pontos extremos deste intervalo. Sejam os pontos \((x_0,y_0), \cdots,(x_n,y_n)\), a interpolação usa uma função \(f\) que passa pelos pontos. Quando a função \(f\) é um polinômio de grau \(n\), \(p_n(x)\), pode-se representá-la usando a notação de Lagrange:

\[ p_n(x) = \sum^{n}_{k=0}y_kL_k(x)\hspace{0.5cm} \text{onde} \hspace{0.5cm} L_k(x)=\prod^{n}_{\substack{j=0\\j \neq k}}\frac{x-x_j}{x_k-x_j}. \]

O caso especial da interpolação entre dois pontos distintos, \((x_0,y_0)\) e \((x_1,y_1)\), é chamado interpolação linear. Caso \(n=1\), tem-se que \(p_n(x)\) é uma reta, isto é:

\[ p_1(x) = y_0\frac{x-x_1}{x_0-x_1} + y_1\frac{x-x_0}{x_1-x_0} \]

Outra alternativa para a interpolação é através das funções splines. Neste caso, determinam-se polinômios de graus inferiores para subconjuntos dos dados. Por exemplo, pode-se aplicar polinômios de grau 3 a fim de conectar cada intervalo entre os pontos de dados, conhecidas como splines cúbicas.

2.1.2 Médias móveis

Para imputação de valores ausentes, o método das médias móveis calcula médias ponderadas a partir de um número igual de observações em ambos os lados de um valor ausente central. Seja um valor ausente \(y_t\) em uma série temporal, considerando uma janela de média móvel \(k\), os valores \(y_{t-k}, ..., y_{t-1}\) e \(y_{t+1}, ..., y_{t+k}\) são usados para calcular a média. Diversas configurações de pesos podem ser adotadas. Pode-se usar o mesmo peso para todos os valores, calculando assim uma média aritmética simples, como no caso da média móvel simples, ou ainda usar pesos com decaimento linear ou exponencial.

2.1.3 Imputação com decomposição

As séries temporais costumam exibir diferentes padrões, como tendência e sazonalidade. Geralmente é útil decompor a série para obter as componentes que representam esses padrões. A decomposição pode ser do tipo aditiva:

\[ y_t = S_t+T_t+R_t \]

onde \(S_t\), \(T_t\) e \(R_t\) representam as componentes de sazonalidade, tendência e resíduo, respectivamente.

O método de decomposição Sazonal e de Tendência usando Loess (STL) [1] é um método versátil e robusto que realiza uma decomposição do tipo aditiva na série temporal. A decomposição STL é um processo recursivo, onde uma sequência aplicações do suavizador Loess [2] é realizada até se atingir a suavidade desejada. Além disso, o método fornece uma variedade de parâmetros para controlar as componentes obtidas.

A partir da decomposição STL, a série decomposta pode também ser expressa como

\[ y_t = S_t+A_t \]

onde \(A_t = T_t + R_t\) é chamada componente sazonalmente ajustado. Dessa forma, pode-se utilizar a decomposição STL para previsão ou imputação, ao analisar \(S_t\) e \(A_t\) separadamente.

O procedimento para imputação com decomposição STL é o seguinte:

  • Calcular a decomposição STL da série com falhas;
  • Aplicar algum método de imputação na série sazonalmente ajustada \(A_t\), como a interpolação linear, por exemplo;
  • Adicionar a componente sazonal \(S_t\) de volta, para obter a série completa.

2.2 Simulação de valores ausentes

Para comparar o desempenho de métodos de imputação, é preciso uma série temporal completa, isto é, uma série que não possua valores ausentes, para que as falhas possam ser simuladas. O procedimento pode ser resumido da seguinte maneira:

  • Obter uma série temporal sem valores ausentes;
  • Remover aleatoriamente uma dada porcentagem das observações da série;
  • Aplicar diferentes métodos de imputação para preencher as falhas criadas;
  • Comparar os valores originais da série com os valores estimados pelos métodos, usando alguma medida de erro.

2.3 Avaliação do desempenho

Existem várias medidas para avaliar o desempenho de métodos de imputação. O objetivo é medir o erro cometido pelo método ao estimar os valores ausentes. Neste texto, será usada o Erro Quadrático Médio (MSE), ou Mean Squared Error, em inglês. O MSE avalia a média dos erros quadráticos. Quanto menor o seu valor, melhor o desempenho do método. O MSE pode ser calculado conforme mostrado a seguir.

\[MSE=\frac{\sum^{n}_{t=1}{(\hat{y}_t-y_t)^2}}{n}\] em que \(\hat{y}_t\) é o valor estimado por um método de imputação, \(y_t\) é o respectivo valor original da série no instante de tempo \(t\) e \(n\) é o número de valores ausentes.

3 Caso de estudo

3.1 Conjunto de dados

Neste texto, foi usado uma série temporal conhecida e disponível no próprio R, a série AirPassengers. São dados mensais dos totais internacionais de passageiros aéreos, de 1949 a 1960. Para usá-la, basta carregar usando a função data.

# Carrega a série temporal
data("AirPassengers")

# Visualiza a série
plot(AirPassengers, type = 'o', pch = 20)

A figura abaixo mostra a decomposição STL da série AirPassengers. Neste gráfico, a série original é mostrada juntamente com as componentes de sazonalidade, tendência e resíduo.

Além da decomposição STL, foi analisada também a autocorrelação da série temporal. A autocorrelação mede a correlação linear existente entre os pontos da própria série. Assumindo valores entre -1 e +1, um valor igual a +1 (-1) indica uma correlação positiva (negativa) perfeita. O gráfico da função de autocorrelação (ACF) mostra a associação para diferentes valores passados (lags) da série e a sua interpretação pode ajudar a identificar as componentes.

A figura abaixo mostra o gráfico da ACF da série AirPassengers.

Nota-se que nos lags menores, a autocorrelação é alta, e vai diminuindo conforme aumentam-se os lags. Isto é típico de séries com forte padrão de tendência. Além disso, há elevações periódicas do valor da autocorrelação em alguns lags. Isto é comum em séries com variações sazonais. Portanto, isto sugere que a série AirPassengers possui tendência e sazonalidade [3].

3.2 Simulação de valores ausentes

Como visto no gráfico, a série temporal AirPassengers não possui valores ausentes. Neste texto, foi simulada uma situação em que a série possua uma porcentagem de falhas igual a 25%. Ou seja, 25% das observações foram removidas de forma completamente aleatória.

Dada a porcentagem de falhas, calcula-se quantos valores serão removidos com base no tamanho da série. Como AirPassengers possui 144 observações, 25% de ausência de dados significa que 36 valores serão removidos aleatoriamente. Para isto, foi usada a função sample para sortear 36 números entre 1 e 144. Os números sorteados são os índices de AirPassengers que serão removidos, para se tornarem falhas. Por fim, cria-se uma nova variável igual a AirPassengers e atribui o valor NA nos índices sorteados. Como a simulação envolve aleatoriedade, foi definida uma semente geradora de números aleatórios para garantir a reprodutibilidade do código, usando a função set.seed. O código abaixo mostra como realizar esta simulação.

# Para garantir a reprodutibilidade deste código
set.seed(1)

# Número de observações (tamanho) da série
len <- length(AirPassengers)

# Porcentagem de falhas a ser simulada
perc <- 0.25

# Número de observações que de fato serão removidas
tot <- round(perc * len)

# Cria um vetor auxiliar com números de 1 a 'len'
index <- 1:len

# Seleciona aleatoriamente as posições cujas falhas serão criadas
na.index <- sample(index, size = tot)

# Copia a série para uma nova variável
na.AirPassengers <- AirPassengers

# Cria as falhas nas posições selecionadas aleatoriamente
na.AirPassengers[na.index] <- NA

# Visualiza a nova série com falhas
plot(na.AirPassengers, type = 'o', pch = 20)

Agora, a série temporal na.AirPassengers possui falhas e pode ser usada para a aplicação dos métodos de imputação. Os valores originais são conhecidos e estão armazenados na série AirPassengers.

3.3 Comparação dos resultados

Para comparar os métodos de imputação, foi usado o pacote imputeTS [4]. Os métodos da interpolação linear e por spline, médias móveis e imputação com decomposição STL foram usados para preencher as falhas da série na.AirPassengers.

Primeiramente, deve-se instalar e carregar o pacote no R.

install.packages(imputeTS)
library(imputeTS)

Em seguida, os métodos foram aplicados e o resultado da imputação de cada método foi armazenado em sua respectiva variável.

# Interpolação linear
imp.interp <- na_interpolation(na.AirPassengers)

# Interpolação por spline
imp.spline <- na_interpolation(na.AirPassengers, option = "spline")

# Imputação por médias móveis
imp.ma <- na_ma(na.AirPassengers)

# Imputação com decomposição STL
imp.seadec <- na_seadec(na.AirPassengers)

Finalmente, a partir dos valores originais da série AirPassengers e dos valores estimados por cada método para preencher a série na.AirPassengers, foi possível calcular o MSE.

# Função para calcular o MSE
mse <- function(previsto, original) {
  return(mean((previsto - original)^2))
}

# Calcula o MSE
mse.interp <- mse(imp.interp[na.index], AirPassengers[na.index])
mse.spline <- mse(imp.spline[na.index], AirPassengers[na.index])
mse.ma <- mse(imp.ma[na.index], AirPassengers[na.index])
mse.seadec <- mse(imp.seadec[na.index], AirPassengers[na.index])

Os resultados do MSE são mostrados na tabela abaixo.

##   interp   spline       ma   seadec
##  391.316 353.1816 642.5688 143.7929

Segundo o MSE, o método da imputação com decomposição STL obteve o melhor resultado, seguido pelos métodos da interpolação por spline, interpolação linear e médias móveis. Este resultado sugere que o método mais robusto, que usa a decomposição da série para a imputação, foi superior em relação aos outros métodos avaliados.

4 Considerações finais

Este texto comparou diferentes métodos de imputação de valores ausentes em séries temporais em linguagem R. Uma série temporal conhecida foi usada como caso de estudo. A simulação de valores ausentes realizada permitiu avaliar e comparar o desempenho dos métodos. O método mais robusto, que se baseia na decomposição da série temporal, mostrou o melhor resultado.

5 Referências

[1]
R. B. Cleveland, W. S. Cleveland, J. E. McRae, and I. Terpenning, STL: A seasonal-trend decomposition procedure based on loess,” Journal of Official Statistics, vol. 6, no. 1, pp. 3–33, 1990.
[2]
W. S. Cleveland and S. J. Devlin, “Locally weighted regression: An approach to regression analysis by local fitting,” Journal of the American statistical association, vol. 83, no. 403, pp. 596–610, 1988, doi: https://doi.org/10.1080/01621459.1988.10478639.
[3]
R. J. Hyndman and G. Athanasopoulos, Forecasting: Principles and practice. Melbourne, Australia: OTexts, 2018. Available: https://www.OTexts.com/fpp2
[4]
S. Moritz and T. Bartz-Beielstein, imputeTS: Time Series Missing Value Imputation in R,” The R Journal, vol. 9, no. 1, pp. 207–218, 2017, doi: https://doi.org/10.32614/RJ-2017-009.