16 votos

Procedimiento de análisis de series y métodos utilizando R

Estoy trabajando en un pequeño proyecto en el que estamos tratando de predecir los precios de los commodities (Petróleo, Aluminio, Estaño, etc.) durante los próximos 6 meses. Tengo 12 años de variables para predecir y tengo los datos de abril de 2008 - Mayo de 2013.

¿Cómo debo ir sobre la predicción? He hecho lo siguiente:

  • Importado de datos como un conjunto de datos Unicc
  • Todos los de la variable estacionalidad tiende a variar con la Tendencia, así que me voy a modelo multiplicativo.
  • Me tomó de registro de la variable a convertir en modelo aditivo
  • Para cada variable se descompone de los datos mediante el STL

Estoy planeando el uso de Holt Winters suavización exponencial, ARIMA y de redes neuronales para el pronóstico. Me separé de los datos de entrenamiento y de prueba (80, 20). La planificación de elegir el modelo con menos MAE, MPE, MAPE y MASE.

Estoy haciendo lo correcto?

También una pregunta que tuve fue que, antes de pasar a ARIMA o red neuronal debería suavizar los datos? Si sí, a través de qué? Los datos muestran tanto la Estacionalidad y tendencia.

EDITAR:

Fijación de la unicc de la trama y los datos enter image description here

Year  <- c(2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2009, 2009, 
           2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2010, 
           2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 
           2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 
           2011, 2012, 2012, 2012, 2012, 2012, 2012, 2012, 2012, 2012, 2012, 
           2012, 2012, 2013, 2013)
Month <- c(4, 5, 6, 7, 8, 9, 10, 11, 12, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 
           12, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 1, 2, 3, 4, 5, 6, 7, 
           8, 9, 10, 11, 12, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 1, 2) 
Coil  <- c(44000, 44500, 42000, 45000, 42500, 41000, 39000, 35000, 34000, 
           29700, 29700, 29000, 30000, 30000, 31000, 31000, 33500, 33500, 
           33000, 31500, 34000, 35000, 35000, 36000, 38500, 38500, 35500, 
           33500, 34500, 36000, 35500, 34500, 35500, 38500, 44500, 40700, 
           40500, 39100, 39100, 39100, 38600, 39500, 39500, 38500, 39500, 
           40000, 40000, 40500, 41000, 41000, 41000, 40500, 40000, 39300, 
           39300, 39300, 39300, 39300, 39800)
coil <- data.frame(Year = Year, Month = Month, Coil = Coil)

EDIT 2: Una pregunta, puede usted por favor decirme si mis datos tiene estacionalidad o tendencia? Y también por favor darme algunos consejos sobre cómo identificar a ellos. enter image description hereenter image description here

22voto

Boris Tsirelson Puntos 191

Usted debe usar el pronóstico del paquete, que apoya todos estos modelos (y más) y hace que su montaje un complemento:

library(forecast)
x <- AirPassengers
mod_arima <- auto.arima(x, ic='aicc', stepwise=FALSE)
mod_exponential <- ets(x, ic='aicc', restrict=FALSE)
mod_neural <- nnetar(x, p=12, size=25)
mod_tbats <- tbats(x, ic='aicc', seasonal.periods=12)
par(mfrow=c(4, 1))
plot(forecast(mod_arima, 12), include=36)
plot(forecast(mod_exponential, 12), include=36)
plot(forecast(mod_neural, 12), include=36)
plot(forecast(mod_tbats, 12), include=36)

Yo aconsejo que se suavizado de datos previo a la colocación de su modelo. Su modelo es inherentemente va a tratar de suavizar los datos, de manera pre-alisado sólo complica las cosas.

enter image description here

La edición en función de los nuevos datos:

En realidad, parece arima es uno de los peores modelos usted puede elegir para este entrenamiento y de prueba.

He guardado los datos a un archivo llamada coil.csv, cargan en R, y que se dividió en un entrenamiento y de prueba:

