Mostrar el código
# install.packages("usethis")
usethis::use_git_config(
user.name = "Tu Nombre",
user.email = "tu_email@ugr.es"
)La investigación reproducible es el principio según el cual cualquier análisis cuantitativo —y, por extensión, cualquier resultado publicado— debe poder ser replicado por terceros a partir de los datos, el código y la documentación originales. En bioestadística, donde las decisiones clínicas pueden depender de un único valor p o de un único intervalo de confianza, la reproducibilidad no es un lujo sino una exigencia ética.
Este apéndice introduce las tres herramientas mínimas que todo investigador en ciencias de la salud debería dominar para producir análisis reproducibles: Git (control de versiones), GitHub (plataforma de colaboración basada en Git) y RStudio (entorno de desarrollo integrado para R que incorpora un cliente Git).
Múltiples estudios desde 2005 (Ioannidis, PLoS Medicine) han documentado que una fracción sustancial de los hallazgos publicados en biomedicina no logra replicarse cuando se repite el análisis con los datos originales o se realiza un estudio independiente. Esta crisis de replicabilidad ha motivado iniciativas internacionales (ICMJE, NIH, COS) que hoy exigen compartir datos y código como condición para publicar.
Siguiendo la taxonomía de Goodman, Fanelli & Ioannidis (2016):
| Nivel | Significado | Requiere |
|---|---|---|
| Reproducibilidad de métodos | Otra persona obtiene los mismos resultados a partir de los datos y el código originales | Código + datos + entorno computacional |
| Reproducibilidad de resultados | Otro investigador, con datos nuevos, obtiene conclusiones consistentes | Diseño claro + protocolo público |
| Reproducibilidad inferencial | El conocimiento extraído del estudio se confirma en revisiones sistemáticas y meta-análisis | Reporting estandarizado (CONSORT, STROBE…) |
Los datos y el código de un estudio reproducible deben ser FAIR: Findable (con identificador persistente, p. ej. DOI), Accessible (depositados en un repositorio público), Interoperable (formatos abiertos como CSV, parquet) y Reusable (con licencia explícita y documentación).
renv, conda).Este apéndice cubre los dos primeros, integrados en RStudio. La gestión de entornos se introduce brevemente en la sección D.5.
Git es un sistema distribuido de control de versiones: registra el historial completo de cambios en un conjunto de archivos (un repositorio) y permite recuperar cualquier estado anterior, comparar versiones, y trabajar en paralelo en líneas alternativas (ramas) que después se fusionan.
| Concepto | Significado |
|---|---|
| Repositorio | Carpeta del proyecto bajo control de versiones (.git/ oculto en su raíz) |
| Commit | Instantánea (snapshot) del estado del proyecto en un momento dado, con un mensaje descriptivo |
| Branch (rama) | Línea de desarrollo paralela; main es la rama principal |
| Merge | Fusión de los cambios de una rama en otra |
| HEAD | Puntero al commit actualmente activo |
Remoto (origin) |
Copia del repositorio alojada en un servidor (típicamente GitHub) |
.gitignore |
Archivo que lista patrones que Git debe ignorar (datos crudos, caches, credenciales) |
xcode-select --install (Command Line Tools).sudo apt install git.Verificación:
git --version
# git version 2.42.0 (o superior)git config --global user.name "Tu Nombre"
git config --global user.email "tu_email@ugr.es"
git config --global init.defaultBranch mainEquivalente desde R (recomendado para los lectores de este libro):
# install.packages("usethis")
usethis::use_git_config(
user.name = "Tu Nombre",
user.email = "tu_email@ugr.es"
)git init # Crea un nuevo repositorio en la carpeta actual
git status # Muestra archivos modificados/nuevos
git add archivo.qmd # Marca el archivo para incluirlo en el próximo commit
git add . # Marca TODOS los archivos modificados (cuidado con datos sensibles)
git commit -m "Mensaje claro" # Crea un commit con los cambios marcados
git log --oneline # Historial resumido de commits
git diff archivo.qmd # Muestra los cambios sin hacer commit
git checkout -- archivo.qmd # Descarta los cambios no comprometidosgit diff; el mensaje debe responder a por qué se hizo el cambio.Ejemplos:
Corrige criterio de inclusión: edad >= 18Añade IC bootstrap al modelo de mortalidadcambios (vago)WIP (uso interno aceptable, pero no en main)Las ramas permiten experimentar sin tocar la versión “buena” del análisis:
git switch -c sensibilidad # Crea y cambia a la rama 'sensibilidad'
# … trabajo, commits …
git switch main # Vuelve a la rama principal
git merge sensibilidad # Fusiona los cambios de 'sensibilidad' en main
git branch -d sensibilidad # Elimina la rama una vez fusionadaEn proyectos colaborativos, las ramas se asocian habitualmente con pull requests en GitHub (ver D.3).
GitHub (https://github.com) es un servicio en la nube que aloja repositorios Git, añadiendo funcionalidades de colaboración:
v1.0, v2.0-beta…) con notas y artefactos descargables.tfg-osteoporosis), elegir entre Public o Private, y crear sin README inicial si va a conectar un repositorio local ya existente.GitHub no permite contraseñas en línea de comandos desde 2021. Dos opciones modernas:
# install.packages(c("gitcreds", "usethis"))
usethis::create_github_token() # Abre la página de GitHub con permisos preseleccionados
gitcreds::gitcreds_set() # Guarda el token de forma segura en el llavero del sistemassh-keygen -t ed25519 -C "tu_email@ugr.es", copiar la clave pública (~/.ssh/id_ed25519.pub) y añadirla en GitHub → Settings → SSH and GPG keys.# Una vez creado el repositorio vacío en GitHub:
git remote add origin git@github.com:tu_usuario/tfg-osteoporosis.git
git branch -M main
git push -u origin main # 'origin' es el remoto, 'main' la ramaA partir de aquí:
git pull # Trae los cambios del remoto
git push # Sube tus commits al remotoEl flujo típico para un cambio sustancial es:
git switch -c modelo-logistico.git push -u origin modelo-logistico.main.Este flujo, equivalente a la revisión por pares de un artículo científico, mejora la calidad del código y deja registrado el porqué de cada decisión.
RStudio incluye un panel Git que cubre el 90 % de las operaciones cotidianas sin abrir la terminal. Esto facilita enormemente la adopción de Git para usuarios de R que no se sienten cómodos en línea de comandos.
.gitignore razonable (.Rproj.user/, .Rhistory, .RData).Para un proyecto RStudio sin Git:
# install.packages("usethis")
usethis::use_git() # Inicializa Git y hace el primer commit
usethis::use_github() # Crea el repositorio en GitHub y lo conecta (requiere PAT)| Acción en el panel | Equivalente en línea de comandos |
|---|---|
| Marcar la casilla del archivo (staged) | git add archivo |
| Botón Commit + mensaje | git commit -m "…" |
| Botón Push (flecha verde arriba) | git push |
| Botón Pull (flecha azul abajo) | git pull |
| Botón History (reloj) | git log (con interfaz gráfica) |
| Botón Diff | git diff (visualización lado a lado) |
.R, .qmd, etc.).Repetir varias veces al día: un commit, una idea.
El botón Diff en RStudio muestra los cambios línea a línea con colores (rojo = eliminado, verde = añadido). Cuando dos personas modifican la misma línea de un archivo, Git señala un conflicto que se resuelve manualmente editando los marcadores <<<<<<<, ======= y >>>>>>> antes de hacer commit.
mi-estudio/
├── README.md # Propósito, autor, citación
├── LICENSE # CC-BY, MIT, GPL…
├── .gitignore # Archivos a ignorar
├── mi-estudio.Rproj # Proyecto RStudio
├── data/
│ ├── raw/ # Datos originales (a menudo gitignored si son sensibles)
│ └── processed/ # Datos derivados, reproducibles desde el script
├── R/ # Funciones reutilizables
├── analysis/ # Cuadernos Quarto/Rmd con los análisis
├── results/ # Tablas, figuras, modelos serializados (.rds)
├── manuscript/ # Manuscrito en Quarto o LaTeX
└── renv.lock # Snapshot de las versiones de los paquetes (opcional)
.gitignore típico para un proyecto en R# Artefactos de R
.Rhistory
.RData
.Ruserdata
.Rproj.user/
# Salida de Quarto / RMarkdown
*_files/
*_cache/
/_book/
/_site/
# Sistema operativo
.DS_Store
Thumbs.db
# Datos sensibles (¡nunca commitar PII!)
data/raw/*.csv
data/raw/*.xlsx
Jamás se debe subir a GitHub información identificable de pacientes (PII): nombres, DNI, fechas de nacimiento, códigos de historia clínica, dirección, etc. Aunque elimine el archivo en un commit posterior, permanece en el historial. Si por accidente sube datos sensibles, debe utilizar herramientas como git filter-repo o BFG Repo-Cleaner y rotar inmediatamente cualquier credencial expuesta. Para datos clínicos, la recomendación es trabajar con datos anonimizados o seudonimizados desde el primer commit.
renvPara garantizar que el análisis se ejecuta dentro de cinco años con las mismas versiones de los paquetes:
# install.packages("renv")
renv::init() # Crea un entorno local + renv.lock
renv::snapshot() # Actualiza renv.lock con las versiones actuales
renv::restore() # Reinstala exactamente las versiones del lockfileConviene comprometer (git commit) el archivo renv.lock.
Este libro mismo está alojado en GitHub Pages. El flujo es:
_quarto.yml: project: type: book con output-dir: docs.quarto render (se genera la carpeta docs/).git add docs/ && git commit -m "Publica versión X" && git push.https://tu_usuario.github.io/nombre-repo/ queda activa.Para automatizar la renderización en cada push se utiliza GitHub Actions (ver el archivo .github/workflows/publish.yml del repositorio de este libro como ejemplo).
Crear un repositorio público con un análisis del dataset osteo que se publique automáticamente como página web.
1. Crear cuenta y proyecto:
2. Configurar Git e instalar BioEstatR:
usethis::use_git_config(user.name = "Tu Nombre", user.email = "tu@ugr.es")
remotes::install_github("migariane/BioEstatR")3. Crear un análisis con Quarto:
Archivo analisis.qmd (contenido sugerido):
---
title: "Análisis exploratorio del dataset osteo"
author: "Tu Nombre"
date: today
format: html
---
```{r}
library(BioEstatR)
data(osteo)
freq(osteo$tabaco)
grps(osteo$imc, osteo$sexo)
tabla2x2(fvar = osteo$tabaco, cvar = osteo$osteo_cue, o = osteo)
rls(hba1c ~ tevol, data = osteo)
**4. Renderizar localmente:** `quarto render analisis.qmd` produce `analisis.html`.
**5. Primer commit:**
```bash
git add .
git commit -m "Primer análisis exploratorio del dataset osteo"
6. Crear el repositorio en GitHub y conectarlo:
usethis::use_github(private = FALSE)7. Activar GitHub Pages en Settings → Pages → main / docs (o /root si el HTML está en la raíz).
8. Verificar: abrir https://tu_usuario.github.io/nombre-repo/ y comprobar que el análisis es accesible públicamente.
analisis.qmd y el commit inicial.README.md que describe el propósito del repositorio y cita el paquete BioEstatR..gitignore excluye *_files/, .Rhistory, .Rproj.user/.git clone …) y reproducir el análisis ejecutando quarto render analisis.qmd tras remotes::install_github("migariane/BioEstatR").Libros y guías (gratuitos y en abierto):
Artículos clave sobre reproducibilidad en biomedicina:
Iniciativas y manifiestos:
La reproducibilidad no es un destino sino un hábito. Cada commit es un compromiso con la transparencia, y cada repositorio público es una contribución al conocimiento compartido.