Reproducibilidad

XII Congreso Colombiano de Botánica

Álex Espinosa Correa

Universidad de Antioquia

Proposito

  • Enseñar el flujo de trabajo orientados a proyectos

Niveles de reproducibilidad en R

Niveles de reproducibilidad. Higgins (2024)

Actividad

  • Abrir script_super-analisis.r que se encuentra en la carpeta reproducibilidad
  • Ejecutar el script



05:00

Advertencia

Si la primera línea de tu script R es

setwd("C:\Users\jenny\ruta\que\solo\yo\tengo")

Iré a tu oficina y LE PRENDERÉ FUEGO A TU ORDENADOR 🔥

Jenny Bryan

Dos problemas

setwd()

setwd() establece el directorio de trabajo.

setwd("/Users/alex/github/r/etnobotanica-workshop")

La probabilidad de que setwd() tenga el efecto deseado (hacer que las rutas de los archivos funcionen) para alguien que no sea su autor es del 0%. También es poco probable que funcione para el autor dentro de uno o dos años u ordenadores.

Las rutas fijas y absolutas, especialmente cuando están esparcidas por todo el código, hacen que un proyecto sea frágil. Este tipo de código no viaja bien a través del tiempo o del espacio.

rm(list = ls())

rm(list = ls()) elimina «todos» los objetos del entorno de trabajo actual.

Pensada para reiniciar las cosas, ya sea para reiniciar el análisis actual o para cambiar de un proyecto a otro. Pero hay mejores maneras de hacer ambas cosas: reiniciar R y Usar un IDE con soporte adecuado para proyectos.

Dada la intención, no va lo suficientemente lejos. Todo lo que hace es borrar objetos creados por el usuario del espacio de trabajo. Muchos otros cambios persisten de forma invisible y pueden tener profundos efectos posteriormente.

Entorno de desarrollo integrado (IDE)

Aplicación que proporciona servicios integrales para facilitar el desarrollo de software.

Ventajas:

  • Resaltado de sintaxis
  • Autocompletado de texto
  • Manejo de librerías
  • Construir, compilar o ejecutar
  • y mucho más…

IDEs populares:

  • Emacs
  • RStudio
  • vim
  • VS Code

Siempre empezar R desde cero

Siempre es recomendable trabajar en un espacio de trabajo desde cero, sin guardar o cargar cada vez. En RStudio se puede puede hacer de esta forma.

Siempre es recomendable reiniciar R de vez en cuando. En RStudio se puede hacer en Session > Restar R. Atajo de teclado: Ctrl-Shift-F10

Para desactivar .Rdata ir a Tools > Global Options.

Flujo de trabajo orienta a proyectos1

Enfoque de organización que estructura todo el trabajo, código, datos y resultados relacionados con un proyecto en una única carpeta o estructura de carpetas organizada. Esta metodología facilita el manejo y la reproducibilidad de proyectos, especialmente en ciencia de datos, programación y análisis.

Características

  • Estructura organizada de carpetas
  • Separación de código y datos
  • Control de versiones
  • Scripts y documentación reproducibles
  • Portabilidad

Ventajas

  • Reproducibilidad
  • Colaboración
  • Escalabilidad

Proyectos

Gestionar tus proyectos de forma reproducible no sólo hace que tu ciencia reproducible, sino que te facilita la vida. @vsbuffalo

  • Un proyecto es una carpeta que contiene todos los archivos relevantes para un trabajo en particular.

  • Los proyectos permiten que las investigaciones sean reproducibles, portátiles y autocontenibles.

  • Trabajar con proyectos implica tener:

    • Disciplina en el sistema de archivos: todos los archivos relacionados a un proyecto (datos, imágenes, resultados, scripts, etc) están en la carpeta del proyecto.
    • Intencionalidad en el directorio de trabajo: siempre se trabaja en el directorio del proyecto.
    • Disciplina en las rutas de archivos: todas las rutas son relativas (nunca absolutas) y relativas a la carpeta del proyecto.

Proyectos de RStudio

Los proyectos de RStudio facilitan la división del trabajo en varios contextos, con su propio directorio y espacio de trabajo, historial y documentos.

Hay varias formas de crear un proyecto. La más sencilla es File > New Project. Imagen: Wickham et al. (2023)

La barra de herramientas de proyectos se encuentra en la esquina superior derecha de RStudio. Muestra el nombre del proyecto actual, y tiene comandos para:

Opciones de la barra de herramientas de proyectos de RStudio.

Actividad

  • Crear dentro de Documentos un nuevo proyecto de RStudio



02:00

Rutas

Rutas absolutas