library(forecast)
dat <- read.csv('~/coil.csv')
x <- ts(dat$Coil, start=c(dat$Year[1], dat$Month[1]), frequency=12)
test_x <- window(x, start=c(2012, 3))
x <- window(x, end=c(2012, 2))

La próxima me caben un montón de modelos de serie de tiempo: arima, suavización exponencial, de la red neuronal, tbats, murciélagos, descomposición estacional, y estructurales de series de tiempo:

models <- list(
  mod_arima = auto.arima(x, ic='aicc', stepwise=FALSE),
  mod_exp = ets(x, ic='aicc', restrict=FALSE),
  mod_neural = nnetar(x, p=12, size=25),
  mod_tbats = tbats(x, ic='aicc', seasonal.periods=12),
  mod_bats = bats(x, ic='aicc', seasonal.periods=12),
  mod_stl = stlm(x, s.window=12, ic='aicc', robust=TRUE, method='ets'),
  mod_sts = StructTS(x)
  )

Entonces hice algunas previsiones y en comparación con el conjunto de pruebas. He incluido un ingenuo previsión de que siempre predice un plano horizontal de la línea:

forecasts <- lapply(models, forecast, 12)
forecasts$naive <- naive(x, 12)
par(mfrow=c(4, 2))
for(f in forecasts){
  plot(f)
  lines(test_x, col='red')
}

enter image description here

Como se puede ver, el modelo arima se presenta la tendencia de malo, pero me gusta el aspecto de la "Estructurales Básicos del Modelo"

Por último, he medido para cada modelo de precisión en el ajuste de prueba:

acc <- lapply(forecasts, function(f){
  accuracy(f, test_x)[2,,drop=FALSE]
})
acc <- Reduce(rbind, acc)
row.names(acc) <- names(forecasts)
acc <- acc[order(acc[,'MASE']),]
round(acc, 2)
                ME    RMSE     MAE   MPE MAPE MASE ACF1 Theil's U
mod_sts     283.15  609.04  514.46  0.69 1.27 0.10 0.77      1.65
mod_bats     65.36  706.93  638.31  0.13 1.59 0.12 0.85      1.96
mod_tbats    65.22  706.92  638.32  0.13 1.59 0.12 0.85      1.96
mod_exp      25.00  706.52  641.67  0.03 1.60 0.12 0.85      1.96
naive        25.00  706.52  641.67  0.03 1.60 0.12 0.85      1.96
mod_neural   81.14  853.86  754.61  0.18 1.89 0.14 0.14      2.39
mod_arima   766.51  904.06  766.51  1.90 1.90 0.14 0.73      2.48
mod_stl    -208.74 1166.84 1005.81 -0.52 2.50 0.19 0.32      3.02

Las métricas utilizadas se describen en Hyndman, R. J. y Athanasopoulos, G. (2014) "Forecasting: principios y práctica", que también resultan ser los autores de la previsión del paquete. Le recomiendo que lea su texto: está disponible para libre en línea. Estructurales de series de tiempo es el mejor modelo por varias métricas, incluyendo MASE, que es la métrica que tienden a preferir para la selección de modelo.

Una pregunta final es: ¿el modelo estructural tener suerte en este conjunto de pruebas? Una forma de evaluar este es el aspecto en el conjunto de entrenamiento de errores. Conjunto de entrenamiento errores son menos fiables que las de la prueba de conjunto de errores (porque no puede ser sobre-ajuste), pero en este caso el modelo estructural todavía sale en la parte superior:

acc <- lapply(forecasts, function(f){
  accuracy(f, test_x)[1,,drop=FALSE]
})
acc <- Reduce(rbind, acc)
row.names(acc) <- names(forecasts)
acc <- acc[order(acc[,'MASE']),]
round(acc, 2)
                ME    RMSE     MAE   MPE MAPE MASE  ACF1 Theil's U
