El modelo ARIMAX es similar a un modelo de regresión multivariante, pero permite aprovechar la autocorrelación que puede estar presente en los residuos de la regresión para mejorar la precisión de un pronóstico.

El conjunto de datos contiene las siguientes variables:

Cargamos el conjunto de datos y graficamod las variables cons(consumo de helado), temp(temperatura) y income.

library(ggplot2)
library(gridExtra)
library(DT)
getwd()
## [1] "/cloud/project/Series/SARIMAX"
df <- read.csv("/cloud/project/Series/SARIMAX/Icecream.csv")
df%>%DT::datatable()
p1 <- ggplot(df, aes(x = X, y = cons)) +
             ylab("Consumption") +
             xlab("") +
             geom_line() +
             expand_limits(x = 0, y = 0)
p2 <- ggplot(df, aes(x = X, y = temp)) +
             ylab("Temperature") +
             xlab("") +
             geom_line() +
             expand_limits(x = 0, y = 0)
p3 <- ggplot(df, aes(x = X, y = income)) +
             ylab("Income") +
             xlab("Period") +
             geom_line() +
             expand_limits(x = 0, y = 0)
grid.arrange(p1, p2, p3, ncol=1, nrow=3)

Estimamos un modelo ARIMA para los datos sobre el consumo de helado usando la función auto.arima. Luego, pase el modelo como entrada a la forecastfunción para obtener un pronóstico para los próximos 6 períodos (ambas funciones son del forecastpaquete).

library(forecast)
## Registered S3 method overwritten by 'quantmod':
##   method            from
##   as.zoo.data.frame zoo
fit_cons <- auto.arima(df$cons)
fcast_cons <- forecast(fit_cons, h = 6)

Trace el pronóstico obtenido con la autoplot.forecastfunción del forecastpaquete

library(forecast)
#autoplot.forecast(fcast_cons)
plot(fcast_cons)

Utilice la función accuracy del paquete forecast para encontrar el error escalado absoluto medio (MASE) del modelo ARIMA ajustado.

accuracy(fit_cons)
##                        ME       RMSE        MAE        MPE     MAPE      MASE
## Training set 3.438782e-05 0.03389421 0.02475857 -0.8273305 6.629011 0.7542003
##                    ACF1
## Training set 0.03907652

Estime un modelo ARIMA extendido para los datos de consumo con la variable de temperatura como regresor adicional (usando la función auto.arima). Luego haga un pronóstico para los próximos 6 períodos (tenga en cuenta que este pronóstico requiere una suposición sobre la temperatura esperada; suponga que la temperatura para los próximos 6 períodos estará representada por el siguiente vector:) fcast_temp <- c(70.5, 66, 60.5, 45.5, 36, 28). Trace el pronóstico obtenido.

fit_cons_temp <- auto.arima(df$cons, xreg = df$temp)
fcast_temp <- c(70.5, 66, 60.5, 45.5, 36, 28)
fcast_cons_temp <- forecast(fit_cons_temp, xreg = fcast_temp, h = 6)
plot(fcast_cons_temp)

Imprimir resumen del pronóstico obtenido. Encuentre el coeficiente de la variable de temperatura, su error estándar y el MASE del pronóstico. Compare el MASE con el de la previsión inicial.

summary(fcast_cons_temp)
## 
## Forecast method: Regression with ARIMA(0,1,0) errors
## 
## Model Information:
## Series: df$cons 
## Regression with ARIMA(0,1,0) errors 
## 
## Coefficients:
##         xreg
##       0.0028
## s.e.  0.0007
## 
## sigma^2 = 0.001108:  log likelihood = 58.03
## AIC=-112.06   AICc=-111.6   BIC=-109.32
## 
## Error measures:
##                       ME       RMSE        MAE      MPE     MAPE      MASE
## Training set 0.002563685 0.03216453 0.02414157 0.564013 6.478971 0.7354048
##                    ACF1
## Training set -0.1457977
## 
## Forecasts:
##    Point Forecast     Lo 80     Hi 80     Lo 95     Hi 95
## 31      0.5465774 0.5039101 0.5892446 0.4813234 0.6118313
## 32      0.5337735 0.4734329 0.5941142 0.4414905 0.6260566
## 33      0.5181244 0.4442225 0.5920263 0.4051012 0.6311476
## 34      0.4754450 0.3901105 0.5607796 0.3449371 0.6059529
## 35      0.4484147 0.3530078 0.5438217 0.3025024 0.5943270
## 36      0.4256524 0.3211393 0.5301654 0.2658135 0.5854913

Compruebe la significación estadística del coeficiente de la variable de temperatura utilizando la coeftestfunción del lmtestpaquete. ¿Es el coeficiente estadísticamente significativo al nivel del 5%