Indican la ubicación de un archivo o directorio desde el directorio raíz del sistema de archivos. Dificulta la reproducibilidad ya que esa ruta sólo «funciona» en el equipo donde se haya creado.

/usuarios/yo/documentos/r/proyecto/scripts/super-analisis.R


Rutas relativas

Indican la ubicación de un archivo o directorio a partir de la posición actual del sistema operativo en el sistema de archivos.

scripts/super-analisis.R

Here: encuentra tu camino. Ilustración de Allison Horst.

You are here::here()

El objetivo del paquete here es facilitar la referenciación de archivos en flujos de trabajo orientados a proyectos1. here utiliza el directorio de nivel superior de un proyecto para construir fácilmente rutas a archivos.


Ruta absoluta:

readr::read_csv("/Users/alex/documento/r/etnobotanica-workshop/data/raw_data.csv")


Ruta relativa

readr::read_csv("data/raw_data.csv")


Ruta relativa usando here

readr::read_csv(here::here("data", "raw_data.csv")) # opción 1
readr::read_csv(here::here("data/raw_data.csv")) # opción 2

Actividad

  • Copiar dentro del proyecto que creo todos los archivos de la carpeta ejercicio, que se encuentra en la carpeta reproducibilidad
  • Abrir 01_script_rutas.R que se encuentra en la carpeta scripts
  • Realizar los ejercicio



10:00

El nombre de las cosas

No