mod_sts      -0.03    0.99    0.71  0.00 0.00 0.00  0.08        NA
mod_neural    3.00 1145.91  839.15 -0.09 2.25 0.16  0.00        NA
mod_exp     -82.74 1915.75 1359.87 -0.33 3.68 0.25  0.06        NA
naive       -86.96 1936.38 1386.96 -0.34 3.75 0.26  0.06        NA
mod_arima  -180.32 1889.56 1393.94 -0.74 3.79 0.26  0.09        NA
mod_stl     -38.12 2158.25 1471.63 -0.22 4.00 0.28 -0.09        NA
mod_bats     57.07 2184.16 1525.28  0.00 4.07 0.29 -0.03        NA
mod_tbats    62.30 2203.54 1531.48  0.01 4.08 0.29 -0.03        NA

(Tenga en cuenta que la red neuronal overfit, de realizar un excelente sobre el conjunto de entrenamiento y el mal en el conjunto de prueba)

Finalmente, sería una buena idea realizar una validación cruzada de todos estos modelos, tal vez por su formación en 2008-2009/la prueba en 2010, la formación en el período 2008-2010/pruebas en 2011, la formación en la 2008-2011/pruebas en 2012, la formación en 2008-2012/pruebas en 2013, y un promedio de errores a través de todos estos periodos de tiempo. Si usted desea bajar de esa ruta, tengo un parcial paquete completo para la cruz de la validación de modelos de serie de tiempo en github que me encantaría que usted pruebe y me de su opinión/pull requests en:

devtools::install_github('zachmayer/cv.ts')
library(cv.ts)

Edit 2: vamos a ver si recuerdo cómo usar mi propio paquete!

Primero de todo, instalar y cargar el paquete de github (ver arriba). Luego validación cruzada de algunos modelos (utilizando el conjunto de datos completo):

library(cv.ts)
x <- ts(dat$Coil, start=c(dat$Year[1], dat$Month[1]), frequency=12)
ctrl <- tseriesControl(stepSize=1, maxHorizon=12, minObs=36, fixedWindow=TRUE)
models <- list()

models$arima = cv.ts(
  x, auto.arimaForecast, tsControl=ctrl,
  ic='aicc', stepwise=FALSE)

models$exp = cv.ts(
  x, etsForecast, tsControl=ctrl,
  ic='aicc', restrict=FALSE)

models$neural = cv.ts(
  x, nnetarForecast, tsControl=ctrl,
  nn_p=6, size=5)

models$tbats = cv.ts(
  x, tbatsForecast, tsControl=ctrl,
  seasonal.periods=12)

models$bats = cv.ts(
  x, batsForecast, tsControl=ctrl,
  seasonal.periods=12)

models$stl = cv.ts(
  x, stl.Forecast, tsControl=ctrl,
  s.window=12, ic='aicc', robust=TRUE, method='ets')

models$sts = cv.ts(x, stsForecast, tsControl=ctrl)

models$naive = cv.ts(x, naiveForecast, tsControl=ctrl)

models$theta = cv.ts(x, thetaForecast, tsControl=ctrl)

(Tenga en cuenta que he reducido la flexibilidad del modelo de red neuronal, para tratar de impedir que el sobreajuste)

Una vez que hemos ajuste de los modelos, se puede comparar por MAPE (cv.ts aún no soporta MASE):

res_overall <- lapply(models, function(x) x$results[13,-1])
res_overall <- Reduce(rbind, res_overall)
row.names(res_overall) <- names(models)
res_overall <- res_overall[order(res_overall[,'MAPE']),]
round(res_overall, 2)
                 ME    RMSE     MAE   MPE MAPE
naive     91.40 1126.83  961.18  0.19 2.40
ets       91.56 1127.09  961.35  0.19 2.40
stl     -114.59 1661.73 1332.73 -0.29 3.36
neural     5.26 1979.83 1521.83  0.00 3.83
bats     294.01 2087.99 1725.14  0.70 4.32
sts     -698.90 3680.71 1901.78 -1.81 4.77
arima  -1687.27 2750.49 2199.53 -4.23 5.53
tbats   -476.67 2761.44 2428.34 -1.23 6.10

