You are on page 1of 36

Predicción con Modelos ARIMA

Lic. Juan Isaula


Octubre, 2022

Contents
1 Transformaciones para estabilización de varianza 2
1.1 Estabilización de la Varianza . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2
1.2 Transformaciones de Box-Cox . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 7
1.3 Practica . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 8

2 Modelo ARIMA 16
2.1 Modelo Autorregresivo (AR) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 16
2.2 Modelos de Media Móvil (MA) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 16
2.3 Modelos ARIMA(p,d,q) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 17
2.4 Practicas . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 19

3 Modelos ARIMA Estacionales 28


3.1 Practicas: . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 30

1
Contents

1 Transformaciones para estabilización de varianza


Con los errores ETS, usamos errores multiplicativos y estacionalidad multiplicativa para menejar series de
tiempo que tienen una varianza que aumenta con el nivel de la serie.

1.1 Estabilización de la Varianza


Un enfoque alternativo es transformar la serie de tiempo. Algunas transformaciones comunes son raíces
cuadradas, logaritmos e inversas. Puedes pensar en estos en una escala de transformaciones con fuerza
creciente.

Raíz cuadrada wt = yt ↓

Raiz Cúbica wt = 3 yt Creciente
————– ————————- ————–
Logaritmo wt = log(yt ) Fuerte
————– ————————– —————
Inversa wt = −1/yt ↓

Cuanto más avanzas en la escala, mayor es el efecto de la transformación. Pertimame ilustrar con algunos
datos.
Aquí tenemos la generación de electricidad neta mensual de EE.UU.
library(forecast)
## Registered S3 method overwritten by 'quantmod':
## method from
## as.zoo.data.frame zoo
library(ggplot2)
library(fpp2)
## -- Attaching packages ---------------------------------------------- fpp2 2.4 --
## v fma 2.4 v expsmooth 2.3
##

2
Generación de electricidad mensual de EE.UU

400

300

200

1980 1990 2000 2010


año
Como podemos notar en la gráfica de la serie de tiempo, presenta una tendencia al alza y una fuerte
estacionalidad, impulsada por el uso de calefación y aíre acondicionado. Claramente el tamaño de las
fluctuaciones estacionales es mayor cuando el nivel de la serie es mayor. Cuando usamos transformaciones,
intentamos hacer que esas fluctuaciones sean aproximadamente uniformes en toda la serie.
En este caso, una raíz cuadrada tiene un efecto relativamente pequeño. Veamos:
autoplot(usmelecˆ0.5)+
xlab("año") + ylab('')+
ggtitle('Generación de electricidad mensual de EE.UU')

3
Generación de electricidad mensual de EE.UU

20

18

16

14

12

1980 1990 2000 2010


año
La raíz cúbica es más fuerte
autoplot(usmelecˆ0.33333)+
xlab("año") + ylab('')+
ggtitle('Generación de electricidad mensual de EE.UU')

4
Generación de electricidad mensual de EE.UU
7.5

7.0

6.5

6.0

5.5

1980 1990 2000 2010


año
y un logaritmo es aún más fuerte.
autoplot(log(usmelec))+
xlab("año") + ylab('')+
ggtitle('Generación de electricidad mensual de EE.UU')

5
Generación de electricidad mensual de EE.UU

6.0

5.7

5.4

5.1

1980 1990 2000 2010


año
Pero las fluctuaciones en el extremo superior siguen siendo mayores que las fluctuaciones en el extremo
inferior.
Intentemos una transformación inversa:
autoplot(-1/usmelec)+
xlab("año") + ylab('')+
ggtitle('Generación de electricidad mensual de EE.UU')

6
Generación de electricidad mensual de EE.UU

−0.003

−0.004

−0.005

−0.006

−0.007

1980 1990 2000 2010


año
Ahora parece que hemos ido demaciado lejos, las fluctuaciones estacionales en el extremo superior ahora son
más pequeñas que las fluctuaciones estacionales en el extremo inferior. Entonces, necesitamos algo entre la
transformación logarítmica y la transformación inversa si queremos estabilizar la varianza de esta serie.

1.2 Transformaciones de Box-Cox


Estas cuatro transformaciones están estrechamente relacionadas con la familia de transformaciones de
Box-Cox. Tiene un único parámetro λ, que controla qué tan fuerte es la transformación.

log(yt ) λ=0

