Software libre y codigo

  • Los programas libres y de código abierto permiten a las usuarias inspeccionar, modificar y mejorar su diseño mediante la disponibilidad de su código fuente

  • Código abierto es ideal para la investigación reproducible porque los scripts pueden contener todos los pasos del análisis (auto-documentación)

  • El código en general permite a los colegas ver lo que hemos hecho y volver a ejecutar o incluso modificar nuestros análisis

  • Las herramientas disponibles gratuitamente las puede usar cualquiera al contrario de las herramientas comerciales

  • El código abierto permite entender en detalle las herramietas de analisis

 

¿Porqué R?

por q R

www.traininginbangalore.com

 

Herramientas para la programación reproducible

 

Programación literaria (‘literate programming’)

  • Consiste en documentar en detalle en qué consiste el problema, cómo se resuelve, cómo y por qué se adoptó cierto flujo de análisis, cómo se optimizó (si se optimizó) y cómo se implementó en el lenguaje de programación

  • Los informes dinámicos en R facilitan el uso de programación literaria para documentar el manejo de datos y análisis estadísticos (este archivo que lee en este momento es un reporte dinámico creado en R)

  • La forma principal en que R facilita la investigación reproducible es utilizando un documento que es una combinación de contenido y código de análisis de dato

  • Hablaremos luego de reportes dinámicos como una herramienta para facilitar la programación literaria

 

Ambientes reproducibles

  • La reproducibilidad también se trata de asegurarse de que otra persona pueda reutilizar su código para obtener los mismos resultados

  • Para esto se debe proporcionar más que el código y los datos

  • Documentar y administrar las dependencias de su proyecto correctamente puede ser complicado. Sin embargo, incluso documentación simple que ayude a otros a comprender la configuración que utilizó puede tener un gran impacto.

  • Idealmente se debe documentar las versiones exactas de todos los paquetes y software que utilizó y el sistema operativo

 

Información de la sesión

La forma mas sencilla de documentar el ambiente (R + paquetes y sus versiones) con el que se hizo un análisis es usando la función sessionInfo:

