<- bayestestR::distribution_normal(5000, 800, 30)
x
<- data.table(
plot_data `Intervalo R-R (ms)` = x,
`Z-Score (unidades estandarizadas)` = (x - mean(x))/sd(x)
|> melt.data.table(measure.vars = 1:2)
)
ggplot(plot_data, aes(value, fill = variable)) +
facet_wrap(~ variable, scales = "free") +
geom_density(show.legend = FALSE) +
scale_y_continuous(expand = c(0,0,0.2,0), breaks = NULL) +
scale_x_continuous(expand = c(0.1,0)) +
scale_fill_brewer(type = "qual", palette = 3)
Introducción
Hablemos de tu corazón. No el metafórico que todavía se está recuperando del final esa temporada de Stranger Things, sino el órgano de carne y papas que bombea en tu pecho. Ya sabes, esa cosa que se acelera cuando corres para alcanzar la micro o cuando te tragas Squid Game con una pizza familiar solito (eso le llamo autodeterminación gourmet). Resulta que los científicos (como este humilde servidor) llevamos obsesionados con entender cómo este solo de batería biológico reacciona al ejercicio. Y créeme, no es tan simple como el iconito feliz del corazón de tu Fitbit quiere hacerte creer.
Tu corazón no es solo una bomba, es un poeta. Cada latido es un verso en el poema épico de tu vida, y el intervalo R-R es el ritmo de esa poesía. Técnicamente, es el tiempo (en milisegundos) entre los picos de dos latidos en un ECG, esas icónicas “ondas R” que parecen mini rascacielos. Intervalos R-R cortos = tu corazón late más rápido (hola, reuniones por Zoom que dan ansiedad), mientras que intervalos largos = está en modo reposo (¿alguien dijo maratón de 31 minutos?). La frecuencia cardíaca (latidos por minuto) es simplemente el inverso: divide 60,000 por tu intervalo R-R y voilà, tienes tus latidos por minuto. Pero aquí viene el plot twist: tu corazón no es metrónomo.
Entra en escena la variabilidad de la frecuencia cardíaca (VFC), el héroe anónimo de la salud cardíaca. La VFC mide las sutiles variaciones entre esos intervalos R-R. Imagínala como el talento improvisador de tu corazón, jazz, no música clásica. Una VFC alta significa que tu sistema nervioso autonómico es flexible, cambiando al tiro entre el modo “pelea o huida” (simpático) y el modo “relax” (parasimpático). ¿VFC baja? Tu cuerpo está atrapado en un ciclo de estrés, como una rueda de hámster llena de cortisol. Pero las métricas tradicionales de VFC promedian estas fluctuaciones, convirtiendo el freestyle de tu corazón en música de ascensor.
Ahí es donde los intervalos R-R roban el protagonismo. Analizándolos latido a latido, capturamos los microdramas: cómo tu corazón se asusta en una corrida, se recupera post-burpee o le hace cara fea a tu tercer café del día.
Ahora imagina que tu frecuencia cardíaca durante el ejercicio es como el guión de una película de Christopher Nolan: llena de vueltas, giros y momentos en que no sabes qué está pasando, pero sientes que es profundo. Los métodos tradicionales para analizar la variabilidad de la frecuencia cardíaca (VFC) son como tratar de explicar Inception con un celular del 2005: técnicamente posible, pero pierdes toda la onda. Por décadas, los investigadores han usado modelos lineales y métricas de VFC resumidas, que sirven tanto para capturar el caos del corazón durante el ejercicio como un paraguas en un terremoto. Sí, te dicen algo, pero es como resumir El Señor de los Anillos como “unos tipos caminaron a un volcán”. ¿Perdiendo el punto? Un poquito nomás.
¡Pero atención! Tengo buenas noticias. Desarrollamos y publicamos un nuevo modelo no lineal, el Tony Stark de los análisis cardíacos: brillante, preciso y hecho en una cueva (bueno, un laboratorio) con matemáticas que casi entenderías. En vez de meter los intervalos latido a latido (llamados intervalos R-R para los amigos) en el corsé rígido de ecuaciones lineales, abrazamos el caos con funciones logísticas. Imagínatelo como cambiar del internet con módem al 5G. Estas funciones logísticas son la Beyoncé de las matemáticas: versátiles, dinámicas y capaces de manejar cambios bruscos (como cuando pasas de modo vago a HIIT en 0.2 segundos). Modelan la caída del corazón durante el ejercicio y su lento retorno al modo Netflix-relajo después, todo mientras escupen parámetros que importan para tu cuerpo. ¿“Intervalo R-R basal”? Es el ritmo base de tu corazón. ¿“Proporción de recuperación”? Cuán rápido te perdona por esos burpees.
Ahora, hablemos de lo obvio: ¿para qué te sirve esto? Bueno, a menos que seas un ciborg (te estamos mirando, Boston Dynamics), tu sistema nervioso autónomo, el titiritero tras el ritmo cardíaco, es una reina del drama. Durante el ejercicio, es una pulseada entre el sistema simpático “pelea-o-huye” (el que grita ¡DALE!) y el parasimpático “relájate un rato” (el que susurra ¿un capitulito más no más?). Los modelos tradicionales tratan esto como un sube-y-baja con un cabro pegado al suelo. ¿Nuestro modelo? Es la plaza entera, con columpios, pasamanos y ese cabro que claramente se pasó con las bebidas.
Aquí viene lo bueno: probamos este prodigio en 272 personas mayores. ¿Por qué viejitos? Porque si tu corazón aguanta Zumba a los 70, es básicamente el Dwayne Johnson de los órganos. Spoiler: el modelo la rompió. Con un R2 de 0.868 (traducción: es terriblemente preciso) y un RMSE de 32.6 ms (traducción: detecta hasta tu crisis existencial durante las planchas), es como darle a médicos y entrenadores un truco de God Mode para tu salud cardiovascular. Ah, y usamos Hamiltonian Monte Carlo para estimar parámetros, que suena como un hechizo de Harry Potter pero en realidad es matemática nivel jedi para decir “no adivinamos, lo calculamos”.
¡Pero espera, hay más! Con un análisis de sensibilidad de Sobol (o sea, preguntar ¿qué parte de la ecuación hace la pega?), descubrimos que el intervalo R-R basal y la proporción de recuperación son los cracks de la dinámica cardíaca. Traducción: la configuración default de tu corazón y su capacidad para recuperarse después del ejercicio son el Messi y el Alexis de esta película. Los otros parámetros? Son la banca. Útiles, pero no la llevan.
Hablemos de aplicaciones reales. Imagina un futuro donde tu reloj inteligente no solo te reta por estar sentado, sino que entiende los berrinches de tu corazón durante el spinning. O donde los programas de rehab se ajustan no solo a tu condición física, sino a los cambios de ánimo de tu sistema nervioso. Este modelo no es solo paja académica, es la puerta a tecnología de salud personalizada que no da pena.
Claro, ningún héroe es perfecto. Nuestro estudio se hizo principalmente con mujeres mayores, como probar un auto deportivo solo con abuelitos yendo al bingo. ¿Próximos pasos? Meter atletas universitarios, padres sin dormir y ese amigo que hace ultramaratones “para relajarse”. Además, un saludo a R, el lenguaje de programación que usamos. Si R fuera persona, sería ese amigo que es seco pero te explica todo con memes.
Así que ajústense el cinturón. En las próximas secciones, nos meteremos en el código, las curvas y los momentos “¡eureka!” que hicieron este paper posible. Ya seas fanático del cardio, ñoño de datos o solo alguien que quiere saber por qué tu corazón odia los burpees, esto es para ti. Y si te pierdes, acuérdate: no es caos, es ciencia.
Las Matemáticas, el Código y el Drama Cardíaco Detrás del Modelo
Vamos a pelar las capas de este modelo como una cebolla, pero en vez de lágrimas, te saldrán mates, código R y una nueva apreciación por las tendencias melodramáticas de tu corazón. Ajústate el cinturón; vamos a ponernos modo Sherlock Holmes con esta ecuación.
La Gran Ecuación: Una Sinfonía de Sigmoides
En el corazón del modelo está esta belleza:
\[ \text{RRi}(t) = \alpha + \frac{\beta}{1 + e^{\lambda(t-\tau)}} + \frac{-c \cdot \beta}{1 + e^{\phi(t-\tau-\delta)}} \]
Esto no es solo sopa de letras. Es un puro caso coordinado entre dos funciones logísticas (esas curvas en forma de S que conocís de modelos de población o apocalipsis zombi). Juntas, capturan el viaje de tu corazón desde el modo zen hasta el pánico del ejercicio y de vuelta al Netflix. Vamos a diseccionar cada término como un episodio de Breaking Bad.
1. Intervalo RR Basal (\(\alpha\)): La Calma Antes de la Tormenta
\(\alpha\) (alfa) es el estado de reposo de tu corazón, el intervalo R-R cuando esta tirado en el sillón pensando si ver The Office por quinta vez. Matemáticamente, es el corrimiento vertical de toda la curva. Imagínatelo como el amigo que insiste en tomarse “días de salud mental” todos los lunes.
En el código, \(\alpha\) es simple. Cuando estandarizamos los datos RRi, centramos cada dato en su media (\(\text{RRi}_i\)) y lo escalamos por su desviación estándar (\(S_{\text{RRi}_i}\)). Así comparamos el corazón de la abuela Rosa con el del Gym Bro Chad sin sesgos. En R, esto sería como revertir un z-score. Nada de magia, solo aritmética para que cada corazón se quede en su cancha.
Fíjate cómo la distribución transformada de los intervalos R-R mantiene su forma pero cambia la escala de referencia. La escala estandarizada siempre estará en desviaciones estándar (también conocido como Z-score):
2. El Parámetro del Pánico (\(\beta\)): Cuando el Ejercicio Pegue Como Twist de Telenovela
\(\beta\) es donde empieza el drama. Este término controla la caída del intervalo RR cuando empiezas a ejercitarte. Valores negativos significan que tu corazón se está agitando, como cuando sabes que dejaste la estufa prendida haciendo sentadillas. Mientras más grande el valor absoluto de \(\beta\), más brusca la caída en los intervalos R-R. En el estudio, \(\beta = -345\) ms significó que los corazones hicieron un Free Solo en pleno ejercicio.
El primer término logístico, \(\frac{\beta}{1 + e^{\lambda(t-\tau)}}\), es el equivalente matemático de tu sistema simpático apretando el acelerador. El denominador \(1 + e^{\lambda(t-\tau)}\) asegura que la caída no sea instantánea, sino suave (más o menos), como una montaña rusa subiendo la primera cuesta.
En R, simular esto es pan comido:
<- function(t, alpha, beta, lambda, tau) {
f1 + beta / (1 + exp(lambda * (t - tau)))
alpha }
Poné \(\alpha = 860\) ms, \(\beta = -345\), \(\lambda = -3.05\), y \(\tau = 6.71\), y tienes una curva que cae como el Bitcoin en 2022.
3. Tasa de Caída (\(\lambda\)) y Timing (\(\tau\)): ¿Cuán Rápido y Cuándo se Arma el Lío?
\(\lambda\) (lambda) dicta qué tan rápido se desploma el intervalo RR. Un \(\lambda\) más negativo significa una caída más brusca, como tu corazón en una corrida versus una caminata tranquila. En el modelo, \(\lambda = -3.05\) es como si tu corazón gritara “¡SÁLVESE QUIEN PUEDA!” al empezar el ejercicio.
\(\tau\) (tau) es el punto de inflexión, el momento exacto en que empieza el caos. Con \(\tau = 6.71\) minutos, es el segundo en que tu corazón notó que hablabas en serio con los burpees. Este parámetro evita que el modelo asuma que todos entran en pánico al mismo tiempo (porque, seamos honestos, a algunos nos transpira la mano solo de pensar en ejercicios).
El código para este término es engañosamente simple, pero la magia está en el exponente: \(\lambda(t - \tau)\). Esto hace que la caída se acelere exponencialmente una vez activada, imitando la respuesta de “todos a la bodega” del cuerpo al estrés físico.
4. El Equipo de Recuperación (\(c\), \(\phi\), \(\delta\)): La Redención Post-Ejercicio
Después del caos, la calma… o al menos el intento. El segundo término logístico, \(\frac{-c \cdot \beta}{1 + e^{\phi(t - \tau - \delta)}}\), es donde tu sistema parasimpático (el “modo siesta”) llega a limpiar el desastre.
- \(c\): La proporción de recuperación. Si \(c = 0.84\), tu corazón recupera el 84% de la caída. Es como perdonar a tu pololo por comerse tus completos: se arregla casi todo, pero igual le tiras miradas asesinas.
- \(\phi\) (phi): Velocidad de recuperación. \(\phi = -2.6\) significa que tu corazón vuelve a la normalidad más rápido que un héroe de Marvel después del chasquido. Mientras más negativo, más rápido.
- \(\delta\) (delta): El retraso antes de recuperar. \(\delta = 3.24\) minutos es el “dame un minuto para respirar” de tu corazón post-ejercicio.
En código:
<- function(t, beta, c, phi, delta, tau) {
f2 -c * beta) / (1 + exp(phi * (t - tau - delta)))
( }
Este término es un reflejo invertido de la primera curva logística, demorado por \(\delta\). Juntos forman una curva en U, la huella dactilar de la recuperación cardíaca, como un fénix saliendo de las cenizas de tu sesión de HIIT.
5. El Panorama Completo: Del Reposo al Caos y la Redención
Combinando ambos términos, tienes la trayectoria completa del RRi: una sinfonía de estrés y recuperación. La primera función logística modela el momento simpático de “yo me la juego”, y la segunda captura el parasimpático de “tranquilo, aquí estoy”.
Graficar esto en R es donde sale la magia:
<- seq(0, 20, by = 0.05)
time <- f1(time, 860, -345, -3.05, 6.71) +
total f2(time, -345, 0.84, -2.6, 3.24, 6.71)
<- data.table(
plot_data time = time,
total = total
)
set.seed(123)
ggplot(plot_data, aes(time)) +
geom_line(aes(y = total + rnorm(201, 0, 30)), col = "purple", lwd = 1/4) +
geom_line(aes(y = total + 30), col = "purple", lwd = 1/2, lty = 2) +
geom_line(aes(y = total - 30), col = "purple", lwd = 1/2, lty = 2) +
geom_line(aes(y = total), col = "purple", lwd = 1) +
geom_vline(xintercept = c(6.71, 6.71 + 3.24), lty = 2, col = "gray50") +
labs(y = "RRi (ms)", x = "Tiempo (min)",
title = "La Epopeya de Tu Corazón",
subtitle = "Señal RRi Simulada y Real")
Este gráfico no es solo una curva, es un relato. La caída es la fase “¡ah, la cagué!” de tu corazón durante el ejercicio, y el rebote es su lento regreso a la cordura. El retraso (\(\delta\)) evita que el modelo asuma que la recuperación empieza al tiro (porque, claro, tu corazón también necesita su minuto).
¿Por Qué Funciones Logísticas? Porque Tu Corazón No Es George Harris
Los modelos lineales son el helado de vainilla de la matemática: seguros, predecibles y medio aburridos. ¿Pero tu corazón? Es más como un helado de manjar-ronrón con chispas de terremoto. Las funciones logísticas sirven porque manejan efectos de saturación: tu corazón no puede caer infinitamente (no sos Flash) ni recuperarse al tiro (no sos Wolverine).
La forma sigmoide de \(\frac{1}{1 + e^{-x}}\) es perfecta para modelar transiciones entre estados. Durante el ejercicio, captura la toma de control del sistema simpático. Post-ejercicio, el sigmoide invertido refleja el retorno cauteloso del parasimpático. Juntos, son el yin y yang del control cardíaco, como Thor y Loki, pero con menos explosiones.
De las Matemáticas a la Medicina: Lo Que Realmente Importa
- \(\alpha\) alto: Tu corazón es pura calma. Quizás sos yogui o simplemente un rey de las siestas.
- \(\beta\) bajo: Tu corazón se asusta brigido con el ejercicio. Felicitaciones, sos el Jason Bourne del cardio.
- \(\phi\) lento: La recuperación toma siglos. Tu parasimpático es un perezoso en modo zombie.
- \(\delta\) largo: Tu corazón se toma su tiempo para recuperarse. Es el George R.R. Martin de los órganos: demoras garantizadas.
Estos parámetros no son solo académicos, son útiles. Un \(c\) bajo (proporción de recuperación) podría indicar mala resiliencia autonómica, señalando diabetes o hipertensión. Un \(\lambda\) salvaje (tasa de caída) sugiere que tu sistema simpático es más intenso que perro viendo una liebre.
Tras Bambalinas: Stan, HMC y Trucos de Jedi Bayesiano
Ajustar este modelo no es para pusilánimes. Usamos Stan (lenguaje de programación probabilística) y Hamiltonian Monte Carlo (HMC) para estimar parámetros. Imagina HMC como un Waze para navegar el terreno escarpado del espacio paramétrico: evita callejones sin salida (¡gracias, No-U-Turn Sampler!) para encontrar los valores óptimos.
Traducción: Le dijimos a Stan, “acá está la ecuación, los datos, y porfa no explotes.” ¿Resultado? Distribuciones posteriores que nos dan no solo mejores estimaciones sino incertidumbre, como pronósticos del tiempo para tu corazón.
¿Por Qué Importa Esto?
Este modelo no es solo un truco para ñoños de estadísticas. Es un puente entre datos fríos y el caos de la fisiología humana. Al vincular parámetros con mecanismos reales (como activación simpática o tono vagal), podemos:
- Personalizar rehabilitación: Adaptar ejercicios a tu “personalidad” autonómica.
- Detectar riesgos temprano: Reconocer cuando tu recuperación lenta antes de que sea grave.
- Optimizar entrenamiento: Ajustar intensidad según dinámicas cardíacas en tiempo real.
Imagina un Fitbit que no solo cuente pasos, sino que te diga: “Oye, tu \(\phi\) está bajo, mejor no tomes café hoy.” Ese es el futuro que estamos creando.
Tu corazón no es un metrónomo. Es un baterista de jazz, improvisando, dinámico y a veces caótico. Este modelo abraza ese caos, usando funciones logísticas para mapear el ritmo de reposo, pánico y recuperación. Ya seas científico de datos, médico o alguien que solo quiere saber por qué los burpees dan ganas de llorar, acuérdate: detrás de cada latido hay una historia. Y ahora, tenemos las mates para leerla.
Implementando el Hamiltonian Monte Carlo (HMC)
¿Quieres estimar parámetros para un modelo fancy de ritmo cardíaco usando HMC? Ajústate el cinturón, esto es como enseñarle a un auto autónomo a navegar un laberinto, pero en vez de auto, son ecuaciones, y en vez de laberinto, es el caos que hace tu corazón con el ejercicio. Vamos a simplificarlo sin jerga de doctorado.
Paso 1: ¿Qué Chu*** es HMC?
Imagina que estas escalando un cerro (la “distribución posterior” de parámetros que quieres explorar). Métodos tradicionales como Metropolis-Hastings son como caminar a ciegas dando pasos al azar: eventualmente llegas a la cima, pero te demoras una eternidad. ¿HMC? Es como ponerte una mochila jet que usa física (dinámica hamiltoniana) para deslizarte suave hacia las zonas más probables.
El truco:
- Parámetros = Posiciones: Tus incógnitas (\(\alpha\), \(\beta\)) son coordenadas en un mapa.
- Momento = Variables Auxiliares: Variables “físicas” ficticias que le dan impulso a tu mochila jet.
- Hamiltoniano = Energía Total: Combina “energía potencial” (qué tan malo es el ajuste del modelo) y “energía cinética” (el impulso del momento).
Simula deslizarte por este paisaje de energía, guiado por gradientes (el GPS de las matemáticas), para encontrar los mejores valores.
Paso 2: El No-U-Turn Sampler (NUTS): Piloto Automático para el HMC
¿El talón de Aquiles del HMC? Elegir el tamaño de paso (\(\epsilon\)) y el número de pasos (\(L\)). Si te equivocas, o avanzas a paso de tortuga o te pasái de largo. Ahí entra NUTS, la Marie Kondo de los MCMC: ordena el ajuste automático para que tu muestreo genere alegría.
Ya cubrimos lo básico de NUTS en un post anterior. Pero, para ahorrar tiempo, recordemos rápidamente cómo funciona (ya que, obviamente, ya leíste mi post anterior de NUTS):
- Construye un Árbol: NUTS crea un árbol binario de pasos hacia adelante y atrás.
- Detención en U-Turn: Si el camino empieza a retroceder (un “giro en U”), se detiene. ¡Sin pasos perdidos!
- Ajuste de Paso: Durante el calentamiento, NUTS ajusta \(\epsilon\) para lograr una tasa de aceptación ~80%, el “justo” de Ricitos de Oro.
En nuestro paper, usamos Stan (vía el paquete brms
de R). Stan es como un mayordomo robot que hace las mates mientras tomas café (o mate1).
1 Es como el café pero 10 veces más intenso y amargo
Paso 3: Definiendo el Modelo, Metiendo la Ecuación
Bueno, todo lindo, pero ¿cuál es el modelo? Nuestra ecuación es una bestia:
\[ \text{RRi}(t) = \alpha + \frac{\beta}{1 + e^{\lambda(t-\tau)}} + \frac{-c \cdot \beta}{1 + e^{\phi(t-\tau-\delta)}} \]
En brms
, escribirías esto como una fórmula no lineal:
library(brms)
<- bf(
model_formula ~ alpha + beta / (1 + exp(lambda * (tiempo - tau))) +
RRi -c * beta) / (1 + exp(phi * (tiempo - tau - delta))),
(~ 1, beta ~ 1, lambda ~ 1, tau ~ 1, c ~ 1, phi ~ 1, delta ~ 1,
alpha nl = TRUE
)
Traducción: “Oye Stan, acá está la ecuación. Los parámetros son \(\alpha, \beta, \lambda, \tau, c, \phi, \delta\). ¡Métete con todo!”.
Paso 4: Poniendo priors, Porque Hasta las Ecuaciones Necesitan Límites
Los priors evitan que los parámetros se descontrolen. Por ejemplo:
- \(\beta\) (caída por ejercicio) debe ser negativo; nadie tiene intervalos R-R que aumenten al correr.
- \(\tau\) (inicio del pánico) no puede ser negativo (a menos que tu corazón entre en pánico antes de ejercitarte… igual, te entiendo).
En brms
, los definirías así:
<- c(
priors prior(normal(800, 100), nlpar = "alpha"), # RR basal ~800 ms
prior(normal(-300, 30), nlpar = "beta"), # Caída ~-300 ms
prior(normal(0.8, 0.01), nlpar = "c"), # Recuperación ~80%
prior(normal(-3, 0.5), nlpar = "lambda"), # Tasa de caída ~-3
prior(normal(-2, 0.5), nlpar = "phi"), # Tasa de recuperación ~-2
prior(normal(6, 0.5), nlpar = "tau"), # Pánico empieza ~6 min
prior(normal(3, 0.5), nlpar = "delta") # Retraso recuperación ~3 min
)
Estos priors no son inventos, vienen de conocimiento del área (o, en este caso, de datos del estudio).
Paso 5: Simulando Datos, Entre Más Ruido, Mejor
Para ilustrar cómo funciona el modelo y estimar parámetros, necesitamos datos. Creemos unos ficticios:
## Creamos un data.frame con intervalos de tiempo
<- data.frame(
data tiempo = seq(0, 20, 0.1)
)
## Generamos un patrón RRi con ruido agregado
<- within(data, {
data <- 800 -
RRi 300 / (1 + exp(-3 * (tiempo - 6))) +
0.8 * 300 / (1 + exp(-2 * (tiempo - 6 - 3))) +
rnorm(n = length(tiempo), 0, 30)
})
Y ahora que tenemos datos cocinados, veamos cómo se ve el caos cardíaco simulado:
Paso 6: Ajustando el Modelo, Que Stan Haga la Pega Fuerte
Con la fórmula, priors y datos listos, ajustar el modelo es poco emocionante:
<- brm(
fit formula = model_formula,
data = data,
prior = priors,
family = gaussian(),
chains = 4, # 4 cadenas MCMC en paralelo
iter = 2000, # 2000 iteraciones por cadena
warmup = 1000, # Primeras 1000 son calentamiento
control = list(adapt_delta = 0.95), # Sé cuidadoso
file = "../my_rri_model.RDS"
)
Stan procesará los datos usando HMC (vía NUTS) para explorar el posterior. Es como entrenar una red neuronal, pero en vez de fotos de gatos, son curvas cardíacas.
Paso 7: Verificando Convergencia, ¿El Robot Mayordomo Estaba Curado?
Tras muestrear, debes verificar si las cadenas (ejecuciones paralelas) están de acuerdo. Diagnósticos clave:
- R-hat ( \(\hat{R}\) ): Debe ser ≤1.01. Si es 1.5, tus cadenas se pelean como hermanos.
- Tamaño de Muestra Efectivo (ESS): Debe ser >1000. ¿ESS bajo? Tu mochila jet falló.
En R:
summary(fit)
Family: gaussian
Links: mu = identity; sigma = identity
Formula: RRi ~ alpha + beta/(1 + exp(lambda * (time - tau))) + (-c * beta)/(1 + exp(phi * (time - tau - delta)))
alpha ~ 1
beta ~ 1
lambda ~ 1
tau ~ 1
c ~ 1
phi ~ 1
delta ~ 1
Data: data (Number of observations: 201)
Draws: 4 chains, each with iter = 2000; warmup = 1000; thin = 1;
total post-warmup draws = 4000
Regression Coefficients:
Estimate Est.Error l-95% CI u-95% CI Rhat Bulk_ESS Tail_ESS
alpha_Intercept 800.75 3.45 794.18 807.53 1.00 3052 2914
beta_Intercept -291.16 11.52 -314.42 -269.81 1.00 2077 2512
lambda_Intercept -2.88 0.32 -3.54 -2.30 1.00 3034 2480
tau_Intercept 5.87 0.05 5.77 5.98 1.00 2581 2467
c_Intercept 0.80 0.01 0.79 0.82 1.00 4280 3403
phi_Intercept -2.02 0.26 -2.57 -1.57 1.00 3172 2514
delta_Intercept 3.17 0.12 2.94 3.39 1.00 2401 2769
Further Distributional Parameters:
Estimate Est.Error l-95% CI u-95% CI Rhat Bulk_ESS Tail_ESS
sigma 29.27 1.48 26.59 32.40 1.00 4401 2760
Draws were sampled using sampling(NUTS). For each parameter, Bulk_ESS
and Tail_ESS are effective sample size measures, and Rhat is the potential
scale reduction factor on split chains (at convergence, Rhat = 1).
Busca Bulk_ESS
y Tail_ESS
en los resultados. Si están bien, sigue. Si no, llora (o aumenta iter
).
Por Qué Esto Importa
El HMC no es solo alarde académico. Al usar gradientes (derivadas del log-posterior), explora espacios complejos de manera eficiente. Los métodos tradicionales se perderían; el HMC navega como sobre rieles.
Para el paper, esto permitió capturar:
- Qué rápido entra en pánico el corazón (\(\lambda\)).
- Cuánto se recupera (\(c\)).
- Cuándo empieza el pánico (\(\tau\)).
Estos parámetros no son solo números, son biomarcadores. Un \(c\) bajo podría indicar mala recuperación en pacientes cardíacos. Un \(\lambda\) alto sugiere respuestas al estrés hiperreactivas.
Implementar HMC es como enseñarle a un robot a bailar. Es complejo, requiere ajustes y a veces parece magia. Pero con herramientas como Stan y `brms, no necesitas ser físico, solo un humano con datos y un problema que resolver.
Así que la próxima vez que tu corazón se acelere en el gimnasio, acuérdate: hay todo un universo de ecuaciones y código trabajando para entender sus pataletas. ¡Y eso es lo bonito!
Visualizando el la Distribución Posterior
Seamos honestos: la estadística puede ser más seca que galleta de agua. Pero cuando visualizas las distribuciones posteriores de los parámetros del modelo, ocurre la magia. De repente, números abstractos se transforman en una historia sobre los berrinches, resiliencia y rencores secretos de tu corazón contra los burpees. Aquí te mostramos cómo transformar las matemáticas en insights fisiológicos, con código R y gráficos que hasta tu primo que le huye al cardio entendería.
1. Intervalo R-R basal (\(\alpha\)): El Ritmo de Reposo
Comenzamos con el gráfico de densidad posterior para \(\alpha\), el intervalo R-R en reposo. Usando brms
y bayesplot
, visualizamos dónde vive este parámetro:
library(bayesplot)
library(ggplot2)
# Extraer muestras posteriores
<- as_draws_df(fit)
muestras_posteriores
# Graficar densidad con intervalo creíble del 90%
mcmc_areas(muestras_posteriores, pars = "b_alpha_Intercept", prob = 0.9) +
labs(title = "Intervalo R-R basal (α)",
x = "Intervalo R-R (ms)", y = "Densidad") +
theme(axis.text.y.left = element_blank(),
axis.ticks.y.left = element_blank())
¿Qué Significa?:
- Un pico alrededor de 800 ms sugiere una frecuencia cardíaca en reposo de ~75 lpm (ya que RRi ≈ 60,000 / frecuencia).
- Un intervalo creíble (IC) del 90% estrecho (ej: 795–805 ms) indica poca incertidumbre.
- Insight Fisiológico: Un \(\alpha\) bajo (intervalos cortos) podría indicar estrés crónico o menor condición física. ¿\(\alpha\) alto? Quizás tus participantes son cracks del fitness.
2. Pánico por Ejercicio (\(\beta\)) y Tasa de Caída (\(\lambda\)): La Fase “Ah, la Cagué”
Graficamos \(\beta\) (magnitud de la caída) y \(\lambda\) (pendiente de la caída):
# Combinar gráficos
<- mcmc_areas(muestras_posteriores, pars = "b_beta_Intercept", prob = 0.9) +
p1 labs(title = "Caída Inducida por Ejercicio (β)",
x = "Δ Intervalo R-R (ms)", y = "Densidad") +
theme(axis.text.y.left = element_blank(),
axis.ticks.y.left = element_blank())
<- mcmc_areas(muestras_posteriores, pars = "b_lambda_Intercept", prob = 0.9) +
p2 labs(title = "Tasa de Caída (λ)",
x = "Tasa (por min)", y = "Densidad") +
theme(axis.text.y.left = element_blank(),
axis.ticks.y.left = element_blank())
::ggarrange(p1, p2, ncol = 2) ggpubr
¿Qué Significa?:
- Un \(\beta\) centrado en -290 ms significa que los corazones cayeron ~290 ms durante el ejercicio, como pasar de 75 lpm (~800 ms) a 120 lpm (~500 ms).
- Un \(\lambda\) de -3 sugiere una caída brusca; tomó ~15 segundos llegar al mínimo. Es como tu corazón gritando “¡¿Esto está pasando?!”.
- Insight Fisiológico: Un \(\lambda\) más negativo implica activación simpática rápida (bueno para atletas, preocupante si hay mala recuperación).
3. Parámetros de Recuperación (\(c\), \(\phi\), \(\delta\)): La Redención
Ahora, la fase de recuperación, donde tu corazón perdona (o no) tus decisiones:
# Graficar los tres
<- mcmc_areas(muestras_posteriores, pars = "b_c_Intercept", prob = 0.9) +
p1 labs(title = "Proporción de Recuperación (c)",
x = "Proporción Recuperada", y = "Densidad") +
theme(axis.text.y.left = element_blank(),
axis.ticks.y.left = element_blank())
<- mcmc_areas(muestras_posteriores, pars = "b_phi_Intercept", prob = 0.9) +
p2 labs(title = "Tasa de Recuperación (φ)",
x = "Tasa (por min)", y = "Densidad") +
theme(axis.text.y.left = element_blank(),
axis.ticks.y.left = element_blank())
<- mcmc_areas(muestras_posteriores, pars = "b_delta_Intercept", prob = 0.9) +
p3 labs(title = "Retraso en Recuperación (δ)",
x = "Tiempo de Retraso (min)", y = "Densidad") +
theme(axis.text.y.left = element_blank(),
axis.ticks.y.left = element_blank())
::ggarrange(p1, p2, p3, nrow = 3) ggpubr
¿Qué Significa?:
- \(c = 0.80\): Los corazones recuperaron 80% de la caída. IC 90% (0.79–0.82) indica alta confianza.
- \(\phi = -2\): Recuperación rápida pero no instantánea (~20-25 segundos). Un \(\phi\) más negativo sería reactivación parasimpática más veloz.
- \(\delta = 3.2\) min: Los corazones esperaron ~3 minutos post-ejercicio para recuperarse. Retrasos largos podrían indicar fatiga autonómica.
- Insight Fisiológico: \(c\) bajo, \(\phi\) lento o \(\delta\) largo pueden señalar recuperación deficiente, común en envejecimiento o diabetes.
4. Simulando Curvas RRi: De Posteriores a Predicciones
Los posteriores no son solo gráficos bonitos, permiten simular latidos reales. Generemos trayectorias RRi usando muestras:
# Obtener 100 muestras
<- muestras_posteriores[sample.int(100),]
muestras names(muestras) <- names(muestras) |>
gsub(pattern = "^b_", replacement = "") |>
gsub(pattern = "_Intercept$", replacement = "")
# Simular curvas
<- purrr::map_dfr(1:100, function(i) {
rr_simulado <- muestras[i, ]
params ::tibble(
tibbletiempo = seq(0, 20, by = 0.1),
RRi = params$alpha +
$beta / (1 + exp(params$lambda * (tiempo - params$tau))) +
params-params$c * params$beta) / (1 + exp(params$phi * (tiempo - params$tau - params$delta))),
(sim_id = i
)
})
# Graficar "espagueti"
ggplot(rr_simulado, aes(tiempo, RRi, group = sim_id)) +
geom_line(data = data, aes(group = 1), color = "gray") +
geom_line(alpha = 0.1, color = "purple") +
labs(title = "100 Trayectorias RRi Simuladas",
subtitle = "Compatibles con datos simulados",
x = "Tiempo (min)", y = "Intervalo R-R (ms)")
¿Qué Significa?:
- Este “gráfico de espagueti” muestra la incertidumbre en predicciones. Bandas gruesas = alta confianza. Huecos = “No estamos seguros qué pasa aquí”.
- La forma en U es consistente: caída brusca, retraso, luego recuperación. Pero el timing y profundidad varían, reflejando diferencias individuales.
- Insight Fisiológico: Mayor dispersión post-ejercicio sugiere corazones con dificultad para recuperarse, candidatos a monitoreo.
5. Correlaciones entre Parámetros: La Pulseada Autonómica
Finalmente, exploremos interacciones con un gráfico de correlación por pares:
mcmc_pairs(fit, pars = c("b_alpha_Intercept", "b_beta_Intercept",
"b_c_Intercept", "b_phi_Intercept"),
diag_fun = "dens",
off_diag_fun = "hex")
¿Qué Significa?:
- \(\alpha\) vs. \(\beta\): ¿Correlación negativa? Corazones relajados (\(\alpha\) alto) podrían entrar más en pánico (\(\beta\) bajo).
- \(c\) vs. \(\phi\): ¿Correlación positiva? Recuperación rápida (\(\phi\)) suele ir con recuperación completa (\(c\)).
- Insight Fisiológico: Estas relaciones sugieren acoplamiento autonómico, cómo se coordinan los sistemas simpático y parasimpático.
¿Por Qué Importa?
Estas visualizaciones no son solo adornos académicos. Son herramientas para:
- Medicina Personalizada: Detectar valores extremos en \(\alpha\) o \(c\) puede identificar pacientes en riesgo.
- Optimizar Entrenamiento: Atletas con \(\lambda\) pronunciado podrían soportar mayor intensidad.
- Investigación en Envejecimiento: La cohorte de adultos mayores del paper tuvo \(\phi\) más lento; comparar con jóvenes puede revelar declive por edad.
Imagina una clínica donde estos gráficos aparezcan durante un test de esfuerzo, guiando intervenciones en tiempo real. O un entrenador ajustando rutinas según el retraso (\(\delta\)) de un corredor. Ese es el poder de casar mates con fisiología.
La historia de tu corazón está escrita en curvas logísticas y densidades de probabilidad. Al visualizar los posteriores, no solo procesamos números, sino que desciframos el lenguaje de la vida misma. Y eso, compadre, es mucho más bacán que cualquier tablero de Fitbit.
Discusión: El Panorama General
Hablemos claro: el corazón es un caos. No es metrónomo, es un músico de jazz, improvisando, dinámico y a veces más perdido que perro en misa. Por décadas, hemos intentado meter sus ritmos en cajitas etiquetadas “variabilidad cardíaca” o “modelos lineales”, como tratar de embutir un huaso en un ascensor. Este modelo no-lineal no es solo alarde matemático; es una rebelión contra la simplificación bruta. Al abrazar el caos de los intervalos R-R con funciones logísticas, reconocemos que la respuesta cardíaca al ejercicio no es una línea recta, es una montaña rusa. Y eso importa.
Las implicancias acá son más grandes que la última compra compulsiva en Falabella. Las métricas tradicionales de VFC, aunque útiles, son como resumir Cien años de soledad como “algo pasó en Macondo”. Comprimen toda la historia de tu sistema nervioso en un solo número, perdiendo los giros: cuando el simpático pisa el acelerador en una corrida o el parasimpático hace su lenta vuelta de victoria post-ejercicio. Nuestro modelo captura estos matices, ofreciendo una lente HD a la dinámica cardíaca. Para clínicos, esto podría detectar disfunción autonómica temprana, como diabetes o hipertensión, antes de que escalen. Para atletas, es una hoja de ruta para optimizar recuperación. ¿Para el resto? Prueba que los burpees son, de hecho, invento del diablo.
Pero no corramos a abrir champaña. La cohorte del estudio (personas mayores, mayoría mujeres) es como probar una camioneta 4x4 en la Costanera un domingo. Si bien sus corazones son héroes (shoutout a los 70añeros que bailan zumba mejor que millennials), el envejecimiento altera la función autonómica. Corazones jóvenes, con tono vagal fresco y metabolismo eficiente, podrían bailar cueca distinto. Imagina aplicar este modelo a deportistas universitarios: ¿su retraso en recuperación (\(\delta\)) sería menor? ¿Su parámetro de pánico (\(\beta\)) más dramático? No sabemos, y eso es un problema. La ceguera demográfica actual del modelo limita su aplicabilidad. Futuros estudios deben ampliar la red: jóvenes, atletas élite, padres privados de sueño, y sí, ese amigo que corre ultramaratones “para relajarse”. Solo así sabremos si este marco es la multiherramienta de análisis cardíaco o un chiche para abuelitas del bingo.
Luego está el elefante en la pieza: el ruido del mundo real. El estudio, con datos limpios y controlados, es el equivalente científico de un estudio de TikTok. Pero la vida no es laboratorio. Estrés, café y ese tercero espresso que no debiste tomarte ensucian las señales. Imagina desplegar este modelo al mundo, con relojes inteligentes sufriendo artefactos de movimiento y zonas sin Wi-Fi en el cerro. ¿Aguantará el caos? Las pruebas con datos sintéticos sugieren que sí, pero hasta que no se pruebe en Apple Watches colgando de muñecas sudorosas en CrossFit, seguimos con optimismo cauteloso. Integrar factores ambientales en tiempo real (temperatura, humedad, cortisol) podría transformar este modelo de truco bacán a herramienta clínica pulenta.
Hablando de tecnología, hablemos de wearables. La experiencia Fitbit actual es como tener un copiloto que solo sabe dos frases: “¡Vas bien!” o “¿Y si quizás descansas?”. Nuestro modelo podría mejorarlo a un navegante que entiende los berrinches cardíacos. Imagina tu reloj diciendo: “Tu proporción de recuperación (\(c\)) está baja, salta los burpees hoy”, o “Tu \(\phi\) está genial, ¡dale para la press banca!”. No es ciencia ficción; es el próximo paso lógico. Pero para eso, necesitamos integración con APIs de wearables, edge computing para análisis en tiempo real, e interfaces que no parezcan hechas en Excel. Ah, y baterías que no mueran a media rutina. Prioridades, gente.
Ahora, el talón de Aquiles del modelo: interpretabilidad. Las funciones logísticas son elegantes, pero explicárselas a un cardiólogo tomando unos mates es como enseñarle física cuántica a un golden retriever. Parámetros como \(\alpha\), \(\beta\), \(\lambda\) tienen sentido para nosotros los ñoños, pero ¿cómo traducir “tasa de recuperación (\(\phi\)) = -2.6” en consejos útiles? La respuesta: mejores herramientas visuales. Piensa en dashboards interactivos donde médicos ajusten parámetros y vean curvas cardíacas cambiar en tiempo real. O apps que conviertan “mejorar tu \(c\)” en una misión tipo Zelda. Cerrando la brecha entre ecuaciones y empatía es el próximo desafío.
Y qué hay de los rincones oscuros del sistema nervioso? El modelo asume una pelea simpático vs parasimpático, pero la biología es más enredada que cable de audífonos. Estudios nuevos sugieren que la “balanza simpatovagal” es más como una relación tóxica: a veces cooperan, a veces se pelean (Storniolo et al. 2021). ¿Puede el modelo capturar eso? Por ahora no. Futuras versiones podrían necesitar ecuaciones diferenciales acopladas o análisis de redes. Además, factores como arritmia sinusal respiratoria (donde la respiración afecta el ritmo) deben controlarse. Incluir esto transformaría el modelo de obra de dos actores a teleserie prime time.
No olvidemos la cuerda floja ética. Los datos de salud personalizados son oro para innovación, pero mina antipersonal para privacidad. Si tu reloj sabe los secretos de tu corazón, ¿quién más tiene pase VIP? ¿Isapres? ¿Empleadores? El potencial es innegable, pero sin ética robusta, estamos a un hack de un capítulo de Black Mirror. Transparencia, consentimiento y cifrado no son moda, son el precio de la entrada.
Entonces, ¿dónde quedamos? El paper es un avance, pero la maratón recién empieza. El camino tiene preguntas sin responder: (1) ¿Puede predecir eventos cardíacos? (2) ¿Cómo interactúa con otros biomarcadores como presión arterial? (3) ¿Funciona en patologías como fibrilación auricular? Cada paso requiere colaboración: matemáticos de la Chile, médicos de la Católica, ingenieros de la Santa María, y sí, hasta éticos para que no nos pasemos de listos.
Al final, este trabajo no es de ecuaciones o R2. Es sobre honrar la complejidad cardíaca. Tu corazón no es máquina; es un contador de historias. Cada latido susurra cuentos de estrés, alegría, cansancio y resiliencia. Al escuchar, de verdad escuchar, su narrativa no-lineal, no hacemos ciencia. Aprendemos un nuevo idioma, uno que podría reescribir el futuro de la salud. Y eso, compadre, es un giro argumental que vale la pena seguir.
Apéndice
Revisa el paper original donde presentamos el modelo aquí.
References
Citation
@misc{castillo-aguilar2025,
author = {Castillo-Aguilar, Matías},
title = {¿Crees Saber Cómo Modelar El Ritmo Cardíaco?},
date = {2025-03-24},
url = {https://bayesically-speaking.com/posts/2025-03-24 so-you-think-you-can-model-a-heartbeat/spanish/},
doi = {10.59350/qfn6w-qyt38},
langid = {en}
}