library("forecast")
library("fpp2")
Al trabajar con series de tiempo en R debemos convertir lso objetos al tipo ts
class(AirPassengers)
## [1] "ts"
autoplot(AirPassengers) + theme_classic()
Podemos también gráficar multiples series de tiempo
autoplot(arrivals) + theme_classic()
autoplot(arrivals, facet =TRUE) + theme_classic() +
geom_smooth() +
labs("International arrivals to Australia",
y = "Arrivals (in thousands)",
x = NULL)
## `geom_smooth()` using method = 'loess' and formula 'y ~ x'
japan <- arrivals[, "Japan"]
summary(japan)
## Min. 1st Qu. Median Mean 3rd Qu. Max.
## 9.321 74.135 135.461 122.080 176.752 227.641
frequency(japan) # 1 anual, 2 semestral, 4 trimestralm,12 mensual
## [1] 4
Las series de tiempo tienen varios componentes que pueden ayudarnos a entender cómo modelarlas para pronnóstico
autoplot(fpp2::qcement) + theme_minimal()
La tendencia es el incremento/diminución en el largo plazo de los datos. En el gráfico anterior se ve una tendencia creciente.
Patrón estacional, que ocurre como lo dice su nombre debido a factores estacionales, como el mes del año o el día de la semana
El ciclo existe en una serie de tiempo que exhibe subidas y caidas sin un periodo fijo. Por lo general podríamos hablar de condiciones económicas o ciclos de negocios
ggseasonplot(qcement, year.labels=FALSE, continuous=TRUE) + theme_minimal()
Otra forma interesante de detectar estacionalidad en la serie de tiempo graficamente
# left
ggseasonplot(a10, year.labels=FALSE, continuous=TRUE)
#right
ggseasonplot(a10, year.labels=FALSE, continuous=TRUE, polar = TRUE)
Podemos analizar de forma independiente cada estación
ggsubseriesplot(qcement)
Correlación de la serie de tiempo con sus observaciones pasadas
\[ r_{k} = \frac{\sum_{t=k+1}^T (y_{t} - \bar{y})(y_{t-k} - \bar{y})}{\sum_{t=k}^T (y_{t} - \bar{y})^2} \]
Donde \(T\) es la longitud de la serie
# left: autoplot of the beer data
autoplot(ausbeer)
# middle: lag plot of the beer data
gglagplot(ausbeer)
# right: ACF plot of the beer data
ggAcf(ausbeer)
acf(ausbeer, plot = FALSE)
##
## Autocorrelations of series 'ausbeer', by lag
##
## 0.00 0.25 0.50 0.75 1.00 1.25 1.50 1.75 2.00 2.25 2.50 2.75 3.00
## 1.000 0.684 0.500 0.667 0.940 0.644 0.458 0.621 0.887 0.598 0.410 0.574 0.835
## 3.25 3.50 3.75 4.00 4.25 4.50 4.75 5.00 5.25 5.50 5.75
## 0.543 0.354 0.519 0.770 0.481 0.300 0.454 0.704 0.418 0.236 0.393
# left plot
autoplot(AirPassengers)
# right plot
ggAcf(AirPassengers)
Las tendencias nos muestran positivas correlaciones con rezagos anteriores. Tendencias fuertemente marcadas resultarán en observaciones más recientes mucho más cercanas entre ellas.
Estacionalidad inducirá a picos en los rezagos con estacionalidad
# left plot
autoplot(USAccDeaths)
# right plot
ggAcf(USAccDeaths)
# left plot
autoplot(mink)
# right plot
ggAcf(mink)
Series de tiempo que no muestran autocorrelación son llamadas “ruido blanco”. Datos con estas características son considerados independientes e identicamente distribuidos (iid), porque no hay tendencia , estacionalidad, solo comportamiento aleatorio
set.seed(3)
wn <- ts(rnorm(36))
autoplot(wn)
Box.test(wn, lag = 10, fitdf = 0, type = "Lj")
##
## Box-Ljung test
##
## data: wn
## X-squared = 6.7013, df = 10, p-value = 0.7533
Para series de tiempo ruido blanco esperamos que un 95% de las picas de la función de autocorrelación caigan en un \(+/-\frac{2}{\sqrt{T}}\), donde \(T\) es la cantidad de datos en la serie.
Podemos realizar el test de Lung-Box para evaluar si hay un grupo de autocorrelaciones en la serie de tiempo que sea diferente de cero.
\[ Q = n(n+2) \sum_{k=1}^m \frac{\hat{r}_{k}^2}{n-k} \]
Donde \(\hat{r}_{k}^2\) es la autocorrelcación estimada entre la serie y el rezago \(k\), y \(m\) es el número de rezagos evaluados
El estadístico \(Q\) se evalua en una distribución Chi-cuadrado con \(m\) grados de libertad.
n <- length(AirPassengers)
#Cálculo a mano
# Se exluye el rezago cero, ya que la función acf() igual lo calcula
Box_ <- lapply(1:10, function(x){
(acf(AirPassengers, plot= F)$acf[x+1]^2)/(n - x)
})
sum(unlist(Box_)) * (n * (n+ 2))
## [1] 857.0686
Box.test(AirPassengers, lag = 10, fitdf = 0, type = "Lj")
##
## Box-Ljung test
##
## data: AirPassengers
## X-squared = 857.07, df = 10, p-value < 2.2e-16
p-valores inferiores al 5% indicarían que la serie no es ruido blanco
autoplot(pigs)
ggAcf(pigs)
Box.test(pigs, lag = 24, fitdf = 0, type = "Lj")
##
## Box-Ljung test
##
## data: pigs
## X-squared = 634.15, df = 24, p-value < 2.2e-16