wt =
(ytλ − 1)/λ λ 6= 0
• λ = 1 es esencialmente ninguna transformación, simplemente resta uno de todas las observaciones.
• λ= 1
2 es como una raíz cuadrada,
• λ= 1
3 es igual como una raíz cúbica,
• λ = 0 es equivalente a una transformación logarítmica y;
• λ = −1 es muy similar a una transformación inversa.
Podemos usar todos los valores λ entre estos valores para obtener otras transformaciones. Puede probar
algunos valores usted mismo hasta que tenga algo que parezca correcto. O puede usar la función
BoxCox.lambda() que devuelve una estimación de λ que debería equilibrar aproximadamente la variación
a lo largo de la serie. En este caso, se ha elegido un vaor entre -1 y 0, como era de esperar dados los gráficos
anteriores que vimos:
BoxCox.lambda(usmelec)
## [1] -0.5738331

7
Una vez que haya elegido λ, simplemente debe agregarlo a la función de modelado que esta utilizando, y R se
encargará del resto.
usmelec %>%
ets(lambda = -0.57) %>%
forecast(h = 60) %>%
autoplot()
Forecasts from ETS(A,A,A)

500

400
.

300

200

1980 1990 2000 2010 2020


Time
Aquí, hemos usado λ = −0.57 en la función ets. R transformará la serie de tiempo utilizando la
transformación de BoxCox elegida y luego se ajustará a un modelo ETS. Cuando pasa el modelo resultante
a la función pronóstico, también transmite la información sobre la transformación. Entonces, la función de
pronóstico producira pronósticos a partir del modelo ETS, y luego transformarlos al revés deshaciendo la
transformación de BoxCox, para dar pronósticos en la escala original. Observe como las fluctuaciones
estacionales en la gráfica anterior en los pronósticos son muy similares a las del final de los datos. No es muy
común usar una transformación BoxCox con un modelo ETS como este, ya que los modelos ETS son capaces
de manejar la varianza creciente directamente usando el error multiplicativo y los componentes estacionales
en el modelo. Pero pronto usaremos modelos ARIMA, y luego necesitaremos transformaciones para manejar
series de tiempo con varianza creciente.

1.3 Practica
1.3.1 Transformaciones de BoxCox para series de tiempo.
Aquí, utilizaremos una transformación de BoxCox para estabilizar la varianza de la serie a10, que
contiene las ventas mensuales de medicamentos antidiabéticos en Australia desde 1991 hasta 2008.
En este ejercicio, necesitará experimentar para ver el efecto de λ argumento sobre la transformación. Note
que pequeños cambios en λ hacen poca diferencia en la serie resultante. Quiere encontrar un valor de λ eso
hace que las fluctuaciones estacionales sean aproximadamente del mismo tamaño en toda la serie.

8
Recuerde de la dicho previamente, el rango recomendado para los λ es −1 ≤ λ ≤ 1.
# Trace la serie a10 y observe la varianza creciente
# a medida que aumenta el nivel de la serie
autoplot(a10)

30

20
a10

10

1995 2000 2005


Time
# Pruebe cuatro valores lambda en las transformaciones de BoxCox
a10 %>% BoxCox(lambda = 0.0) %>% autoplot()

9
3.5

3.0

2.5
.

2.0

1.5

1.0
1995 2000 2005
Time
a10 %>% BoxCox(lambda = 0.1) %>% autoplot()

3
.

1
1995 2000 2005
Time
a10 %>% BoxCox(lambda = 0.2) %>% autoplot()

10
5

3
.

1
1995 2000 2005
Time
a10 %>% BoxCox(lambda = 0.3) %>% autoplot()
6

4
.

1
1995 2000 2005
Time
# Comparar con Box.Cox.lambda()
BoxCox.lambda(a10)

11
## [1] 0.1313326
Parece que un λ = 0.13 funcionaría bien.

1.3.2 Diferenciación no estacional por estacionariedad


La diferenciación es una forma de hacer que una serie de tiempo sea estacionaria; esto significa que elimina
cualquier patrón sistemático, como la tendencia y la estacionalidad de los datos. Una serie de ruido blanco se
considera un caso especial de una serie temporal estacionaria.
Con datos no estacionales, utiliza diferencias de retraso 1 para modelar cambios entre observaciones en lugar
de las observaciones directamente. Ya ha hecho esto antes usando la función diff().
En este ejercicio, utilizaremos los datos precargados wmurders, que contienen la tasa anual de asesinatos de
mujeres en los EE.UU de 1950 a 2004.
# Gráfique la tasa de asesinatos de mujeres en EE.UU
autoplot(wmurders)

