En la práctica médica y epidemiológica, las decisiones clínicas rara vez se toman bajo certeza absoluta. Un resultado de laboratorio, un signo físico o un síntoma comunicado por el paciente no proporcionan un diagnóstico definitivo por sí solos, sino que actualizan la probabilidad de que el paciente padezca una determinada condición.
Este tutorial tiene como propósito guiar al estudiante de medicina en el uso de RStudio para comprender y aplicar la Probabilidad Condicional y el Teorema de Bayes en la toma de decisiones clínicas.
La probabilidad condicional mide la frecuencia relativa con la que ocurre un evento \(A\), sabiendo de antemano que ha ocurrido el evento \(B\) (donde \(P(B) > 0\)).
\[\mathbf{P(A \mid B) = \frac{P(A \cap B)}{P(B)}}\]
Al evaluar \(P(A \mid B)\), el universo original de observación (\(\Omega\)) se contrae exclusivamente al subgrupo de individuos que cumplen la condición \(B\). El denominador ya no es el total poblacional \(N\), sino el número de personas que presentan la característica \(B\).
Durante la década de 1980, en los inicios de la epidemia del VIH, las Fuerzas Armadas de los Estados Unidos implementaron el tamizaje masivo en personal reclutado utilizando la prueba inmunoabsorbente ligada a enzimas (ELISA).
Simulemos lo que ocurre al aplicar este test a una cohorte de \(100,000\) reclutas militares:
# Parámetros de entrada
N <- 100000
prev <- 0.00148
sens <- 0.93
espec <- 0.99
# 1. Total de enfermos y sanos en la cohorte
enfermos <- round(N * prev) # VIH+
sanos <- N - enfermos # VIH-
# 2. Celdas de la Matriz 2x2
VP <- round(enfermos * sens) # Verdaderos Positivos
FN <- enfermos - VP # Falsos Negativos
VN <- round(sanos * espec) # Verdaderos Negativos
FP <- sanos - VN # Falsos Positivos
# 3. Construcción de la Tabla de Contingencia en R
matriz_vih <- matrix(
c(VP, FP, VP + FP,
FN, VN, FN + VN,
enfermos, sanos, N),
nrow = 3, byrow = TRUE,
dimnames = list(
"Resultado ELISA" = c("ELISA Positivo (+)", "ELISA Negativo (-)", "Total Marginal"),
"Estado Real VIH" = c("Infectado (VIH+)", "Sano (VIH-)", "Total Poblacional")
)
)
kable(matriz_vih, caption = "Tabla 2x2: Tamizaje de VIH en 100,000 Reclutas Militares")| Infectado (VIH+) | Sano (VIH-) | Total Poblacional | |
|---|---|---|---|
| ELISA Positivo (+) | 138 | 999 | 1137 |
| ELISA Negativo (-) | 10 | 98853 | 98863 |
| Total Marginal | 148 | 99852 | 100000 |
Si un recluta obtiene un resultado ELISA Positivo (+), ¿cuál es la probabilidad real de que esté verdaderamente infectado por VIH (\(P(VIH+ \mid ELISA+)\))?
\[\mathbf{P(VIH+ \mid +) = \frac{P(+ \mid VIH+) \cdot P(VIH+)}{P(+ \mid VIH+) \cdot P(VIH+) + P(+ \mid VIH-) \cdot P(VIH-)}}\]
Calculémoslo directamente en R:
# Cálculo por fórmula Bayesiana
numerador <- sens * prev
denominador <- (sens * prev) + ((1 - espec) * (1 - prev))
vpp_vih <- (numerador / denominador) * 100
cat("Resultado del VPP mediante Bayes:\n")## Resultado del VPP mediante Bayes:
## Probabilidad real de estar infectado tras un primer ELISA (+): 12.11 %
A pesar de que la prueba posee una sensibilidad del \(93\%\) y una especificidad del \(99\%\), un recluta con ELISA positivo solo tiene un \(12.1\%\) de probabilidad real de tener VIH.
Ahora aplicaremos el Teorema de Bayes a un escenario clínico real utilizando los datos recolectados por estudiantes de la UJMD en sus pruebas piloto (\(N\) pequeño).
Informe_g3.pdf)En el estudio del Subgrupo 3 sobre prehipertensión en estudiantes de Medicina (\(N = 36\)), evaluamos el nivel de actividad física inactiva/moderada como un marcador o factor de riesgo para la presencia de prehipertensión arterial.
# 1. Definición de la matriz de contingencia piloto
datos_piloto <- matrix(
c(15, 4,
12, 5),
nrow = 2, byrow = TRUE,
dimnames = list(
"Marcador (Actividad Física)" = c("Baja/Moderada (+)", "Alta (-)"),
"Estado Clínico" = c("Prehipertenso (+)", "Normotenso (-)")
)
)
print(datos_piloto)## Estado Clínico
## Marcador (Actividad Física) Prehipertenso (+) Normotenso (-)
## Baja/Moderada (+) 15 4
## Alta (-) 12 5
# 2. Extracción de métricas de la prueba piloto
VP <- datos_piloto[1, 1]
FP <- datos_piloto[1, 2]
FN <- datos_piloto[2, 1]
VN <- datos_piloto[2, 2]
sens_piloto <- VP / (VP + FN) # Sensibilidad = 15/27
espec_piloto <- VN / (VN + FP) # Especificidad = 5/9
prev_piloto <- (VP + FN) / sum(datos_piloto) # Prevalencia = 27/36
# 3. Aplicación de la Ecuación de Bayes
vpp_piloto <- (sens_piloto * prev_piloto) /
((sens_piloto * prev_piloto) + ((1 - espec_piloto) * (1 - prev_piloto)))
vpn_piloto <- (espec_piloto * (1 - prev_piloto)) /
((espec_piloto * (1 - prev_piloto)) + ((1 - sens_piloto) * prev_piloto))
# 4. Impresión de Resultados
cat("--- RESULTADOS DEL ANÁLISIS BAYESIANO CON DATOS PILOTO ---\n")## --- RESULTADOS DEL ANÁLISIS BAYESIANO CON DATOS PILOTO ---
## Prevalencia basal de Prehipertensión: 75 %
## Sensibilidad del marcador (Inactividad): 55.6 %
## Especificidad del marcador: 55.6 %
## Valor Predictivo Positivo (VPP por Bayes): 78.9 %
## Valor Predictivo Negativo (VPN por Bayes): 29.4 %
Aunque el tamaño muestral de la prueba piloto es pequeño (\(N = 36\)), la lógica condicional y la estructura matemática del Teorema de Bayes funcionan de manera idéntica. Saber que un estudiante es inactivo físicamente actualiza la probabilidad de prehipertensión del \(75.0\%\) (prevalencia a priori) al \(78.9\%\) (probabilidad a posteriori).
Cada subgrupo de investigación deberá elaborar un script en RStudio aplicando la metodología Bayesiana a su propia base de datos piloto.
.csv o .xlsx).table() en R.# ==============================================================================
# PLANTILLA DE TRABAJO AUTÓNOMO: ANÁLISIS BAYESIANO DE DATOS PILOTO
# Subgrupo N°: _____ | Integrantes: ____________________________________
# ==============================================================================
# 1. Cargar datos (Reemplazar con el nombre de su archivo)
# mis_datos <- read.csv("mi_base_piloto.csv")
# 2. Crear la tabla 2x2 con sus dos variables elegidas
# mi_tabla <- table(mis_datos$variable_marcador, mis_datos$variable_estado)
# print(mi_tabla)
# 3. Asignar celdas (Adaptar según el orden de sus categorías)
# VP <- mi_tabla[2, 2]
# FP <- mi_tabla[2, 1]
# FN <- mi_tabla[1, 2]
# VN <- mi_tabla[1, 1]
# 4. Calcular Bayes
# prev <- (VP + FN) / (VP + FP + FN + VN)
# sens <- VP / (VP + FN)
# espec <- VN / (VN + FP)
# vpp_bayes <- (sens * prev) / ((sens * prev) + ((1 - espec) * (1 - prev)))
# cat("La probabilidad a posteriori (VPP) es de:", round(vpp_bayes * 100, 2), "%\n")Cátedra de Bioestadística — Escuela de Medicina, UJMD 2026