Está en la página 1de 10

laboratorio10

Ana Asensio

9/12/2021

library(eurostat)
library(forecast)

## Registered S3 method overwritten by ’quantmod’:


## method from
## as.zoo.data.frame zoo

1. Descarga la serie temporal del PIB trimestral de España con la configuración descrita arriba. Divide
la serie en entrenamiento (datos de 2013 a 2018) y validación (datos de 2019). Descarta los datos a
partir de 2020.

euro = get_eurostat("namq_10_gdp", filters = list(geo = "ES", unit =


"CP_MEUR", na_item = "B1GQ", s_adj = "NSA", sinceTimePeriod = "2013Q1"), time_format = "num")
euro2 = euro[, c("time", "values")]
x.ts = ts(euro2$values, start = c(2013, 1), frequency = 4)
x.ts.train = window(x.ts, start = c(2013,1), end = c(2018,4))
x.ts.valid = window(x.ts, start = c(2019,1), end = c(2019,4))

2. Entrena un modelo con tendencia lineal y estacionalidad aditiva. Comprueba los residuos y mejora la
predicción con un modelo autorregresivo. Nota: Puedes aprovechar el código de la práctica L5.

x.ts.lm = tslm(x.ts.train ~ trend + season)

residuos = x.ts.lm$residuals
# modelo AR
ar_x = Arima(x.ts.lm$residuals, order = c(1, 0, 0))
summary(ar_x)

## Series: x.ts.lm$residuals
## ARIMA(1,0,0) with non-zero mean
##
## Coefficients:
## ar1 mean
## 0.8425 1726.163
## s.e. 0.1275 2274.146
##
## sigma^2 estimated as 3620881: log likelihood=-214.86
## AIC=435.71 AICc=436.91 BIC=439.25
##

1
## Training set error measures:
## ME RMSE MAE MPE MAPE MASE ACF1
## Training set -299.0125 1821.851 1462.884 197.3767 231.6221 0.5854684 -0.2923539

autoplot(ar_x)

Inverse AR roots
1.0

0.5
Imaginary

UnitCircle
0.0
Within

−0.5

−1.0

−1.0 −0.5 0.0 0.5 1.0


Real

forecast::forecast(forecast::auto.arima(x.ts.train), h=12)

## Point Forecast Lo 80 Hi 80 Lo 95 Hi 95
## 2019 Q1 297829 295169.6 300488.4 293761.9 301896.1
## 2019 Q2 316103 312342.1 319863.9 310351.2 321854.8
## 2019 Q3 308154 303547.9 312760.1 301109.5 315198.5
## 2019 Q4 326241 320922.3 331559.7 318106.7 334375.3
## 2020 Q1 309096 301574.2 316617.8 297592.4 320599.6
## 2020 Q2 327370 318157.7 336582.3 313281.0 341459.0
## 2020 Q3 319421 308783.6 330058.4 303152.4 335689.6
## 2020 Q4 337508 325615.0 349401.0 319319.2 355696.8
## 2021 Q1 320363 306041.9 334684.1 298460.8 342265.2
## 2021 Q2 338637 322243.6 355030.4 313565.5 363708.5
## 2021 Q3 330688 312456.3 348919.7 302805.1 358570.9
## 2021 Q4 348775 328874.2 368675.8 318339.3 379210.7

autoplot(residuos, xlab = 'Año', ylab = 'Residuo')

2
7500

5000

2500
Residuo

−2500

2014 2016 2018


Año

accuracy((forecast(x.ts.lm,h=12)$mean+forecast(ar_x,h=12)$mean), x.ts.valid)

## ME RMSE MAE MPE MAPE ACF1 Theil’s U


## Test set -996.0024 1766.714 1393.92 -0.3322622 0.4549898 -0.7020788 0.1133076

mejorado = x.ts.lm$fitted.values + ar_x$residuals


autoplot(mejorado)

3
300000
mejorado

280000

260000

240000
2014 2016 2018
Time

autoplot(x.ts.lm$fitted.values)

4
300000
x.ts.lm$fitted.values

280000

260000

240000

2014 2016 2018


Time

autoplot(cbind(mejorado, x.ts.lm$fitted.values))

5
cbind(mejorado, x.ts.lm$fitted.values)

300000

series
280000
mejorado
x.ts.lm$fitted.values

260000

240000

2013 2014 2015 2016 2017 2018 2019


Time

autoplot(ar_x$residuals)

6
2000
ar_x$residuals

−2000

2014 2016 2018


Time

3. Considera los dos modelos anteriores (tendencia lineal con estacionalidad y la versión mejorada de éste)
y los modelos ingenuo e ingenuo con estacionalidad. Compara numérica y gráficamente los pronósticos
generados. ¿Qué modelo genera mejor pronóstico de los datos de validación?