4.5

4.0
wmurders

3.5

3.0

2.5

1950 1960 1970 1980 1990 2000


Time
# Trazar la tasa de homicidios diferenciada
autoplot(diff(wmurders))

12
0.6

0.3
diff(wmurders)

0.0

−0.3

1950 1960 1970 1980 1990 2000


Time
# Trazar el ACF de la tasa de homicidios diferenciada
ggAcf(diff(wmurders))
Series: diff(wmurders)

0.3

0.2

0.1
ACF

0.0

−0.1

−0.2

5 10 15
Lag

13
Parece que los datos parecen ruido blanco después de la diferenciación.

1.3.3 Diferenciación estacional por estacionariedad


Con datos estacionales, a menudo se toman diferencias entre observaciones en la misma temporada de años
consecutivos, en lugar de en periodos consecutivos. Por ejemplo, con datos trimestrales, se tomaría la
diferencia entre el primer trimestre de un año y el primer trimestre del año anterior. Esto se llama
diferenciación estacional.
A veces es necesario aplicar tanto las diferencias estacionales como las diferencias de retraso 1 a la misma
serie, calculando así las diferencias en las diferencias.
En este ejercicio, usará diferencias y transformaciones simultáneamente para hacer que una serie de tiempo
parezca estacionaria. El conjunto de datos aquí es h02, que contiene 17 años de ventas mensuales de
medicamentos con corticosteroides en Australia.
# Gráficar lso datos
autoplot(h02)

1.25

1.00
h02

0.75

0.50

1995 2000 2005


Time
# Toma registros y diferencias estacionales de h02
difflogh02 <- diff(log(h02), lag = 12)

# Trazar difflogh02
autoplot(difflogh02)

14
0.4

0.2
difflogh02

0.0

1995 2000 2005


Time
# Tomar otra diferencia y graficar
ddifflogh02 <- diff(difflogh02)
autoplot(ddifflogh02)

0.4

0.2
ddifflogh02

0.0

−0.2

1995 2000 2005


Time

15
# Traze los ACF de difflogh02
ggAcf(ddifflogh02)
Series: ddifflogh02

0.2

0.0
ACF

−0.2

−0.4

−0.6
6 12 18 24
Lag
Los datos no parecen ruido blanco después de la transformación, pero podría desarrollar un modelo ARIMA
para ellos.

2 Modelo ARIMA
ARIMA son las siglas de Autoregresive Integrated Moving Average Models. Vamos a dividir eso en sus
partaes.

2.1 Modelo Autorregresivo (AR)


Primero, un modelo autoregresivo es simplemente una regresión de una serie de tiempo contra los valores
rezagados de esa serie. Las últimas p observaciones se utilizan como predictores en la ecuación de regresión.

yt = c + φ1 yt−1 + φ2 yt−2 + ... + φp yt−p + et

2.2 Modelos de Media Móvil (MA)


Un modelo de media móvil también se puede considerar como una regresión. Pero en lugar de retroceder
frente a observaciones rezagadas, retrocedemos frente a errores rezagados.

yt = c + θ1 et−1 + θ2 et−2 + ... + θq et−q

16
Los últimos q errores se utilizan como predictores en la ecuación anterior. Ahora, cuando juntamos estas dos
ecuaciones tenemos un modelo ARMA,

yt = c + φ1 yt−1 + φ2 yt−2 + ... + φp yt−p + θ1 et−1 + θ2 et−2 + ... + θq et−q + et

donde el último p son las observaciones y los últimos q errores se utilizan como predictores en la ecuación.

2.3 Modelos ARIMA(p,d,q)


Los modelos ARMA solo pueden funcionar con datos estacionarios, entonces, primero debemos diferenciar los
datos, esto nos lleva al parámetro I en ARIMA que significa Integrado. Eso es lo opuesto a diferenciar. Si
nuestra serie de tiempo necesita ser diferenciada d veces para que sea estacionaria, entonces, el modelo
resultante se denomina ARIMA(p,d,q). Entonces, para aplicar un modelo ARIMA a los datos, necesitamos
decidir el valor de p, d y q, y si incluir o no la constante c (la intersección en estas ecuaciones).
Afortunadamente existe un procedimiento automatizado para hacer eso. Apliquemoslo a los datos sobre
generación nete anual de electricidad en EE.UU.
autoplot(usnetelec)+
xlab('Año')+
ylab('Millones Kwh')+
ggtitle('Electricidad neta anual en EE.UU')
Electricidad neta anual en EE.UU
4000

