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
www.traininginbangalore.com
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
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
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.
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.
packrat
en R:
Ahora, creemos un proyecto de R nuevo (en un directorio nuevo).
Luego de crear un proyecto (o moverse a uno existente) podemos
iniciar el monitoreo y manejo de paquetes con packrat
así:
Si el directorio de trabajo esta definido como el directorio del proyecto no es necesario definir el ‘path’:
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
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.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:
Cada vez que instalamos uno o mas paquetes es necesario tomar
actualizar el estado del rastreo de packrat
. Esto lo
hacemos asi:
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:
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")
…y deben ser “referenciados” en la misma forma:
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:
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