## R version 4.1.1 (2021-08-10)
## Platform: x86_64-pc-linux-gnu (64-bit)
## Running under: Ubuntu 20.04.2 LTS
## 
## Matrix products: default
## BLAS:   /usr/lib/x86_64-linux-gnu/blas/libblas.so.3.9.0
## LAPACK: /usr/lib/x86_64-linux-gnu/lapack/liblapack.so.3.9.0
## 
## locale:
##  [1] LC_CTYPE=es_ES.UTF-8      
##  [2] LC_NUMERIC=C              
##  [3] LC_TIME=es_CR.UTF-8       
##  [4] LC_COLLATE=es_ES.UTF-8    
##  [5] LC_MONETARY=es_CR.UTF-8   
##  [6] LC_MESSAGES=es_ES.UTF-8   
##  [7] LC_PAPER=es_CR.UTF-8      
##  [8] LC_NAME=C                 
##  [9] LC_ADDRESS=C              
## [10] LC_TELEPHONE=C            
## [11] LC_MEASUREMENT=es_CR.UTF-8
## [12] LC_IDENTIFICATION=C       
## 
## attached base packages:
## [1] stats     graphics  grDevices utils     datasets 
## [6] methods   base     
## 
## loaded via a namespace (and not attached):
##   [1] uuid_1.1-0          workflowr_1.7.0    
##   [3] systemfonts_1.0.4   plyr_1.8.7         
##   [5] lazyeval_0.2.2      crosstalk_1.2.0    
##   [7] leaflet_2.1.1       usethis_2.1.6      
##   [9] ggplot2_3.3.6       urltools_1.7.3     
##  [11] digest_0.6.29       foreach_1.5.2      
##  [13] htmltools_0.5.3     rsconnect_0.8.26   
##  [15] fansi_1.0.3         magrittr_2.0.3     
##  [17] memoise_2.0.1       vertical_0.1.0.0000
##  [19] remotes_2.4.2       svglite_2.1.0      
##  [21] rmdformats_1.0.4    prettyunits_1.1.1  
##  [23] colorspace_2.0-3    rvest_1.0.2        
##  [25] xfun_0.31           dplyr_1.0.9        
##  [27] callr_3.7.0         crayon_1.5.1       
##  [29] jsonlite_1.8.0      zoo_1.8-10         
##  [31] iterators_1.0.14    ape_5.6-2          
##  [33] glue_1.6.2          kableExtra_1.3.4   
##  [35] gtable_0.3.0        emmeans_1.7.4-1    
##  [37] webshot_0.5.3       pkgbuild_1.3.1     
##  [39] scales_1.2.0        oai_0.3.2          
##  [41] mvtnorm_1.1-3       solrium_1.2.0      
##  [43] emo_0.0.0.9000      DBI_1.1.3          
##  [45] xaringanExtra_0.7.0 Rcpp_1.0.9         
##  [47] viridisLite_0.4.0   xtable_1.8-4       
##  [49] bold_1.2.0          rgbif_3.7.3        
##  [51] clisymbols_1.2.0    datawizard_0.4.1   
##  [53] htmlwidgets_1.5.4   httr_1.4.3         
##  [55] papaja_0.1.1        revealjs_0.9       
##  [57] RColorBrewer_1.1-3  ellipsis_0.3.2     
##  [59] pkgconfig_2.0.3     reshape_0.8.9      
##  [61] sass_0.4.1          utf8_1.2.2         
##  [63] here_1.0.1          cowsay_0.8.0       
##  [65] conditionz_0.1.0    crul_1.2.0         
##  [67] tidyselect_1.1.2    rlang_1.0.4        
##  [69] later_1.3.0         effectsize_0.7.0   
##  [71] munsell_0.5.0       tools_4.1.1        
##  [73] cachem_1.0.6        fortunes_1.5-4     
##  [75] cli_3.3.0           generics_0.1.2     
##  [77] tinylabels_0.2.3    devtools_2.4.3     
##  [79] evaluate_0.15       stringr_1.4.0      
##  [81] fastmap_1.1.0       yaml_2.3.5         
##  [83] rticles_0.24        tufte_0.12         
##  [85] processx_3.6.1      knitr_1.39         
##  [87] fs_1.5.2            purrr_0.3.4        
##  [89] ritis_1.0.0         packrat_0.8.0      
##  [91] rrtools_0.1.5       nlme_3.1-152       
##  [93] whisker_0.4         formatR_1.12       
##  [95] taxize_0.9.100      xml2_1.3.3         
##  [97] brio_1.1.3          compiler_4.1.1     
##  [99] rstudioapi_0.13     curl_4.3.2         
## [101] testthat_3.1.4      sketchy_1.0.2      
## [103] tibble_3.1.8        bslib_0.3.1        
## [105] stringi_1.7.8       highr_0.9          
## [107] ps_1.7.1            parameters_0.18.1  
## [109] desc_1.4.1          lattice_0.20-44    
## [111] vctrs_0.4.1         pillar_1.8.0       
## [113] lifecycle_1.0.1     rmsfact_0.0.3      
## [115] triebeard_0.3.0     jquerylib_0.1.4    
## [117] estimability_1.3    data.table_1.14.2  
## [119] insight_0.17.1      httpuv_1.6.5       
## [121] R6_2.5.1            bookdown_0.27      
## [123] promises_1.2.0.1    sessioninfo_1.2.2  
## [125] codetools_0.2-18    assertthat_0.2.1   
## [127] pkgload_1.2.4       rprojroot_2.0.3    
## [129] withr_2.5.0         httpcode_0.3.0     
## [131] bayestestR_0.12.1   parallel_4.1.1     
## [133] grid_4.1.1          coda_0.19-4        
## [135] rmarkdown_2.14      git2r_0.30.1       
## [137] getPass_0.2-2       lubridate_1.8.0

 

Sin embargo, esta documentación no necesariamente hace los análisis replicables ya que las versiones de los paquetes suelen actualizarse e inclusive algunos paquete pueden no estar disponibles luego de un tiempo.

 

Packrat: manejo reproducible de paquetes en R

Los paquetes de R (y sus versiones específicas) usados en un análisis pueden ser difíciles de replicar:

  • ¿Alguna vez ha tenido que usar prueba y error para averiguar qué paquetes de R necesita instalar para hacer que el código de otra persona funcione?

  • ¿Alguna vez ha actualizado un paquete para que el código de uno de sus proyectos funcione, solo para descubrir que el paquete actualizado hace que el código de otro proyecto deje de funcionar?

Con el paquete packrat los proyectos tienen varias características útiles en términos de reproducibilidad:

  • Aislamiento: la instalación de un paquete nuevo o actualizado para un proyecto no afectará a sus otros proyectos y viceversa. Eso es porque packrat le da a cada proyecto su propia biblioteca de paquetes privada.

  • Portable: mueva fácilmente sus proyectos de una computadora a otra, incluso en diferentes plataformas. packrat facilita la instalación de los paquetes en los que depende su proyecto.

  • Reproducible: packrat registra las versiones exactas del paquete de las que depende y se asegura de que esas versiones exactas sean las que se instalen dondequiera que vaya.