3000
Millones Kwh

2000

1000

1950 1960 1970 1980 1990 2000


Año
A partir de su experiencia en el uso de la diferenciación, probablemente supongo que esta serie necesita una
diferenciación para que sea estacionaria. La función auto.arima() elige el modelo ARIMA dada la serie de
tiempo, veamos
fit <- auto.arima(usnetelec)
summary(fit)

17
## Series: usnetelec
## ARIMA(2,1,2) with drift
##
## Coefficients:
## ar1 ar2 ma1 ma2 drift
## -1.3032 -0.4332 1.5284 0.8340 66.1585
## s.e. 0.2122 0.2084 0.1417 0.1185 7.5595
##
## sigma^2 = 2262: log likelihood = -283.34
## AIC=578.67 AICc=580.46 BIC=590.61
##
## Training set error measures:
## ME RMSE MAE MPE MAPE MASE
## Training set 0.04640184 44.89414 32.3328 -0.6177064 2.101204 0.4581279
## ACF1
## Training set 0.02249247
En este caso, ha seleccionado un modelo ARIMA(2,1,2) con deriva, entonces, los datos se han diferenciado
una vez, y luego se han usado 2 observaciones pasadas y 2 errores pasados en la ecuación.
La deriva aquí se refiere al coeficiente c. Se llama coeficiente de deriva cuando hay diferenciación. El resto de
la salida le informa sobre el valor de los parámetros y otra información del modelo. Observe también que se
proporciona el valor AIC, tal como estaba para los modelos ETS.
auto.arima() selecciona los valores de p y q minimizando el valor de AIC, tal como lo hizo la función ets en
secciones previas. Sin embargo, no puede comparar un valor AIC ARIMA con un valor AIC ETS, solo puede
comparar los valores AIC entre modelos de la misma clase. Tampoco puede comparar los valores de AIC entre
modelos con diferentes cantidades de diferenciación. Los pronósticos resultantes se ven bastante bien, ¿no?
fit %>% forecast() %>% autoplot()

18
Forecasts from ARIMA(2,1,2) with drift
5000

4000

3000
usnetelec

2000

1000

1960 1980 2000


Time
Note que la tendencia alcista se ha captado muy bien. auto.arima está utilizando un algoritmo desarrollado
por Yeasmin-Khandakar:
• Elige el número de diferencias utilizando una herramienta llamada unidad prueba de raíz, y
• selecciona valores de p y q minimizando AIC.
• Los parámetros se estiman utilizando la estimación de máxima verosimilitud.
• Un problema aquí es el espacio modelo es muy grande ya que p y q pueden tomar cualquier valor no
negativo, por loq que para ahorrar tiempo solo probamos algunos de los posibles modelos. Eso significa
que es posible que auto.arima devuelva un modelo que en realidad no es el que tiene el valor mínimo de
AIC. A veces puedes superarlo, como verás en un ejercicio posterior.

2.4 Practicas
2.4.1 Modelos ARIMA automáticos para series de tiempo no estacionales
En la sección prevía, aprendió que la función auto.arima() seleccionará un modelo de promedio movil
intergado autorregresivo (ARIMA) apropiado dada una serie de tiempo, tal como lo hace ets() para los
modelos ETS. La función summary() puede proporcionar informació adicoonal.
En este ejercicio, eligirá automaticamente un modelo ARIMA para la serie precargada austa, que contiene el
número anual de visitantes internacionales a Australia entre 1980 y 2015. Luego verificará los residuos
(recuerde que un valor p mayor que 0.05 indica que los datos se asemejan a un ruido blanco) y producirá
algunos pronósticos. A parte de la función de modelado, esto es idéntico a lo que hizo con el pronóstico de
ETS.
# Ajustar un modeo ARIMA automático a la serie austa
fit <- auto.arima(austa)

# Verifique que los residuos se vean como ruido

19
checkresiduals(fit)
Residuals from ARIMA(0,1,1) with drift

0.2

0.0

−0.2

−0.4
1980 1990 2000 2010

0.2 9
ACF

0.0 df$y 6

3
−0.2

