class: center <img src="images/gif_serie.gif" width="40%" /> # Sknifedatar **Ajuste y visualización de múltiples modelos** **sobre múltiples series de tiempo** <br> <br> <br> 2021-06-24 Rafael Zambrano & Karina Bartolomé <br> --- <style type="text/css"> /* Table width = 100% max-width */ .remark-slide table{width: 100%;} /* Change the background color to white for shaded rows (even rows) */ .remark-slide thead, .remark-slide tr:nth-child(2n) { background-color: white; .tfoot .td {background-color: white} } .bold-last-item > ul > li:last-of-type, .bold-last-item > ol > li:last-of-type {font-weight: bold;} </style> # ¿Quiénes somos? .pull-left[ ### Rafael Zambrano - Actuario 🇻🇪 - Data Scientist en Ualá 🚀 - Magister en métodos cuantitativos (en curso) ] .pull-right[ <br> <br> <img src="images/imagen_b.jpeg" width="35%" style="display: block; margin: auto;" /> ] .pull-left[ ### Karina Bartolomé - Economista 🇦🇷 - Data Scientist en Ualá 🚀 - Especialista en métodos cuantitativos (en curso) ] .pull-right[ <br> <br> <img src="images/imagen_a.jpeg" width="35%" style="display: block; margin: auto;" /> ] --- # ¿Qué es #modeltime? Es un ecosistema desarrollado por **Matt Dancho** para realizar análisis de series de tiempo mediante un enfoque ordenado (o Tidy) con #tidymodels 📦. <img src="images/modeltime.png" width="90%" height="90%" style="display: block; margin: auto;" /> --- # Sknifedatar 📦 #### Una extensión de **#modeltime** ```r install.packages('sknifedatar') ``` -- <img src="images/sknifedatar.png" width="20%" height="20%" style="display: block; margin: auto;" /> Incluye: - **Funciones multifit**: Múltiples modelos en múltiples series de tiempo (sin datos de panel) - **Workflowsets**: Ajuste de múltiples modelos y recetas de preprocesamiento con modeltime - **Workflowset multifit**: Ajuste de múltiples modelos y recetas de preprocesamiento sobre múltiples modelos (sin datos de panel) - **Automagic tabs**: Generación automática de tabs --- # Agenda para hoy <img src="images/gif_gato_lentes.gif" width="30%" style="display: block; margin: auto;" /> - **Introducción a modeltime** - **Multifit**: Ajuste de múltiples modelos en múltiples series de tiempo - **Workflowsets**: Ajuste de múltiples modelos y recetas de preprocesamiento sobre múltiples modelos - **Automagic tabs**: Generación automática de tabs en Distill / Rmd --- # Librerías utilizadas 📚 ```r library(sknifedatar) library(modeltime) library(workflowsets) library(tidymodels) library(tidyverse) library(timetk) library(anomalize) ``` <img src="images/gif_libros.gif" width="50%" style="display: block; margin: auto;" /> --- # Datos 📊 **Consumo residencial de gas 4 estados de Estados Unidos, entre 1989 y 2020** -- ```r data <- USgas::us_residential %>% rename(value=y) %>% filter(state %in% c('Nevada','Maine', 'Hawaii','West Virginia')) %>% group_by(state) %>% mutate(value = ifelse(is.na(value),mean(value, na.rm=TRUE),value)) %>% ungroup() ``` -- <table> <thead> <tr> <th style="text-align:left;"> date </th> <th style="text-align:left;"> state </th> <th style="text-align:right;"> value </th> </tr> </thead> <tbody> <tr> <td style="text-align:left;"> 1989-01-01 </td> <td style="text-align:left;"> Hawaii </td> <td style="text-align:right;"> 51 </td> </tr> <tr> <td style="text-align:left;"> 1989-02-01 </td> <td style="text-align:left;"> Hawaii </td> <td style="text-align:right;"> 52 </td> </tr> <tr> <td style="text-align:left;"> 1989-03-01 </td> <td style="text-align:left;"> Hawaii </td> <td style="text-align:right;"> 50 </td> </tr> <tr> <td style="text-align:left;"> 1989-04-01 </td> <td style="text-align:left;"> Hawaii </td> <td style="text-align:right;"> 50 </td> </tr> <tr> <td style="text-align:left;"> 1989-05-01 </td> <td style="text-align:left;"> Hawaii </td> <td style="text-align:right;"> 47 </td> </tr> </tbody> </table> --- ### Evolución 📈 ```r data %>% group_by(state) %>% plot_time_series(date, value) ``` <!-- --> --- ### Detección de anomalías 🔍 ```r data %>% group_by(state) %>% plot_anomaly_diagnostics(date, value) ``` <!-- --> --- ### Descomposición de series de tiempo .panelset[ .panel[.panel-name[Hawaii] <!-- --> ] .panel[.panel-name[Maine] <!-- --> ] .panel[.panel-name[Nevada] <!-- --> ] .panel[.panel-name[West Virginia] <!-- --> ] ] --- <br> <br> # Múltiples modelos y una serie <br> <img src="images/gif_gatos_multi.gif" width="25%" style="display: block; margin: auto;" /> --- ## Flujo de trabajo de modeltime ### Preparación de datos ⚙️ * Se selecciona el estado de 🏖 **Hawaii** ```r data_hawaii <- data %>% filter(state=='Hawaii') ``` -- * Particiona el dataset en train y test ✂️ ```r splits <- data_hawaii %>% initial_time_split(prop = 0.8) ``` --- ### Visualización de la partición ```r splits %>% tk_time_series_cv_plan() %>% plot_time_series_cv_plan(date, value) ```
--- ### Receta 🌮 Se crea una receta de **preprocesamiento**, incluye la fórmula a estimar y un paso adicional que añade variables en función de la fecha. ```r receta <- recipe(value ~ date, data = training(splits)) %>% step_timeseries_signature(date) %>% step_rm(contains("iso"), contains("minute"), contains("hour"), contains("am.pm"), contains("xts"), contains("second"), date_index.num, date_wday, date_month) ```
date
value
date_year
date_half
date_quarter
date_month.lbl
date_day
date_wday.lbl
date_mday
date_qday
date_yday
date_mweek
date_week
date_week2
date_week3
date_week4
date_mday7
1989-01-01
51
1989
1
1
January
1
Sunday
1
1
1
5
1
1
1
1
1
1989-02-01
52
1989
1
1
February
1
Wednesday
1
32
32
5
5
1
2
1
1
--- ### Modelos 🚀 Definición y ajuste de modelos sobre train ```r # Modelo: Auto-ARIMA m_autoarima <- arima_reg() %>% set_engine('auto_arima') %>% fit(value~date, data=training(splits)) # Modelo: exponential smoothing m_exp_smoothing <- exp_smoothing() %>% set_engine('ets') %>% fit(value~date, data=training(splits)) # Workflow: prophet boosted m_prophet_boost <- workflow() %>% add_recipe(receta) %>% add_model( prophet_boost(mode='regression') %>% set_engine("prophet_xgboost") ) %>% fit(data = training(splits)) ``` --- ### Modeltimetable El objeto central del ecosistema #modeltime 📦 es el **modeltime_table**, el cual incluye todos los modelos entrenados para realizar comparaciones. ```r modelos <- modeltime_table(m_autoarima, m_exp_smoothing, m_prophet_boost ) ``` -- <div data-pagedtable="false"> <script data-pagedtable-source type="application/json"> {"columns":[{"label":[".model_id"],"name":[1],"type":["int"],"align":["right"]},{"label":[".model"],"name":[2],"type":["list"],"align":["right"]},{"label":[".model_desc"],"name":[3],"type":["chr"],"align":["left"]}],"data":[{"1":"1","2":"<S3: _auto_arima_fit_impl>","3":"ARIMA(0,1,1)(0,1,1)[12]"},{"1":"2","2":"<S3: _ets_fit_impl>","3":"ETS(A,N,A)"},{"1":"3","2":"<S3: workflow>","3":"PROPHET W/ XGBOOST ERRORS"}],"options":{"columns":{"min":{},"max":[10]},"rows":{"min":[6],"max":[6]},"pages":{}}} </script> </div> --- ### Calibración de modelos 🔧 Se verifica el **rendimiento** de los modelos sobre la partición de test. ```r calibration_table <- modelos %>% modeltime_calibrate(new_data = testing(splits)) ``` -- * Verificación de métricas 🎯 ```r calibration_table %>% modeltime_accuracy() ``` <div data-pagedtable="false"> <script data-pagedtable-source type="application/json"> {"columns":[{"label":[".model_id"],"name":[1],"type":["int"],"align":["right"]},{"label":[".model_desc"],"name":[2],"type":["chr"],"align":["left"]},{"label":["mae"],"name":[3],"type":["dbl"],"align":["right"]},{"label":["mape"],"name":[4],"type":["dbl"],"align":["right"]},{"label":["mase"],"name":[5],"type":["dbl"],"align":["right"]},{"label":["smape"],"name":[6],"type":["dbl"],"align":["right"]},{"label":["rmse"],"name":[7],"type":["dbl"],"align":["right"]},{"label":["rsq"],"name":[8],"type":["dbl"],"align":["right"]}],"data":[{"1":"1","2":"ARIMA(0,1,1)(0,1,1)[12]","3":"3.256071","4":"6.929972","5":"0.9532983","6":"6.601998","7":"3.917026","8":"0.6656222"},{"1":"2","2":"ETS(A,N,A)","3":"2.062559","4":"4.276337","5":"0.6038670","6":"4.249388","7":"2.628818","8":"0.6433330"},{"1":"3","2":"PROPHET W/ XGBOOST ERRORS","3":"3.132737","4":"6.664286","5":"0.9171891","6":"6.379083","7":"3.720455","8":"0.6363483"}],"options":{"columns":{"min":{},"max":[10]},"rows":{"min":[6],"max":[6]},"pages":{}}} </script> </div> --- * Forecasting 🔬 Se realiza la **proyección** sobre los datos de testing para luego visualizarla. ```r forecast_series <- calibration_table %>% modeltime_forecast( new_data = testing(splits), actual_data = data_hawaii) ``` --- ### Verificación visual ```r forecast_series %>% plot_modeltime_forecast( .legend_max_width = 30, .interactive = FALSE, .conf_interval_alpha = 0.2 ) ``` <!-- --> --- ### Selección y reajuste de modelos Se seleccionan 2 modelos y luego se reajustan ambos modelos en todos los datos (train + test) ```r refit_tbl <- calibration_table %>% filter(.model_id %in% c(1,2)) %>% modeltime_refit(data = data_hawaii) ``` -- ## Proyección 🔮 ```r forecast_final <- refit_tbl %>% modeltime_forecast( actual_data = data_hawaii, h='2 years' ) ``` --- ### Visualización de la proyección a 2 años ```r forecast_final %>% plot_modeltime_forecast( .legend_max_width = 30, .interactive = FALSE, .conf_interval_alpha = 0.2 ) ``` <!-- --> --- # Múltiples modelos sobre múltiples series (no panel) <img src="diagrama_multifit.png" width="5081" style="display: block; margin: auto;" /> --- ## Datos 📊 ```r nest_data <- data %>% nest(nested_column = -state) ```
--- ## Receta 🌮 ```r receta <- recipe(value ~ date, data = data %>% select(-state)) %>% step_timeseries_signature(date) %>% step_rm(contains("iso"), contains("minute"), contains("hour"), contains("am.pm"), contains("xts"), contains("second"), date_index.num, date_wday, date_month) ``` --- ## Modelos 🚀 Definición de modelos ```r # Modelo: tbats m_tbats <-seasonal_reg() %>% set_engine("tbats") # Modelo stlm_arima m_seasonal <- seasonal_reg() %>% set_engine("stlm_arima") # Workflow: prophet boosted m_prophet_boost <- workflow() %>% add_recipe(receta) %>% add_model( prophet_boost(mode='regression') %>% set_engine("prophet_xgboost") ) ``` --- ## Modeltime Multifit ✨ <img src="images/gif_jack.gif" width="50%" style="display: block; margin: auto;" /> ```r model_table <- modeltime_multifit(serie = nest_data, .prop = 0.8, m_tbats, m_seasonal, m_prophet_boost ) ``` --- ## Modeltimetable * **Table time** ```r model_table$table_time ``` <div data-pagedtable="false"> <script data-pagedtable-source type="application/json"> {"columns":[{"label":["state"],"name":[1],"type":["chr"],"align":["left"]},{"label":["nested_column"],"name":[2],"type":["list"],"align":["right"]},{"label":["m_tbats"],"name":[3],"type":["list"],"align":["right"]},{"label":["m_seasonal"],"name":[4],"type":["list"],"align":["right"]},{"label":["m_prophet_boost"],"name":[5],"type":["list"],"align":["right"]},{"label":["nested_model"],"name":[6],"type":["list"],"align":["right"]},{"label":["calibration"],"name":[7],"type":["list"],"align":["right"]}],"data":[{"1":"Hawaii","2":"<tibble[,2]>","3":"<S3: _tbats_fit_impl>","4":"<S3: _stlm_arima_fit_impl>","5":"<S3: workflow>","6":"<mdl_tm_t[,3]>","7":"<mdl_tm_t[,5]>"},{"1":"Maine","2":"<tibble[,2]>","3":"<S3: _tbats_fit_impl>","4":"<S3: _stlm_arima_fit_impl>","5":"<S3: workflow>","6":"<mdl_tm_t[,3]>","7":"<mdl_tm_t[,5]>"},{"1":"Nevada","2":"<tibble[,2]>","3":"<S3: _tbats_fit_impl>","4":"<S3: _stlm_arima_fit_impl>","5":"<S3: workflow>","6":"<mdl_tm_t[,3]>","7":"<mdl_tm_t[,5]>"},{"1":"West Virginia","2":"<tibble[,2]>","3":"<S3: _tbats_fit_impl>","4":"<S3: _stlm_arima_fit_impl>","5":"<S3: workflow>","6":"<mdl_tm_t[,3]>","7":"<mdl_tm_t[,5]>"}],"options":{"columns":{"min":{},"max":[10]},"rows":{"min":[6],"max":[6]},"pages":{}}} </script> </div> -- ```r model_table$table_time$nested_model[[1]] ``` <div data-pagedtable="false"> <script data-pagedtable-source type="application/json"> {"columns":[{"label":[".model_id"],"name":[1],"type":["int"],"align":["right"]},{"label":[".model"],"name":[2],"type":["list"],"align":["right"]},{"label":[".model_desc"],"name":[3],"type":["chr"],"align":["left"]}],"data":[{"1":"1","2":"<S3: _tbats_fit_impl>","3":"TBATS(1, {0,0}, -, {<12,5>})"},{"1":"2","2":"<S3: _stlm_arima_fit_impl>","3":"SEASONAL DECOMP: ARIMA(0,1,1)"},{"1":"3","2":"<S3: workflow>","3":"PROPHET W/ XGBOOST ERRORS"}],"options":{"columns":{"min":{},"max":[10]},"rows":{"min":[6],"max":[6]},"pages":{}}} </script> </div> --- ## Calibración de modelos 🔧 Se verifica el **rendimiento** de los modelos sobre la partición de test. * Verificación de métricas 🎯 ```r model_table$models_accuracy ``` <div data-pagedtable="false"> <script data-pagedtable-source type="application/json"> {"columns":[{"label":["name_serie"],"name":[1],"type":["chr"],"align":["left"]},{"label":[".model_id"],"name":[2],"type":["int"],"align":["right"]},{"label":[".model_desc"],"name":[3],"type":["chr"],"align":["left"]},{"label":[".type"],"name":[4],"type":["chr"],"align":["left"]},{"label":["mae"],"name":[5],"type":["dbl"],"align":["right"]},{"label":["mape"],"name":[6],"type":["dbl"],"align":["right"]},{"label":["mase"],"name":[7],"type":["dbl"],"align":["right"]},{"label":["smape"],"name":[8],"type":["dbl"],"align":["right"]},{"label":["rmse"],"name":[9],"type":["dbl"],"align":["right"]},{"label":["rsq"],"name":[10],"type":["dbl"],"align":["right"]}],"data":[{"1":"Hawaii","2":"1","3":"TBATS(1, {0,0}, -, {<12,5>})","4":"Test","5":"2.048344","6":"4.239269","7":"0.5997054","8":"4.213804","9":"2.580558","10":"0.6580835"},{"1":"Hawaii","2":"2","3":"SEASONAL DECOMP: ARIMA(0,1,1)","4":"Test","5":"2.082337","6":"4.306734","7":"0.6096577","8":"4.304328","9":"2.530066","10":"0.6653430"},{"1":"Hawaii","2":"3","3":"PROPHET W/ XGBOOST ERRORS","4":"Test","5":"3.132737","6":"6.664286","7":"0.9171891","8":"6.379083","9":"3.720455","10":"0.6363483"},{"1":"Maine","2":"1","3":"TBATS(0, {2,2}, -, {<12,5>})","4":"Test","5":"62.628731","6":"20.682037","7":"0.7804519","8":"24.038519","9":"90.084881","10":"0.9317830"},{"1":"Maine","2":"2","3":"SEASONAL DECOMP: ARIMA(4,1,3) WITH DRIFT","4":"Test","5":"75.051502","6":"45.199655","7":"0.9352590","8":"37.520298","9":"94.063015","10":"0.9493728"},{"1":"Maine","2":"3","3":"PROPHET W/ XGBOOST ERRORS","4":"Test","5":"51.864392","6":"24.763482","7":"0.6463114","8":"24.454316","9":"77.319740","10":"0.8739811"},{"1":"Nevada","2":"1","3":"TBATS(0, {1,2}, 0.888, {<12,4>})","4":"Test","5":"564.120987","6":"13.962006","7":"0.4881914","8":"15.165033","9":"817.142143","10":"0.9324942"},{"1":"Nevada","2":"2","3":"SEASONAL DECOMP: ARIMA(1,1,3) WITH DRIFT","4":"Test","5":"387.735939","6":"11.854816","7":"0.3355474","8":"11.353737","9":"544.458176","10":"0.9518313"},{"1":"Nevada","2":"3","3":"PROPHET W/ XGBOOST ERRORS","4":"Test","5":"544.514213","6":"12.185886","7":"0.4712236","8":"13.252798","9":"826.694587","10":"0.9370876"},{"1":"West Virginia","2":"1","3":"TBATS(0.348, {4,2}, -, {<12,5>})","4":"Test","5":"338.931416","6":"20.826426","7":"0.4139079","8":"18.116444","9":"511.570278","10":"0.9240290"},{"1":"West Virginia","2":"2","3":"SEASONAL DECOMP: ARIMA(1,1,1)","4":"Test","5":"350.999385","6":"23.373315","7":"0.4286454","8":"20.195734","9":"507.059505","10":"0.9341292"},{"1":"West Virginia","2":"3","3":"PROPHET W/ XGBOOST ERRORS","4":"Test","5":"393.904332","6":"25.124042","7":"0.4810416","8":"28.680657","9":"546.377757","10":"0.9249577"}],"options":{"columns":{"min":{},"max":[10]},"rows":{"min":[6],"max":[6]},"pages":{}}} </script> </div> --- ## Proyección sobre test 🔬 ```r forecast_series <- modeltime_multiforecast( model_table$table_time, .prop = 0.9 ) ``` --- * **Verificación visual** ```r forecast_series %>% select(state, nested_forecast) %>% unnest(nested_forecast) %>% group_by(state) %>% plot_modeltime_forecast() ``` <!-- --> --- ### Selección de modelos 🥇 Se selecciona el **mejor modelo** para cada serie en función a una métrica. ```r best_models <- modeltime_multibestmodel( .table = forecast_series, .metric = "mae" ) ``` <img src="images/gif_minon_1.gif" width="30%" style="display: block; margin: auto;" /> --- ```r best_models %>% select(state, nested_forecast) %>% unnest(nested_forecast) %>% group_by(state) %>% plot_modeltime_forecast() ``` <!-- --> --- ## Reajuste de los modelos 🌀 * **Se reajustan los modelos para todas las series completas (train + test)** ```r models_refit <- modeltime_multirefit(best_models) ``` -- **Proyección** 🔮 * **Se predicen los proximos 2 años para todas las series.** ```r forecast_final <- models_refit %>% modeltime_multiforecast(.h = "2 years") ``` -- --- **Visualización de la proyección a 2 años** ```r forecast_final %>% select(state, nested_forecast) %>% unnest(nested_forecast) %>% group_by(state) %>% plot_modeltime_forecast() ``` <!-- --> --- # Workflowsets en múltiples series <img src="diagrama_wfs.png" width="6233" style="display: block; margin: auto;" /> --- ### Recetas 🌮 ```r # Receta base recipe_base <- recipe(value~date, data=data_hawaii) # Características según fecha recipe_date_extrafeatures <- recipe_base %>% step_date(date, features = c('month','year','quarter','semester')) # Resagos recipe_date_extrafeatures_lag <- recipe_date_extrafeatures %>% step_lag(value, lag = 1:6) %>% step_ts_impute(all_numeric(), period=365) # Fourier recipe_date_extrafeatures_fourier <-recipe_date_extrafeatures %>% step_fourier(date, period = 365/12, K = 1) ``` --- ### Modelos 🚀 ```r # prophet_xgboost prophet_boost <- prophet_boost(mode = 'regression') %>% set_engine("prophet_xgboost") # nnetar nnetar <- nnetar_reg() %>% set_engine("nnetar") #auto_arima_xgboost auto_arima_boost <- arima_boost() %>% set_engine('auto_arima_xgboost') ``` --- ### Workflowsets ✨ ```r wfsets <- workflow_set( preproc = list( base = recipe_base, extrafeatures = recipe_date_extrafeatures, extrafeatures_lag = recipe_date_extrafeatures_lag, extrafeatures_fourier = recipe_date_extrafeatures_fourier ), models = list( M_arima_boost = auto_arima_boost, M_prophet_boost = prophet_boost, M_nnetar = nnetar ), cross = TRUE ) ``` --- 👉 El objeto **wfsets** contiene todas las posibles combinaciones de recetas con modelos: ```r wfsets %>% rmarkdown::paged_table(list(rows.print = 6)) ``` <div data-pagedtable="false"> <script data-pagedtable-source type="application/json"> {"columns":[{"label":["wflow_id"],"name":[1],"type":["chr"],"align":["left"]},{"label":["info"],"name":[2],"type":["list"],"align":["right"]},{"label":["option"],"name":[3],"type":["list"],"align":["right"]},{"label":["result"],"name":[4],"type":["list"],"align":["right"]}],"data":[{"1":"base_M_arima_boost","2":"<tibble[,4]>","3":"<wrkflw__>","4":"<list [0]>"},{"1":"base_M_prophet_boost","2":"<tibble[,4]>","3":"<wrkflw__>","4":"<list [0]>"},{"1":"base_M_nnetar","2":"<tibble[,4]>","3":"<wrkflw__>","4":"<list [0]>"},{"1":"extrafeatures_M_arima_boost","2":"<tibble[,4]>","3":"<wrkflw__>","4":"<list [0]>"},{"1":"extrafeatures_M_prophet_boost","2":"<tibble[,4]>","3":"<wrkflw__>","4":"<list [0]>"},{"1":"extrafeatures_M_nnetar","2":"<tibble[,4]>","3":"<wrkflw__>","4":"<list [0]>"},{"1":"extrafeatures_lag_M_arima_boost","2":"<tibble[,4]>","3":"<wrkflw__>","4":"<list [0]>"},{"1":"extrafeatures_lag_M_prophet_boost","2":"<tibble[,4]>","3":"<wrkflw__>","4":"<list [0]>"},{"1":"extrafeatures_lag_M_nnetar","2":"<tibble[,4]>","3":"<wrkflw__>","4":"<list [0]>"},{"1":"extrafeatures_fourier_M_arima_boost","2":"<tibble[,4]>","3":"<wrkflw__>","4":"<list [0]>"},{"1":"extrafeatures_fourier_M_prophet_boost","2":"<tibble[,4]>","3":"<wrkflw__>","4":"<list [0]>"},{"1":"extrafeatures_fourier_M_nnetar","2":"<tibble[,4]>","3":"<wrkflw__>","4":"<list [0]>"}],"options":{"columns":{"min":{},"max":[10]},"rows":{"min":[6],"max":[6]},"pages":{}}} </script> </div> --- ### Ajuste de modelos ⚙️ ```r wfs_multifit <- modeltime_wfs_multifit(serie = nest_data, .prop = 0.8, .wfs = wfsets) ``` <div data-pagedtable="false"> <script data-pagedtable-source type="application/json"> {"columns":[{"label":["state"],"name":[1],"type":["chr"],"align":["left"]},{"label":["nested_column"],"name":[2],"type":["list"],"align":["right"]},{"label":["base_M_arima_boost"],"name":[3],"type":["list"],"align":["right"]},{"label":["base_M_nnetar"],"name":[4],"type":["list"],"align":["right"]},{"label":["base_M_prophet_boost"],"name":[5],"type":["list"],"align":["right"]},{"label":["extrafeatures_fourier_M_arima_boost"],"name":[6],"type":["list"],"align":["right"]},{"label":["extrafeatures_fourier_M_nnetar"],"name":[7],"type":["list"],"align":["right"]},{"label":["extrafeatures_fourier_M_prophet_boost"],"name":[8],"type":["list"],"align":["right"]},{"label":["extrafeatures_lag_M_arima_boost"],"name":[9],"type":["list"],"align":["right"]},{"label":["extrafeatures_lag_M_nnetar"],"name":[10],"type":["list"],"align":["right"]},{"label":["extrafeatures_lag_M_prophet_boost"],"name":[11],"type":["list"],"align":["right"]},{"label":["extrafeatures_M_arima_boost"],"name":[12],"type":["list"],"align":["right"]},{"label":["extrafeatures_M_nnetar"],"name":[13],"type":["list"],"align":["right"]},{"label":["extrafeatures_M_prophet_boost"],"name":[14],"type":["list"],"align":["right"]},{"label":["nested_model"],"name":[15],"type":["list"],"align":["right"]},{"label":["calibration"],"name":[16],"type":["list"],"align":["right"]}],"data":[{"1":"Hawaii","2":"<tibble[,2]>","3":"<S3: workflow>","4":"<S3: workflow>","5":"<S3: workflow>","6":"<S3: workflow>","7":"<S3: workflow>","8":"<S3: workflow>","9":"<S3: workflow>","10":"<S3: workflow>","11":"<S3: workflow>","12":"<S3: workflow>","13":"<S3: workflow>","14":"<S3: workflow>","15":"<mdl_tm_t[,3]>","16":"<mdl_tm_t[,5]>"},{"1":"Maine","2":"<tibble[,2]>","3":"<S3: workflow>","4":"<S3: workflow>","5":"<S3: workflow>","6":"<S3: workflow>","7":"<S3: workflow>","8":"<S3: workflow>","9":"<S3: workflow>","10":"<S3: workflow>","11":"<S3: workflow>","12":"<S3: workflow>","13":"<S3: workflow>","14":"<S3: workflow>","15":"<mdl_tm_t[,3]>","16":"<mdl_tm_t[,5]>"},{"1":"Nevada","2":"<tibble[,2]>","3":"<S3: workflow>","4":"<S3: workflow>","5":"<S3: workflow>","6":"<S3: workflow>","7":"<S3: workflow>","8":"<S3: workflow>","9":"<S3: workflow>","10":"<S3: workflow>","11":"<S3: workflow>","12":"<S3: workflow>","13":"<S3: workflow>","14":"<S3: workflow>","15":"<mdl_tm_t[,3]>","16":"<mdl_tm_t[,5]>"},{"1":"West Virginia","2":"<tibble[,2]>","3":"<S3: workflow>","4":"<S3: workflow>","5":"<S3: workflow>","6":"<S3: workflow>","7":"<S3: workflow>","8":"<S3: workflow>","9":"<S3: workflow>","10":"<S3: workflow>","11":"<S3: workflow>","12":"<S3: workflow>","13":"<S3: workflow>","14":"<S3: workflow>","15":"<mdl_tm_t[,3]>","16":"<mdl_tm_t[,5]>"}],"options":{"columns":{"min":{},"max":[10]},"rows":{"min":[6],"max":[6]},"pages":{}}} </script> </div> --- **Performance según rsq de cada modelo en cada serie** .panelset[ .panel[.panel-name[Hawaii] <!-- --> ] .panel[.panel-name[Maine] <!-- --> ] .panel[.panel-name[Nevada] <!-- --> ] .panel[.panel-name[West Virginia] <!-- --> ] ] --- ### Proyecciones 🔬 ```r wfs_multiforecast <- modeltime_wfs_multiforecast( wfs_multifit$table_time, .prop=0.8) ``` <img src="sknifedatar_files/figure-html/unnamed-chunk-80-1.png" style="display: block; margin: auto;" /> --- ### Selección del mejor modelo 🥇 ```r wfs_bests<- modeltime_wfs_multibestmodel( .table = wfs_multiforecast, .metric = "rsq", .minimize = FALSE ) ``` ### Reentrenamiento para todos los datos 🌀 ```r wfs_refit <- modeltime_wfs_multirefit(wfs_bests) ``` --- ### Proyecciones a 12 meses 🔮 ```r wfs_forecast <- modeltime_wfs_multiforecast(wfs_refit, .h = "12 month") ``` <!-- --> --- <br> <br> # Automagic Tabs <br> <img src="images/gif_gato_tocadisco.gif" width="50%" style="display: block; margin: auto;" /> --- # ¿Por qué utilizar tabs? 🤔 Mostrar muchos gráficos 📈 o resultados de modelos 🤖 juntos puede generar confusión. Organizar los resultados en solapas permite centrar la atención en ciertos aspectos y no sobrecargar de información. .panelset[ .panel[.panel-name[👋 Hey!] Esta es la primera tab 🌟 Hacer click en las tabs para consejos no solicitados 🌟 👆 ] .panel[.panel-name[Consejo 1] <img src="https://media.tenor.com/images/be8a87467b75e9deaa6cfe8ad0b739a0/tenor.gif" width="50%" style="display: block; margin: auto;" /> ] .panel[.panel-name[Consejo 2] <img src="https://media.tenor.com/images/6a2cca305dfacae61c5668dd1687ad55/tenor.gif" width="50%" style="display: block; margin: auto;" /> ] .panel[.panel-name[Consejo 3] <img src="https://media.tenor.com/images/bfde5ad652b71fc9ded82c6ed760355b/tenor.gif" width="50%" style="display: block; margin: auto;" /> ] ] --- ## ¿Cómo se crean tabs manualmente? <img src="https://karbartolome-blog.netlify.app/posts/automagictabs/data/tabs.png" width="70%" style="display: block; margin: auto;" /> --- <br> <br> <br> <img src="images/gif_minon_2.gif" width="50%" style="display: block; margin: auto;" /> --- ## Generación automática de tabs 🙌 👉 **Código inline** , utilizando un dataframe anidado, que incluye una variable del resultado a presentar por tab ('ts_plots'), y una variable agrupadora ('state') ```r `r automagic_tabs(input_data = nest_plots_1, panel_name = "state", .output = "ts_plots")` ``` --- <img src="images/gif_bye.gif" width="30%" style="display: block; margin: auto;" /> ## Contactos ✉ Karina Bartolome [](https://twitter.com/karbartolome) [](https://www.linkedin.com/in/karinabartolome/) [](https://github.com/karbartolome) [](https://karbartolome-blog.netlify.app/) Rafael Zambrano [](https://twitter.com/rafa_zamr) [](https://www.linkedin.com/in/rafael-zambrano/) [](https://github.com/rafzamb) [](https://rafael-zambrano-blog-ds.netlify.app/)