Previsão de séries temporais R com rede neural, auto.arima e ets

10

Ouvi falar um pouco sobre o uso de redes neurais para prever séries temporais.

Como posso comparar, qual método para prever minhas séries temporais (dados diários de varejo) é melhor: auto.arima (x), ets (x) ou nnetar (x).

Eu posso comparar auto.arima com ets por AIC ou BIC. Mas como posso compará-los com redes neurais?

Por exemplo:

   > dput(x)
 c(1774, 1706, 1288, 1276, 2350, 1821, 1712, 1654, 1680, 1451, 
 1275, 2140, 1747, 1749, 1770, 1797, 1485, 1299, 2330, 1822, 1627, 
 1847, 1797, 1452, 1328, 2363, 1998, 1864, 2088, 2084, 594, 884, 
 1968, 1858, 1640, 1823, 1938, 1490, 1312, 2312, 1937, 1617, 1643, 
 1468, 1381, 1276, 2228, 1756, 1465, 1716, 1601, 1340, 1192, 2231, 
 1768, 1623, 1444, 1575, 1375, 1267, 2475, 1630, 1505, 1810, 1601, 
 1123, 1324, 2245, 1844, 1613, 1710, 1546, 1290, 1366, 2427, 1783, 
 1588, 1505, 1398, 1226, 1321, 2299, 1047, 1735, 1633, 1508, 1323, 
 1317, 2323, 1826, 1615, 1750, 1572, 1273, 1365, 2373, 2074, 1809, 
 1889, 1521, 1314, 1512, 2462, 1836, 1750, 1808, 1585, 1387, 1428, 
 2176, 1732, 1752, 1665, 1425, 1028, 1194, 2159, 1840, 1684, 1711, 
 1653, 1360, 1422, 2328, 1798, 1723, 1827, 1499, 1289, 1476, 2219, 
 1824, 1606, 1627, 1459, 1324, 1354, 2150, 1728, 1743, 1697, 1511, 
 1285, 1426, 2076, 1792, 1519, 1478, 1191, 1122, 1241, 2105, 1818, 
 1599, 1663, 1319, 1219, 1452, 2091, 1771, 1710, 2000, 1518, 1479, 
 1586, 1848, 2113, 1648, 1542, 1220, 1299, 1452, 2290, 1944, 1701, 
 1709, 1462, 1312, 1365, 2326, 1971, 1709, 1700, 1687, 1493, 1523, 
 2382, 1938, 1658, 1713, 1525, 1413, 1363, 2349, 1923, 1726, 1862, 
 1686, 1534, 1280, 2233, 1733, 1520, 1537, 1569, 1367, 1129, 2024, 
 1645, 1510, 1469, 1533, 1281, 1212, 2099, 1769, 1684, 1842, 1654, 
 1369, 1353, 2415, 1948, 1841, 1928, 1790, 1547, 1465, 2260, 1895, 
 1700, 1838, 1614, 1528, 1268, 2192, 1705, 1494, 1697, 1588, 1324, 
 1193, 2049, 1672, 1801, 1487, 1319, 1289, 1302, 2316, 1945, 1771, 
 2027, 2053, 1639, 1372, 2198, 1692, 1546, 1809, 1787, 1360, 1182, 
 2157, 1690, 1494, 1731, 1633, 1299, 1291, 2164, 1667, 1535, 1822, 
 1813, 1510, 1396, 2308, 2110, 2128, 2316, 2249, 1789, 1886, 2463, 
 2257, 2212, 2608, 2284, 2034, 1996, 2686, 2459, 2340, 2383, 2507, 
 2304, 2740, 1869, 654, 1068, 1720, 1904, 1666, 1877, 2100, 504, 
 1482, 1686, 1707, 1306, 1417, 2135, 1787, 1675, 1934, 1931, 1456)

Usando auto.arima:

y=auto.arima(x)
plot(forecast(y,h=30))
points(1:length(x),fitted(y),type="l",col="green")

insira a descrição da imagem aqui

> summary(y)
Series: x 
ARIMA(5,1,5)                    

Coefficients:
         ar1      ar2     ar3      ar4      ar5      ma1     ma2      ma3     ma4      ma5
      0.2560  -1.0056  0.0716  -0.5516  -0.4822  -0.9584  1.2627  -1.0745  0.8545  -0.2819