0
1 2 3 4 5 6 7 8 9 10 11 12 −0.6 −0.3 0.0 0.3 0.6
Lag residuals
##
## Ljung-Box test
##
## data: Residuals from ARIMA(0,1,1) with drift
## Q* = 2.297, df = 6, p-value = 0.8905
##
## Model df: 1. Total lags used: 7
residualsok <- TRUE
# Resuma el modelo
summary(fit)
## Series: austa
## ARIMA(0,1,1) with drift
##
## Coefficients:
## ma1 drift
## 0.3006 0.1735
## s.e. 0.1647 0.0390
##
## sigma^2 = 0.03376: log likelihood = 10.62
## AIC=-15.24 AICc=-14.46 BIC=-10.57
##
## Training set error measures:
## ME RMSE MAE MPE MAPE MASE
## Training set 0.0008313383 0.1759116 0.1520309 -1.069983 5.513269 0.7461559

20
## ACF1
## Training set -0.000571993
# Encuentre el valor de AIC y el numero de diferencias utilizadas
AICc <- -14.46
d <- 1

# Trazar pronosticos de ajuste


fit %>% forecast(h = 10) %>% autoplot()
Forecasts from ARIMA(0,1,1) with drift

10.0

7.5
austa

5.0

2.5

1980 1990 2000 2010 2020


Time
Parece que el modelo ARIMA creó un pronóstico bastante bueno para usted.

2.4.2 Predicción con modelos ARIMA


El método automático del ejercicio anterior eligió un modelo ARIMA(0,1,1) con derivada para los datos
austa, es decor yt = c + yt−1 + θet−1 + et . Ahora experimentará con varios otros modelos ARIMA para los
datos para ver que diferencia hace en los pronóstico.
La función Arima() se puede utilizar para seleccionar un modelo ARIMA específico. Su primer argumento,
order, se establece en un vector que específica valores de p, d y q. El segundo argumento,
incluye.constant, es un valor boleano que determina si la constante c, o deriva, debe incluirse. A
continuación se muestra un ejemplo de una función de tubería que trazaría pronósticos de usnetelec un
modelo ARIMA(2,1,2) con deriva:
usnetelec %>%
Arima(order = c(2,1,2),include.constant = TRUE) %>%
forecast() %>%
autoplot()

21
Forecasts from ARIMA(2,1,2) with drift
5000

4000

3000
.

2000

1000

1960 1980 2000


Time
En los ejemplos aquí, observe cómo los diferentes modelos afectan los pronósticos y los intervalos de
predicción. Los datos **austa* seran los a utilizar.
# Trazar pronosticos de un modelo ARIMA(0,1,1) sin deriva
austa %>% Arima(order = c(0,1,1), include.constant = FALSE) %>% forecast() %>% autoplot()

22
Forecasts from ARIMA(0,1,1)

7.5

5.0
.

2.5

1980 1990 2000 2010 2020


Time
# Trazar pronósticos de un modelo ARIMA(2,1,3) con deriva
austa %>% Arima(order = c(2,1,3), include.constant = TRUE) %>% forecast() %>% autoplot()

23
Forecasts from ARIMA(2,1,3) with drift

7.5

5.0
.

2.5

1980 1990 2000 2010 2020


Time
# Trazar pronósticos de un modelo ARIMA(0,0,1) con una constante
austa %>% Arima(order = c(0,0,1), include.constant = TRUE) %>% forecast() %>% autoplot()

24
Forecasts from ARIMA(0,0,1) with non−zero mean

4
.

1980 1990 2000 2010 2020


Time
# Trazar pronósticos de un modelo ARIMA(0,2,1) sin constante
austa %>% Arima(order = c(0,2,1), include.constant = FALSE) %>% forecast() %>% autoplot()

25
Forecasts from ARIMA(0,2,1)

10
.

1980 1990 2000 2010 2020


Time
¡La especificación del modelo tiene un gran impacto en el pronóstico!

2.4.3 Comparando auto.arima() y ets() en datos no estacionales


El estadística AIC es útil para seleccionar entre modelos de la misma clase. Por ejemplo, puede usarlo para
seleccionar un modelo ETS o para seleccionar un modelo ARIMA. Sin embargo, no puede usarlo para
comparar modelos ETS y ARIMA porque están en diferentes clases de modelos.
En su lugar, puede utilizar la validación cruzada de series de tiempo para comparar un modelo ARIMA y
un modelo ETS usaremos los datos austa. Debido a que tsCV() requiere funciones que devuelven objetos de
pronóstico, configurá algunas funciones simples que ajusten a los modelos y devuelvan los pronósticos. Los
argumentos de tsCV() son una serie de tiempo, una función de pronóstico y un horizonte de pronóstico h.
Además, recuerde que los operadores de tuberías en R toman el valor de lo que está a la izquierda y lo pasan
como argumento a lo que esta en la derecha, paso a paso, de izquierda a derecha. Este es un ejemplo basado
en el codigo que vio en un capitulo anterior
lynx %>% ets() %>% forecast() %>% autoplot()

