Monitores: Victor Andrade Medeiros e Josué de Meneses Lopes
Atualização: 18.02.2025
Introdução
Uma série temporal é caracterizada por um conjunto de observações ordenadas ao longo do tempo. Modelos tradicionais de análise de regressão geralmente apresentam um método de estimação que relaciona duas ou mais variáveis. Estes modelos são construídos por meio de uma equação ou de modelos mais complexos que exigem equações múltiplas simultâneas.
Modelos de séries temporais se diferenciam de tais modelos tradicionais, pois sua estimação está baseada no comportamento da própria variável em estudo (distribuída no tempo) e não se relaciona com nenhuma outra variável a não ser o tempo. Assim, a análise de séries temporais leva em consideração a forte relação das observações e dos erros ao longo do tempo. Entretanto, a série geralmente é caracterizada pela violação do pressuposto de não autocorrelação. As variáveis e os resíduos não são independentes ao longo do tempo.
Os objetivos traçados para os modelos de análise de séries temporais são quatro:
Descrever um comportamento de uma série (tendência, variações sazonais, movimentos cíclicos);
Investigar o mecanismo gerador da série temporal;
Fazer previsões de valores futuros da série;
Procurar periodicidades relevantes nos dados.
Em síntese, os modelos são construídos com o intuito de atingir esses quatro objetivos. Espera-se que estes sejam simples e parcimoniosos (o número de parâmetros envolvidos deva ser o menor possível).
Uma das suposições mais frequentes que se faz a respeito de uma série temporal é a de que ela seja estacionária, ou seja, se desenvolva no tempo em torno de uma média constante, refletindo alguma forma de equilíbrio estável. Entretanto, a maioria das séries (principalmente as econômicas) apresenta um sinal de tendência. Isto pode ser observado pelos gráficos dos dados originais (é importante sempre examinar o gráfico antes de proceder ao processo de identificação do modelo).
Uma vez o modelo estudado possibilite a identificação, parte-se para a sua estimação. Em geral, a escolha do melhor modelo passa pelos seguintes critérios, conforme salienta Pankratz (1995):
Um bom modelo é parcimonioso;
Um bom modelo é estacionário (média e variância constantes);
Um bom modelo é invertível;
Um bom modelo deve ter coeficientes estimados com alta qualidade estatística, ou seja, tenham coeficientes estatisticamente significativos (\(t\) maior que \(\pm 1,96\)) ao nível de 5,00%;
Um bom modelo tem resíduos estatisticamente independentes, ou seja, os choques aleatórios são independentes no processo, analisados a partir dos testes de qui-quadrado;
Um bom modelo apresenta o erro quadrado médio e o percentual de erros médios absolutos mínimos;
Por fim, um bom modelo tem erros médios pequenos nas previsões (ex-post e ex-ante).
Na prática, nosso critério de escolha inicia-se pelas estatísticas t-student dos coeficientes do AR e MA; pela análise dos resíduos do modelo estimado (teste de \(Q\)); e também pelos critérios de parcimônia de Akaike Information Criteria (AIC) e de Critério de Informação Bayesiano (BIC) sugerido por Schwarz. Para os modelos SARIMA, o critério de escolha segue os mesmos padrões que os modelos não sazonais, entretanto, deve-se tomar cuidado com o padrão de repetição sazonal de uma série.
1. Estacionariedade
O primeiro passo para o trabalho em modelos da família Box-Jenkins está na verificação da estacionariedade dos dados observados (acucar.txt).
Admita a seguinte base de dados, denominada de acucar.txt:
A Figura 1 da cotação (em US$) internacional do açúcar apresenta algumas irregularidades. No início, há uma grande variação em torno de uma média, depois, ao longo do tempo, vai se dissipando. O gráfico, em geral, deixa a dúvida quanto à estacionariedade, pois a variância ao longo do tempo não parece ser constante. Dividindo-se a série em três etapas, verifica-se uma tendência para baixo até 1985, depois uma mudança na tendência para cima até 1990 e, finalmente, uma estabilização na tendência até o fim da série.
Código
# Carregar o arquivo de dados, considerando que a primeira linha é o nome da colunadados_acucar <-read.table("acucar.txt", header =TRUE, stringsAsFactors =FALSE)# Verificar as primeiras linhas do arquivo para entender a estruturahead(dados_acucar)
# Criar uma sequência de datas para as cotações, assumindo que são mensais de 1981:1 até 1994:1datas <-seq(from =as.Date("1981-01-01"), to =as.Date("1994-01-01"), by ="month")# Verificar o número de linhas em ambos os vetoreslength(datas)
[1] 157
Código
nrow(dados_acucar)
[1] 157
Código
# Ajustar o tamanho da sequência de datas ou do vetor de cotações, se necessárioif(length(datas) !=nrow(dados_acucar)) { datas <- datas[1:min(length(datas), nrow(dados_acucar))]}# Adicionar as datas ao dataframe e converter as cotações para numéricodados_acucar$Data <- datasnames(dados_acucar) <-c("Cotacao", "Data") # Ajustar o nome das colunas se necessário# Verificar se os dados estão corretoshead(dados_acucar)
# Plotar a série temporal da cotação do açúcarplot(dados_acucar$Data, dados_acucar$Cotacao, type ="l",main ="Cotação Internacional do Açúcar (1981:1-1994:1)",xlab ="Período", ylab ="Cotação (Cts/lb)",col ="blue")
Gráfico 1: Cotação Internacional do Açúcar - 1981:1-1994:1 - Cts/lb
A dúvida na inspeção gráfica sugere que é necessário examinar outras estratégias para testar a estacionariedade, tais como o correlograma da função de autocorrelação e o teste de Q. Se a dúvida persistir, recomenda-se realizar testes mais formais, como os testes de raiz unitária, para obter uma análise mais precisa da estabilidade da série. Entre os testes de raiz unitária, podemos utilizar:
Dickey-Fuller (DF e ADF): Testes que verificam a presença de uma raiz unitária em séries temporais.
Phillips-Perron (PP): Teste que ajusta os erros de heterocedasticidade e autocorrelação para detectar a raiz unitária.
Kwiatkowski-Phillips-Schmidt-Shin (KPSS): Teste que avalia se a série é estacionária em torno de uma média ou tendência.
Assim, processos estacionários apresentam média e variância constantes no tempo e o valor da covariância entre dois períodos depende somente da distância (ou LAG) entre dois períodos. Em outras palavras, uma série estacionária não apresenta mudança sistemática na média e na variância. As condições para que isso ocorra são:
\[3. \quad Cov(y_t, y_{t-s}) = Cov(y_t, y_{t+s}), \quad s = 1, 2, \dots, n. \quad \forall \quad t\]
O primeiro passo é obter a estatística descritiva da série, para fins exploratórios.
O segundo passo é verificar se a série tem distribuição normal.
A condição de estacionariedade geralmente é verificada por meio da função de autocorrelação (FAC). O procedimento inicial em uma série temporal é exatamente verificar essa condição. Quando uma série apresenta um comportamento tendencioso, faz-se uso da FAC para constatar a estacionariedade da série. A FAC nos mostra se as observações são invariantes por translações no tempo, ou seja, se os LAGs são ou não constantes e se \(y_t\) e \(y_{t+k}\) se tornam independentes quando as observações (\(k\)) vão se afastando umas das outras.
\[
\rho_k = \frac{Cov(y_t, y_{t+k})}{Var(y_t)}
\] onde \(\rho_k\) é o coeficiente de autocorrelação no lag \(k\), \(Cov(y_t, y_{t+k})\) é a covariância entre \(y_t\) e \(y_{t+k}\), e \(Var(y_t)\) é a variância de \(y_t\).
Depois de calculada a FAC, apresenta-se graficamente o correlograma, observando se os valores de \(k\) caem abruptamente (sugerindo uma série estacionária) ou caem lentamente (sugerindo uma série não estacionária).
O correlograma, juntamente com o teste de Bartlett, pode ser obtido da seguinte forma:
Código
# Pacote necessáriolibrary(forecast)# Calcular o correlograma com 36 defasagensacf_resultado <-acf(dados_acucar$Cotacao, lag.max =36, main ="Correlograma da Cotação do Açúcar")
Gráfico 2: Correlograma para Cotação Internacional do Açúcar - 1981:1-1994:1 - Cts/lb
Pela função de autocorrelação calculada (FAC) e apresentada por meio de um correlograma, observa-se que os valores calculados estão caindo lentamente ao longo das defasagens. Os testes de Bartlett são evidenciados no próprio correlograma. Se a série temporal é gerada por um processo ruído branco, os coeficientes de autocorrelação amostral são normalmente distribuídos com média zero e desvio padrão, definido da seguinte forma:
onde: - \(S(\rho_k)\) é o desvio padrão dos coeficientes de autocorrelação amostral, - \(n\) é o número de observações, - \((\rho_j)\) é o coeficiente de autocorrelação na defasagem \(j\).
Assim, testa-se a hipótese nula, \(H_0 : \rho_1 = \rho_2 = \dots = 0\) (ou seja, há ruído branco e a série é estacionária), contra a hipótese alternativa, \(H_1 : \rho_k \ne 0\) (a série tem características de passeio aleatório e, portanto, não é estacionária). Utiliza-se a estatística t-student.
Alternativamente, usa-se o intervalo de confiança de 1,96 DP (com 95,00% de probabilidade) para uma visão gráfica associada ao correlograma. Intuitivamente, observe se os \(\rho_k\) (correlações) estiverem fora deste intervalo e estiverem caindo lentamente; a série é considerada não estacionária.
Para certificar-se, há também o teste conjunto das correlações. Este teste é dado pela estatística \(Q\) de Box-Pierce, que tem distribuição Qui-Quadrado, conforme:
\[Q = n \sum_{k=1}^{m} \rho_k^2\]
Pelas estatísticas de Bartlett, há alguns \(\rho_k\) fora do intervalo de confiança e, pela estatística de Box-Pierce (\(Q\)), o valor das oito primeiras defasagens é de \(Q = 531,9329\), superior ao valor crítico da Tabela de Qui-Quadrado, que é de \(14,45\) com \(96,00\%\) de probabilidade. Neste caso, rejeita-se a hipótese nula de que os \(\rho_k\) sejam zero, confirmando o teste de Bartlett individual. Para estes dois testes, há forte evidência de que a série é não estacionária.
Mas para ser mais preciso na identificação, deve-se produzir outro teste de não estacionariedade. A decisão pode ser melhor definida utilizando o teste de Dickey-Fuller Ampliado (ADF). Quando as raízes da equação característica apresentam valores próximos à unidade, a análise pela Função de Autocorrelação (FAC) pode ser falha. Por isso, recomenda-se que se utilize o teste estatístico de Raiz Unitária.
Formalmente deseja-se testar a hipótese nula de não estacionariedade contra a hipótese alternativa de série estacionária. Comparando o valor do \(t\) com o \(\varphi\) da tabela de Dickey-Fuller (\(-3,99\)), observa-se que o valor de \(-5,926\) está na região da hipótese alternativa, ou seja, de que a série é estacionária (é gerada por um processo ruído branco). Assim, uma vez levantada alguma dúvida sobre a observação da função de autocorrelação, recorre-se ao teste de Dickey-Fuller para precisar o comportamento dos dados.
No mesmo caso, o modelo de preço internacional do açúcar, pelo teste da FAC, tem evidência de um modelo não estacionário e, por isso, é preciso diferenciar a série em pelo menos uma vez, devido à mudança de inclinação da tendência. Por outro lado, pode-se estar diante de uma série estacionária com uma ou mais raízes da equação característica próximas do valor unitário, isto é, o teste de Dickey-Fuller mostra evidências de um modelo com raízes não unitárias.
Os modelos ARIMA serão capazes de descrever de maneira satisfatória séries estacionárias e não estacionárias (homogêneas) que não apresentem comportamento explosivo. Este tipo de não estacionariedade, chamado de homogêneas, pode ser transformado em estacionária (ARMA) por meio de diferenciações.
2. Identificação ARMA (p,q)
A função de autocorrelação e a função de autocorrelação parcial (FACP) serão usadas para identificar um modelo autoregressivo (AR) e um modelo de médias móveis (MA), isto é, definir o número de defasagens que uma série apresenta.
Admita, primeiro, um modelo de médias móveis MA(q), onde cada observação é gerada por uma média ponderada dos termos de erros defasados em (q) períodos, com a seguinte denominação:
A função de autocorrelação (FAC) nos dá um indicativo da ordem do modelo MA\((q)\), ou seja, a hipótese de erro passado que influencia significativamente na composição da série temporal.
Além do modelo MA\((q)\), tem-se o modelo AR\((p)\), onde a observação corrente é gerada por uma média ponderada de observações passadas defasadas em \((p)\) períodos mais um termo de erro aleatório do período corrente, definido da seguinte forma:
Neste caso, para definir a ordem de \((p)\), utiliza-se a função de autocorrelação parcial (FACP).
Enfim, o objetivo da identificação é determinar os valores \((p,d,q)\) do modelo ARIMA, além de estimativas preliminares dos parâmetros a serem usados no estágio de estimação. Segundo Moretin (1985), o procedimento de identificação consiste em duas partes:
Diferenciar a série \(Z_t\), tantas vezes quanto necessário, para se obter uma série estacionária, de modo que o processo seja reduzido a um ARMA\((p,q)\). O número de diferenças necessárias \((d)\) para que o processo se torne estacionário é alcançado quando a FAC amostral decresce rapidamente para zero;
Identificar o processo ARMA\((p,q)\) resultante, através da análise das autocorrelações e autocorrelações parciais. Pode-se verificar os gráficos das séries e das diferenças, suas médias e variâncias, suas autocorrelações e seus correlogramas com os respectivos intervalos de confiança.
Para calcular o ACF e PACF o seguinte comando deverá ser digitado:
Código
# Calcular a primeira diferença da variável 'Cotacao'diff_cotacao <-diff(dados_acucar$Cotacao, differences =1)# Criar um dataframe novo para armazenar as diferençasdados_acucar_diff <-data.frame(Data = dados_acucar$Data[-1], # Remover a primeira data, pois há uma menos após a diferençaDiff_Cotacao = diff_cotacao)# Verificar as primeiras linhas do novo dataframehead(dados_acucar_diff)
# Configurar o layout para dois gráficos lado a ladopar(mfrow =c(1, 2))# Plotar a Função de Autocorrelação (FAC) da série diferenciadaacf(dados_acucar_diff$Diff_Cotacao, lag.max =36, main ="Função de Autocorrelação (FAC)")# Plotar a Função de Autocorrelação Parcial (FACP) da série diferenciadapacf(dados_acucar_diff$Diff_Cotacao, lag.max =36, main ="Função de Autocorrelação Parcial (FACP)")
Gráfico 3: FACP e FAC da Série com Primeira diferença
Código
# Resetar o layout para o padrãopar(mfrow =c(1, 1))
Observa-se que, pela função de autocorrelação, a série de preços internacional da cana-de-açúcar representa dois componentes fora do intervalo de confiança, MA(2). Já pela função de autocorrelação parcial, há apenas um valor de \(\rho_k\) fora do intervalo. Neste caso, há evidência de um modelo AR(1), utilizando-se, dessa forma, os possíveis modelos:
ARIMA(1,1,2)
ARIMA(1,1,1)
ARIMA(0,1,2)
ARIMA(0,1,1)
ARIMA(1,1,0)
3. Estimação
Os modelos que são estimados seguem o critério de obtenção dos resíduos ruído branco. Neste caso, efetua-se uma análise gráfica dos resíduos. Caso esses resíduos sejam ruído branco, todos os \(\rho_k\) calculados estão dentro do intervalo de confiança do correlograma selecionado pelos testes de Box-Pierce. O procedimento do teste de \(Q\) vem confirmar a análise gráfica dos correlogramas dos resíduos. Os modelos apresentados aqui serão os modelos que melhor se ajustaram aos dados, observados pelos critérios estatísticos.
ARIMA(1,1,2)
ARIMA(1,1,1)
ARIMA(0,1,2)
ARIMA(1,1,0)
ARIMA(0,1,1)
Além destes modelos que foram identificados pelo processo de autocorrelação com uma diferença, pode-se ampliar essa modelagem para uma possível série estacionária. Segundo Moretin (1985), na maioria dos casos, \(d = 1\) ou \(d = 2\) são suficientes para tornar a série estacionária, principalmente quando ocorrer:
A série não estacionária quanto ao nível, oscilam ao redor de um nível médio durante algum tempo e depois saltam para outro nível temporário e, para torná-la estacionária, é suficiente tomar apenas uma diferença;
Série não estacionária quanto à inclinação, oscilam numa direção por algum tempo e depois mudam para outra direção, temporariamente. Para torná-la estacionária, é necessário tomar a segunda diferença.
Pelas simulações efetuadas, os modelos abaixo podem também ter uma importância para o processo e, por isso, serão também considerados:
ARIMA(1,2,2)
ARIMA(1,2,1)
ARIMA(0,2,2)
ARIMA(1,2,0)
ARIMA(0,2,1)
3.1. Tabela - Resumo dos Modelos
Código
# Estimar os modelos ARIMAmodelos <-list(ARIMA_1_1_2 =arima(dados_acucar$Cotacao, order =c(1, 1, 2)),ARIMA_1_1_1 =arima(dados_acucar$Cotacao, order =c(1, 1, 1)),ARIMA_0_1_2 =arima(dados_acucar$Cotacao, order =c(0, 1, 2)),ARIMA_1_1_0 =arima(dados_acucar$Cotacao, order =c(1, 1, 0)),ARIMA_0_1_1 =arima(dados_acucar$Cotacao, order =c(0, 1, 1)),ARIMA_1_2_2 =arima(dados_acucar$Cotacao, order =c(1, 2, 2)),ARIMA_1_2_1 =arima(dados_acucar$Cotacao, order =c(1, 2, 1)),ARIMA_0_2_2 =arima(dados_acucar$Cotacao, order =c(0, 2, 2)),ARIMA_1_2_0 =arima(dados_acucar$Cotacao, order =c(1, 2, 0)),ARIMA_0_2_1 =arima(dados_acucar$Cotacao, order =c(0, 2, 1)))# Resumo dos modelosmodelos_resumo <-lapply(modelos, summary)# Comparar os modelos usando o critério AICaic_values <-sapply(modelos, AIC)# Comparar os modelos usando o critério BICbic_values <-sapply(modelos, BIC)# Função para realizar o teste de Box-Pierce Q(16)test_residuos <-function(modelo) { residuos <-residuals(modelo) bp_test <-Box.test(residuos, lag =16, type ="Ljung-Box")return(bp_test)}# Aplicar o teste a todos os modelostestes_residuos <-lapply(modelos, test_residuos)# Função para calcular estatísticas de Box-Piercecalcular_q_pvalor <-function(modelo, lag_max =16) { residuos <- modelo$residuals teste_q <-Box.test(residuos, lag = lag_max, type ="Ljung-Box")c(Q = teste_q$statistic, p_value = teste_q$p.value)}# Calcular estatísticas e armazenar em data frameresultados <-as.data.frame(t(sapply(modelos, function(modelo) {c(AIC =AIC(modelo),BIC =BIC(modelo),calcular_q_pvalor(modelo) ) })))# Adicionar nomes das linhas (modelos)rownames(resultados) <-names(modelos)# Exibir a tabelaprint(resultados)
De acordo com o resumo dos modelos ARIMA estimados, vários deles se mostram adequados do ponto de vista estatístico. Para avançar na seleção do modelo, é necessário utilizar o critério de previsão ex-post. Este critério avalia a abertura dos intervalos de confiança e a variância dos erros (one-step-ahead).
O melhor modelo, de acordo com o critério de previsão ex-post, é o ARIMA(1,2,1). Este modelo apresenta a menor variância entre todos os modelos selecionados e proporciona previsões das 6 últimas observações bastante precisas. Além disso, o modelo ARIMA(1,2,1) exibe um dos menores valores de AIC quando comparado com os outros modelos, o que reforça o princípio da parcimônia. A análise da estatística \(Q\) de Box-Pierce também confirma a não rejeição da hipótese nula de estacionariedade dos resíduos. Por esses motivos, o modelo ARIMA(1,2,1) foi escolhido para as previsões ex-ante, demonstrando que, com duas diferenças, o modelo se adapta melhor aos dados previstos em comparação aos dados observados.
Código
# Supondo que o modelo ARIMA(1,2,1) já esteja estimado e armazenado em 'modelo_arima121'modelo_arima121 <-arima(dados_acucar$Cotacao, order =c(1, 2, 1))# Obter os resíduos do modeloresiduos_arima121 <-residuals(modelo_arima121)# Plotar os resíduosplot(residuos_arima121, type ="l", main ="Resíduos do Modelo ARIMA(1,2,1)", ylab ="Resíduos")
Código
# Plotar a Função de Autocorrelação (FAC) dos resíduosacf(residuos_arima121, main ="Função de Autocorrelação (FAC) dos Resíduos")
Código
# Plotar a Função de Autocorrelação Parcial (FACP) dos resíduospacf(residuos_arima121, main ="Função de Autocorrelação Parcial (FACP) dos Resíduos")
Considerando que um modelo matemático deve descrever o sistema de maneira parcimoniosa, ou seja, sua forma funcional deve ser simples e o número de parâmetros deve ser o mínimo necessário, optou-se pelo modelo ARIMA(1,2,1). Este modelo atende ao critério de simplicidade, oferecendo um bom equilíbrio entre a complexidade e a capacidade de descrever o comportamento da série temporal de maneira eficaz.
5. Previsão
Dessa forma, a previs~ao do modelo Box-Jenkins seis passos há frente e o gráfico da série estimada pelo modelo ARIMA (1,2,1) estão apresentados abaixo, respectivamente.
Código
# Transformar os dados em uma série temporal# Supondo que a série começa em 1981 e tem frequência anualdados_acucar_ts <-ts(dados_acucar$Cotacao, start =c(1981, 1), frequency =12) # Frequência mensal# Ajustar o modelo ARIMA(1,2,1) com a série temporalmodelo_arima121 <-arima(dados_acucar_ts, order =c(1, 2, 1))# Fazer previsões para os próximos 6 períodosprevisao <-forecast(modelo_arima121, h =6)# Plotar a série original e as previsões, com os anos no eixo xplot(previsao, main ="Previsão do Modelo ARIMA(1,2,1)", ylab ="Cotação", xlab ="Ano")# Adicionar a série original ao gráficolines(dados_acucar_ts, col ="blue")# Adicionar uma legendalegend("topleft", legend =c("Série Original", "Previsões"), col =c("blue", "black"), lty =1)