- Marco teórico.
- Proceso de lectura y limpieza de la base de datos.
- Metodologías nuevas de backtesting.
- Modelo a utilizar y alternativas.
- Presentación de los resultados
- Predicciones
- Conclusiones y recomendaciones
Noviembre del 2022
Al definir qué son los aranceles en economía partimos de que el arancel es un impuesto que recae sobre los bienes que son importados a un país.
El objetivo principal es obtener información periódica sobre las compras que legalmente realiza el país al exterior o a una Zona Franca del territorio nacional.
Las importaciones corresponden a aquellos bienes que entran al país y son registrados en las aduanas. Estas se valoran a precios Miles de dólares CIF(por su sigla original en inglés Cost, insurance and freight, que significa “Costo, seguro y flete”).
El DANE debe asegurar la veracidad y la imparcialidad de la información básica y estratégica del país, y le compete garantizar la calidad de las estadísticas básicas.
Esta serie de documentos favorecen la transparencia, confianza y credibilidad de la calidad técnica de la institución para un mejor entendimiento, comprensión y aprovechamiento de la información estadística.
data<-read_excel("Impo_mensual_cap_arancel_ago22.xlsx",skip=7,range = cell_rows(308:319),col_names = FALSE)
## New names: ## • `` -> `...1` ## • `` -> `...2` ## • `` -> `...3` ## • `` -> `...4` ## • `` -> `...5` ## • `` -> `...6` ## • `` -> `...7` ## • `` -> `...8` ## • `` -> `...9` ## • `` -> `...10` ## • `` -> `...11` ## • `` -> `...12` ## • `` -> `...13` ## • `` -> `...14` ## • `` -> `...15` ## • `` -> `...16` ## • `` -> `...17` ## • `` -> `...18`
data %<>% clean_names() #limpiar el nombre de las variables
data %>% head()
## # A tibble: 6 × 18 ## x1 x2 x3 x4 x5 x6 x7 x8 x9 x10 x11 ## <chr> <chr> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> ## 1 Juguetes… Enero 17798. 12490. 16772. 16142. 14225. 12100. 11074. 13611. 20076. ## 2 <NA> Febr… 22471. 13881. 14907. 17108. 16311. 13535. 12068. 20551. 19401. ## 3 <NA> Marzo 23999. 19497. 9475. 12697. 15966. 16238. 12636. 21211. 19297. ## 4 <NA> Abril 16316. 13822. 7790. 16790. 21883. 14548. 11081. 17107. 24754. ## 5 <NA> Mayo 20133. 10230. 6832. 20897. 18357. 17199. 13308. 19170. 26496. ## 6 <NA> Junio 27345. 16543. 9498. 18770. 19142. 21080. 22537. 18579. 20130. ## # … with 7 more variables: x12 <dbl>, x13 <dbl>, x14 <dbl>, x15 <dbl>, ## # x16 <dbl>, x17 <dbl>, x18 <dbl>
values<- data[c(3:18)] values %<>% select(x18,x17,x16,x15,x14,x13,x12,x11,x10,x9,x8,x7,x6, x5,x4,x3) values<- as.vector(as.matrix(values)) #eliminar Na´s values %<>% na.omit() head(values) #crear una secuencia de fechas, de acuerdo a los años de regristro date<-seq(as.Date("2007/1/1"),as.Date("2022/8/1"),"months")
toys<-data.frame(values,date) toys %>% head()
## values date ## 1 8557.056 2007-01-01 ## 2 5902.224 2007-02-01 ## 3 9496.419 2007-03-01 ## 4 7793.890 2007-04-01 ## 5 11863.045 2007-05-01 ## 6 12689.508 2007-06-01
ts_toys <- ts(values, start =c(2007,01), end=c(2022,08), frequency = 12) ts_info(ts_toys)
## The ts_toys series is a ts object with 1 variable and 188 observations ## Frequency: 12 ## Start time: 2007 1 ## End time: 2022 8
ts_toys %>% head()
## Jan Feb Mar Apr May Jun ## 2007 8557.056 5902.224 9496.419 7793.890 11863.045 12689.508
ts_toys %>% tail()
## Mar Apr May Jun Jul Aug ## 2022 23998.93 16315.96 20133.45 27345.23 28167.36 39259.81
ts_toys_plot<-ts_plot(ts_toys, title = " Serie de tiempo de importación de juguetes", Xtitle = "Año", Ytitle = "Número de juguetes ", #slider = TRUE, Xgrid = TRUE, Ygrid = TRUE, color = "blue" ) ts_toys_plot
Uno de los enfoques de entrenamiento más comunes es el uso de una sola partición de entrenamiento y prueba. Organizadas en orden cronológico.
Establezca las primeras N observaciones como la partición de entrenamiento inicial y desplaza la ventana en n observaciones para crear la siguiente partición de entrenamiento.
Utilizando las primeras N observaciones como la partición de entrenamiento inicial, añada las siguientes n observaciones para crear la siguiente partición de entrenamiento, donde n es una constante que representa el índice expandido de la ventana.La desventaja de este método es el entrenamiento del modelo con particiones de diferente longitud, ya que normalmente un modelo tiende a aprender más y, por tanto, a funcionar mejor cuando se dispone de más datos.
Método para entrenar, probar y comparar múltiples modelos de series temporales utilizando una única partición o múltiples particiones.
Input: serie de tiempo (en objeto tipo ts)
-Methods: Es una lista, que define los modelos a emplear para el entrenamiento y la prueba de la serie.
Modelos posibles:
methods <- list(hw = list(method = "HoltWinters", method_arg = NULL, notes = "HoltWinters Model"), autoarima_bic = list(method="auto.arima", method_arg = list(stepwise = FALSE, approximation = FALSE, ic = "bic"), notes= "Auto arima BIC"), ets1 = list(method = "ets", method_arg = list(opt.crit = "mse"), notes = "ETS model with opt.crit = mse"), tslm = list(method = "tslm", method_arg = list(formula = input ~ trend+ season), notes = "tslm model with trend and seasonal components"))
train_method, Es una lista, que define los parámetros de backtesting:
partitions: un número entero, que establece el número de particiones de entrenamiento y prueba que se utilizarán en el proceso de backtesting, cuando la partición se establece en 1 es un enfoque de entrenamiento de una única partición.
space: define el tamaño de la expansión de la ventana de backtesting, es decir el n para las particiones que define la longitud de expansión de la ventana de backtesting.
sample.in: un número entero, opcional, que define la longitud de las particiones de entrenamiento y, por lo tanto, la estructura de la ventana de backtesting. De forma predeterminada, se establece en NULL y, como resultado, el backtesting usa la ventana de expansión. De lo contrario, cuando se define sample.in, la estructura de la ventana es deslizante.
sample.out: El argumento define la longitud de la partición de prueba.
horizon: Un número entero que define el horizonte de pronóstico.
error: Define la métrica del error que se utilizará para ordenar la tabla de clasificación de los modelos. Métrica posible: “MAPE” o “RMSE”.
xreg: Opcional, una lista de regresores externos.
level: Un número entero, que establece el nivel de confianza de los intervalos de predicción, que por lo general son de 80 y 95% de confianza.
md <- suppressWarnings(train_model(input = ts_toys, methods = methods, train_method = list(partitions = 3, sample.out = 6, space = 5), horizon = 6, error = "MAPE"))
## # A tibble: 4 × 7 ## model_id model notes avg_m…¹ avg_r…² avg_c…³ avg_c…⁴ ## <chr> <chr> <chr> <dbl> <dbl> <dbl> <dbl> ## 1 autoarima_bic auto.arima Auto arima BIC 0.196 6725. 0.833 0.889 ## 2 hw HoltWinters HoltWinters Model 0.216 6420. 0.667 0.889 ## 3 tslm tslm tslm model with tre… 0.254 7160. 0.833 0.889 ## 4 ets1 ets ETS model with opt.… 0.329 9927. 0.5 0.611 ## # … with abbreviated variable names ¹avg_mape, ²avg_rmse, ³`avg_coverage_80%`, ## # ⁴`avg_coverage_95%`
md$error_summary$autoarima_bic
## partition model_id mape rmse coverage_80% ## coverage...1 1 autoarima_bic 0.2341807 7001.658 0.8333333 ## coverage...2 2 autoarima_bic 0.2075581 8906.009 0.6666667 ## coverage...3 3 autoarima_bic 0.1471040 4266.364 1.0000000 ## coverage_95% ## coverage...1 1.0000000 ## coverage...2 0.6666667 ## coverage...3 1.0000000
md$train$partition_1$test
## May Jun Jul Aug Sep Oct ## 2021 10229.90 16542.63 18169.52 25268.35 41895.44 48165.34
md$train$partition_2$test
## Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov ## 2021 48165.34 48070.65 ## 2022 17798.01 22471.01 23998.93 ## Dec ## 2021 27671.95 ## 2022
md$train$partition_3$test
## Mar Apr May Jun Jul Aug ## 2022 23998.93 16315.96 20133.45 27345.23 28167.36 39259.81
md$forecast$autoarima_bic$model
## Series: structure(c(8557.05618, 5902.22362, 9496.41934, 7793.88987, 11863.04451, 12689.50815, 17421.96802, 28401.19492, 27883.56223, 24045.57302, 22168.06921, 12848.60803, 7884.29282, 10317.67647, 7725.27767, 12400.40601, 12233.81137, 14258.72338, 21592.60885, 30010.35472, 34219.85513, 39485.53097, 20391.64535, 18343.96733, 8552.31746999999, 8932.80710999999, 8304.51531, 9226.92544000001, 8216.73373999999, 12006.12301, 18337.8107, 22891.14458, 26757.1445299999, 25839.6211400001, 18902.68181, 16343.67036, 8860.36512, 8246.45361000001, 10525.41903, 12092.47775, 13321.31967, 14166.54375, 19453.09158, 29420.92275, 40051.42972, 35847.14887, 34482.68441, 19587.71961, 11271.25139, 11694.05954, 13769.59362, 11659.18374, 17877.42994, 22021.2541, 33659.33064, 42369.4890400001, 54550.5408100002, 47030.07208, 36031.45117, 22722.94451, 16424.3379, 19416.12184, 15761.26377, 17461.77492, 23034.18867, 25961.00149, 35632.5872900001, 60657.6473300001, 55100.3184400003, 61655.7761500001, 30761.99269, 29786.96525, 22656.00762, 16351.53555, 18015.74743, 23910.70351, 20995.39388, 20371.11763, 35233.2200699999, 47270.4236300001, 53802.7741499999, 53714.6655900001, 37278.88368, 21616.27635, 20075.94796, 19401.09063, 19297.18282, 24753.55655, 26496.27603, 20130.08216, 35058.80389, 48125.0677700001, 59969.08135, 57450.13203, 41753.05294, 24874.24726, 13610.99182, 20550.55517, 21210.90882, 17107.47709, 19169.57646, 18578.76088, 34744.47389, 44335.41631, 46347.7448900001, 41550.3942399999, 27755.91724, 13414.11281, 11074.46552, 12068.09558, 12635.94958, 11081.12223, 13308.23815, 22536.94408, 18105.44875, 34714.63068, 37437.38786, 36784.10513, 27154.86446, 23552.82666, 12099.5804, 13534.57088, 16237.6264, 14547.91032, 17199.1968, 21080.44842, 25085.36974, 39258.28851, 40603.46326, 37742.40849, 33620.18708, 20305.95371, 14225.0285, 16310.65407, 15965.69726, 21882.95871, 18356.99151, 19141.86357, 30531.37237, 39800.98787, 39354.91294, 42634.31533, 31650.05883, 20502.26432, 16141.67259, 17107.80332, 12697.38945, 16790.21574, 20896.63372, 18770.0884, 28972.74371, 39656.79033, 44340.99371, 44916.33668, 28115.79535, 19531.60955, 16771.57021, 14906.54845, 9474.66004, 7789.76465, 6832.06489, 9497.70645, 14834.9029, 24787.91273, 26257.65726, 28598.46215, 26921.74417, 20172.35918, 12489.69404, 13881.20071, 19496.62399, 13821.68343, 10229.89673, 16542.62827, 18169.52112, 25268.34917, 41895.43731, 48165.33864, 48070.64557, 27671.95099, 17798.00725, 22471.00625, 23998.9337, 16315.96127, 20133.44694, 27345.2284, 28167.35831, 39259.8106), tsp = c(2007, 2022.58333333333, 12), class = "ts") ## ARIMA(1,0,1)(0,1,1)[12] ## ## Coefficients: ## ar1 ma1 sma1 ## 0.8930 -0.3315 -0.8149 ## s.e. 0.0451 0.1067 0.1578 ## ## sigma^2 = 22268779: log likelihood = -1743.87 ## AIC=3495.74 AICc=3495.97 BIC=3508.42
coeftest(md$forecast$autoarima_bic$model)
## ## z test of coefficients: ## ## Estimate Std. Error z value Pr(>|z|) ## ar1 0.893012 0.045068 19.8149 < 2.2e-16 *** ## ma1 -0.331492 0.106746 -3.1054 0.0019 ** ## sma1 -0.814854 0.157835 -5.1627 2.434e-07 *** ## --- ## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## ## Ljung-Box test ## ## data: Residuals from ARIMA(1,0,1)(0,1,1)[12] ## Q* = 32.541, df = 21, p-value = 0.05156 ## ## Model df: 3. Total lags used: 24
md$forecast$autoarima_bic$model$residuals %>% shapiro.test()
## ## Shapiro-Wilk normality test ## ## data: . ## W = 0.97048, p-value = 0.0005248
md$forecast$autoarima_bic$model$residuals %>% jarque.bera.test()
## ## Jarque Bera Test ## ## data: . ## X-squared = 35.174, df = 2, p-value = 2.302e-08
md$forecast$autoarima_bic$forecast
## Point Forecast Lo 80 Hi 80 Lo 95 Hi 95 ## Sep 2022 44514.19 38464.460 50563.92 35261.927 53766.45 ## Oct 2022 45262.21 38324.073 52200.34 34651.247 55873.17 ## Nov 2022 36378.70 28806.517 43950.89 24798.045 47959.36 ## Dec 2022 24453.80 16411.829 32495.77 12154.667 36752.94 ## Jan 2023 17316.13 8918.752 25713.51 4473.448 30158.82 ## Feb 2023 18494.14 9823.466 27164.82 5233.488 31754.80
methods_1 <- list(autoarima_bic = list(method="auto.arima", method_arg = list(stepwise = FALSE, approximation = FALSE, ic = "bic"), notes= "Auto arima BIC"))
md1 <- suppressWarnings(train_model(input = log(ts_toys), methods = methods_1, train_method = list(partitions = 3, sample.out = 6, space = 5), horizon = 6, error = "MAPE"))
## # A tibble: 1 × 7 ## model_id model notes avg_mape avg_rmse avg_covera…¹ avg_c…² ## <chr> <chr> <chr> <dbl> <dbl> <dbl> <dbl> ## 1 autoarima_bic auto.arima Auto arima BIC 0.0310 0.348 0.444 0.722 ## # … with abbreviated variable names ¹`avg_coverage_80%`, ²`avg_coverage_95%`
## ## Ljung-Box test ## ## data: Residuals from ARIMA(1,0,1)(2,1,1)[12] ## Q* = 17.851, df = 19, p-value = 0.5324 ## ## Model df: 5. Total lags used: 24
md1$forecast$autoarima_bic$model$residuals %>% shapiro.test()
## ## Shapiro-Wilk normality test ## ## data: . ## W = 0.9803, p-value = 0.009417
md1$forecast$autoarima_bic$model$residuals %>% jarque.bera.test()
## ## Jarque Bera Test ## ## data: . ## X-squared = 9.2872, df = 2, p-value = 0.009623
Esta función nos ayuda a automatizar el proceso entrenamiento, prueba, evaluación y pronósticar múltiples modelos de series de tiempo univariadas.
Aunque el enfoque de backtesting nos proporciona información intuitiva sobre la estabilidad y escalabilidad del modelo, está conlleva un mayor coste computacional en comparación con el comparado con el enfoque de una sola partición de entrenamiento y prueba. Por lo tanto, esta compensación entre los dos enfoques debe tenerse en cuenta al seleccionar el enfoque de entrenamiento.
Cabe resaltar que de igual manera se debe continuar con el análisis de la serie para así evaluar los resultados obtenidos.
Link código usado: Series de tiempo