26
Forecasts from ETS(M,N,N)

1e+05
.

0e+00

−1e+05

1850 1900 1950


Time
En este ejercicio, comparará el MSE de dos funciones de pronóstico aplicadas a austa, y trazará pronósticos
de la función que calcula los mejores pronósticos.
# Configuramos las funciones de pronostico para los modelos ETS y ARIMA
fets <- function(x, h) {
forecast(ets(x), h = h)
}
farima <- function(x, h) {
forecast(auto.arima(x), h = h)
}

# Calcular errores de CV para ETS en austa como e1


e1 <- tsCV(austa, fets, h = 1)

# Calcular errores de CV para ARIMA en austa como e2


e2 <- tsCV(austa, farima, h = 1)

# Encuentre MSE de cada clase de modelo


mean(e1ˆ2, na.rm = TRUE)
## [1] 0.05623684
mean(e2ˆ2, na.rm = TRUE)
## [1] 0.04336277
# Trazar pronósticos de 10 años usando la mejor clase de modelo
austa %>% farima(h = 10) %>% autoplot()

27
Forecasts from ARIMA(0,1,1) with drift

10.0

7.5
x

5.0

2.5

1980 1990 2000 2010 2020


Time
Ahora sabe cómo comparar entre clases de modelos.

3 Modelos ARIMA Estacionales


Los modelos ARIMA también pueden manejar series temporales estacionales. Solo necesitamos agregar
diferenciación estacional y muchos más términos rezagados en el modelo. Como ya sabe ARIMA(p,d,q)
implica d diferencias de rezado -1, p observaciones rezagadas y q errores rezagados. Para un modelo ARIMA
estacional, tenemos otra P,D,Q, todas en mayúsculas, haciendo referencia a las versiones de temporada de
estas.
• D: se refiere al número de diferencias estacionales a usar,
• P : es el número de observaciones retrasadas estacionalmente y,
• Q: es el número de errores retrasados estacionalmente.
Finalmente, la m al final indica el periodo estacional: el número de observaciones en cada año de datos.
Como puedes imaginar, estos modelos pueden ser muy complicados de escribir. Además, ya no son lineales,
ya que las partes estacionales se multiplican con las partes no estacionales del modelo. No intentaré
mostrarte las ecuaciones aquí.

ARIMA (p,d,q) (P,D,Q)m


No estacional Estacional

Veamos un ejemplo de datos mensuales.


autoplot(debitcards) +
xlab('Año') + ylab('Millones ISK') +
ggtitle('Uso de tarjetas de débito minoristas en Islandia')

28
Uso de tarjetas de débito minoristas en Islandia

25

20
Millones ISK

15

10

2000 2005 2010


Año
Este es el uso total de tarjetas de débito en Islandia durante un período de 13 años. Puede notar que existe
una variación creciente, por lo que necesitamos usar una transformación de BoxCox para hacerlo simple,
usaré una transformación logarítmica y estableceré λ igual a 0. Todo lo demas sobre el modelo se puede
manejar automaticamente usando la función auto.arima.
Entonces, apliquemos auto.arima a los datos, estableciendo λ = 0,
fit <- auto.arima(debitcards, lambda = 0)
fit
## Series: debitcards
## ARIMA(0,1,4)(0,1,1)[12]
## Box Cox transformation: lambda= 0
##
## Coefficients:
## ma1 ma2 ma3 ma4 sma1
## -0.7959 0.0856 0.2628 -0.1751 -0.8144
## s.e. 0.0825 0.0988 0.0999 0.0798 0.1118
##
## sigma^2 = 0.002321: log likelihood = 239.33
## AIC=-466.67 AICc=-466.08 BIC=-448.56
Note que el modelo resultante, es un modelo ARIMA(0,1,4)(0,1,1)[12]. Es decir, se han utilizado las
diferencias estacionales como las primeras:
• indicando por 1 en la ranura de enmedio de cada parte del modelo
• También nos dice que se han seleccionado 4 errores retrasados y un error retrasado estacionalmente.
• Los 0 indican que no se han utilizado términos de autorregresión.
El resto de la salida nos informa sobre los coeficientes del modelo y otra información del modelo. Los