Ouch. Parece que nuestro estructurales de previsión que tienen suerte. En el largo plazo, la ingenua previsión que hace el mejor de los pronósticos de media en los 12 meses horizonte (el modelo arima es todavía uno de los peores modelos). Vamos a comparar los modelos en cada una de las 12 horizontes de pronóstico, y ver si alguna de ellas alguna vez vencer a los ingenuos modelo:

library(reshape2)
library(ggplot2)
res <- lapply(models, function(x) x$results$MAPE[1:12])
res <- data.frame(do.call(cbind, res))
res$horizon <- 1:nrow(res)
    res <- melt(res, id.var='horizon', variable.name='model', value.name='MAPE')
    res$model <- factor(res$model, levels=row.names(res_overall))
ggplot(res, aes(x=horizon, y=MAPE, col=model)) +
  geom_line(size=2) + theme_bw() +
  theme(legend.position="top") +
  scale_color_manual(values=c(
    "#1f78b4", "#ff7f00", "#33a02c", "#6a3d9a",
    "#e31a1c", "#b15928", "#a6cee3", "#fdbf6f",
    "#b2df8a")
    )

model compare

De hecho, el modelo de suavizado exponencial es siempre escoger el modelo ingenuo (la línea naranja y azul de la línea de superposición 100%). En otras palabras, la ingenua previsión de que "el mes que viene de la bobina de precios será el mismo que el de este mes de la bobina de precios" es más preciso (en casi todo el horizonte de previsión) de 7 extremadamente sofisticados modelos de serie de tiempo. Si no se dispone de información secreta de la bobina de mercado no ya sabes, superando a los ingenuos de la bobina pronóstico del precio va a ser extremadamente difícil.

Nunca es la respuesta que nadie quiere escuchar, pero si la precisión del pronóstico es su meta, usted debe usar el modelo más preciso. Utilizar el modelo ingenuo.

14voto

forecaster Puntos 3015

El enfoque que has tomado es razonable. Si usted es nuevo a la predicción, entonces te recomiendo siguientes libros:

  1. Los métodos de predicción y de aplicaciones por Makridakis, Wheelright y Hyndman
  2. Pronóstico: los Principios y la práctica por Hyndman y Athanasopoulos.

El primer libro es un clásico que recomiendo encarecidamente. El segundo libro es una fuente abierta de libro en el cual se puede hacer referencia para los métodos de predicción y cómo se aplica el uso de R open source paquete de software de pronóstico. Tanto los libros proporcionan buen fondo en los métodos que he utilizado. Si usted es serio acerca de la predicción, entonces te recomiendo Principios de Previsión por parte de Armstrong, que es la recopilación de gran cantidad de investigación en el pronóstico de que los profesionales podrían encontrar muy útil.

Llegando a su ejemplo específico en la bobina, me recuerda a un concepto de previsibilidad que la mayoría de los libros de texto a menudo se ignoran. Algunas series como la de la serie, simplemente no puede ser previsto, porque es el patrón de menos, ya que no presentan tendencia o de temporada patrones o cualquier variación sistemática. En ese caso yo sería categorizar una serie como menos forecastable. Antes de aventurarse en la extrapolación de los métodos, me gustaría ver a los datos y la pregunta, es mi serie forecastable?En este ejemplo concreto, una simple extrapolación, tales como la caminata aleatoria pronóstico en el que se utiliza el último valor de la previsión se ha encontrado para ser más exactos.

También un comentario acerca de las redes neuronales: las redes Neuronales son notoriamente saber a fallar en la empírica competiciones. Me gustaría probar tradicional statitical métodos de series de tiempo antes de intentar el uso de redes neuronales para el pronóstico de serie temporal de las tareas.

He tratado de ser un modelo de datos en R's forecast package, esperemos que los comentarios son auto explicativas.

coil <- c(44000, 44500, 42000, 45000, 42500, 41000, 39000, 35000, 34000, 
          29700, 29700, 29000, 30000, 30000, 31000, 31000, 33500, 33500, 
          33000, 31500, 34000, 35000, 35000, 36000, 38500, 38500, 35500, 
          33500, 34500, 36000, 35500, 34500, 35500, 38500, 44500, 40700, 
          40500, 39100, 39100, 39100, 38600, 39500, 39500, 38500, 39500, 
          40000, 40000, 40500, 41000, 41000, 41000, 40500, 40000, 39300, 
          39300, 39300, 39300, 39300, 39800)


