12.14 Séries temporais não lineares
O enfoque será nos métodos apresentados na biblioteca tsDyn
(M. Stigler 2019), (Fabio Di Narzo, Aznarte, and Stigler 2024) que implementa modelos de séries temporais autorregressivas (AR) não lineares. Para uma introdução, veja a vinheta de tsDyn. Será utilizada a série temporal datasets::lynx
de números anuais de capturas de linces entre 1821 e 1934 no Canadá.
12.14.1 Análise exploratória
12.14.1.1 Relações bivariadas e trivariadas
A função tsDyn::autopairs()
mostra um gráfico de dispersão da série temporal \(x_t\) versus \(x_{t−lag}\).
par(mfrow=c(2,2))
autopairs(x, type = 'regression')
autopairs(x, lag = 2, type = 'regression')
autopairs(x, lag = 3, type = 'regression')
autopairs(x, lag = 4, type = 'regression')
A função tsDyn::autotriples()
apresenta \(x_t\) versus \((x_{t−lag1},x_{t−lag2})\).
12.14.1.2 Linearidade
A função tsDyn::llar()
(locally linear autoregressive fit) implementa o gráfico de ajuste autorregressivo linear local proposto por (Casdagli 1992). Este gráfico exibe o erro relativo feito pela previsão de valores de série temporal com modelos lineares de dimensão \(m\) e atraso de tempo \(d\) na forma
\[\begin{equation} y_{t+s} = \phi_0 + \phi_1 y_t + \ldots + \phi_m y_{t-(m-1)d} \tag{12.41} \end{equation}\]
estimado em pontos na esfera de raio \(\varepsilon\) ao redor de \(y_t^m\) para um intervalo de valores de \(\varepsilon\). Um mínimo atingido em valores relativamente pequenos de \(\varepsilon\) pode indicar que um modelo linear global seria inapropriado para a aproximação da dinâmica da série temporal.
12.14.1.3 Teste BDS
It is well known that processes which are linearly independent, i.e. with zero autocorrelations at all lags, can exhibit higher order dependence or nonlinear dependence. (Manzan 2003, 17)
O teste de não linearidade BDS foi desenvolvido por William Brock, W. Davis Dechert e José Alexandre Scheinkman em 1987, publicado posteriormente por (Brock et al. 1996). A proposta é calcular a estatística de teste BDS sob a hipótese nula de que a série temporal testada é uma sequência de variáveis aleatórias iid.
O teste está implementado na função fNonlinear::bdsTest()
(Wuertz, Setz, and Chalabi 2024).
Exemplo 12.25 Adapatado de (Tsay and Chen 2019, 20–24) e da documentação de fNonlinear::bdsTest()
.
##
## Title:
## BDS Test
##
## Test Results:
## PARAMETER:
## Max Embedding Dimension: 3
## eps[1]: 0.45
## eps[2]: 0.9
## eps[3]: 1.35
## eps[4]: 1.8
## STATISTIC:
## eps[1] m=2: -1.1487
## eps[1] m=3: -3.1486
## eps[2] m=2: -2.1158
## eps[2] m=3: -2.3245
## eps[3] m=2: -2.2512
## eps[3] m=3: -2.4027
## eps[4] m=2: -2.1239
## eps[4] m=3: -2.1362
## P VALUE:
## eps[1] m=2: 0.2507
## eps[1] m=3: 0.001641
## eps[2] m=2: 0.03436
## eps[2] m=3: 0.0201
## eps[3] m=2: 0.02437
## eps[3] m=3: 0.01627
## eps[4] m=2: 0.03368
## eps[4] m=3: 0.03266
##
## Description:
## Wed Nov 13 16:56:55 2024 by user:
##
## Title:
## BDS Test
##
## Test Results:
## PARAMETER:
## Max Embedding Dimension: 3
## eps[1]: 0.279
## eps[2]: 0.558
## eps[3]: 0.838
## eps[4]: 1.117
## STATISTIC:
## eps[1] m=2: 51.4822
## eps[1] m=3: 82.9787
## eps[2] m=2: 32.0318
## eps[2] m=3: 38.6321
## eps[3] m=2: 20.7438
## eps[3] m=3: 19.3338
## eps[4] m=2: 16.4341
## eps[4] m=3: 14.3115
## P VALUE:
## eps[1] m=2: < 2.2e-16
## eps[1] m=3: < 2.2e-16
## eps[2] m=2: < 2.2e-16
## eps[2] m=3: < 2.2e-16
## eps[3] m=2: < 2.2e-16
## eps[3] m=3: < 2.2e-16
## eps[4] m=2: < 2.2e-16
## eps[4] m=3: < 2.2e-16
##
## Description:
## Wed Nov 13 16:56:55 2024 by user:
O teste BDS também está implementado na função tseries::bds.test()
(Trapletti and Hornik 2024).
##
## BDS Test
##
## data: rnorm(length(lynx))
##
## Embedding dimension = 2 3
##
## Epsilon for close points = 0.45 0.90 1.35 1.80
##
## Standard Normal =
## [ 0.45 ] [ 0.9 ] [ 1.35 ] [ 1.8 ]
## [ 2 ] -1.1487 -2.1158 -2.2512 -2.1239
## [ 3 ] -3.1486 -2.3245 -2.4027 -2.1362
##
## p-value =
## [ 0.45 ] [ 0.9 ] [ 1.35 ] [ 1.8 ]
## [ 2 ] 0.2507 0.0344 0.0244 0.0337
## [ 3 ] 0.0016 0.0201 0.0163 0.0327
##
## BDS Test
##
## data: log10(lynx)
##
## Embedding dimension = 2 3
##
## Epsilon for close points = 0.2792 0.5584 0.8376 1.1168
##
## Standard Normal =
## [ 0.2792 ] [ 0.5584 ] [ 0.8376 ] [ 1.1168 ]
## [ 2 ] 51.4822 32.0318 20.7438 16.4341
## [ 3 ] 82.9787 38.6321 19.3338 14.3115
##
## p-value =
## [ 0.2792 ] [ 0.5584 ] [ 0.8376 ] [ 1.1168 ]
## [ 2 ] 0 0 0 0
## [ 3 ] 0 0 0 0
12.14.2 Modelo autorregressivo não linear
Seja o processo estocástico a tempo discreto \(Y_t\) gerado pelo mapeamento \[\begin{equation} Y_{t+s} = f(Y_t,Y_{t-d},\ldots,Y_{t-(m-1)d}|\theta) + a_{t+s} \tag{12.42} \end{equation}\] onde \(a_t \sim WN(0,\sigma_a)\), \(a_{t+s} \perp\!\!\!\perp Y_{t+s}\) e \(f\) é uma função genérica de \(\mathcal{R}^m\) em \(\mathcal{R}\). Esta classe de modelos é frequentemente referenciada na literatura com a sigla NLAR\((m)\), que significa Não Linear AutoRegressivo de ordem \(m\).
A dimensão de incorporação \(m\) em séries temporais é o comprimento do vetor usado para reconstruir o espaço de estados (ou espaço de fase) sucessivo de um processo, que mostra as características dinâmicas de uma série temporal. Conforme (Tsay and Chen 2019, 22), considerando \(m\) um inteiro positivo define-se uma \(m\)-história (\(m\)-history) de uma série temporal como \[\begin{equation} \boldsymbol{y}_t^m = (y_t, y_{t−1}, \ldots, y_{t−m+1}) \text{ para } t = m, \ldots, T. \tag{12.42} \end{equation}\]
A função tsDyn::availableModels()
retorna a lista de modelos de séries temporais da classe nlar
disponíveis.
## [1] "linear" "nnetTs" "setar" "lstar" "star" "aar" "lineVar" "VECM" "TVAR"
## [10] "TVECM"
Modelo | Equação |
---|---|
linear |
\[Y_{t+s} = \phi + \phi_0 Y_t + \phi_1 Y_{t-d} + \ldots + \phi_m Y_{t-(m-1)d} + a_{t+s}\] |
nnetTs |
\[Y_{t+s} = \beta_0 + \sum_{j=1}^{D} \beta_j g(\gamma_{0j} + \sum_{i=1}^{m} \gamma_{ij} Y_{t-(i-1)d})\] |
setar |
\[Y_{t+s} = \left\{ \begin{array}{l l} \phi_1 + \phi_{10}Y_t + \phi_{11}Y_{t-d} + \ldots + \phi_{1L}Y_{t-(L-1)d} + a_{t+s}, & \quad Z_t \le th\\ \phi_2 + \phi_{20}Y_t + \phi_{21}Y_{t-d} + \ldots + \phi_{2H}Y_{t-(H-1)d} + a_{t+s}, & \quad Z_t < th\\ \end{array} \right. \] |
lstar |
\[Y_{t+s} = (\phi_1 + \phi_{10}Y_t + \phi_{11}Y_{t-d} + \ldots + \phi_{1L}Y_{t-(L-1)d})(1-G(Z_t,\gamma,th)) + \\ + (\phi_2 + \phi_{20}Y_t + \phi_{21}Y_{t-d} + \ldots + \phi_{2H}Y_{t-(H-1)d})G(Z_t,\gamma,th) + a_{t+s} \] |
star |
|
aar |
\[Y_{t+s} = \mu + \sum_{i=1}^{m} s_i(Y_{t-(i-1)d})\] |
lineVar |
|
VECM |
|
TVAR |
|
TVECM |
- \(m\): dimensão de incorporação (embedding dimension), AR\((p-1)\)?
- \(d\): atraso de tempo (time delay), equivale à diferença sazonal \(D\)?
- \(s\): passos de previsão (forecasting steps)
- \(Z_t\): variável limite (threshold variable)
- \(th\): limite (threshold)
- \(D\): unidades ocultas (hidden units)
- \(g\): função de ativação (activation function)
- \(G\): função logística (logistic function)
- \(\delta\): limite de atraso (threshold delay)
12.14.2.1 Rede neural autorregressiva
De acordo com (Rob J. Hyndman and Athanasopoulos 2021), a função forecast::nnetar()
ajusta um modelo NNAR\((p,P,k)_m\), que é análogo a um modelo ARIMA\((p,0,0)(P,0,0)_m\) com funções não lineares, onde \(k\) é o número de nós ocultos. Segundo a documentação, o argumento xreg
permite a entrada de covariáveis, omitindo-se as linhas correspondentes a y
e xreg
se houver valores ausentes. A rede é treinada para previsão de uma etapa, e previsões de várias etapas são calculadas recursivamente.
Se os valores de \(p\) e \(P\) não forem especificados, eles serão selecionados automaticamente. Para séries temporais não sazonais, o padrão é o número ótimo de defasagens de acordo com o AIC para um modelo AR\((p)\) linear. Para séries temporais sazonais, os valores padrão são \(P=1\) e \(p\) é escolhido do modelo linear ótimo ajustado aos dados ajustados sazonalmente. Se \(k\) não for especificado, ele será definido como \(k=(p+P+1)/2\) arredondado para o inteiro mais próximo.
Exemplos, sendo que os modelos de rede neural não possuem as restrições nos parâmetros para garantir a estacionariedade.
- NNAR\((p,0) \equiv\) ARIMA\((p,0,0)\)
- NNAR\((p,P,0)_m \equiv\) ARIMA\((p,0,0)(P,0,0)_m\)
Exemplo 12.26 Aplicação de forecast::nnetar()
na série temporal datasets::lynx
.
Pode-se usar a estratégia treino-teste e calcular métricas de desempenho de previsão.
library(forecast)
fit <- forecast::nnetar(window(lynx, end=1913))
plot(forecast(fit, h=24))
lines(lynx)
## ME RMSE MAE MPE MAPE MASE ACF1
## Training set 0.1280555 278.9293 186.8424 -32.64067 44.75747 0.2174152 -0.1422465
Exercício 12.31
- Teste
plot(predict(fit, h = 48, PI = TRUE))
. - Veja https://otexts.com/fpp3/nnetar.html
12.14.2.2 LSTM (Long Short-Term Memory)
O modelo LSTM (Long Short-Term Memory) é uma arquitetura baseada em Rede Neural Recorrente (RNN) utilizada para previsão de séries temporais. Será considera a abordagem da biblioteca TSLSTM (Dr. R. K. Paul and Yeasin 2022), que utiliza os módulos Keras e TensorFlow (R. K. Paul and Garai 2021).
Exemplo 12.27 Adaptado da documentação de TSLSTMplus::ts.lstm()
.
library(TSLSTMplus)
fit_lstm <- TSLSTMplus::ts.lstm(ts = lynx, tsLag = 2,
LSTMUnits = 5, Epochs = 2)
## Model: "sequential"
## _______________________________________________________________________________________________________
## Layer (type) Output Shape Param #
## =======================================================================================================
## lstm (LSTM) (1, 5) 140
## dense (Dense) (1, 1) 6
## =======================================================================================================
## Total params: 146 (584.00 Byte)
## Trainable params: 146 (584.00 Byte)
## Non-trainable params: 0 (0.00 Byte)
## _______________________________________________________________________________________________________
## Epoch 1/2
## 100/100 - 1s - loss: 1.1865 - mae: 0.8777 - val_loss: 0.5305 - val_mae: 0.6156 - 1s/epoch - 15ms/step
## Epoch 2/2
## 100/100 - 0s - loss: 1.1180 - mae: 0.8480 - val_loss: 0.5123 - val_mae: 0.5980 - 223ms/epoch - 2ms/step
# Optimizer = 'tf.keras.optimizers.legacy.RMSprop')
current_values <- stats::predict(fit_lstm, ts = lynx)
## 4/4 - 0s - 249ms/epoch - 62ms/step
## 1/1 - 0s - 10ms/epoch - 10ms/step
## 1/1 - 0s - 9ms/epoch - 9ms/step
## 1/1 - 0s - 9ms/epoch - 9ms/step
## 1/1 - 0s - 9ms/epoch - 9ms/step
## 1/1 - 0s - 10ms/epoch - 10ms/step
## 1/1 - 0s - 9ms/epoch - 9ms/step
## 1/1 - 0s - 9ms/epoch - 9ms/step
## 1/1 - 0s - 9ms/epoch - 9ms/step
## 1/1 - 0s - 9ms/epoch - 9ms/step
## 1/1 - 0s - 9ms/epoch - 9ms/step
## 1/1 - 0s - 9ms/epoch - 9ms/step
## 1/1 - 0s - 10ms/epoch - 10ms/step
## 1/1 - 0s - 9ms/epoch - 9ms/step
## 1/1 - 0s - 10ms/epoch - 10ms/step
## 1/1 - 0s - 9ms/epoch - 9ms/step
## 1/1 - 0s - 9ms/epoch - 9ms/step
## 1/1 - 0s - 9ms/epoch - 9ms/step
## 1/1 - 0s - 9ms/epoch - 9ms/step
## 1/1 - 0s - 9ms/epoch - 9ms/step
## 1/1 - 0s - 9ms/epoch - 9ms/step
## 1/1 - 0s - 10ms/epoch - 10ms/step
## 1/1 - 0s - 9ms/epoch - 9ms/step
## 1/1 - 0s - 9ms/epoch - 9ms/step
## 1/1 - 0s - 8ms/epoch - 8ms/step
Exercício 12.32 Veja
?TSLSTMplus::ts.lstm
.- https://stackoverflow.com/questions/77222463/is-there-a-way-to-change-adam-to-legacy-when-using-mac-m1-m2-in-tensorflow
- WARNING:absl:At this time, the v2.11+ optimizer
tf.keras.optimizers.RMSprop
runs slowly on M1/M2 Macs, please use the legacy Keras optimizer instead, located attf.keras.optimizers.legacy.RMSprop
.