29
modelos ARIMA pueden ser difíciles de interpretar, y todos los coeficientes no tienen una explicación clara
en términos de los datos originales. Pero son modelos muy potentes que pueden manejar una amplia gamma
de series de tiempo.
Podemos pasar el objeto del modelo a la función de pronóstico para obtener pronósticos.
Aquí, estoy pronósticando 3 años por delante para que pueda ver claramente la tendencia creciente y
variación creciente debido a la transformación BoxCox.
fit %>%
forecast(h = 36) %>%
autoplot() + xlab('Año')
Forecasts from ARIMA(0,1,4)(0,1,1)[12]

40

30
debitcards

20

10

2000 2005 2010 2015


Año
Observe cómo las partes estacionales del modelo han capturado bastante bien la estacionalidad. Una
característica interesante de los modelos ARIMA Estacionales es que permiten que la estacionalidad cambien
con el tiempo. El patrón estacional pronósticado se verá más afectado por la forma de la estacionaldad cerca
del final de la serie, y no tanto en los patrones estacionales al comienzo de la serie.
Quizás se pregunte de donde viene la tendencia en este modelo, ya que aquí no hay un término de deriva.
Resulta que siempre que haces dos muchas diferenciaciones de cualquier tipo, los pronósticos tendrán
tendencia sin necesidad de incluir la constante. Aquí hemos realizado diferenciaciones tanto ordinarios como
estacionales, por lo que hay una tendencia en los pronósticos.

3.1 Practicas:
Como ha aprendido, la función auto.arima() también funciona con datos estacionales. Tenga en cuenta que
la configuración λ = 0 en la auto.arima significa que el modelo se ajustará a los datos transformados y que
los pronósticos se transformarán a la escala original.
Después de aplicar summary() a este tipo de modelo ajustado, es posible que vea algo como el siguiente

30
resultado que corresponde con (p,d,q)(P,D,Q)[m].
En este ejercicio, utilizará estas funciones para modelar y pronósticar los datos h02, que contiene las ventas
mensuales de medicamentos corticosteroides en Australia.
# Verifique que los datos h02 tengan una varianza estable
h02 %>% log() %>% autoplot()

0.0

−0.4
.

−0.8

1995 2000 2005


Time
# Ajustar un modelo ARIMA estacional a h02 com lambda =0
fit <- auto.arima(h02, lambda = 0)

# Resumir modelo
summary(fit)
## Series: h02
## ARIMA(2,1,1)(0,1,2)[12]
## Box Cox transformation: lambda= 0
##
## Coefficients:
## ar1 ar2 ma1 sma1 sma2
## -1.1358 -0.5753 0.3683 -0.5318 -0.1817
## s.e. 0.1608 0.0965 0.1884 0.0838 0.0881
##
## sigma^2 = 0.004278: log likelihood = 248.25
## AIC=-484.51 AICc=-484.05 BIC=-465
##
## Training set error measures:
## ME RMSE MAE MPE MAPE MASE
## Training set -0.003931805 0.0501571 0.03629816 -0.5323365 4.611253 0.5987988
## ACF1
## Training set -0.003740269

31
# Registre la cantidad de diferenciacion lag-1 y diferenciación estacional
d <- 1
D <- 1

# Trazar pronosticos de 2 años


fit %>% forecast(h = 24) %>% autoplot()
Forecasts from ARIMA(2,1,1)(0,1,2)[12]

1.5
h02

1.0

0.5

1995 2000 2005 2010


Time
¡auto.arima() es lo suficientemente flexible como para trabajar incluso con series de tiempo estacionales!

3.1.1 Explorando las opciones de auto.arima()


La función auto.arima() necesita estimar muchos modelos diferentes, y se utiliza varios atajos para intentar
que la función sea lo más rápida posible. Esto puede hacer que se devuelva un modelo que en realidad no
tiene el valor AIC más pequeño. Para hacer que auto.arima() el trabajo sea más dificil para encontrar un
buen modelo, agregue el argumento opcional stepwise = FALSE para ver una coleccion de modelos mucho
mas grande.
Aquí, intentará encontrar un modelo ARIMA para los datos euretail, que contiene el comercio minorista
trimestral en la zona del euro desde 1996 hasta 2011.
# Encuentre un modelo ARIMA para euretail
fit <- auto.arima(euretail)

# No use una busqueda por paso


