class: middle
<style type="text/css"> .remark-slide-number { display: none; } </style> <br> <br> <center> # Creando flujos de trabajo abiertos y reproducibles para el modelamiento de nichos ecológicos ### Andrea Sánchez-Tapia, Sara Ribeiro Mortara, Felipe Sodré Barros ### FOSS4G Buenos Aires 2021 </center> <br> __[Slides in English](https://andreasancheztapia.github.io/FOSS4G_2021/english#1)__ --- background-image: url("figs/logo_jbrj.png") background-position: 98% 2% background-size: 100px .left-column[ <img src="figs/andrea.jpg" title="fotos del equipo: Andrea Sánchez-Tapia, Sara Mortara, Felipe Sodré Barros, Guilherme Gall, Diogo Rocha, y Marinez Ferreira de Siqueira (Investigadora principal)" alt="fotos del equipo: Andrea Sánchez-Tapia, Sara Mortara, Felipe Sodré Barros, Guilherme Gall, Diogo Rocha, y Marinez Ferreira de Siqueira (Investigadora principal)" width="90" style="display: block; margin: auto auto auto 0;" /><img src="figs/SRM.jpg" title="fotos del equipo: Andrea Sánchez-Tapia, Sara Mortara, Felipe Sodré Barros, Guilherme Gall, Diogo Rocha, y Marinez Ferreira de Siqueira (Investigadora principal)" alt="fotos del equipo: Andrea Sánchez-Tapia, Sara Mortara, Felipe Sodré Barros, Guilherme Gall, Diogo Rocha, y Marinez Ferreira de Siqueira (Investigadora principal)" width="90" style="display: block; margin: auto auto auto 0;" /><img src="figs/Felipe_Barros.jpg" title="fotos del equipo: Andrea Sánchez-Tapia, Sara Mortara, Felipe Sodré Barros, Guilherme Gall, Diogo Rocha, y Marinez Ferreira de Siqueira (Investigadora principal)" alt="fotos del equipo: Andrea Sánchez-Tapia, Sara Mortara, Felipe Sodré Barros, Guilherme Gall, Diogo Rocha, y Marinez Ferreira de Siqueira (Investigadora principal)" width="90" style="display: block; margin: auto auto auto 0;" /><img src="figs/gui.jpeg" title="fotos del equipo: Andrea Sánchez-Tapia, Sara Mortara, Felipe Sodré Barros, Guilherme Gall, Diogo Rocha, y Marinez Ferreira de Siqueira (Investigadora principal)" alt="fotos del equipo: Andrea Sánchez-Tapia, Sara Mortara, Felipe Sodré Barros, Guilherme Gall, Diogo Rocha, y Marinez Ferreira de Siqueira (Investigadora principal)" width="90" style="display: block; margin: auto auto auto 0;" /><img src="figs/diogo.jpeg" title="fotos del equipo: Andrea Sánchez-Tapia, Sara Mortara, Felipe Sodré Barros, Guilherme Gall, Diogo Rocha, y Marinez Ferreira de Siqueira (Investigadora principal)" alt="fotos del equipo: Andrea Sánchez-Tapia, Sara Mortara, Felipe Sodré Barros, Guilherme Gall, Diogo Rocha, y Marinez Ferreira de Siqueira (Investigadora principal)" width="90" style="display: block; margin: auto auto auto 0;" /><img src="figs/mari.jpeg" title="fotos del equipo: Andrea Sánchez-Tapia, Sara Mortara, Felipe Sodré Barros, Guilherme Gall, Diogo Rocha, y Marinez Ferreira de Siqueira (Investigadora principal)" alt="fotos del equipo: Andrea Sánchez-Tapia, Sara Mortara, Felipe Sodré Barros, Guilherme Gall, Diogo Rocha, y Marinez Ferreira de Siqueira (Investigadora principal)" width="90" style="display: block; margin: auto auto auto 0;" /> ] .right-column[ #### Núcleo de Computación Científica y Geoprocesamiento - Jardín Botánico de Río de Janeiro #### ¡liibre! Laboratorio Independiente de Informática de la Biodiversidad y Reproducibilidad en Ecología + Flujos de trabajo científicos basados en R para descarga y limpieza de datos, verificación taxonómica + Informática de la biodiversidad, MNE, ciencia abierta, reproducibilidad + Soporte a proyectos de investigación que utilizan datos sobre biodiversidad (e.g., CNCFlora - autoridad UICN para la Flora de Brasil) ] --- background-image: url("https://the-turing-way.netlify.app/_static/logo.jpg") background-position: 4% 4% background-size: 200px .right[ ### https://the-turing-way.netlify.app/welcome ] <br> <br> <br> <br> + [Investigación abierta](https://the-turing-way.netlify.app/reproducible-research/open.html): reproducible, transparente, reutilizable, colaborativa, responsable, accesible a la sociedad + [Reproducibilidad](https://the-turing-way.netlify.app/reproducible-research/reproducible-research.html): datos y código disponibles para volver a rodar los análisis --- ## modelos de nicho ecológico o de distribución potencial de especies (ENM, SDM) + __Aprendizaje estadístico__ aplicado a la preducción de áreas potencialmente adecuadas para la presencia de especies -- + Datos de ocurrencia de las especies (bases de dados de colecciones) -- + Variables predictoras ambientales (Worldclim, sensoriamiento remoto) -- + Diferentes algoritmos (GLM, SVM, Bosques aleatorios, árboles de clasificación, GBM) -- + Desempeño de modelos (partición de los datos en conjunto de entrenamiento y test + métricas de desempeño) -- + Primeras implementaciones: código oculto, uso interactivo con el ratón --- background-image: url("https://www.r-project.org/Rlogo.png") background-position: 4% 4% background-size: 200px <br> <br> <br> <br> - Lenguaje de programación en estadística -- - Software libre, código abierto, _lingua franca_ en Ecología -- - Varias opciones para ENM/SDM dentro de R -- - SIG con __raster__, __sp__, __maps__, __rgdal__, __sf__ -- - Paquetes reconocidos como __dismo__ (Hijmans et al 2017), __BIOMOD2__ (Thuiller et al 2007) -- - Paquetes recientes: **ENMeval** (Muscarella et al 2014), **sdm** (Naimi & Araujo 2016), **spThin** (Aiello-Lammens et al 2015), **zoon** (Golding et al. 2018), **wallace** (Kass et al 2018), **kuenm** (Cobos et al 2019), **occCite** (Lowens 2020) -- #### Dificultad con escalabilidad, repetición de código, documentación de decisiones... .purple[no reproducibilidad] --- background-image: url("figs/modleR.png") background-position: 4% 4% background-size: 150px <br> <br> <br> <br> <br> - https://model-r.github.io/modleR/index.html -- - Un .purple[flujo de trabajo] desarrollado para __integrar y automatizar__ algunos de los pasos comunes en el modelamiento de nichos ecológicos -- - Cuatro pasos: -- + `setup_sdmdata()`: configuración de datos, limpieza, partición, selección de pseudoausencias -- + `do_any()` and `do_many()`: ajuste, proyección y evaluación del modelo -- + `final_model()`: uniendo particiones -- + `ensemble_model()`: consenso entre algoritmos --- background-image: url("figs/modleR.png") background-position: 4% 4% background-size: 150px .right[ ## un flujo de trabajo en cuatro pasos <img src="figs/WORKFLOW.png" title="Esquema del flujo de trabajo. el primer paso limpia y particiona los datos en conjunto de entrenamiento y test, muestrea pseudoausencias y controla la correlación de las variables explicativas. En el segundo paso cada algoritmo genera un modelo por partición, con variación entre ellas debido a la diferencia en los conjuntos de entrenamiento y test. En el tercer paso final_model() junta esas particiones de diferentes maneras, generando un modelo por algoritmo. El cuarto paso analiza el consenso entre algoritmos, en el paso que denominamos 'ensemble modeling', para obtener un único modelo por especie" alt="Esquema del flujo de trabajo. el primer paso limpia y particiona los datos en conjunto de entrenamiento y test, muestrea pseudoausencias y controla la correlación de las variables explicativas. En el segundo paso cada algoritmo genera un modelo por partición, con variación entre ellas debido a la diferencia en los conjuntos de entrenamiento y test. En el tercer paso final_model() junta esas particiones de diferentes maneras, generando un modelo por algoritmo. El cuarto paso analiza el consenso entre algoritmos, en el paso que denominamos 'ensemble modeling', para obtener un único modelo por especie" width="1000" /> ] --- ## 1. `setup_sdmdata()`: preparación de datos - Limpieza de datos: datos duplicados, NA y una ocurrencia por píxel (¡No excluye la necesidad de preparar y limpiar datos previamente!) -- - Diseño experimental: *bootstrap*, validación cruzada -- - Muestreo de pseudo-ausencias -- - Control de correlación de variables hasta un valor definido por el usuarie (p. ej., 0,8) --- ## 2. `do_(m)any()`: ajuste y proyección del modelo - `do_any()` para un algoritmo y partición (ej. `algo = "maxent"`) -- - `do_many()` llama a `do_any()` para ajustar múltiples algoritmos (ej. `bioclim = TRUE`, `maxent = TRUE`) -- - Parametrización -- - Algoritmos: dismo, maxnet, GLM, SVM, bosques aleatorios, boosted regression trees (BRT) -- - Proyección a diferentes conjuntos de datos (en el tiempo o el espacio) -- - Devuelve una tabla con estadísticas de desempeño `->` TSS, AUC, pROC, FNR, Jaccard --- ## 2. `do_(m)any()`: ajuste y proyección del modelo <img src="figs/modleR/rf_cont_Abarema_langsdorffii_1_1.png" width="300" /><img src="figs/modleR/rf_cont_Abarema_langsdorffii_1_2.png" width="300" /><img src="figs/modleR/rf_cont_Abarema_langsdorffii_1_3.png" width="300" /> _Abarema langsdorffii_, tres particiones, bosques aleatorios --- ## 3. `final_model()`: un modelo por algoritmo por especie - Lo básico: una medida de tendencia central e incertidumbre entre particiones -- - ¿Qué modelos unir? (el modelo continuo sin procesar, el binario) -- - Algunas operaciones adicionales: consenso entre modelos binarios -- - Incertidumbre: rango (max-min) entre particiones --- ## 3. `final_model()`: un modelo por algoritmo por especie <img src="figs/modleR/Abarema_langsdorffii_rf_raw_mean.png" width="300" /><img src="figs/modleR/Abarema_langsdorffii_rf_bin_consensus.png" width="300" /><img src="figs/modleR/Abarema_langsdorffii_rf_raw_uncertainty.png" width="300" /> 1. Media de los modelos brutos 2. Consenso de los modelos binarios 3. Incertidumbre (rango) --- ## 4. `ensemble_model()` - consenso entre algoritmos - Media entre `final_models()` -- - Algoritmo de mejor desempeño -- - PCA entre algoritmos -- - Métricas de incertidumbre -- - Los modelos *ensemble* no necesariamente funcionan mejor que los algoritmos individuales (Zhu & Peterson 2017) -- + Evaluar el desempeño de diferentes métodos de consenso (WIP) --- class: center, middle # modleR fue escrito para implementar buenas prácticas en computación científica --- ## estructura de carpetas y portabilidad .pull-left[ - Un único directorio de trabajo por proyecto - Una estructura de subcarpetas consistente. - Diferentes pasos: diferentes subcarpetas - Rutas relativas en lugar de absolutas y no `setwd()` ] .pull-right[ <img src="figs/fig03_folder.png" width="772" /> ] --- ## modularidad - Cada paso guarda su salida -- - El siguiente paso lee la salida anterior -- - Usando espacio en disco en lugar de RAM: -- - Permite entrar y salir del flujo de trabajo en cualquier paso -- - Paralelización y uso en marcos computacionales de alto procesamiento / alto rendimiento (HPC / HTC) --- ## registro detallado de metadatos - Opciones de parametrización -- - Información de sesión -- - Paquetes utilizados y su versión -- <img src="figs/metadata.png" width="600" /> --- ## interoperabilidad No creamos nuevas clases o métodos: comunicación con otros paquetes de R <img src="figs/xkcd_standards.png" title="cómic de xkcd: título: ¿cómo proliferan los estándares? subtítulo: (ver: cargadores de corriente alternativa A/C, codificación de caracteres, mensajería instantánea, etc.) Primer cuadro: Situación: Hay 14 estándares compitiendo. Segundo cuadro: dos figuras humanas. Persona 1: '¿14? ¡Ridículo! Necesitamos desarrollar un estándar universal que cubra todos los casos de uso' Persona 2: '¡sí!'. Tercer cuadro: Pronto: Situación: Hay 15 estándares compitiendo" alt="cómic de xkcd: título: ¿cómo proliferan los estándares? subtítulo: (ver: cargadores de corriente alternativa A/C, codificación de caracteres, mensajería instantánea, etc.) Primer cuadro: Situación: Hay 14 estándares compitiendo. Segundo cuadro: dos figuras humanas. Persona 1: '¿14? ¡Ridículo! Necesitamos desarrollar un estándar universal que cubra todos los casos de uso' Persona 2: '¡sí!'. Tercer cuadro: Pronto: Situación: Hay 15 estándares compitiendo" width="719" /> --- ## reproducibilidad <img src="figs/feng.png" width="600" /> --- ## consideraciones finales - La reproducibilidad debería impulsar cualquier flujo de trabalho de MNE -- - Los __metadatos__ son realmente útiles y necesarios -- - __Escalabilidad__: un flujo adaptado para paralelización y alto desempeño -- - La __flexibilidad__ para empezar y salir en cualquier paso es fundamental para garantizar la comunicación con otros paquetes y los requerimientos de cada proyecto -- - Parte de un grupo mayor de paquetes de R en el área: esfuerzos de __integración__ --- class: middle, center # ¡Gracias! <svg style="height:0.8em;top:.04em;position:relative;" viewBox="0 0 512 512"><path d="M459.37 151.716c.325 4.548.325 9.097.325 13.645 0 138.72-105.583 298.558-298.558 298.558-59.452 0-114.68-17.219-161.137-47.106 8.447.974 16.568 1.299 25.34 1.299 49.055 0 94.213-16.568 130.274-44.832-46.132-.975-84.792-31.188-98.112-72.772 6.498.974 12.995 1.624 19.818 1.624 9.421 0 18.843-1.3 27.614-3.573-48.081-9.747-84.143-51.98-84.143-102.985v-1.299c13.969 7.797 30.214 12.67 47.431 13.319-28.264-18.843-46.781-51.005-46.781-87.391 0-19.492 5.197-37.36 14.294-52.954 51.655 63.675 129.3 105.258 216.365 109.807-1.624-7.797-2.599-15.918-2.599-24.04 0-57.828 46.782-104.934 104.934-104.934 30.213 0 57.502 12.67 76.67 33.137 23.715-4.548 46.456-13.32 66.599-25.34-7.798 24.366-24.366 44.833-46.132 57.827 21.117-2.273 41.584-8.122 60.426-16.243-14.292 20.791-32.161 39.308-52.628 54.253z"/></svg> [@SanchezTapiaA](https://twitter.com/SanchezTapiaA) <svg style="height:0.8em;top:.04em;position:relative;" viewBox="0 0 512 512"><path d="M459.37 151.716c.325 4.548.325 9.097.325 13.645 0 138.72-105.583 298.558-298.558 298.558-59.452 0-114.68-17.219-161.137-47.106 8.447.974 16.568 1.299 25.34 1.299 49.055 0 94.213-16.568 130.274-44.832-46.132-.975-84.792-31.188-98.112-72.772 6.498.974 12.995 1.624 19.818 1.624 9.421 0 18.843-1.3 27.614-3.573-48.081-9.747-84.143-51.98-84.143-102.985v-1.299c13.969 7.797 30.214 12.67 47.431 13.319-28.264-18.843-46.781-51.005-46.781-87.391 0-19.492 5.197-37.36 14.294-52.954 51.655 63.675 129.3 105.258 216.365 109.807-1.624-7.797-2.599-15.918-2.599-24.04 0-57.828 46.782-104.934 104.934-104.934 30.213 0 57.502 12.67 76.67 33.137 23.715-4.548 46.456-13.32 66.599-25.34-7.798 24.366-24.366 44.833-46.132 57.827 21.117-2.273 41.584-8.122 60.426-16.243-14.292 20.791-32.161 39.308-52.628 54.253z"/></svg> [@MortaraSara](https://twitter.com/MortaraSara) <svg style="height:0.8em;top:.04em;position:relative;" viewBox="0 0 512 512"><path d="M459.37 151.716c.325 4.548.325 9.097.325 13.645 0 138.72-105.583 298.558-298.558 298.558-59.452 0-114.68-17.219-161.137-47.106 8.447.974 16.568 1.299 25.34 1.299 49.055 0 94.213-16.568 130.274-44.832-46.132-.975-84.792-31.188-98.112-72.772 6.498.974 12.995 1.624 19.818 1.624 9.421 0 18.843-1.3 27.614-3.573-48.081-9.747-84.143-51.98-84.143-102.985v-1.299c13.969 7.797 30.214 12.67 47.431 13.319-28.264-18.843-46.781-51.005-46.781-87.391 0-19.492 5.197-37.36 14.294-52.954 51.655 63.675 129.3 105.258 216.365 109.807-1.624-7.797-2.599-15.918-2.599-24.04 0-57.828 46.782-104.934 104.934-104.934 30.213 0 57.502 12.67 76.67 33.137 23.715-4.548 46.456-13.32 66.599-25.34-7.798 24.366-24.366 44.833-46.132 57.827 21.117-2.273 41.584-8.122 60.426-16.243-14.292 20.791-32.161 39.308-52.628 54.253z"/></svg> [@FelipeSMBarros](https://twitter.com/FelipeSMBarros) <svg style="height:0.8em;top:.04em;position:relative;" viewBox="0 0 496 512"><path d="M165.9 397.4c0 2-2.3 3.6-5.2 3.6-3.3.3-5.6-1.3-5.6-3.6 0-2 2.3-3.6 5.2-3.6 3-.3 5.6 1.3 5.6 3.6zm-31.1-4.5c-.7 2 1.3 4.3 4.3 4.9 2.6 1 5.6 0 6.2-2s-1.3-4.3-4.3-5.2c-2.6-.7-5.5.3-6.2 2.3zm44.2-1.7c-2.9.7-4.9 2.6-4.6 4.9.3 2 2.9 3.3 5.9 2.6 2.9-.7 4.9-2.6 4.6-4.6-.3-1.9-3-3.2-5.9-2.9zM244.8 8C106.1 8 0 113.3 0 252c0 110.9 69.8 205.8 169.5 239.2 12.8 2.3 17.3-5.6 17.3-12.1 0-6.2-.3-40.4-.3-61.4 0 0-70 15-84.7-29.8 0 0-11.4-29.1-27.8-36.6 0 0-22.9-15.7 1.6-15.4 0 0 24.9 2 38.6 25.8 21.9 38.6 58.6 27.5 72.9 20.9 2.3-16 8.8-27.1 16-33.7-55.9-6.2-112.3-14.3-112.3-110.5 0-27.5 7.6-41.3 23.6-58.9-2.6-6.5-11.1-33.3 2.6-67.9 20.9-6.5 69 27 69 27 20-5.6 41.5-8.5 62.8-8.5s42.8 2.9 62.8 8.5c0 0 48.1-33.6 69-27 13.7 34.7 5.2 61.4 2.6 67.9 16 17.7 25.8 31.5 25.8 58.9 0 96.5-58.9 104.2-114.8 110.5 9.2 7.9 17 22.9 17 46.4 0 33.7-.3 75.4-.3 83.6 0 6.5 4.6 14.4 17.3 12.1C428.2 457.8 496 362.9 496 252 496 113.3 383.5 8 244.8 8zM97.2 352.9c-1.3 1-1 3.3.7 5.2 1.6 1.6 3.9 2.3 5.2 1 1.3-1 1-3.3-.7-5.2-1.6-1.6-3.9-2.3-5.2-1zm-10.8-8.1c-.7 1.3.3 2.9 2.3 3.9 1.6 1 3.6.7 4.3-.7.7-1.3-.3-2.9-2.3-3.9-2-.6-3.6-.3-4.3.7zm32.4 35.6c-1.6 1.3-1 4.3 1.3 6.2 2.3 2.3 5.2 2.6 6.5 1 1.3-1.3.7-4.3-1.3-6.2-2.2-2.3-5.2-2.6-6.5-1zm-11.4-14.7c-1.6 1-1.6 3.6 0 5.9 1.6 2.3 4.3 3.3 5.6 2.3 1.6-1.3 1.6-3.9 0-6.2-1.4-2.3-4-3.3-5.6-2z"/></svg> [modleR](https://model-r.github.io/modleR/index.html)