coilts <- ts(coil,start=c(2008,4),frequency=12)

library("forecast")

# Data for modeling
coilts.mod <- window(coilts,end = c(2012,3))

#Data for testing
coil.test <- window(coilts,start=c(2012,4))

# Model using multiple methods - arima, expo smooth, theta, random walk, structural time series

#arima
coil.arima <- forecast(auto.arima(coilts.mod),h=11)

#exponential smoothing
coil.ets <- forecast(ets(coilts.mod),h=11)

#theta
coil.tht <- thetaf(coilts.mod, h=11)

#random walk
coil.rwf <- rwf(coilts.mod, h=11)

#structts
coil.struc <- forecast(StructTS(coilts.mod),h=11)


##accuracy 

arm.acc <- accuracy(coil.arima,coil.test)
ets.acc <- accuracy(coil.ets,coil.test)
tht.acc <- accuracy(coil.tht,coil.test)
rwf.acc <- accuracy(coil.rwf,coil.test)
str.acc <- accuracy(coil.struc,coil.test)

El uso de MAE en la bodega de datos, yo elegiría ARIMA para el corto plazo, la previsión (1 - 12 meses). para el largo plazo, me gustaría confiar en paseo aleatorio pronóstico. Por favor, tenga en cuenta que ARIMA escogido un modelo de paseo aleatorio con deriva (0,1,0)+drift que tiende a ser mucho más preciso que el modelo de paseo aleatorio en este tipo de problemas específicamente a corto plazo. Consulte la tabla de abajo. Este se basa en la precisión de la función como se muestra en el código anterior.

enter image description here

Respuestas concretas a sus preguntas específicas: También una pregunta que tuve fue que, antes de pasar a ARIMA o red neuronal debería suavizar los datos? Si sí, a través de qué?

  • No, los métodos de predicción, naturalmente, suaviza sus datos para el modelo de ajuste.

Los datos muestran tanto la Estacionalidad y tendencia.

  • Los datos anteriores no muestran tendencia o estacionalidad. Si usted determinar que los datos de las exhibiciones de la estacionalidad y la tendencia, a continuación, elija un método apropiado.

Consejos prácticos para mejorar la precisión:

Combinar variedad de métodos de predicción: - Usted podría tratar de no utilizar la extrapolación de métodos tales como la previsión por analogía, a juicio de previsión o de otras técnicas y combinarlos con su statitical métodos para proporcionar la exactitud de las predicciones. Consulte este artículo para que los beneficios de la combinación. He probado la combinación de las anteriores 5 métodos, pero la predicción no eran exactos como los métodos individuales, una posible razón es que las previsiones son similares. Usted cosechará los beneficios de la combinación de previsión cuando se combinan diversos métodos, tales como la estadística y crítico de los pronósticos.

Detectar y Comprender los valores Atípicos: - Datos del mundo Real está lleno de valores atípicos. Identificar y adecuadamente el tratamiento de los valores atípicos en series de tiempo. Se recomienda la lectura de este post. Mirando en su bobina de datos, es la gota antes de 2009, es de un valor atípico ??

Editar

Los datos parecen estar siguiendo algún tipo de macro tendencias económicas. Mi conjetura es que la tendencia a la baja antes visto de 2009 sigue la caída de la economía visto entre los años 2008 - 2009 y empezar a recoger post de 2009. Si este es el caso, entonces me gustaría que todos juntos evite el uso de cualquier extrapolación de los métodos y en su lugar se basan en una sólida teoría sobre cómo estas tendencias económicas comportan como el que se hace referencia por @GraemeWalsh.

Espero que esto ayude

i-Ciencias.com

I-Ciencias es una comunidad de estudiantes y amantes de la ciencia en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X