Tutorial
L'Ecuyer-CMRG
Cuando un análisis se ejecuta en paralelo, cada núcleo puede generar secuencias aleatorias distintas
en cada ejecución, lo que rompe la reproducibilidad. Este tutorial permite resolverlo usando
el generador L'Ecuyer-CMRG junto con el paquete parallel en R:
sin dependencias externas y con un protocolo de cuatro pasos que garantiza resultados idénticos
en cualquier máquina y en cualquier momento.
Descripción
El protocolo está pensado para estudios de salud pública, biomedicina y ciencia de datos en los que
se ejecutan simulaciones o análisis paralelos. El objetivo es evitar que cada hilo o nodo genere
secuencias aleatorias distintas entre ejecuciones.
El esquema se basa en L'Ecuyer-CMRG, integrado en el paquete parallel de R base,
sin dependencias externas.
Requisitos previos
- R instalado en una versión reciente.
- Paquete parallel disponible en R base.
- Alguna librería de visualización si quieres graficar resultados, por ejemplo ggplot2.
- Un número de núcleos suficiente para dejar recursos libres al sistema operativo.
Protocolo de implementación
- Cargar parallel y fijar el motor de RNG con RNGkind("L'Ecuyer-CMRG").
- Sembrar el entorno principal con set.seed().
- Crear el clúster con makeCluster() dejando al menos un núcleo libre.
- Sincronizar las semillas en cada nodo con clusterSetRNGStream().
- Ejecutar el cálculo en paralelo con parLapply().
- Detener siempre el clúster con stopCluster().
Código de ejemplo
Este bloque resume el flujo estándar que aparece en el material original del repositorio.
library(parallel)
library(ggplot2)
RNGkind("L'Ecuyer-CMRG")
set.seed(123)
num_cores <- detectCores() - 1
cl <- makeCluster(num_cores)
clusterSetRNGStream(cl, iseed = 123)
resultados <- parLapply(cl, 1:1000, function(x) mean(rnorm(100)))
stopCluster(cl)
datos <- data.frame(medias = unlist(resultados))
ggplot(datos, aes(x = medias)) +
geom_histogram(aes(y = after_stat(density)), bins = 30,
fill = "steelblue", color = "white", alpha = 0.7) +
geom_density(color = "darkred", linewidth = 1) +
theme_minimal() +
labs(title = "Distribución de Medias Muestrales",
subtitle = "1000 iteraciones en paralelo",
x = "Valor de la media",
y = "Densidad")
Nota metodológica
La reproducibilidad computacional no es un detalle accesorio cuando el análisis escala. En este contexto,
es la base para que un flujo paralelo sea verificable, repetible y apto para trabajo científico serio.