Usando packrat

  1. Por supuesto, primero debemos instalar el paquete packrat en R:
# instalar paquete
install.packages("packrat")

 

  1. Ahora, creemos un proyecto de R nuevo (en un directorio nuevo).

  2. Luego de crear un proyecto (o moverse a uno existente) podemos iniciar el monitoreo y manejo de paquetes con packrat así:

# iniciar packrat en proyecto
packrat::init(path = "/directorio/del/proyecto")

 

Si el directorio de trabajo esta definido como el directorio del proyecto no es necesario definir el ‘path’:

# iniciar packrat en proyecto
packrat::init()

 

Luego de esto el uso de paquetes en este proyecto sera manejado por packrat (verán algunas diferencias en lo que imprime la consola de R cuando instalen paquetes). Osea ya estamos usando packrat. Un proyecto packrat contiene algunos archivos y directorios adicionales. La función init() crea estos archivos y directorios si aún no existen:

  • packrat/packrat.lock: enumera las versiones precisas del paquete que se utilizaron para satisfacer las dependencias, incluidas las dependencias de las dependencias (¡nunca debe editarse a mano!).
  • packrat/packrat.opts: Opciones de packrat específicas del proyecto. Estos se pueden consultar y configurar con get_opts y set_opts; consulte “packrat-options” para obtener más información.
  • packrat/lib/: biblioteca de paquetes privada para este proyecto.
  • packrat/src/: paquetes fuente de todas las dependencias de las que se ha informado a packrat.
  • .Rprofile: indica a R que utilice la biblioteca de paquetes privada cuando se inicia desde el directorio del proyecto.

La única diferencia con otros proyectos es que los proyectos que usan packrat tienen su propia biblioteca de paquetes. Esta se encuentra en /directorio/del/proyecto/packrat/lib. Por ejemplo instalemos un par de paquetes nuevos, pueden ser algunos con que estén familiarizados o estos que tenemos acá como ejemplo:

install.packages("fun")

 

Cada vez que instalamos uno o mas paquetes es necesario tomar actualizar el estado del rastreo de packrat. Esto lo hacemos asi:

# revisar estado actual
packrat::status()

# actualizar packrat en proyecto
packrat::snapshot()

 

Con este paquete podemos jugar en R:

# ejemplo de un juego X irrelevante
library(fun)

if (.Platform$OS.type == "windows") x11() else x11(type = "Xlib")

mine_sweeper()

 

O tomar una prueba de Alzheimer:

# otro juego un poco menos irrelevante
x = alzheimer_test()

 

Si removemos un paquete que utilizamos en el proyecto lo podemos reinstalar usando restore():

# remover
remove.packages("fun")

# ver estado actual
packrat::status()

# restaurar
packrat::restore()

Nuevos paquetes pueden ser instalados:

# instalar
install.packages("cowsay")

# cargar
library(cowsay)

# diagrama
say("Hello world!")

# echo aleatorio
say("rms")
# echo aleatorio
say("rms")

 

 

…y deben ser “referenciados” en la misma forma:

# revisar estado actual
packrat::status()

# actualizar packrat en proyecto
packrat::snapshot()

 

En este repositorio de github hay un proyecto de R con packrat. Lo podemos clonar solo para ver como funciona sin necesidad de instalar los paquetes:

git clone https://github.com/maRce10/ejemplo_packrat_repo.git

Información de la sesión