fit2 <- auto.arima(euretail, stepwise = FALSE)

# AIC de mejor modelo


AICc <- 68.39

32
# Calcule pronosticos a 2 años a partir de un mejor modelo
fit2 %>% forecast(h = 8) %>% autoplot()
Forecasts from ARIMA(0,1,3)(0,1,1)[4]

100
euretail

96

92

2000 2005 2010


Time
Como puede notar, auto.arima() tiene una gran cantidad de opciones que vale la pena explorar.

3.1.2 Comparando auto.arima() vs ets() en datos estacionales


¿Qué sucede cuando desea crear conjuntos de prueba y entrenamiento para datos que son más frecuentes que
una vez al año? Si es necesario, puede utilizar un vector en forma c(año, periodo) de start y/o end palabras
clave en la window(). También debe asegurarse de utilizar los valores adecuados de h en las funciones de
precisión. Recuerde que h debe ser igual a la longitud de los datos que componen su conjunto de prueba.
Por ejemplo, si sus datos abarcan 15 años, su conjunto de entrenamiento consta de los primeros 10 años y
tiene la intención de pronósticar los últimos 5 años de datos, usaría h = 12 ∗ 5 not h = 5 porque su conjunto
de prueba incluiría 60 observaciones mensuales. Si, en cambio, su conjunto de entrenamiento consta de los
primeros 9.5 años y desea pronósticar los últimos 5.5 años, usaría h = 66 para contabilizar los 6 meses
adicionales.
En el ejercicio final de este capitulo, comparará los modelos estcionales ARIMA y ETS aplicados a los datos
trimestrales de producción de cemento qcement. Debiudo a que la serie es muy larga, puede darse el lujo de
usar un conjunto de prueba y entrenamiento en lugar de una validación cruzada de series temporales. Esto es
mucho mas rápido.
# Utilice 20 años de los datos de qcement a partir de 1988
train <- window(qcement, start = 1988, end = c(2007, 4))

# Ajuste un modelo ARIMA y ETS a los datos de entrenamiento


fit1 <- auto.arima(train)
fit2 <- ets(train)

33
# Verifique que ambos modelos tengan residuos de ruido blanco
checkresiduals(fit1)
Residuals from ARIMA(1,0,1)(2,1,1)[4] with drift
0.3
0.2
0.1
0.0
−0.1
−0.2
−0.3
1990 1995 2000 2005

20
0.2
15
0.1
ACF

df$y

0.0 10

−0.1 5
−0.2
0
4 8 12 16 −0.2 0.0 0.2
Lag residuals
##
## Ljung-Box test
##
## data: Residuals from ARIMA(1,0,1)(2,1,1)[4] with drift
## Q* = 0.78311, df = 3, p-value = 0.8535
##
## Model df: 5. Total lags used: 8
checkresiduals(fit2)

34
Residuals from ETS(M,N,M)
0.15
0.10
0.05
0.00
−0.05
−0.10
−0.15
1990 1995 2000 2005

20
0.2

0.1 15
ACF

df$y
0.0 10

−0.1 5

−0.2
0
4 8 12 16 −0.1 0.0 0.1 0.2
Lag residuals
##
## Ljung-Box test
##
## data: Residuals from ETS(M,N,M)
## Q* = 6.3457, df = 3, p-value = 0.09595
##
## Model df: 6. Total lags used: 9
# Producir pronosticos para cada modelo
fc1 <- forecast(fit1, h = 25)
fc2 <- forecast(fit2, h = 25)

# Use accuary() para encontrar un mejor modelo basado en RMSE


accuracy(fc1, qcement)
## ME RMSE MAE MPE MAPE MASE
## Training set -0.006205705 0.1001195 0.07988903 -0.6704455 4.372443 0.5458078
## Test set -0.158835253 0.1996098 0.16882205 -7.3332836 7.719241 1.1534049
## ACF1 Theil's U
## Training set -0.01133907 NA
## Test set 0.29170452 0.7282225
accuracy(fc2, qcement)
## ME RMSE MAE MPE MAPE MASE
## Training set 0.01406512 0.1022079 0.07958478 0.4938163 4.371823 0.5437292
## Test set -0.13495515 0.1838791 0.15395141 -6.2508975 6.986077 1.0518075
## ACF1 Theil's U
## Training set -0.03346295 NA

35
## Test set 0.53438371 0.680556
mejor_modelo <- fit2
Parece que el modelo ETS lo hizo mejor aquí.

36

You might also like