library(lmtest)
## Loading required package: zoo
## 
## Attaching package: 'zoo'
## The following objects are masked from 'package:base':
## 
##     as.Date, as.Date.numeric
coeftest(fit_cons_temp)
## 
## z test of coefficients:
## 
##       Estimate Std. Error z value  Pr(>|z|)    
## xreg 0.0028453  0.0007302  3.8966 9.756e-05 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1

La función que estima el modelo ARIMA puede ingresar más regresores adicionales, pero solo en forma de matriz. Cree una matriz con las siguientes columnas:

-valores de la variable de temperatura, -valores de la variable renta, -los valores de la variable de ingresos se retrasaron un período, -los valores de la variable renta se retrasaron dos períodos.

Imprime la matriz.

Nota: las últimas tres columnas se pueden crear anteponiendo dos NA al vector de valores de la variable de ingresos y utilizando el vector obtenido como entrada a la función embed (con el dimensionparámetro igual al número de columnas a crear).

temp_column <- matrix(df$temp, ncol = 1)
income <- c(NA, NA, df$income)
income_matrix <- embed(income, 3)
vars_matrix <- cbind(temp_column, income_matrix)
print(vars_matrix)
##       [,1] [,2] [,3] [,4]
##  [1,]   41   78   NA   NA
##  [2,]   56   79   78   NA
##  [3,]   63   81   79   78
##  [4,]   68   80   81   79
##  [5,]   69   76   80   81
##  [6,]   65   78   76   80
##  [7,]   61   82   78   76
##  [8,]   47   79   82   78
##  [9,]   32   76   79   82
## [10,]   24   79   76   79
## [11,]   28   82   79   76
## [12,]   26   85   82   79
## [13,]   32   86   85   82
## [14,]   40   83   86   85
## [15,]   55   84   83   86
## [16,]   63   82   84   83
## [17,]   72   80   82   84
## [18,]   72   78   80   82
## [19,]   67   84   78   80
## [20,]   60   86   84   78
## [21,]   44   85   86   84
## [22,]   40   87   85   86
## [23,]   32   94   87   85
## [24,]   27   92   94   87
## [25,]   28   95   92   94
## [26,]   33   96   95   92
## [27,]   41   94   96   95
## [28,]   52   96   94   96
## [29,]   64   91   96   94
## [30,]   71   90   91   96

Use la matriz obtenida para ajustar tres modelos ARIMA extendidos que usan las siguientes variables como regresores adicionales:

Tenga en cuenta que el AIC no se puede utilizar para comparar modelos ARIMA con diferentes órdenes de integración (expresados por los términos intermedios en las especificaciones del modelo) debido a una diferencia en el número de observaciones. Por ejemplo, un valor AIC de un modelo no diferenciado, ARIMA (p, 0, q), no se puede comparar con el valor correspondiente de un modelo diferenciado, ARIMA (p, 1, q).

fit_vars_0 <- auto.arima(df$cons, xreg = vars_matrix[, 1:2])
fit_vars_1 <- auto.arima(df$cons, xreg = vars_matrix[, 1:3])
fit_vars_2 <- auto.arima(df$cons, xreg = vars_matrix[, 1:4])
print(fit_vars_0$aic)
## [1] -113.3357
print(fit_vars_1$aic)
## [1] -111.9228
print(fit_vars_2$aic)
## [1] -110.2497

Utilice el modelo que se encontró en el ejercicio anterior para hacer un pronóstico para los próximos 6 períodos y grafique el pronóstico. (El pronóstico requiere una matriz de la temperatura y los ingresos esperados para los próximos 6 períodos; cree la matriz utilizando la variable fcast_temp y los siguientes valores para los ingresos esperados:) 91, 91, 93, 96, 96, 96. Encuentre el error escalado absoluto medio del modelo y compárelo con los de los dos primeros modelos de este conjunto de ejercicios

expected_temp_income <- matrix(c(fcast_temp, 91, 91, 93, 96, 96, 96), ncol = 2, nrow = 6)
fcast_cons_temp_income <- forecast(fit_vars_0, xreg = expected_temp_income, h = 6)
#autoplot.forecast(fcast_cons_temp_income)
plot(fcast_cons_temp_income)

accuracy(fit_cons)[, "MASE"]
## [1] 0.7542003
## [1] 0.8200619
accuracy(fit_cons_temp)[, "MASE"]
## [1] 0.7354048
## [1] 0.7354048
accuracy(fit_vars_0)[, "MASE"]
## [1] 0.7290753
## [1] 0.7290753
# the model with two external regressors has the lowest 

# mean absolute scaled error (0.7290753)