## R version 4.1.1 (2021-08-10)
## Platform: x86_64-pc-linux-gnu (64-bit)
## Running under: Ubuntu 20.04.2 LTS
## 
## Matrix products: default
## BLAS:   /usr/lib/x86_64-linux-gnu/blas/libblas.so.3.9.0
## LAPACK: /usr/lib/x86_64-linux-gnu/lapack/liblapack.so.3.9.0
## 
## locale:
##  [1] LC_CTYPE=es_ES.UTF-8      
##  [2] LC_NUMERIC=C              
##  [3] LC_TIME=es_CR.UTF-8       
##  [4] LC_COLLATE=es_ES.UTF-8    
##  [5] LC_MONETARY=es_CR.UTF-8   
##  [6] LC_MESSAGES=es_ES.UTF-8   
##  [7] LC_PAPER=es_CR.UTF-8      
##  [8] LC_NAME=C                 
##  [9] LC_ADDRESS=C              
## [10] LC_TELEPHONE=C            
## [11] LC_MEASUREMENT=es_CR.UTF-8
## [12] LC_IDENTIFICATION=C       
## 
## attached base packages:
## [1] stats     graphics  grDevices utils     datasets 
## [6] methods   base     
## 
## other attached packages:
## [1] cowsay_0.8.0
## 
## loaded via a namespace (and not attached):
##   [1] uuid_1.1-0          workflowr_1.7.0    
##   [3] systemfonts_1.0.4   plyr_1.8.7         
##   [5] lazyeval_0.2.2      crosstalk_1.2.0    
##   [7] leaflet_2.1.1       usethis_2.1.6      
##   [9] ggplot2_3.3.6       urltools_1.7.3     
##  [11] digest_0.6.29       foreach_1.5.2      
##  [13] htmltools_0.5.3     rsconnect_0.8.26   
##  [15] fansi_1.0.3         magrittr_2.0.3     
##  [17] memoise_2.0.1       vertical_0.1.0.0000
##  [19] remotes_2.4.2       svglite_2.1.0      
##  [21] rmdformats_1.0.4    prettyunits_1.1.1  
##  [23] colorspace_2.0-3    rvest_1.0.2        
##  [25] xfun_0.31           dplyr_1.0.9        
##  [27] callr_3.7.0         crayon_1.5.1       
##  [29] jsonlite_1.8.0      zoo_1.8-10         
##  [31] iterators_1.0.14    ape_5.6-2          
##  [33] glue_1.6.2          kableExtra_1.3.4   
##  [35] gtable_0.3.0        emmeans_1.7.4-1    
##  [37] webshot_0.5.3       pkgbuild_1.3.1     
##  [39] scales_1.2.0        oai_0.3.2          
##  [41] mvtnorm_1.1-3       solrium_1.2.0      
##  [43] emo_0.0.0.9000      DBI_1.1.3          
##  [45] xaringanExtra_0.7.0 Rcpp_1.0.9         
##  [47] viridisLite_0.4.0   xtable_1.8-4       
##  [49] bold_1.2.0          rgbif_3.7.3        
##  [51] clisymbols_1.2.0    datawizard_0.4.1   
##  [53] htmlwidgets_1.5.4   httr_1.4.3         
##  [55] papaja_0.1.1        revealjs_0.9       
##  [57] RColorBrewer_1.1-3  ellipsis_0.3.2     
##  [59] pkgconfig_2.0.3     reshape_0.8.9      
##  [61] sass_0.4.1          utf8_1.2.2         
##  [63] here_1.0.1          conditionz_0.1.0   
##  [65] crul_1.2.0          tidyselect_1.1.2   
##  [67] rlang_1.0.4         later_1.3.0        
##  [69] effectsize_0.7.0    munsell_0.5.0      
##  [71] tools_4.1.1         cachem_1.0.6       
##  [73] fortunes_1.5-4      cli_3.3.0          
##  [75] generics_0.1.2      tinylabels_0.2.3   
##  [77] devtools_2.4.3      evaluate_0.15      
##  [79] stringr_1.4.0       fastmap_1.1.0      
##  [81] yaml_2.3.5          rticles_0.24       
##  [83] tufte_0.12          processx_3.6.1     
##  [85] knitr_1.39          fs_1.5.2           
##  [87] purrr_0.3.4         ritis_1.0.0        
##  [89] packrat_0.8.0       rrtools_0.1.5      
##  [91] nlme_3.1-152        whisker_0.4        
##  [93] formatR_1.12        taxize_0.9.100     
##  [95] xml2_1.3.3          brio_1.1.3         
##  [97] compiler_4.1.1      rstudioapi_0.13    
##  [99] curl_4.3.2          testthat_3.1.4     
## [101] sketchy_1.0.2       tibble_3.1.8       
## [103] bslib_0.3.1         stringi_1.7.8      
## [105] highr_0.9           ps_1.7.1           
## [107] parameters_0.18.1   desc_1.4.1         
## [109] lattice_0.20-44     vctrs_0.4.1        
## [111] pillar_1.8.0        lifecycle_1.0.1    
## [113] rmsfact_0.0.3       triebeard_0.3.0    
## [115] jquerylib_0.1.4     estimability_1.3   
## [117] data.table_1.14.2   insight_0.17.1     
## [119] httpuv_1.6.5        R6_2.5.1           
## [121] bookdown_0.27       promises_1.2.0.1   
## [123] sessioninfo_1.2.2   codetools_0.2-18   
## [125] assertthat_0.2.1    pkgload_1.2.4      
## [127] rprojroot_2.0.3     withr_2.5.0        
## [129] httpcode_0.3.0      bayestestR_0.12.1  
## [131] parallel_4.1.1      grid_4.1.1         
## [133] coda_0.19-4         rmarkdown_2.14     
## [135] git2r_0.30.1        getPass_0.2-2      
## [137] lubridate_1.8.0