modelo_ingenuo = naive(x.ts.train, h=4)


modelo_estacionalidad = snaive(x.ts.train, h=4)
modelo_ingenuo

## Point Forecast Lo 80 Hi 80 Lo 95 Hi 95
## 2019 Q1 314974 297719.5 332228.5 288585.5 341362.5
## 2019 Q2 314974 290572.4 339375.6 277655.0 352293.0
## 2019 Q3 314974 285088.3 344859.7 269267.7 360680.3
## 2019 Q4 314974 280464.9 349483.1 262196.9 367751.1

modelo_estacionalidad

## Point Forecast Lo 80 Hi 80 Lo 95 Hi 95
## 2019 Q1 286562 274034 299090 267402.1 305721.9
## 2019 Q2 304836 292308 317364 285676.1 323995.9
## 2019 Q3 296887 284359 309415 277727.1 316046.9
## 2019 Q4 314974 302446 327502 295814.1 334133.9

7
autoplot(cbind(x.ts.lm$fitted.values, mejorado, modelo_ingenuo$fitted, modelo_estacionalidad$fitted, x.t

320000

300000
series
x.ts.lm$fitted.values
Modelos

mejorado
280000 modelo_ingenuo$fitted
modelo_estacionalidad$fitted
x.ts

260000

240000

2015.0 2017.5 2020.0


Año

#autoplot((forecast(x.ts.lm,h=4)$mean+forecast(ar_x,h=4)$mean))
#accuracy(exp(log(forecast(x.ts.lm,h=4)$mean)+forecast(ar_x,h=4)$mean), x.ts.valid)

accuracy(forecast(x.ts.lm,h=4)$mean, x.ts.valid)

## ME RMSE MAE MPE MAPE ACF1 Theil’s U


## Test set 2217.867 2622.213 2217.867 0.7039424 0.7039424 -0.7011827 0.1823345

accuracy(forecast(x.ts.lm,h=4)$mean+forecast(ar_x,h=4)$mean, x.ts.valid)

## ME RMSE MAE MPE MAPE ACF1 Theil’s U


## Test set -996.0024 1766.714 1393.92 -0.3322622 0.4549898 -0.7020788 0.1133076

#accuracy(forecast(modelo_ingenuo$fitted, h=4, na.rm=TRUE)$mean, x.ts.valid)


accuracy(forecast(modelo_estacionalidad,h=4)$mean, x.ts.valid)

## ME RMSE MAE MPE MAPE ACF1 Theil’s U


## Test set 10279 10380.76 10279 3.315027 3.315027 0.2190352 0.6182259

MAPE ingenuo = MAPE estacionalidad = MAPE arima = 0.4549898 MAPE modelo inicial = 0.7039424

8
4. Asume que la serie representa la demanda de una empresa de moda textil (en euros). La producción de
la empresa se debe ajustar con antelación y se hace en función de la previsión de ventas. Si la previsión
es superior a las ventas, habrá un exceso de stock que pierde valor porque se tiene que vender rebajado
en la propia tienda o en outlets. Si la previsión se queda corta, nos faltará mercancía y no podremos
ingresar tanto como hubiéramos podido. Los costes de producción son del 60% del PVP. Además,
hay 100.000 euros al trimestre en costes fijos. Teniendo en cuenta esta aplicación, ¿qué modelo genera
mejor pronóstico de los datos de validación? Define una función que calcule los beneficios esperados
tomando como entrada las series predicha y real.

beneficios <- function(y_real, y_predicha){


pmin(y_real, y_predicha) - 100000 - 0.6*y_predicha}

sum(beneficios(x.ts.train, x.ts.lm$fitted.values))

## [1] 217798.5

sum(beneficios(x.ts.train, mejorado))

## [1] 222867.6

sum(beneficios(x.ts.train, modelo_ingenuo$fitted), na.rm=TRUE)

## [1] 104139.2

sum(beneficios(x.ts.train, modelo_estacionalidad$fitted), na.rm=TRUE)

## [1] 162321.2

En este caso el modelo que mejor se ajusta es el mejorado con arima.

5. ¿Elegirías el mismo modelo si los costes de producción fueran el 50% del PVP?

beneficios <- function(y_real, y_predicha){


pmin(y_real, y_predicha) - 100000 - 0.5*y_predicha}

sum(beneficios(x.ts.train, x.ts.lm$fitted.values))

## [1] 878704.7

sum(beneficios(x.ts.train, mejorado))

## [1] 883056.1

sum(beneficios(x.ts.train, modelo_ingenuo$fitted), na.rm=TRUE)

## [1] 733548

9
sum(beneficios(x.ts.train, modelo_estacionalidad$fitted), na.rm=TRUE)

## [1] 702901.5

En este caso el modelo escogido seguiría siendo el mejorado con arima.

10

También podría gustarte