Compendio de conocimiento sobre series temporales, para la predicción de series temporales con todos los métodos tratados en nuestro laboratorio DICITS.
Una serie temporal es una colección de observaciones de una variable tomadas de forma secuencial y ordenada en el tiempo (instantes de tiempo equiespaciados). Las series pueden tener una periodicidad anual, semestral, trimestral, mensual, etc., según los periodos de tiempo en los que están recogidos los datos que la componen. Las series temporales se pueden definir como un caso particular de los procesos estocásticos, ya que un proceso estocástico es una secuencia de variables aleatorias, ordenadas y equidistantes cronológicamente referidas a una característica observable en diferentes momentos.
Algunos ejemplos de series temporales vienen de campos como la economía (producto interior bruto anual, tasa de inflación, tasa de desempleo, ...), la demografía (nacimientos anuales, tasa de dependencia, ...), la meteorología (temperaturas máximas, medias o mínimas, precipitaciones diarias, ...), etc.
El objetivo de una serie temporal reside en estudiar los cambios en esa variable con respeto al tiempo (descripción), y en predecir sus valores futuros (predicción). Por lo tanto, el análisis de series temporales presenta un conjunto de técnicas estadísticas que permiten extraer las regularidades que se observan en el comportamiento pasado de la variable, para tratar de predecir el comportamiento futuro.
Una serie temporal se representa mediante un gráfico temporal, con el valor de la serie en el eje de ordenadas y los tiempos en el eje de abscisas. Esta es la forma más sencilla de comenzar el análisis de una serie temporal y permite detectar las características y componentes más importantes de una serie.
Componentes de una serie temporal
Los componentes que forman una serie temporal son los siguientes:
Tipos de series temporales
Además, las series temporales se pueden dividir en:
La importancia de esta división reside en que la estacionaridad (en media y en varianza) es un requisito que debe cumplirse para poder aplicar modelos paramétricos de análisis y predicción de series de datos. Ya que con series estacionarias podemos obtener predicciones fácilmente, debido a que como la media es constante se puede estimar con todos los datos y utilizar este valor para predecir una nueva observación. Y también permite obtener intervalos de confianza para las predicciones.
Un tipo especial de serie estacionaria es la serie denominada ruido blanco. Un ruido blanco es una serie estacionaria tal que ninguna observación influye sobre las siguientes, es decir, donde los valores son independientes e idénticamente distribuidos a lo largo del tiempo con media y covarianza cero e igual varianza.
Otro tipo especial de serie temporal es la llamada camino aleatorio, una serie es un camino aleatorio si la primera diferenciación de la serie es un ruido blanco.
Las series temporales también se pueden dividir según cuántas variables se observan o según su variabilidad:
Por otro lado, la variable que se observa en una serie temporal puede ser de tipo:
La tarea de predicción y análisis de series temporales por lo general consta de cinco pasos básicos (sólo como referencia):
Definición del problema. A menudo, esta es la parte más difícil de la predicción. En la definición del problema se necesita que se comprenda la forma en que se utilizarán las predicciones. Hay que dedicar tiempo para hablar con todas las entidades que van a participar en la recogida de datos, el mantenimiento de bases de datos, y el uso de las predicciones.
Recopilación de información. Hay al menos dos tipos de información necesaria:
Análisis Preliminar (exploratorio) Primero, es necesario hacer una representación gráfica de los datos. Y hacerse las siguientes preguntas:
Elección y ajuste de modelos. El mejor modelo a utilizar depende (en la mayoría de los casos) de la disponibilidad de datos históricos, la fuerza de las relaciones entre la variable de predicción y las variables explicativas. Cada modelo es una construcción artificial que se basa en un conjunto de supuestos (explícitos e implícitos) y por lo general consiste en uno o más parámetros que deben ser "equipados" utilizando los datos históricos conocidos. Pra ello: modelos de regresión , los métodos de suavización exponencial, los modelos de Box-Jenkins ARIMA, los modelos dinámicos de regresión, redes neuronales, y vectores autorregresivos, deeplearning, ...
Uso y evaluación de un modelo de predicción. Una vez que el modelo ha sido seleccionado y sus parámetros estimados, el modelo se utiliza para hacer predicciones. El rendimiento del modelo sólo puede ser evaluado correctamente después de que los datos para el período de predicción estén disponibles.
El análisis más clásico de las series temporales se basa en la idea de que los valores que toma la variable de observación son la consecuencia de las componentes anteriores (tendencia, estacionalidad, ciclo y aleatoriedad), aunque no siempre aparecen todas. Luego este enfoque descriptivo determinista consiste en encontrar componentes que se correspondan a una tendencia a largo plazo, un comportamiento estacional y una parte aleatoria.
El primer paso a seguir a la hora de realizar un análisis es determinar cómo se combinan los componentes de la serie. Para ello se consideran dos modelos habituales para relacionar los valores de la serie con los componentes anteriores:
Si a modelo multiplicativo se le aplica un logaritmo para estabilizarlo, entonces es equivalente a un modelo aditivo. Así pues, una serie temporal se puede descomponer y denotar en su manera aditiva como:
Xt = Tt + Et + It
ó en su forma multiplicativa como:
Xt = Tt x Et x It
donde Tt es la tendencia, Et es la componente estacional, que constituyen la señal o parte determinística, e It es el ruido o parte aleatoria.
Para conocer qué tipo se adapta mejor a la serie, se pueden seguir los siguientes procedimientos:
Una vez que se conoce la forma en que se relacionan los componentes, se descompone la serie estimando los componentes de tendencia y estacionalidad:
Se puede diferenciar la parte regular (lag=1) para la tendencia y se puede diferenciar la parte estacional para la estacionalidad (lag=periodo), o ambas. Se seleccionaría aquella diferenciación que minimice la varianza, ya que en una serie sobrediferenciada la varianza aumenta.
Y por lo tanto, la tendencia y la estacionalidad una vez modelados se pueden eliminar para obtener la componente aleatoria:
It = Xt − Tt − Et
ó
It = Xt / (Tt * Et)
En este punto se tiene una descomposición de la serie en componentes que separan tendencia, estacionalidad y ruido. Estos componentes obtenidos de la serie la describen, pero no la predicen. Las predicciones de valores futuros se consiguen usando las componentes Tt y Et con valores de tiempo t+1, t+2, etc. Para ello se realiza un pronóstico futuro de la tendencia, y se le añade la predicción de la estacionalidad (índice de estacionalidad) correspondiente a cada periodo (la componente irregular o aleatorio no es predecible y por lo tanto no se considera).
Ventajas e inconvenientes
Los métodos clásicos de análisis de series temporales tienen la ventaja de no ser excesivamente complejos, ya que explican la evolución pasada de una serie en función de pautas simples pero tienen problemas y limitaciones. Aunque son útiles para describir las pautas que sigue una serie temporal, las predicciones que proporcionan suelen ser muy malas (es decir, con un gran error asociado). La razón de esto es que en una serie temporal la observación más reciente depende, en general, de sus valores pasados, pero esta dependencia suele ser más fuerte con los datos más recientes y más débil con los más alejados.
Los métodos de suavizado o alisado se basan en modelos paramétricos deterministas que se ajustan a la evolución de la serie. Son técnicas de tipo predictivo más que descriptivo (resultan más adecuados para pronosticar). Estos modelos se pueden emplear en:
Series temporales sin tendencia ni estacionalidad
Este tipo de series tienen un comportamiento más o menos estable que sigue un patrón subyacente salvo fluctuaciones aleatorias (comportamiento estacionario), a este tipo de series se le pueden aplicar:
Series temporales no estacionales con tendencia
En el caso de series temporales con tendencia lineal (creciente o decreciente) pero sin comportamiento estacional, el modelo clásico que más se suele aplicar es el de Holt:
Series temporales con tendencia y estacionalidad
En el caso de series temporales con tendencia lineal (creciente o decreciente) y comportamiento estacional, el modelo clásico que se aplica es el de Holt-Winters:
Hasta ahora se han analizado las series temporales desde un punto de vista determinista o clásico, sin tener en cuenta cuál es el mecanismo que genera la serie. Pero ahora con este nuevo enfoque se analizan desde un punto de vista estocástico, por lo que el punto de partida para elaborar un modelo a partir de una serie temporal consiste en considerar que dicha serie está generada y es una realización particular de un proceso estocástico.
Pero para poder efectuar inferencias sobre los parámetros de un proceso estocástico, es preciso imponer restricciones a este último. Las restricciones que se imponen habitualmente son que sea estacionario y ergódico. Ya se ha visto cuándo un proceso es estacionario, pero ¿cúando es ergódico?. Antes de explicar un proceso ergódico necesitamos definir la autocorrelación. Se denomina autocorrelación de orden k, pk, a la correlación (dependencia) de cualesquiera dos variables aleatorias del proceso estocástico (serie temporal), distanciadas k instantes de tiempo. Algunas de sus principales caracteristicas son:
La autocorrelación se puede medir mediante las funciones de autocorrelación:
Las funciones de autocorrelación simple y parcial constituyen uno de los instrumentos clave para ajustar el modelo que genera una serie temporal. Así pues, un proceso es ergódico cuando conforme k se hace más grande, a autocorrelación se hace más pequeña. Es decir, que la dependencia entre variables tiene menos importancia pasado más tiempo.
ARIMA (AutoRegresive Integrated Moving Average)
Box y Jenkins desarrollaron modelos estadísticos para series temporales que tienen en cuenta la dependencia existente entre los datos, esto es, cada observación en un momento dado es modelada en función de los valores anteriores. Los modelos se conocen con el nombre genérico de ARIMA (AutoRegresive Integrated Moving Average)(ARIMA para procesos estocásticos no estacionarios y ARMA para procesos estocásticos estacionarios), que deriva de sus tres componentes Autoregresivo, Integrado y Medias Móviles:
Procesos Autoregresivos AR(p)
Los modelos autoregresivos se basan en la idea de que el valor actual de la serie, Xt, puede explicarse o predecirse en función de p valores pasados Xt-1, ... Xt-p más un término de error, donde p determina el número de valores pasados necesarios para pronosticar un valor actual. El orden del modelo expresa el número de observaciones retrasadas de la serie temporal que intervienen en la ecuación, así pues, un modelo autoregresivo de orden 1 AR(1), la variable Xt está determinada únicamente por un valor pasado, esto es Xt-1 y así sucesivamente. Todos los procesos autorregresivos son procesos invertibles. Xt=f0+f1Xt-1+f2Xt-2+......+fpXt-p+at
Procesos de Medias Móviles MA(q)
Un modelo de medias móviles es aquel que explica el valor de una determinada variable en un período t en función de un término independiente y una sucesión de errores correspondientes a períodos precedentes, ponderados convenientemente. Estos modelos se denotan normalmente con las siglas MA, seguidos del orden entre paréntesis. Todos los procesos de medias móviles son procesos estacionarios. No todos los procesos de medias móviles son invertibles. Xt=m+at+q1at-1+q2at-2+......+qpat-p
Proceso Autoregresivo de Medias Móviles ARMA(p,q)
Una extensión natural de los modelos AR(p) y MA(q) es un tipo de modelos que incluyen tanto términos autorregresivos como de medias móviles. Los modelos autorregresivos de medias móviles, ARMA(p,q), son la suma de un proceso autorregresivo de orden p y uno de medias móviles de orden q. Es muy probable que una serie de tiempo tenga características de AR y de MA a la vez y, por consiguiente, sea ARMA. Un proceso ARMA(p, q) es estacionario si lo es su componente autorregresiva, y es invertible si lo es su componente de medias móviles.
Proceso Integrado I(d)
No todas las series temporales son estacionarias, algunas presentan cambios de nivel en el tiempo o la varianza no es constante, por lo que la serie se diferencia d veces para hacerla estacionaria. A este tipo de procesos se les considera procesos integrados, y se puede aplicar a esta serie diferenciada un modelo ARMA(p,q) para dar lugar a un modelo ARIMA(p,d,q).
Luego un Proceso Autoregresivo Integrado y de Media Móvil, ARIMA (p,d,q), es una serie de tiempo autoregresiva integrada de media móvil. Donde denota p el número de términos autoregresivos, d el número de veces que la serie debe ser diferenciada para hacerla estacionaria y q el número de términos de la media móvil invertible. La metodología Box-Jenkins para la construcción de los modelos ARIMA(p,d,q) se realiza de manera iterativa mediante un proceso en el que se puede distinguir cuatro etapas:
Identificación: esta primera fase consiste en identificar el posible modelo ARIMA(p,d,q) que sigue la serie (es posible identificar más de un modelo candidato que pueda describir la serie), lo que requiere:
Generalmente en primer lugar se debe de representar gráficamente la serie para identificar la tendencia y la estacionalidad (si es que las hay)(la estacionalidad de puede ver con las gráficas de las subsecuencias estacionarias). Posteriormente se prosigue modelando y eliminando tanto la tendencia como la estacionalidad para conseguir la estacionariedad (sobre todo si son muy pronunciadas y se ve claramente que existen)(ya se ha explicado anteriormente cómo se estiman y modelan ambas)(en caso de observarse un componente estacional muy fuerte además de tendencia, se puede probar a eliminar primero el componente estacional por si la serie resultante ya fuera estacionaria, y así no tener que realizar además la eliminación de la tendencia)(también pueden no eliminarse directamente e incluirse las diferenciaciones necesarias para hacerlo en el modelo ARIMA). Aunque en el análisis y modelado de series temporales no hay un patrón fijo a seguir, lo recomendable es llegar al análisis de tendencia y estacionalidad con la serie temporal lo mas limpia posible, eliminando todo tipo de comportamientos no deseados, luego si al graficar la serie vemos claramente que es heterocedástica (no es constante en varianza)(es frecuente observar que la varianza aumenta con el nivel de la serie)(por lo tanto no sigue una distribución normal) es recomendable realizar alguna de las siguientes transformaciones para acercarse más a una distribución normal:
Una vez esto hecho se comprueba la estacionariedad. La condición de estacionaridad es un requisito que debe cumplirse para poder aplicar modelos paramétricos de análisis y predicción de series de datos. Pero ¿cómo saber si una serie es estacionaria?
Si encontramos que la serie no es estacionaria ni habiendo eliminado la tendencia y la estacionalidad, se debe de diferenciar hasta conseguir que lo sea (lo ideal es diferenciar lo menos posible, solo en este caso en que tras la eliminación de la tendencia y estacionalidad aún es necesaria). La parte integrada suele ser necesaria para corregir la estacionaridad en la varianza. Normalmente los ordenes de diferenciación para que desaparezcan la tendencia o estacionalidad que quede no suelen ser elevados. Uno de los errores más comunes es aplicar una difereciación extra de la necesitada por la serie temporal para ser estacionaria, lo que es conocido como sobrediferenciación. Un indicio de que una serie temporal ha sido sobrediferenciada, es que el primer rezago de la gráfica de autocorrelación es -0.5 o un valor más negativo. Otro síntoma de sobrediferenciación es un incremento en la desviación estándar (y la varianza) trás aplicar una diferenciación más, luego el orden óptimo de diferenciación es frecuentemente aquel que hace que la desviación estándar (y varianza) sea la más baja posible.
Por último, una vez que la serie sea estacionaria, se determina un modelo ARIMA (o ARMA en caso de que no haga falta diferenciar) para la serie estacionaria, es decir, los órdenes p, d y q de su estructura autorregresiva, integrado y de media móvil. El modelo se puede deducir leyendo los correlogramas de la serie, es decir, las funciones de autocorrelación y autocorelación parcial (de la serie transformada, no de la original), ya que por norma general cuando solo hay un componente:
Considerando un valor “distinto de cero” si no está en el rango (-2/sqrt(N), 2/sqrt(N)), con N=longitud de la serie (banda de significancia, suelen ser del 95%). Luego la identificación de los órdenes del modelo consiste en comparar la ACF y PACF estimada de la serie estacionaria con la ACF y PACF de los modelos teóricos. Hay situaciones que no son muy claras, en estos casos puede tratarse de un modelo con las dos partes, la AR y la MA. Estos son modelos ARMA(p,q) o ARIMA(p,0,q). Sus funciones FAS y FAP son combinaciones de las de ambas partes, por lo que son más difíciles de identificar a simple vista. Debido a que en la práctica es difícil identificar con exactitud el orden p y q del modelo ARMA, se pueden plantear dos o más modelos plausibles, que luego de ser estimados son útiles para la elección del más apropiado.
Estimación: una vez seleccionado provisionalmente un modelo para la serie estacionaria, se pasa a la segunda etapa, donde se estiman los coeficientes/parámetros de los términos autorregresivos (AR) y de media móvil (MA) del modelo (siempre el modelo estacionario, no el original). Los parámetros se suelen obtener por máxima verosimilitud o por mínimos cuadrados lineales, pero en otras ocasiones se recurre a la estimación no lineal de los parámetros, el objetivo en ambos casos es encontrar los valores de los parametros que minimizen el sumatorio de los errores al cuadrado (o dicho de otra forma, minimizar la suma de los cuadrados de los residuos).
Validación: en esta etapa se busca evaluar si el modelo (o los modelos) estimado(s) se ajusta(n) razonablemente bien a los datos (y si se estimaron varios modelos para conocer cuál es mejor) antes de hacer uso del modelo para la predicción. Así pues la validación o verificación incluye 3 tipos de análisis:
El análisis de los coeficientes o parámetros del modelo: se desea que el modelo estimado cumpla con las condiciones de estacionariedad e invertibilidad y que exista significancia estadística en los rezagos incorporados.
La evaluación de la bondad del ajuste: ya que los modelos han sido elegidos mediante identificación, es importante determinar cuál de los modelos presenta una mejor bondad de ajuste.
AIC (Akaike Information Criterion): es una medida de la calidad relativa de un modelo estadístico que proporciona un medio para la selección de un modelo entre un conjunto de modelos. El AIC maneja un trade-off entre la bondad de ajuste del modelo y la complejidad del modelo, para ello tiene en cuenta lo bien que el modelo se ajusta a los datos penalizando la complejidad del modelo que puede llevar a un sobreentrenamiento (es decir, un modelo más complejo puede ajustarse mejor a los datos, pero esto puede hacer que el modelo sea peor para datos futuros). Un valor más pequeño del AIC representa un mejor ajuste.
BIC (Bayesian Information Criterion): similar a AIC.
Métodos de validación con datos de entrenamiento y test: una práctica común es seleccionar un modelo basándose únicamente en el ajuste del mismo con todos los datos que forman parte de la serie, pero que un modelo se ajuste y reproduzca bien unos datos no significa necesariamente que prediga datos a futuro bien (frecuentemente mientras mejor se ajusta a unos datos, peor predice datos a futuro, lo que es llamado sobreentrenamiento), aunque sea un buen indicador de ello. Para evitar esto, se puede dividir la serie en datos de entrenamiento empleados para estimar el modelo, y datos de test empleados para evaluar la predicción del modelo. Emplear este tipo de técnicas se hace más difícil con series temporales ya que los datos no son independientes y hay que tener cuidado al dividir la serie en entrenamiento y test (se recomienda que las observaciones de entrenamiento ocurran temporalmente antes que la de test).
Una vez explicados se puede matizar una diferenciación entre ellos, y es que los criterios de información (como AIC o BIC) no realizan una valoración en función de la predicción sino que la valoración se ciñe al ajuste del modelo a los datos observados, mientras que por otro lado los métodos de validación (hold out, validación cruzada) realizan una valoración del modelo con respecto a la predicción futura que se puede realizar a partir de lo aprendido con los datos observados. Cada uno de los métodos anteriores tiene sus ventajas y desventajas, usar un método de validación con datos de entrenamiento y test tiene la ventaja de que puede usarse para comparar predicciones de métodos diferentes (ARIMA, ETS, ...) pero con el coste de tener que usar algunas observaciones para testear. Mientras que los criterios de información tienen la ventaja de que emplean todas las observaciones, pero requieren que los datos de los modelos comparados sean los mismo, es decir, no puede usarse para comparar entre modelos ARIMA y ETS, o entre diferentes diferenciaciones de los modelos ARIMA, etc.
El análisis de los residuos: debe verificarse el supuesto de que los errores del modelo son un proceso puramente aleatorio (media cero, varianza constante y no correlación serial), es decir, no tienen estructura de dependencia (los residuos no deben estar correlacionados el pasado, deben ser independientes los unos de los otros) y siguen un proceso de ruido blanco.
Para que un modelo sea válido, los diferentes análisis sobre los residuos obtenidos en la estimación serán "ruido blanco". Un ruido blanco es una serie estacionaria en la que ninguna observación depende de las otras y, por tanto, todos los valores de la ACF y la PACF son nulos. El correlograma y el correlograma parcial deben ser muy similares y los valores no deben ser significativamente distintos de cero. Si ésto no es así y los residuos muestran estructura, habrá que realizar una nueva estimación incorporando la estructura más parecida al modelo teórico que podamos intuir y se repiten las etapas anteriores hasta obtener un modelo adecuado.
Predicción: una vez seleccionado el mejor modelo, éste se puede utilizar para conseguir la mejor predicción de los valores a futuro de la serie a partir de su propia historia. ¿Pero cuál es el mejor predictor que se puede aplicar a los datos? El mejor predictor posible será "el que menos se equivoca" o, en términos estadísticos, aquel que minimiza el error cuadrático medio respecto a otro potencial predictor alternativo. A la hora de realizar una predicción con el modelo obtenido, hay dos tipos de estrategias:
SARIMA (Seasonal AutoRegresive Integrated Moving Average)
En principio se tiene que los modelos ARIMA(p,d,q) vistos anteriormente son modelos no estacionarios (aunque también se pueden ajustar a modelos estacionarios eliminando la estacionalidad previamente como se ha visto), por ello, también existen los modelos estacionales autorregresivos integrados de média móvil ARIMA(p,d,q)(P,D,Q)S (o SARIMA(p,d,q)(P,D,Q)). Aunque la metodología para constuir estos procesos es igual, son útiles sobre todo cuando la serie de tiempo observada tiene intervalos de observación menores a un año ya que entonces es frecuente que estas tengan variaciones ó patrones sistemáticos cada cierto periodo. Esta estacionalidad debe ser captadas e incluida dentro de la estructura del modelo a construir. Este tipo de procesos tiene las siguientes características:
En principio la parte estacional se puede modelizar de la misma forma que la parte regular. La identificación se realiza estudiando la ACF y la PACF en los retardos estacionales. Cuando una serie tiene parte regular y parte estacional, la FAS presenta una interrelación entre ellas. Básicamente la ACF y PACF de los modelos estacionales presentan las siguientes características:
Por ejemplo, un modelo ARIMA(0,0,0)(0,0,1)12 mostraría únicamente una barra significativa en el rezago 12 de la ACF, mientras que la PACF mostraría un decaimiento exponencial en el rezago estacionario. De manera similar, un ARIMA(0,0,0)(1,0,0)12 mostraría un decaimiento exponencial en los rezagos estacionales de la ACF, y una sola barra significativa en el rezago 12 del PACF.
Ventajas e inconvenientes
Por último, una de las desventajas de los modelos de Box-Jenkins está en que asumen que las observaciones están presentes en cada periodo de tiempo (ya que son necesarios para el cómputo de las autocorrelaciones), algo que no siempre es así ya que es habitual encontrar series de tiempo con valores perdidos. Por lo que este tipo de series requiere que se apliquen previamente métodos que estimen los valores faltantes para poder emplear el método ARIMA.
Hasta ahora, los enfoques de análisis de series temporales se han llevado a cabo desde un punto de vista lineal, ya que con los métodos vistos anteriormente se obtienen resultados satisfactorios en series de tiempo lineales, pero al utilizarlos en series no lineales, presentan limitaciones ya que no son capaces de capturar las relaciones no lineales de los datos. Así entran en juego los métodos capaces de capturar las relaciones lineales y no lineales entre los datos, como son las redes neuronales.
Los métodos de predicción basados en redes neuronales artificiales están basados en modelos matemáticos simples del cerebro. Una red neuronal puede ser vista como una red de neuronas organizadas en capas, en la que los predictores (o entradas) forman la capa más baja y las predicciones (salidas) forman la capa más alta. Entre ambas capas pueden existir capas intermedias con neuronas ocultas. Esta capa intermedia oculta es la que permite una relación no linear entre las entradas y las salidas permitiendo al modelo más grados de libertad (ya que se emplean funciones de activación no lineales, como la función sigmoide)(si solo se tuvieran la capa de entrada y salida sería una regresión lineal (modelo más simple)). Una neurona artificial consta de los siguientes elementos:
Luego cada neurona va a recibir un conjunto de entradas ponderadas por un peso específico, a las que le aplica una función de activación una vez realizado el sumatorio del valor de las mismas, para obtener así una salida. Los pesos son valores reales que multiplican a las entradas. En un principio los pesos son inicializados aleatoriamente (luego hay una componente aleatoria asociada a cada red neuronal), pero estos pesos se actualizan mediante algoritmos de entrenamiento sobre los datos observados que minimizan una función de coste, por lo que van a representar el conocimiento de la red. La función de activación define la salida de la neurona, se puede decir que representa el potencial de activación de la neurona...
En su forma simplificada, esta función es binaria, esto es, se activa la neurona o no. Una función rampa también puede ser usada para reflejar el incremento del potencial de activación que ocurre cuando la entrada se incrementa. Esta función de activación es lineal, y por consiguiente tiene los mismos problemas que la función binaria. Los problemas mencionados anteriormente, pueden ser manejados usando una función de activación sigmoidal. La función de tangente hiperbólica puede también ser cualquier función sigmoidal.
¿qué es función de activación y tipos?
¿algoritmos entrenamiento? ¿umbral?¿bias? ¿función de coste?
Para aquellas redes que usen funciones de activación como por ejemplo la sigmoide, una normalización de los datos es frecuentemente de ayuda, ya que si no se realiza la normalización los datos de entrada tendrán un efecto adicional sobre la neurona, dando lugar a decisiones incorrectas. Entre los tipos de normalización más comunes se pueden encontrar:
En las redes neuronales, los nodos de cada capa están conectados con otros nodos o incluso consigo mismos (cada conexión es diferente además porque también tienen un peso asociado), dependiendo de la arquitectura e interconexión de todas las neuronas de una red, pueden clasificárse en distintas categorías:
Con respecto a las series temporales, la idea base reside en que los valores futuros son dependientes de los valores pasados, es decir, buscando en los valores pasados de una serie temporal se puede predecir su comportamiento en el futuro. Luego los valores de los rezagos de las series temporales pueden ser usados como entradas a una red neuronal, de igual modo que se usan en un modelo autoregresivo lineal, y los valores futuros a predecir como las salidas de la red. La aplicación de redes neuronales artificiales a la predicción de series temporales se puede realizar de acuerdo a una serie de etapas que pueden ser:
Ventajas y desventajas
Los modelos no lineales son más potentes, pero por contra necesitan de más datos de entrenamiento, de más parámetros por ajustar, y se comportan peor (por ejemplo son más dados a producir sobreentrenamiento, etc...). Además, su computación es más pesada lo que va a conllevar un mayor tiempo de cómputo.
En construcción...
La estructura anterior de las redes neuronales artificiales (red neuronal poco profunda, superficial o shallow), se ha mantenido vigente durante bastante tiempo debido a los problemas de entrenamiento que se presentaban en las redes neuronales a medida que se ampliaba y profundizaba su estructura. El principal problema es conocido como el problema de la desaparición del gradiente (vanishing gradient problem)(entre otros problemas como capacidad computacional, etc.), dicho problema reside en los algoritmos de entrenamiento (propagación hacia atrás (backpropagation)) debido a que el error se va diluyendo de forma exponencial a medida que atraviesa capas en su camino hasta el principio de la red, lo que es un problema porque en una red muy profunda (con muchas capas ocultas) sólo las últimas capas se entrenan, mientras que las primeras apenas sufren cambios. Lo que ofrece un rendimiento muy bajo con redes neuronales profundas ya que al tener un gran conjunto de pesos iniciales acaba estancándose en algún mínimo local. De echo, los experimentos han demostrado que las redes neuronales profundas con pesos iniciales inicialidos de manera aleatoria, obtienen peores resultados que las redes neuronales con solo una o dos capas ocultas.
Debido a esta dificultad de entrenar estas arquitecturas profundas de una manera eficiente, las redes neuronales profundas no han tenido relevancia hasta la aparición de algunas técnicas que superan las dificultades de entrenamiento de una estructura profunda, como son los métodos de aprendizaje greedy layer-wise, que sí pueden realizar el entrenamiento de manera adecuada ya que su idea clave es pre-entrenar la red capa por capa de una manera ascendente, de forma que una vez realizado este proceso de pre-entrenamiento, el algoritmo de back-propagation sí puede ser usado para encontrar los parámetros óptimos de la red completa de una manera descendente. Esto ha dado lugar a una mejora significativa de los resultados de las redes neuronales cuando se pre-entrena la red con algoritmos de aprendizaje no supervisados. Además, ha dado lugar a que se haya convertido en una técnica muy habitual en Deep Learning entrenar en primer lugar de manera no supervisada greedy layer-wise, y continuar con un entrenamiento supervisado, es decir, el entrenamiento supervisado, en lugar de empezar con pesos al azar, empieza con pesos útiles, especialmente para las primeras capas.
Un método alternativo al pre-entrenamiento consiste en entrenar la red neuronal profunda de una manera más simple, empleando ReLu en lugar de la típica función sigmoide ¿resuelve problema backpropagation?.
Al entrenar una red neuronal profunda puede que se produzca sobreentrenamiento si el volumen de datos disponibles es relativamente pequeño con respecto al tamaño de la red neuronal. Cuando se produce este sobreentrenamiento, existe un cierto punto donde el error de test empieza a incrementar mientras el error de entrenamiento aún decrece, lo que significa que el modelo memoriza los datos de entrenamiento dados pero no predice bien en una situación real. Este sobreentrenamiento puede ser observado ¿COMO?
Así pues una red neuronal profunda es una red neuronal artificial con una arquitectura mayor y más compleja que las 3 o 4 capas habituales de un perceptrón multicapa (entrada, ocultas y salida). Este cambio hacía una estructura profunda (gran número de capas) incrementa la capacidad de absorción automática de caracterísiticas abstractas de una red neuronal sobre los datos. La técnicas de Deep learning han mostrado buenas capacidades para modelar y predecir series temporales por medio de aquitecturas como:
Arquitecturas de deep learning empleadas en series temporales
Auto-codificadores (Auto-encoders): se suelen implementar como redes de neuronas con tres capas (entrada y salida de igual tamaño y oculta de tamaño mayor o menor), aprenden a producir a la salida exactamente la misma información que recibe a la entrada. Lo interesante de esto radica en que si la capa oculta tiene un nº menor de neuronas que la capa de entrada, la red se verá obligada a encontrar una representación intermedia de la información en su capa oculta usando menos números, o si por el contrario si la capa oculta tiene más neuronas ahora la red tendría que aprender nuevamente un código alternativo, pero en este caso disperso (cuidado aquí que hay que hacer que la red no solo se limite a copiar información). En ambos casos la red está forzada a generalizar, y encontrar patrones o características fundamentales en los ejemplos que pueda representar mediante las neuronas de su capa oculta.
Redes de creencia profunda (Deep Belief Networks): una red de creencia profunda está formada por un conjunto de máquinas de Bolztmann restringuidas.
Este procedimiento puede volver a ser visto como un procedimiento de dos pasos, un primero que lleva a cabo un aprendizaje de características de los datos de entrada, y un segundo paso añadido para la predicción. Es muy similar a los autoencoders apilados, pero en este caso los autoencoders han sido reemplazados por MBR, luego en una red de creencia profunda la capa de entrada de la primera MBR es la capa de entrada para toda la red, la capa oculta de la primera MBR es la capa de entrada de la segunda MBR, y así sucesivamente. Cada MBR se pre-entrena de manera greedy layer-wise una a una pero esta vez en vez de con back-propagation, se realiza con el algoritmo de divergencia contrastiva. Después del pre-entrenamiento, y al igual que en los autoencoders apilados, los pesos están inicializados y la red se puede ampliar mediante la conexión de una o más capas completamente conectadas a la capa oculta final MBR, formando un perceptrón de múltiples capas que puede ser afinado mediante backpropagation.
LSTM (Recurrent neural networks):
Última capa
On a deep neural network of many layers, the final layer has a particular role. When dealing with labeled input, the output layer classifies each example, applying the most likely label. Each node on the output layer represents one label, and that node turns on or off according to the strength of the signal it receives from the previous layer’s input and parameters.
Deep-learning networks end in an output layer: a logistic, or softmax, classifier that assigns a likelihood to a particular outcome or label.
Softmax is a function used as the output layer of a neural network that classifies input. It converts vectors into class probabilities. Softmax normalizes the vector of scores by first exponentiating and then dividing by a constant.
Then a supervised learner such as softmax or SVM/SVR can be added on top of DBN.
Loss Functions in DeepLearning
MSE: Mean Squared Error: Linear Regression EXPLL: Exponential log likelihood: Poisson Regression XENT: Cross Entropy: Binary Classification MCXENT: Multiclass Cross Entropy RMSE_XENT: RMSE Cross Entropy SQUARED_LOSS: Squared Loss NEGATIVELOGLIKELIHOOD: Negative Log Likelihood
FUNCIONES DE ACTIVACION
Sigmoid and tanh should not be used as activation function for the hidden layer. This is because of the vanishing gradient problem, i.e., if your input is on a higher side (where sigmoid goes flat) then the gradient will be near zero. The best function for hidden layers is thus ReLu.
outputo layer -> Regression: linear (because values are unbounded) Classification: softmax (simple sigmoid works too but softmax works better)
¿activation funtion in hidden and output layer?
Librerias que permiten aplicar deep learning sobre series temporales
Activation function te marca la salida de la red, por ejemplo, sofmax clasificación en eqtiquetas, sigmoide regresión logística...
The sigmoid function can be applied easily, the ReLUs will not vanish the effect during your training process. However, when you want to deal with classification problems, they cannot help much.
Forma de obtener el número de capas óptimo: Otro consejo: No te lances a meter capas. Empieza entrenando con pocos datos y pocas capas. Mantén siempre un conjunto de datos de entrenamiento y uno de test. Nunca entrenes con los datos de test. Pero durante el entrenamiento ve evaluando el error en ambos conjuntos. Si ves que ambos van bajando, genial. Si el error de test empieza a diverger, necesitas más datos. Si el error de entrenamiento se estanca y lo quieres más bajo, necesitas más capas.
greedy = algoritmo voraz
TRUCOS
Los modelos vistos hasta ahora, constituyen una modelización univariante de una serie temporal (útiles para conocer las características de una serie temporal de tendencia, ciclo, estacionalidad, o para predecir), pero no tienen en cuenta la interrelación entre distintas variables (variable objeto de estudio con otras variables relevantes), y por lo tanto su utilidad puede verse limitada. Esta necesidad del estudio interrelacional entre variables se hace latente en muchos ámbitos, un ejemplo de esta necesidad se refleja en el ámbito económico, ya que por ejemplo la realidad económica de sectores, países, empresas, o el conjunto de la economía mundial viene determinada porque sus variables económicas se determinan por la interrelación entre distintas variables, así por ejemplo las ventas de una empresa están en relación con la renta de los consumidores, o la demanda de turistas está en relación con el crecimiento del PIB o de los precios relativos, etc.
Para resolver estas limitaciones se presentan los modelos multivariantes, que son modelos que sí tienen en cuenta la interrelación entre variables de distintas series temporales, luego estos modelos contienen varias series temporales. Concretamente estudian la relación entre una variable de interés y una serie de variables explicativas (que influyen en la variable de interés). En el marco multivariante se considera el pasado tanto de la variable que se quiere explicar, como el de las variables que están relacionadas con dicha variable. Los modelos multivariantes de series temporales son una generalización de los modelos univariantes, la diferencia está en que en vez de una sola variable hay n variables (en vez de una serie, hay varias series).
La forma multivariante de los modelos ARIMA Box-Jenkins es llamada modelos VARMA o ARMAV (AutoRegressive Moving Average Vector) (VARIMA o ARIMAV). Sin embargo, el ajuste de este tipo modelos es bastante complicado, lo que hace que por simplicidad una de las formas más frecuentes de modelar modelos multivariantes sea como vectores autoregresivos:
VAR
Los modelos de vectores autoregresivos, VAR, son unos de los modelos más empleados para el análisis de series de tiempo multivariantes. Los modelos VAR son una extensión de los modelos AR, con la diferencia de que mientras que los modelos autorregresivos univariantes recogen la dinámica de una sola serie temporal, los modelos multivariantes recogen las estructuras dinámicas sobre varias series temporales (por lo que presentan tantas ecuaciones como series haya). Dicha estructura consiste en un sistema de ecuaciones en la que cada una representa una función lineal de los rezagos pasados de la variable (como en un modelo AR) y los rezagos de las demás variables de las otras series (no se distingue entre variables endógenas y exógenas). Por ejemplo, si un modelo AR(p) venía dado por la expresión: yt=f0+f1yt-1+f2yt-2+......+fpyt-p+at, ahora se tiene que en lugar de modelar el comportamiento de una variable, modelamos el de k variables, es decir consideremos un vector columna de k variables aleatorias: Yt=[y1, y2, ... , yk]. Luego la expresión general de un modelo VAR viene dada por:
yt=f1yt-1+f2yt-2+......+fpyt-p+gxt+at
Donde yt es la variable objeto de predicción (vector de variables a predecir), xt es un vector de k variables explicativas, y f y g son los vectores de coeficientes a estimar, con a como el vector de perturbaciones aleatorias. Esta estructura es propicia para ser representada en forma matricial, y es fácilmente extendible para contener un número mayor de series y de rezagos. El número de rezagos empleado viene denotado por el componente p de VAR(p).
Al igual que con los modelos univariantes, existe una metodología para la construcción de los modelos multivariantes:
VEC
En los modelos VAR, así como en la modelización univariante de series temporales, se asume que las series temporales utilizadas son estacionarias, esto debe de ser así ya que cuando se efectúan regresiones entre variables no estacionarias podemos caer en el problema de las llamadas correlaciones espurias (estimaciones de modelos que presentan en principio buenas validaciones, pero que encierran relaciones no-reales). Aunque en general la regresión entre series no estacionarias conduce a correlaciones espurias, existe una situación especial en el que tal regresión no sería espuria, sino que el estimador MCO sería correcto. Esa situación especial recibe el nombre de cointegración (Por definición, una combinación lineal de dos o más series no estacionarias puede ser estacionaria. Luego si existe una combinación lineal de series que es estacionaria, se dice que las series no estacionarias, con raíz unitaria, que dan lugar a esa combinación están cointegradas). La combinación lineal estacionaria se denomina ecuación de cointegración y puede interpretarse como la relación de equilibrio a largo plazo entre las distintas variables que conforman la ecuación por lo cual, en sí misma, tiene una alta importancia para el análisis de los fenómenos que la serie contiene.
Pues bien, un modelo de vector de corrección del error (VEC)(VECM, Vector Error Correction Models) es un modelo VAR restringido (habitualmente con sólo dos variables) que tiene restricciones de cointegración incluidas en su especificación, por lo que se diseña para ser utilizado con series que no son estacionarias pero de las que se sabe que son cointegradas. El principio detrás de estos modelos es que existe una relación de equilibrio a largo plazo entre variables y que, sin embargo, en el corto plazo puede haber desequilibrios. Con los modelos de corrección del error, una proporción del desequilibrio de un período es corregido gradualmente a través de ajustes parciales en el corto plazo. Una de las claves de los modelos VEC es determinar si las series que se modelan son cointegradas y, si es así, determinar la ecuación de integración. Para ello se utiliza el método de Johansen (luego si la serie multivariante es cointegrada se utiliza un modelo VEC, si no es cointegrada se utiliza un modelo VAR).
En el desarrollo teórico de la mayoría de técnicas y modelos no se tienen en cuenta algunas cuestiones que surgen en su aplicación práctica, como es en concreto la existencia de datos faltantes, también denominados perdidos o incompletos. Muchas series temporales existentes contienen valores perdidos o no presentes en las observaciones que las componen (ya sean provocados por mediciones incorrectas, errores, etc). Estos valores perdidos crean numerosos problemas y hacen dificil el análisis de los datos, por lo tanto su presencia hace que sea necesaria una etapa de preprocesado de la serie. Los modelos de pérdida de datos se clasifican en tres tipos diferentes: MCAR, MAR y MNAR. Conocer esta causa que genera los datos perdidos es importante ya que puede ser de ayuda a la hora de seleccionar un método concreto para tratarlos.
La manera más simple de tratar con ellos es descartándolos, pero esto solo es posible cuándo son muy pocos los valores perdidos y no tienen influencia en el análisis posterior. Otra forma de lidiar con ellos es realizar el análisis únicamente con los datos disponibles. Pero uno de los métodos más conocidos para tratar con este problema es la imputación.
Imputación
En estadística, la imputación es el proceso de reemplazar los valores perdidos con valores sustitutos. El objetivo de la imputación es rellenar los valores perdidos con estimaciones (realizadas con el método de aprendizaje más apropiado para cada caso) de estos teniendo en cuenta las relaciones posibles entre las observaciones. Luego existen diversos métodos de imputación diferenciados en la forma de estimar los datos faltantes, cuya elección preferible vendrá dada por la naturaleza de la serie:
En el ámbito de la imputación, la imputación en series temporales univariantes es un reto adicional, debido a que la mayoría de algoritmos complejos están desarrollados para series temporales multivariantes ya que dependen de la correlación entre los inter-atributos para estimar los valores de los datos perdidos (imputación múltiple, EM, kNN, etc.), algo que no ocurre en el caso univariante (al ser un único atributo). Pero además de los métodos simples, también hay posibilidades adicionales más complejas para la imputación en series temporales univariantes:
Series temporales univariantes
Para que R trate a un conjunto de datos como serie temporal:
ts(data, start, end, frequency)
- data: vector o matrix con las observaciones
- start: tiempo de la primera observación
- end: tiempo de la última observación
- frequency: número de observaciones por unidad de tiempo
Conocer el tiempo de comienzo de la serie:
start(serie temporal)
Conocer el tiempo de fin de la serie:
end(serie temporal)
Conocer la frecuencia de la serie:
frequency(serie temporal)
Representación gráfica de la serie:
plot(serie temporal) *llama internamente a plot.ts(serie temporal)*
Representación numérica de la serie:
print(serie temporal)
Unidad de tiempo a la que pertenece cada observación de la serie:
cycle(serie temporal)
Obtener un subconjunto de la serie teporal (puede ser interesante por ejemplo para pintar un año y ver si presenta componente estacional):
window(serie temporal, start, end)
- start: tiempo de la primera observación
- end: tiempo de la última observación
Extraer las subseries estacionales de la serie y pintarlas todas juntas (es interesante para ver la componente estacional)(lo ideal es usarlas sin la componente tendecia):
monthplot(serie temporal, phase)
- phase: indica la estación a la que corresponde cada muestra
boxplot(formula, serie temporal)
- formula: fórmula que indica la serie temporal y su división en ciclos (es decir, a que estación o ciclo corresponde cada muestra)
Agregación de los datos de la serie temporal (puede ser interesante por ejemplo para cambiar la frecuencia de anual a trimestral)(siempre que los datos sean agregables):
aggregate(serie temporal, FUN, nfrequency)
-FUN: función con la que se computa la agregación (mean)
-nfrequency: nuevo número de observaciones por unidad de tiempo (12->mensual, 4->trimestral, 1->anual...)
Retardar la serie temporal:
lag(serie temporal, k) *paquete stat* *realiza un rezago del tiempo de la serie temporal*
Lag(serie temporal, k) *paquete quantmod* *si se le pasa una serie temporal realiza un rezago del tiempo de la serie temporal, si no, realiza un rezago de los datos añadiento un valor NA al principio*
- k: número de rezagos aplicados a la serie
Descomposición de una serie temporal en Tendencia + Efecto estacional + Residuos:
decompose(serie temporal, type) *mediante medias móviles*
- type: tipo de serie, aditiva o multiplicativa
stl(serie temporal, s.windows) *mediante loess*
- s.windows: establecido con "period" o con el periodo para la extracción de la estacionalidad
Transformación logarítmica de una serie:
log(serie temporal, base)
- base: base del logaritmo. 10 por defecto
Transformación BoxCox de una serie:
BoxCox(serie temporal, lambda)
- lambda: parámetro de la transformación, el parámetro óptimo para los datos se consigue con la función BoxCox.lambda(serie temporal, method=c("loglik","guerrero"))
Test de heterodasticidad de Goldfeld-Quandt (hipótesis nula de que la varianza es igual en toda la serie):
gqtest(formula) *paquete lmtest*
- formula: descripción simbólica del modelo
Cómputo de las estimaciones de las funciones de autocorrelación y autocorrelación parcial:
acf(serie temporal, lag.max) *paquete stats*
Acf(serie temporal, lag.max) *paqute forecast*
pacf(serie temporal, lag.max) *paquete stats*
Pacf(serie temporal, lag.max) *paqute forecast*
- lag.max: número máximo de retardos calculados
Cálculo del test de Dickey-Fuller Ampliado (Test ADF) para estacionariedad:
adf.test(serie temporal) *paquete tseries* *siempre elimina la tendencia de la serie evaluada*
adfTest(serie temporal, type) *paquete fUnitRoots*
type: tipo de regresión de raíz unitaria empleada. "nc" sin intercepto ni tendencia, "c" sin tendencia con intercept, "ct" con intercepto y tendencia
Cálculo del test de Kwiatkowski-Phillips-Schmidt-Shin (Test KPSS) para estacionariedad:
kpss.test(serie temporal)
Cálculo de la tendencia mediante modelos lineales y polinómicos:
lm(formula)
- formula:
- Para modelos lineales: serie temporal ~ tiempo
- Para modelos polinómicos: serie temporal ~ tiempo + I(tiempo^2) + ...
Cálculo de la tendencia mediante filtrado (medias móviles):
filter(serie temporal, filter, method, sides)
- filter: vector de coeficientes del filtro
- method: "convolution" para usar medias móviles
- sides: "2" para centrados
decompose(sertie temporal)$trend
ma(serie temporal, order, centre) *paquete forecast*
- order: orden la media móvil
- centre: si se desea centrar la media móvil sea cual sea el orden
Eliminación de la tendencia mediante diferenciación (lag=1):
diff(serie temporal)
Eliminación de la estacionalidad mediante diferenciación del orden del periodo:
diff(serie temporal, lag)
- lag: retardo a emplear
La diferenciación se puede deshacer con:
diffinv(serie temporal, lag)
- lag: retardo empleado
Cálculo del número de diferenciaciones regulares necesarias para hacer la serie estacionaria:
ndiffs(serie temporal, test)
- test: tipo de test con el que se realiza el cálculo; "adf" (Augmented Dickey-Fuller), "kpss", "pp" (Phillips-Perron)
Cálculo del número de diferenciaciones estacionales necesarias para hacer la serie estacionaria:
nsdiffs(serie temporal, m)
- m: longitud del periodo estacional
Cálculo (identificación) automático del mejor modelo ARIMA al que se ajustan los datos (se puede usar por ejemplo simplemente como una primera aproximación)(lo ideal es usarlo con la serie ya una vez sea estacionaria):
auto.arima(serie temporal, seasonal, stepwise, d, D)
- seasonal: con true o false indicamos si las búsqueda restringuen el componente estacional
- stepwise: a FALSE realiza una búsqueda sobre todos los modelos (lento), a TRUE hace una búsqueda gradual (rápido)
- d: orden de la primera diferenciación regular
- D: orden de la diferenciación estacional
Simulación de un modelo ARIMA:
arima.sim(model, n)
- model: lista con los componenetes AR y MA, se puede usar también _order_ para el orden
- n: longitud de la serie que se simula
Ajuste del modelo ARIMA sobre una serie temporal:
arima(serie temporal, order, seasonal) *paquete stats*
Arima(serie temporal, order, seasonal,lambda) *permite una componente de tendencia* *paquete forecast*
- order: especificación de los tres componentes del modelo en forma de vector
- seasonal: especificación de la parte estacional del modelo junto con el periodo (si la serie original es estacionaria)
- lambda: si está presente indica el valor que debe de emplear una transformación de BoxCox sobre los datos
Ajuste de un modelo autorregresivo AR sobre una serie temporal:
ar(serie temporal, order.max, method)
- order.max: orden máximo del modelo a ajustar
- method: método con el que se ajusta el modelo
Evaluación de la bondad del ajuste de varios modelos mediante el criterio AIC (Akaike Information Criterion) o BIC (Bayesian Information Criterion):
AIC(object, object, ...)
BIC(object, object, ...)
- object: modelos de serie temporal que se quieren comparar
Test de Ljung-Box y Box-Pierce para la hipótesis de independencia:
Box.test(residuos modelo,type)
- type: "Ljung-Box" o "Box-Pierce" (por defecto)
Test de normalidad con los estadísticos Jarque Bera y Shapiro-Wilk:
jarque.bera.test(residuos modelo)
shapiro.test(residuos modelo)
Predecir una serie temporal:
forecast(object, h)
- object: modelo de serie temporal
- h: número de periodos a predecir
predict(object, n.ahead)
- object: modelo de serie temporal
- n.ahead: número de periodos a predecir
Medición de la afinidad del modelo predicho (Error medio (ME), Error medio absoluto (MAE), Porcentaje del error medio absoluto (MAPE), Error medio absoluto escalado (MASE), Porcentaje del error medio (MPE), etc.):
accuracy(object, x)
- object: objeto de la clase forecast (también sirve con arima) o un vector numérico con las predicciones
- x: vector con los valores reales a comparar
Ajustar una serie temporal mediante un alisado exponencial simple:
HoltWinters(serie temporal, alpha, beta, gamma) *paquete stats*
- alpha: parámetro alpha del alisado exponencial
- beta: parámetro beta del alisado exponencial. Debe establecerse a FALSE
- gamma: parámetro gamma del alisado exponencial. Debe establecerse a FALSE
ses(serie temporal, alpha, h) *paquete forecast*
- alpha: parámetro alpha del alisado exponencial
- h: nº de periodos a predecir
Ajustar una serie temporal mediante un alisado exponencial doble:
HoltWinters(serie temporal, alpha, beta, gamma) *paquete stats*
- alpha: parámetro alpha del alisado exponencial
- beta: parámetro beta del alisado exponencial
- gamma: parámetro gamma del alisado exponencial. Debe establecerse a FALSE
holt(serie temporal, alpha, beta, h, exponential, damped) *paquete forecast*
- alpha: parámetro alpha del alisado exponencial
- beta: parámetro beta del alisado exponencial
- h: nº de periodos a predecir
- exponential: a TRUE se calcula una tendencia exponencial, a FALSE lineal
- damped: a TRUE para no usar una tendencia lineal
Ajustar una serie temporal mediante un alisado exponencial Holt-Winter:
HoltWinters(serie temporal, alpha, beta, gamma, seasonal) *paquete stats*
- alpha: parámetro alpha del alisado exponencial
- beta: parámetro beta del alisado exponencial
- gamma: parámetro gamma del alisado exponencial
- seasonal: permite diferenciar entre un modelo aditivo o multiplicativo. Solo disponible si está presente el parámetro gamma
hw(serie temporal, alpha, beta, gamma, seasonal, h, exponential, damped) *paquete forecast*
- alpha: parámetro alpha del alisado exponencial
- beta: parámetro beta del alisado exponencial
- gamma: parámetro gamma del alisado exponencial
- seasonal: permite diferenciar entre un modelo aditivo o multiplicativo
- h: nº de periodos a predecir
- exponential: a TRUE se calcula una tendencia exponencial, a FALSE lineal
- damped: a TRUE para no usar una tendencia lineal
Predicción de valores de una serie temporal ajustada con un alisado:
forecast(object, h) *forecast.HoltWinters()*
- object: modelo de serie temporal
- h: número de periodos a predecir
predict(object, n.ahead) *predict.HoltWinters*
- object: modelo de serie temporal
- n.ahead: número de periodos a predecir
Ajuste de una serie temporal aditiva (con tendencia no lineal y estacionalidad semanal y anual)(buena con periodicidad diaria):
prophet(df, changepoints, n.changepoints, changepoint.prior.scale)
- df: data.frame con una columna ds con el tiempo, y otra columna y con las observaciones
- changepoints: fechas dentro de df$ds para testear si hay en ellas un cambio de tendencia. Por defecto vacío
- n.changepoints: número de fechas a testear. Por defecto 25
- changepoint.prior.scale: establece la flexibilidad en el cambio de tendencia.Por defecto 0.5
Extensión del data.frame de la serie temporal aditiva con los periodos temporales a predecir:
make_future_dataframe(m, periods, freq)
- m: objeto prophet
- periods: nº de periodos que se va a predecir
- freq: frecuencia de la serie
Predicción de la serie temporal aditiva:
predict(object, df) *predict.prophet*
- object: objeto prophet
- df: data.frame con el periodo a predecir incluido (también predice la serie ajustada)
Series temporales multivariantes
Determinación del nº de lags óptimos a emplear en un modelo VAR:
VARselect(serie temporal, lag.max) *paquete vars*
- lag.max: número máximo de retardos a evaluar
VARorder(serie temporal, maxp) *paquete MTS*
- max.p: número máximo de retardos a evaluar
Estimación de un modelo VAR empleando mínimos cuadrados ordinarios por ecuación:
VAR(serie temporal, p)
- p: orden, nº de rezagos empleados
Ploteo de un modelo VAR ajustado:
plot(modeloVAR)
- modeloVAR: resultado del ajuste de un modelo VAR
Pruebas de cointegración de Johansen:
ca.jo(serie tempotal, type, K)
- type: test empleado, "eigen" o "trace"
- K: lag de la serie VAR
Ajuste y estimación de los parámetros de cointegración:
cajorls(serie temporal, r)
- r: rango de cointegración
Transformación de un modelo VECM en un modelo VAR:
vec2var(z, r)
- z: objeto obtenido con ca.jo
- r: rango de cointegración
stats: incorporado en R
base: incorporado en R
tseries: https://cran.r-project.org/web/packages/tseries/index.html
forecast: https://cran.r-project.org/web/packages/forecast/index.html
prophet: https://cran.r-project.org/web/packages/prophet/prophet.pdf
Debido a que las redes neuronales tienen un componente aleatorio, es aconsejable establecer una semilla para asegurar que los datos sean reproducibles.
Ajuste de una serie temporal con redes neuronales feed-fordward:
nnetar(serie temporal, p, P, size, repeats, lambda, scale.inputs) *paquete forecast*
- p: nº de retardos no estacionales. Para datos no estacionales, el valor por defecto es el nº óptimo de razagos (acorde al AIC) de un modelo AR(p) lineal. Para datos estacionales, el valor por defecto sigue la misma metodología, pero aplicada a los datos ajustados estacionalmente (a partir de una descomposición stl)
- P: nº de retardos estacionales. Por defecto es 1
- size: nº de neuronas de la capa oculta. Por defecto es el redondeo al entero más cercano de k=(p+P+1)/2 (la mitad de los nodos de entrada)
- repeats: nº de redes ajustadas con valores de los pesos diferentes (inicializados aleatoriamente)
- lambda: parámetro para una transformación de box cox
- scale.inputs: por defecto TRUE, las entradas son escaladas
nnet(formula, x, y, data, size, linout) *paquete nnet*
- formula: formula que debe aprender la red neuronal (valor real de la serie y rezagos)
- x: matriz o data.frame con los datos de los rezagos de la serie
- y: matriz o data.frame con los datos reales de la serie
- data: data.frame con los valores que aparecen en formula
- size: número de neuronas de la capa oculta
- linout: salida lineal o logística
neuralnet(formula, data, hidden, algorithm) *paquete neuralnet*
- formula: formula que debe aprender la red neuronal (valor real de la serie y rezagos)
- data: data.frame con los valores que aparecen en formula
- hidden: número de neuronas de la capa oculta
- algorithm: algoritmo empleado para calcular (entrenar) la red
mlp(x, y, size, learnFunc, linOut) *paquete rsnns*
- x: entradas de la red neuronal
- y: salidas de la red neuronal
- size: nº de neuronas en la capa oculta
- learnFunc: algoritmo empleado para aprender la red
- linOut: función de activación de la salida lineal (TRUE) o logística
Normalización de las observaciones de una serie temporal:
scale(x)
- x: datos que se van a normalizar
normalizeData(x, type)
- x: datos que se van a normalizar
- type: tipo de normalización empleada ("0_1", "norm" o "center")
denormalizeData(x, normParams)
- x: valores a des-normalizar
- normParams: parámetros generados durante la normalización (se obtienen con getNormParameters(x))
Ajuste de una serie temporal con redes neuronales parcialmente recurrentes:
jordan(x, y, size, learnFunc, linOut) *paquete rsnns*
- x: entradas de la red neuronal
- y: salidas de la red neuronal
- size: nº de neuronas en la capa oculta
- learnFunc: algoritmo empleado para aprender la red
- linOut: función de activación de la salida lineal (TRUE) o logística
elman(x, y, size, learnFunc, linOut) *paquete rsnns*
- x: entradas de la red neuronal
- y: salidas de la red neuronal
- size: nº de neuronas en la capa oculta
- learnFunc: algoritmo empleado para aprender la red
- linOut: función de activación de la salida lineal (TRUE) o logística
Series temporales univariantes
Aunque la imputación en general está bien cubierta en R, es dificil encontrar funciones para la imputación de series temporales univariantes. El problema reside en que la mayoría de técnicas de imputación estandar no pueden ser aplicadas a series temporales univariantes de forma directa, ya que la mayoría de algoritmos dependen de correlaciones entre los inter-atributos, mientras que la imputación de series univariantes necesitan emplear dependencias del tiempo.
Imputación de valores perdidos mediante la media:
na.mean(serie temporal)
Imputación de valores perdidos mediante médias móviles:
na.ma(serie temporal, k)
- k: ventana de la média móvil
Imputación de valores perdidos mediante locf:
na.locf(serie temporal, option) *paquete imputeTS*
- option: locf para reemplazar con la anterior, nocb para reemplazar con la posterior
na.locf(serie temporal, fromLast) *paquete zoo*
- fromLast: valor a true para reemplazar con la posterior, en caso contrario con la anterior
Imputación de valores perdidos mediante interpolación:
na.interpolation(serie temporal, option) *paquete imputeTS*
- option: "linear" "spline" (polinomial) o "stine"
na.approx(serie temporal) *paquete zoo*
na.interp(serie temporal) *paquete forescast*
Imputación de valores perdidos mediante agregación:
na.aggregate(serie temporal, by)
- by: agrupación para generar la imputación
Imputación de valores perdidos mediante filtro de Kalman en modelos en el espacio de estados o estructurales:
na.kalman(serie temporal, model, smooth)
- model: modelo usado al que se le aplica el filtro de Kalman. Puede ser "auto.arima" para usar una representación en el espacio de estados de los modelos ARIMA, o "StructTS" para usar un modelo estructural ajustado por máxima verosimilitud.
- smooth: "true" para usar kalmanSmooth (mejor opción para imputación) o "false" para kalmanRun.
Imputación de valores perdidos por descomposición estacional:
na.seadec(serie temporal, algorithm)
- algorithm: algoritmo usado para realizar la imputación
Imputación de valores perdidos por división estacional:
na.seasplit(serie temporal, algorithm)
- algorithm: algoritmo usado para realizar la imputación
Series temporales multivariantes
Imputación de valores perdidos mediante imputación múltiple:
mice(serie temporal, m, method)
- m: número de imputaciones múltiples
- method: método de imputación de los datos
Imputación de valores perdidos mediante k-NN:
kNN(serie temporal, variable, k) *paquete imputeTS*
- variable: nombre de la columna a imputar
- k: número de vecinos cercanos usados
forecast: https://cran.r-project.org/web/packages/forecast/index.html
imputeTS: https://cran.r-project.org/web/packages/imputeTS/index.html
mtsdi: https://cran.r-project.org/web/packages/mtsdi/mtsdi.pdf
amelia: https://cran.r-project.org/web/packages/Amelia/Amelia.pdf
mvnmle: https://cran.r-project.org/web/packages/mvnmle/mvnmle.pdf
missForest: https://cran.r-project.org/web/packages/missForest/missForest.pdf
yaImpute: https://cran.r-project.org/web/packages/yaImpute/yaImpute.pdf
Ejemplo básico de las funciones referentes a una serie temporal: Ver
Ejemplo básico de las funciones referentes a una serie temporal con alisados exponenciales: Ver
Ejemplo básico de las funciones referentes a una serie temporal con redes neuronales: Ver
Ejemplo básico de comparación de funciones de modelado de series temporales con redes neuronales, modelos arima, alisados exponenciales y modelos aditivos: Ver
Ejemplo básico de las funciones referentes a la imputación: Ver
Ejemplo básico de las funciones referentes a la validación cruzada: Ver
Ejemplo básico de las funciones referentes a una serie temporal multivariante: Ver
Ejemplo simple de análisis y modelado de series temporales sin predicción: http://www.itl.nist.gov/div898/handbook/pmc/section6/pmc62.htm
Ejemplo simple de análisis, modelado y predicción de series temporales: http://www.itl.nist.gov/div898/handbook/pmc/section4/pmc44a.htm
Ejemplo simple de análisis, modelado y predicción de series temporales: Ver
Caso ejemplo Análisis y modelado Series temporales simple 01: Ver
Caso ejemplo Análisis y modelado Series temporales simple 02: Ver
Caso ejemplo Análisis y modelado Series temporales completo 03: Ver
Caso ejemplo Análisis y modelado Series temporales completo 04: Ver
Series temporales:
https://www.udacity.com/course/time-series-forecasting--ud980
Machine learning:
https://es.coursera.org/learn/machine-learning
Redes neuronales:
https://www.coursera.org/learn/neural-networks
Deep learning:
https://www.udacity.com/course/deep-learning--ud730
The analysis of time series. An introduction. Chris Chatfield
Time series analysis. With apllications in R. Jonathan D. Cryer
Time series analysis and its applications. With R examples. Robert H. Shumway
Using R for data analysis and graphics. Introduction, code and commentary. J. H. Maindonald
Data preprocesing in data mining. Salvador García, Julián Luengo and Francisco Herrera
Introduction to time series analysis http://www.itl.nist.gov/div898/handbook/pmc/section4/pmc4.htm
Series temporales http://halweb.uc3m.es/esp/Personal/personas/jmmarin/esp/EDescrip/tema7.pdf
Series temporales http://humanidades.cchs.csic.es/cchs/web_UAE/tutoriales/PDF/SeriesTemporales.pdf
Introducción al análisis de series temporales http://halweb.uc3m.es/esp/Personal/personas/amalonso/esp/seriestemporales.pdf
Introducción al análisis de series temporales https://www.ucm.es/data/cont/docs/518-2013-11-11-JAM-IAST-Libro.pdf
Introducción a series de tiempo http://www.estadisticas.gobierno.pr/iepr/LinkClick.aspx?fileticket=4_BxecUaZmg%3D
Modelización con datos de series temporales https://www.ucm.es/data/cont/docs/518-2013-10-25-Tema_6_EctrGrado.pdf
Series temporales: Modelo ARIMA http://www.estadistica.net/ECONOMETRIA/SERIES-TEMPORALES/modelo-arima.pdf
Modelo ARIMA https://www.uam.es/personal_pdi/economicas/anadelsur/pdf/Box-Jenkins.PDF
Técnicas de suavización http://renanquispellanos.com/recursos/aporte%20intelectual/tecnicas%20prediccion/12.unidad9.pdf
Alisado de series temporales http://www.estadistica.net/ECONOMETRIA/SERIES-TEMPORALES/alisado.pdf
Análisis descriptivo de series temporales con R https://www.uam.es/personal_pdi/ciencias/acuevas/docencia/doct/Series-temporales-con-R.pdf
Análisis básico de series temporales con R https://rpubs.com/joser/SeriesTemporalesBasicas
Quick-R: Time Series http://www.statmethods.net/advstats/timeseries.html
Series temporales en R https://dl.orangedox.com/9fzOYs2ZoimR4izLVE/7-Series%20temporales%20en%20R.pdf
A Complete Tutorial on Time Series Modeling in R https://www.analyticsvidhya.com/blog/2015/12/complete-tutorial-time-series-modeling/
A little book of R for time series https://media.readthedocs.org/pdf/a-little-book-of-r-for-time-series/latest/a-little-book-of-r-for-time-series.pdf
Methods for the estimation of missing values in time series http://ro.ecu.edu.au/cgi/viewcontent.cgi?article=1063&context=theses
Comparison of different Methods for Univariate Time Series Imputation in R: https://arxiv.org/ftp/arxiv/papers/1510/1510.03924.pdf
A blog by Rob J Hyndman: http://robjhyndman.com/hyndsight/
Redes de neuronas recurrentes http://eva.evannai.inf.uc3m.es/et/docencia/doctorado/cib/documentacion/NNRecurrentes.pdf
A Beginner’s Guide to Recurrent Networks and LSTMs: https://deeplearning4j.org/lstm
¿Qué es y cómo funciona “Deep Learning”? https://rubenlopezg.wordpress.com/2014/05/07/que-es-y-como-funciona-deep-learning/
Multivariate time series models: http://lipas.uwasa.fi/~bepa/Multivariate.pdf
Analysis of multiple time series: https://www.kevinsheppard.com/images/5/56/Chapter5.pdf
Técnicas avanzadas de predicción: https://www.uam.es/docencia/predysim/combinado5/unidad5.htm
Johansen Test for Cointegrating Time Series Analysis in R:https://www.quantstart.com/articles/Johansen-Test-for-Cointegrating-Time-Series-Analysis-in-R
Análisis de series temporales https://www.youtube.com/watch?v=NDOPKRAT3-E
Análisis clásico de series temporales https://www.youtube.com/watch?v=cQxFPPIj7gc
Series temporales https://www.youtube.com/watch?v=NRtgyq3MjAs
Prácticas series temporales https://www.youtube.com/watch?v=XXu2Mbg5-Lg
Predicción con series temporales https://www.youtube.com/watch?v=XXu2Mbg5-Lg
Lectura de correlogramas https://www.youtube.com/watch?v=zpFyhbcNWIU
Modelo autorregresivo en R https://www.youtube.com/watch?v=a5QQp9peaZ4
Introduction to ARIMA modeling in R https://www.youtube.com/watch?v=zFo7QixEKvg