s.e.  0.1014   0.0778  0.1296   0.0859   0.0844   0.1184  0.1322   0.1289  0.1388   0.0903

sigma^2 estimated as 58026:  log likelihood=-2191.97
AIC=4405.95   AICc=4406.81   BIC=4447.3

Training set error measures:
                   ME     RMSE      MAE       MPE     MAPE      MASE
Training set 1.457729 240.5059 173.9242 -2.312207 11.62531 0.6157512

Usando ets:

fit <- ets(x)
plot(forecast(fit,h=30))
points(1:length(x),fitted(fit),type="l",col="red")

insira a descrição da imagem aqui

 > summary(fit)
 ETS(M,N,N) 

 Call:
  ets(y = x) 

   Smoothing parameters:
     alpha = 0.0449 

   Initial states:
     l = 1689.128 

   sigma:  0.2094

      AIC     AICc      BIC 
 5570.373 5570.411 5577.897 

 Training set error measures:
                    ME     RMSE      MAE      MPE     MAPE      MASE
 Training set 7.842061 359.3611 276.4327 -4.81967 17.98136 0.9786665

Nesse caso, o auto.arima se encaixa melhor do que o ets.

Vamos tentar cantar rede neural:

 library(caret)
 fit <- nnetar(x)
 plot(forecast(fit,h=60))
 points(1:length(x),fitted(fit),type="l",col="green")

insira a descrição da imagem aqui

Pelo gráfico, posso ver, que o modelo de rede neural se encaixa muito bem, mas como posso compará-lo com o auto.arima / ets? Como posso calcular o AIC?

Outra pergunta é: como adicionar intervalo de confiança para a rede neural, se possível, como se fosse adicionado automaticamente para auto.arima / ets.?

Jurgita
fonte

Respostas:

14

Os ajustes dentro da amostra não são um guia confiável para a precisão da previsão fora da amostra. O padrão ouro na medição da precisão da previsão é usar uma amostra de validação. Remova os últimos 30 dias da amostra de treinamento, ajuste seus modelos ao restante dos dados, use os modelos adequados para prever a amostra de validação e simplesmente compare as precisões na validação, usando Desvios Absolutos Médios (MAD) ou Erros de Porcentagem Absoluta Média ponderada (wMAPEs).

Aqui está um exemplo usando R. Estou usando a série 2000 da competição M3, que já está dividida em séries de treinamento M3[[2000]]$xe dados de teste M3[[2000]]$xx. São dados mensais. As duas últimas linhas produzem o wMAPE das previsões dos dois modelos, e vemos aqui que o modelo ARIMA (wMAPE 18,6%) supera o modelo ETS automaticamente ajustado (32,4%):

library(forecast)
library(Mcomp)

M3[[2000]]

ets.model <- ets(M3[[2000]]$x)
    arima.model <- auto.arima(M3[[2000]]$x)

ets.forecast <- forecast(ets.model,M3[[2000]]$h)$mean
arima.forecast <- forecast(arima.model,M3[[2000]]$h)$mean

sum(abs(ets.forecast-M3[[2000]]$xx))/sum(M3[[2000]]$xx)
sum(abs(arima.forecast-M3[[2000]]$xx))/sum(M3[[2000]]$xx)

Além disso, parece que há vendas anormalmente altas perto dos índices 280-300. Isso poderia ser vendas de Natal? Se você souber sobre eventos do calendário como esses, seria melhor alimentá-los ao seu modelo de previsão como variáveis ​​explicativas, o que fornecerá uma previsão melhor na próxima vez que o Natal chegar. Você pode fazer isso facilmente no ARIMA (X) e NNs, não tão facilmente no ETS.

Por fim, recomendo este livro sobre previsão: http://otexts.com/fpp/