myabstract.docx
Joe’s Filenames Use Spaces and Punctuation.xlsx
figure 1.png
fig 2.png
JW7d^(2sl@deletethisandyourcareerisoverWx2*.txt


2014-06-08_abstract-for-sla.docx
joes-filenames-are-getting-better.xlsx
fig01_scatterplot-talk-length-vs-interest.png
fig02_histogram-talk-attendance.png
1986-01-28_raw-data-from-challenger-o-rings.txt

Principios para los nombres (de los archivos)

  1. Legible por máquinas

    • Expresiónes regulares (regex) y globbing1 amigable
      • Evitar espacios, puntuación, caracteres acentuados y distinción entre mayúsculas y minúsculas
    • Fácil de computar
      • Uso deliberado de delimitadores: “_” para delimitar unidades de metadatos y “-” para delimitar palabras
  2. Legible por humanos

    • El nombre contiene información sobre el contenido

    • Relacionado al concepto de URL semántica2

  3. Funciona bien con el orden predeterminado (alfanúmerico)

    • Poner algo numérico primero

    • Utilice ceros a la izquierda de otros números

    • Utilice la norma ISO 8601 para fechas: YYYY-MM-DD

Ejemplos

Orden lógico

01_marshal-data.R
02_pre-dea-filtering.R
03_dea-with-Limma-voom.R
04_explore-dea-results.R
90_Limma-model-term-name-fiasco.R
helper01_load-counts.R
helper02_load-exp-des.R
helper03_load-focus-statinf.R
helper04_extract-and-tidy.R

Orden crónologico

2015-11-09_package-installation.R
2016-05-21_package-installation.R
2017-09-05_package-installation.R
2018-06-29_package-installation.R
2019-02-19_repair-default-library.R
2020-06-06_record-existing-pkgs.R
2021-06-15_git-config-analysis.R
2021-08-29-git-default-branch.R
2022-08-11_record-existing-pkgs.R


Ejemplo más complejo

2013-06-26_BRAFWTNEGASSAY_Plasmid-Cellline-100-1MutantFraction_HO1.csv
2013-06-26_BRAFWTNEGASSAY_Plasmid-Cellline-100-1MutantFraction_HO2.csv
2013-06-26_BRAFWTNEGASSAY_Plasmid-Cellline-100-1MutantFraction_plateflle.csv
2014-02-26_BRAFWTNEGASSAY_FFPEDNA-CRC-1-41_A01.csv
2014-02-26_BRAFWTNEGASSAY_FFPEDNA-CRC-1-41_A02.csv

Formatos de los nombres

  • flatcase
  • SCREAMINGCASE
  • camelCase
  • PascalCase
  • snake_case
  • SCREAMING_SNAKE_CASE
  • camel_Snake_Case
  • Pascal_Snake_Case
  • kebab-case
  • SCREAMING-KEBAB-CASE
  • camel-Kebad-Case
  • Pascal-Kebad-Case

R no acepta todos los formatos listados. Formatos sugeridos: camelCase, flatcase, PascalCase, period.case, snake_case.

«Lo lamento, pero hizo que el emperador perdiera el estilo»

Un buen estilo de codificación es como una correcta puntuación: se puede prescindir de él, perofacilitalalectura. Todas las guías de estilo se basan fundamentalmente en opiniones. Algunas decisiones realmente facilitan el uso del código, pero muchas decisiones son arbitrarias. Lo más importante de una guía de estilo es que proporciona coherencia, lo que facilita la escritura del código porque hay que tomar menos decisiones.

Guías de estilo

Dos paquetes de R soportan la Guía de estilo del Tidyverse: styler y lintr.

Styler añade un complemento de RStudio que facilita aplicar el estilo.

Actividad



15:00

Estructura de un proyecto

No hay una estructura estándar para organizar un proyecto. Lo principal es que sea «organizado» y entendible por uno mismo y por otros.

La estructura de las carpetas y los nombres de los archivos deben ser:

  • Autodocumentados:
    • Los datos en la carpeta datos
    • Los scripts en la carpeta scripts
  • Fáciles de codificar. Ejemplo:
    • medellin_temperatura-minima.csv
    • medellin_temperatura-maxina.csv
  • Todos los archivos necesarios para

Hay varios paquetes que facilitan algunas de estas tareas: usethis, rrtools.

Ejemplo de estructura de un proyecto

proyecto/
├── proyecto.Rproject  # proyecto de RStudio
├── README.md          # útil para describir el proyecto
├── code/
│   ├── functions
│   └── scripts
├── data/
│   ├── raw_data/      # los datos sin procesar
│   │   ├── muestreo.xlsx
│   ├── derived_data/  # los datos procesados
│       └── datos.csv
├── images/
├── output/
│   ├── report.pdf     # el archivo exportado
├── report/
│   ├── apa.csl        # el estilo de citas y referencias
│   ├── references.bib # la información de las referencias
│   └── report.qmd
├── tables/
└── templates/

Quarto

No se trata solo de obtener resultados reproducibles; los informes o manuscritos también deben serlo. Quarto es un sistema de publicación científica y técnica de código abierto. Puede entrelazar texto y código para producir resultados con un formato elegante en forma de documentos, páginas web, blogs, libros y mucho más. Los archivos de Quarto (.qmd) son archivos de texto plano conformado por:

Metadata (YAML)

format: html
engine: knitr
format: html
engine: jupyter

Código

```{r}
library(dplyr)
mtcars |> 
  group_by(cyl) |> 
  summarize(mean = mean(mpg))
```
```{python}
from siuba import *
(mtcars
  >> group_by(_.cyl)
  >> summarize(avg_mpg = _.mpg.mean()))
```

Texto

# Título 1
Esta es una frase con algo de **texto en negrita**, *texto en cursiva* y una 
![Descripción de la imagen](imagen.png){fig-alt=«Alt text para la imagen»}.

Rutas en Quarto

Al usar un documento de Quarto dentro de un proyecto, es importante ser consciente de la ubicación de los archivos utilizados; por eso, las rutas relativas son fundamentales. Por diseño, el directorio de trabajo para renderizar archivos de Quarto es el directorio del propio archivo, que no siempre es la raíz del proyecto (.Rproj).

Tenemos el siguiente proyecto. Queremos mostrar data.csv en index.qmd

proyecto/
├── proyecto.Rproject # proyecto de RStudio
├── code/
│   └── index.qmd     # arhcivo de Quarto
└── data/
    └── data.csv/     # los datos

Ruta relativa

read.csv(
  "../data.csv"
)

# los .. significa «una carpeta 
# arriba de donde yo esté»

Ruta relativa con here

read.csv(
  here::here(
    "data",
    "data.csv"
  )
)

Actividad

  • Abrir 02_quarto_directorio-trabajo.qmd que se encuentra en la carpeta scripts
  • Leer las instrucciones y realizar la actividad
  • Abrir 03_quarto_rutas.qmd que se encuentra en la carpeta scripts
  • Leer las instrucciones y realizar la actividad



10:00

Flujo de trabajo

Procesos y código

Procesos y objetos

Una API humana para el análisis

Siempre que se pueda, se ha de apostar por formatos abiertos: CSV, JPEG, HTML, ODS, ODT, PDF, PNG, SVG, TSV, TXT. Imagen Bryan et al. (2024).

Control de versiones

Un control de versiones es un sistema que registra los cambios realizados en un archivo o conjunto de archivos a lo largo del tiempo, de modo que puedas recuperar versiones específicas más adelante. […] en realidad puedes hacer lo mismo con casi cualquier tipo de archivo que encuentres en una computadora. Chacon (2014)

Un método básico y rudimentario del control de versiones es tener copias de un mismo archivo.

2015-11-09_package-installation.R
2016-05-21_package-installation.R
2017-09-05_package-installation.R
2018-06-29_package-installation.R

Se comienza con una versión básica y se van guardando sólo los cambios. Gonzalez et al. (2019).

Una revisión «normal» de un documento. PHD Comics.

Git y GitHub

Git es un sistema de control de versiones. Git gestiona la evolución de un conjunto de archivos -llamado repositorio- de una forma sana y muy estructurada. En un flujo de trabajo basado en Git, documentas y, opcionalmente, expones tu trabajo a medida que avanzas. La comunicación y la colaboración son las aplicaciones estrella del control de versiones. Bryan (2018).

Logo de Git.

GitHub es el mayor proveedor de alojamiento de repositorios Git, y es el punto de encuentro para que millones de desarrolladores colaboren en el desarrollo de sus proyectos. Un gran porcentaje de los repositorios Git se almacenan en GitHub, y muchos proyectos de código abierto lo utilizan para hospedar su Git, realizar su seguimiento de fallos, hacer revisiones de código y otras cosas. Chacon (2014).

El invertocat logo de Github. La silueta es The Octocat, la mascota de GitHub.

Entornos reproducibles

Un entorno (environment) consiste en todas las dependencias necesarias para que el código se ejecute correctamente. Esto incluye el propio R, los paquetes de R y las dependencias del sistema. Puede ser difícil gestionar entornos reproducibles:

  • El código que solía ejecutarse ya no se ejecuta, a pesar de que el código no ha cambiado.
  • Tener miedo de actualizar o instalar un nuevo paquete, ya que podría romper su código o el de otra persona.
  • Escribir install.packages() en tu entorno no hace nada, o no hace lo correcto.

package managers
package managers












language manager
language manager...







language
version
language...


environment
manager
environment...
your
project
your...
Text is not SVG - cannot display

«El proyecto cebolla»: apostar por el flujo de trabajo orientado a proyectos significa adoptar herramientas que permitan gestionar mediante programación cada una de las capas de la configuración del proyecto. Bryan et al. (2024)

Estos retos pueden abordarse mediante una cuidadosa combinación de herramientas y estrategias. Acá sólo abordamos: la actualización segura de paquetes y la colaboración en equipo. Quedando por fuera el manejo de varias versiones de R y las dependencias del sistema, para lo cual es recomendable investigar sobre rig y Docker.

renv

renv ayuda a crear entornos reproducibles para sus proyectos de R, haciendo los proyectos:

  • Aislados: la instalación de un paquete nuevo o actualizado para un proyecto no romperá sus otros proyectos, y viceversa. renv proporciona a cada proyecto su propia biblioteca privada.
  • Portátil: transporte fácilmente sus proyectos de un ordenador a otro, incluso a través de diferentes plataformas. renv facilita la instalación de los paquetes de los que depende su proyecto.
  • Reproducible: renv registra las versiones exactas de los paquetes de los que depende, y asegura que esas versiones exactas son las que se instalan allá donde vaya.

Los verbos y sustantivos más importantes de renv.

Pausa



10:00

Referencias

Bryan, J. (2015). How to name files. https://speakerdeck.com/jennybc/how-to-name-files
Bryan, J. (2017). Project-oriented workflow. https://www.tidyverse.org/blog/2017/12/workflow-vs-script/
Bryan, J. (2018). Excuse me, do you have a moment to talk about version control? The American Statistician, 72(1), 20-27. https://doi.org/10.1080/00031305.2017.1399928
Bryan, J., Hester, J., Pileggi, S., & Aja, E. D. (2024). What they forgot to teach you about R: the stuff you need to know about R, besides data analysis. https://rstats.wtf/
Campitelli, E., & Corrales, P. (2024). An R reproducibility toolkit for the practical researcher. https://reproducibility.rocks/
Chacon, S. (2014). Pro Git (2.ª ed.). Apress. https://git-scm.com/book/en/v2
Gonzalez, I., Huang, D., Hejazi, N., Koziar, K., & Munk, M. (2019). Version Control with Git: Summary and Setup. https://swcarpentry.github.io/git-novice/index.html
Higgins, P. D. R. (2024). Reproducible medical research with r. https://bookdown.org/pdr_higgins/rmrwr/
Lopp, S. (2019). Reproducible Environments. https://rviews.rstudio.com/2019/04/22/reproducible-environments/
Posit Software. (2022). RStudio User Guide - renv. https://docs.posit.co/ide/user/ide/guide/environments/r/renv.html
Posit Software. (2024). Reproducible Environments. https://solutions.posit.co/envs-pkgs/environments/
Slingsby, J. (2024). A minimal introduction to reproducible research. https://www.ecologi.st/data-management/
Wickham, H., Çetinkaya-Rundel, M., & Grolemund, G. (2023). R for data science: import, tidy, transform, visualize, and model data (2.ª ed.). O’Reilly. https://r4ds.hadley.nz