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()

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)

Autocorrelación

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)

# left plot
autoplot(USAccDeaths)

# right plot
ggAcf(USAccDeaths)

# left plot
autoplot(mink)

# right plot
ggAcf(mink)

Ruido blanco

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.

Prueba L.Jung-Box

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