El presente documento es un prepartivo o aclaratorio referente a las series de Tiempo y su tratamiento en R. Revisarmos los conceptos iniciales para la luego, comenzar a utilizar los diferentes modelos que permite a posterior la predicción de valores futuros de la serie.
Tendencia : Regresión y diferenciación
Cambios de tendencias: Regresión, dummy y diferenciación
Patron estacional: regresión, dummy y diferenciación
Heterocedasticidad: Transformación BoxCox
Objetivo 1:
Lograr estacionaridad
Media constante;
Homocedasticidad;
ACF que no depende de t.
La estacionariodad se cumple entonces logrando que la media, la varianza y la covarainza del proceso generador de la serie No dependan del Tiempo
Ejemplo: cargamos df y le damos el objeto ts (serie de tiempo). En este caso, le damos un inicio en enero de 2020 con una frecuencia mensual.
ventas <- c(120, 135, 150, 160, 180, 200, 210, 190, 170, 160, 150, 140, #ventas mensuales
130, 145, 160, 170, 190, 210, 220, 200, 180, 170, 160, 150,
140, 155, 170, 180, 200, 220, 230, 210, 190, 180, 170, 160)
ventas_ts <- ts(ventas, start = c(2020, 1), frequency = 12) #Creamos un objeto de serie de tiempo
ventas_ts
## Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec
## 2020 120 135 150 160 180 200 210 190 170 160 150 140
## 2021 130 145 160 170 190 210 220 200 180 170 160 150
## 2022 140 155 170 180 200 220 230 210 190 180 170 160
Podemos a través del comando plot o plot.ts graficar nuestra serie de tiempo.
plot(ventas_ts, main = "Ventas Mensuales (2000-2022)",
xlab = "Tiempo", ylab = "Ventas", col = "orange", lwd = 3)
Luego a traves del comando decompose, podemos descomponer la serie.
dec <- decompose(ventas_ts)
plot(dec, lwd=2, col="orange")
La tendencia muestra el patrón que sigue la evoluaión de los datos a través del tiempo. Este componente constituye la base del incremento o decremento de la serie de la serie de tiempo. Se ve como si la serie se “mueve”, la media y la varianza depende del tiempo.
Cuando se puede apreciar que la tendencia se mueve en una dirección (crece o decrece), hablamos de un modelo determinista
Cuando la tendencia oscila o avanza sin rumbo, se denomina estocástica
La estacionalidad son patrones debido a influencias estacionales.
El ruido corresponde a variaciones impredecibles.
El concepto de dependencia serial en series de tiempo se refiere a que el valor de una variable en un momento dado (t) está relacionado o depende del valor que tuvo en momentos anteriores (t−1,t−2,…).
En términos sencillos, significa que la historia de la serie de tiempo importa y tiene un efecto persistente en el futuro inmediato.
La dependencia serial se mide formalmente con algo llamado Autocorrelación. La autocorrelación simplemente mide la correlación de la serie consigo misma en diferentes desfases de tiempo (lag).
Una autocorrelación alta en el lag 1 indica que la observación de hoy está fuertemente relacionada con la de ayer.
En resumen, la dependencia serial es la huella del pasado en el presente dentro de una serie de tiempo.
La dependencia serial se mide con la función ACF.
A continuación tres ejemplos de tipos de series y como se aprecia su ACF.
Respecto al ejemplo.
1.- Para el primer caso, no hay dependencia serial, se conoce como ruido blanco.
2.- Para los otros dos casos si existe dependencia serial, se diferencian por:
Dependencia serial de memoria corta.
Dependencia serial de memoria larga.
Tanto el ejemplo AR de dependencia corta, como la Caminata aleatoria de dependencia larga, muestran dependencia serial . La de memoria corta tiene un patron estacionario (media y varianza constante, ademas de dependencia). La serie denominada “caminata aleatoria”, solo muestra dependencia serial.
Muchas de las series de la vida real muestran características no estacionarias, generalmente algún tipo de tendencia o alguna estacionalidad.
Como se dijo anteriormente, la aplicación y el estudio de serie temporales se basan en el supuesto de estacionaridad, se utilizan técnicas para transformar datos NO estacionarios en datos estacionarios
Entre algunos métodos están:
Estabilización de la varianza (Transformación Box Cox).
La estimación de tendencias a través de: la regresión lineal y la diferenciación de la serie.
En el enfoque estocástico la estacionariedad se suele alcanzar mediante la operación de diferenciación,mientras que en los métodos clásicos se requiere sustraer de la serie que presenta tendencia determinista la estimación de la función del tiempo que provoca dicha tendencia.
Cargamos una serie de tiempo disponible en R, esta se llama “AirPassengers”.
data <- AirPassengers
head(data)
## Jan Feb Mar Apr May Jun
## 1949 112 118 132 129 121 135
Dibujamos la serie de tiempo.
plot.ts(data)
Ploteamos su ACF y vemos que esta es de memoria larga.
acf(data)
En resumen, hasta el momento esta serie no es estacionaria por:
Media dependiente del tiempo,
Varianza dependiente del tiempo.
Si cumple con la dependencia serial. Pero no es suficiente para el cumplimiento de la estacionaridad.
Por lo anterior, esta serie en este formato NO ES POSIBLE DE MODELAR
Recordar que el objetivo es lograr la estacionaridad.
A nuestra serie de tiempo data, le aplicamos el logaritmo y graficamos.
log.data <- log(data)
plot.ts(log.data)
Vemos como se estabilizo la varianza.. Continua con tendencia pero la varianza se estabiliza.
lambda <- BoxCox.lambda(data)
cat("El lambda obtenido es: ", lambda)
## El lambda obtenido es: -0.2947156
data.bc <- BoxCox(data, lambda = lambda)
plot(data.bc)
En resumen mediante dos formas.. la aplicación de logaritmo (que en BoxCox se da con un lambda igual a 0) y la búsqueda del mejor lambda con el comando BoxCox.lambda, nos ha permitido estabilizar la varianza.
Basicamente aquí tomamos los datos de la serie de tiempo, obtenemos el indice de los tiempos. A continuación, obtenemos la regresión lineal
#data son los datos originales...
#el indice de tiempo sirve para representar el paso del tiempo, sin la utilización de fechas reales.
ind.time <- seq(from=1, to=length(data))
modelo.trend <- lm(data~ind.time)
residuos <- resid(modelo.trend)
par(mfrow=c(2,1))
plot(data, main="Air Passengers con tendencia", ylab="Pasajeros", xlab="Tiempos (años)", lwd=1)
lines(modelo.trend$fitted.values~c(time(data)), col="orange", lwd=2)
plot(residuos, type = "l", main="Residuos (Serie sin tendencia)")
abline(h=0, col="orange")
Podemos obtenemos la autocorrelación de los residuos..
acf(residuos)
Se pueden apreciar una dependencia serial y una estacionalidad.. Este
modelo no cumple la condición de estacionaridad.
la diferenciación permite eliminar tendencias y estacionalidad restando cada valor, con su valor anterior. Se utiliza principalmente cuando el proceso del cual proviene la serie no es deterministica (estocástca).
Probemos que sucede al diferenciar.
data.diff1 <- diff(data, differences = 1) # eliminamos la tendencia
plot(data.diff1, type="l", col="orange")
data.diff2 <- diff(data,lag=12) # eliminamos la estacionalidad
plot(data.diff2, type="l", col="orange")
Sobre los lag o rezago, es bueno considerar:
lag=1 , se resta la serie de tiempo con su valor inmediatamente anterior (por defecto es 1).
lag=12, se resta con el valor de 12 meses atrás (cuando la serie es mensual).
data.diff1 <- diff(data, differences = 1) # eliminamos la tendencia
data.diff12 <- diff(data.diff1, lag=12) # eliminamos la estacionalidad
plot(data.diff12, type="l", main="Eliminación de Estacionalidad y Tendencia", col="orange")
acf(data.diff12, main="ACF Diferenciación estacionalidad y tendencia")
Número de diferencias que se deben ejecutar para que la serie se vuelva estacionaria.
ndiffs(x = data, test = "adf")
## [1] 1
ndiffs(x = data, test = "pp")
## [1] 1
ndiffs(x = data, test = "kpss")
## [1] 1
Al aplicar los test, cada uno me indica que lo prudente es hacer una diferenciación.
data.diffx2 <- diff(data, differences = 2)
vdata <- var(data)
cat("la viaranza de los datos es:", vdata)
## la viaranza de los datos es: 14391.92
cat("\n")
num <- var(data.diff1)
den <- var(data.diffx2)
cat("la primera varianza es:", num,"la segunda varianza es:",den)
## la primera varianza es: 1139.352 la segunda varianza es: 1588.474
num/den
## [1] 0.7172615
Podemos igualmente medir mediante un estadístico la estacionaridad del modelo. Donde H0 indica que no es estacionaria y la hipotesis alternativa (H1) indica lo contrario. Para ello empleamos el modelo al que le quitamos la tendencia y estacionalidad.
adf.test(data.diff12)
## Warning in adf.test(data.diff12): p-value smaller than printed p-value
##
## Augmented Dickey-Fuller Test
##
## data: data.diff12
## Dickey-Fuller = -5.0472, Lag order = 5, p-value = 0.01
## alternative hypothesis: stationary
Como el p-value = 0.01 < 0.05, podemos rechazar la hipotesis nula y aceptar la alternativa, llegando a la conclusión que la data.diff12 es estacionaria.