Stephan Kolassa
fonte
Obrigado pela resposta. Suas sugestões são muito boas, mas infelizmente não são adequadas para mim. Eu tenho muitas séries temporais, com períodos diferentes e preciso fazer previsões para elas, portanto, estou procurando um modelo simples e melhor. Eu pensei que, se eu pudesse comparar métodos pela AIC, então eu escolheria o melhor.
Jurgita
Eu não posso olhar para cada série temporal manualmente, eu deveria escrever um programa, que iria encontrar o melhor modelo e aplicá-lo
Jurgita
é possível adicionar variáveis ​​explicativas (dias de Natal) ao modelo de previsão auto.arima? Ou é possível apenas ao trabalhar com arima?
Jurgita
11
Você pode escrever um loop sobre sua série e verificar qual método fornece o melhor wMAPE para cada série. Se um método supera claramente os outros, use-o para todas as séries. Caso contrário, pense em usar métodos diferentes por série. AIC não irá ajudá-lo com várias séries! Ou, melhor ainda, procure um software dedicado para prever um grande número de séries temporais diárias de varejo que também leve em consideração coisas como alterações de preços etc. É isso que eu faço para viver, felizmente colocarei você em contato com nossos vendedores ;-) Mas também ficarei feliz em ajudá-lo aqui!
Stephan Kolassa
Para auto.arima(), use o xregparâmetro Veja ?auto.arima.
Stephan Kolassa
4

A sugestão de Stephan acima é boa. Eu acrescentaria que o uso da AIC é definitivamente uma maneira válida de escolher entre modelos - mas não entre eles. Ou seja, você pode (e deve!) Usar critérios de informação para escolher quais modelos ARIMA, quais modelos de suavização exponencial etc., e então comparar seus principais candidatos usando previsões fora da amostra (MASE, MAPE etc.) )

http://robjhyndman.com/hyndsight/aic/

Stephen C
fonte
1

Assista a este vídeo do Prof Rob https://www.youtube.com/watch?v=1Lh1HlBUf8k

No vídeo, o professor Rob ensinou sobre a função de precisão e as diferenças entre a precisão da amostra e a precisão fora da amostra.

ou seja: digamos 80-90% dos seus dados, ajuste um modelo, faça uma previsão. Em seguida, verifique a precisão usando os dados previstos com 10% (como temos o valor real dos dados de 10%, podemos verificar a precisão fora do modelo da amostra)

Além de consultar o livro on-line em otext

Como mencionado anteriormente, quando comparamos modelos x modelos, usamos a precisão () para comparar com o conjunto de testes. Então você pode ter várias medidas de erro como MAE, MSE, RMSE ... etc, que são usadas para comparar modelos vs modelos

sopa de missô
fonte
0

Em vez de atribuir um nome ao modelo NN, use fit_nn. Da mesma forma, fit_arima e fit_ets. para que você possa comparar todos os modelos.

library(caret)
#ets
fit_ets <- ets(x)
#ANN
fit_nn <- nnetar(x)
plot(forecast(fit,h=60))
points(1:length(x),fitted(fit_nn),type="l",col="green")
library(forecast)
accuracy(fit_nn)
accuracy(fit_ets)

Agora, você pode comparar os dois modelos usando ME, MAE ou o que quiser.

Komal Batool
fonte
Eu tive que ler isso algumas vezes para entender seu ponto. Embora a nomeação das variáveis ​​seja uma boa prática de codificação, ela não é essencial para a resposta. A parte principal da sua resposta está na linha final (usando o MAE, etc). Se você pudesse destacar (ou melhor ainda, expandir) isso, melhoraria isso.
mkt - Restabelece Monica
quando você usa a precisão da função (modelo), fornece determinadas estatísticas como ME, MAE, RMSE, MPE e assim por diante. Você pode usar qualquer um deles ou todos para comparar dois ou mais modelos. Digamos, por exemplo, o modelo com menos RMSE (Root Mean Square Error) é considerado o melhor modelo entre todos.
Komal Batool 28/08/19
Isso é útil saber. Mas o que quero dizer é que este não é um site sobre codificação, mesmo que o código possa certamente esclarecer perguntas e respostas. E, portanto, sua resposta seria melhor se você destacasse a questão substantiva .
mkt - Restabelece Monica
A questão era como a RNA pode ser comparada com modelos estatísticos como o ARIMA (já que esses modelos são comparados usando seus valores de AIC) e a resposta está usando outros valores estatísticos, como MAE ou RMSE, que podem ser obtidos pela função precision (). Não há nenhum ponto de confusão nele.
Komal Batool 28/08/19