Prueba de Detección de Cáncer de Mama

Una mamografía detecta cáncer de mama. La prevalencia (prior) es del 1% en mujeres de 40–50 años. La prueba tiene sensibilidad del 80% (detecta correctamente el 80% de casos reales) y especificidad del 90.4% (tasa de falsos positivos del 9.6%). Una paciente da positivo. ¿Cuál es la probabilidad real de que tenga cáncer?

Teorema de BAYES — Caso 1: Diagnóstico Médico

Datos del problema:

prevalencia  <- 0.01   # Probabilidad previa (Prior): 1% de la población tiene cáncer
sensibilidad <- 0.80   # Probabilidad de que la prueba sea positiva dado que SÍ hay cáncer: P(Positivo | Cáncer)
falso_pos    <- 0.096  # Probabilidad de falso positivo: P(Positivo | No Cáncer)

Definición de los estados posibles

estados <- c("Cancer", "No Cancer")  # Vector con las dos condiciones posibles
# Probabilidades previas (priors)
prior   <- c(prevalencia, 1 - prevalencia)  # P(Cáncer) y P(No Cáncer)

# Verosimilitudes (likelihoods)
likel   <- c(sensibilidad, falso_pos)   # P(Positivo | estado)

# Paso 1-3: cálculo de probabilidades conjuntas
conjunta <- prior * likel  # P(estado ∩ positivo) = P(estado) * P(Positivo | estado)

# Paso 4: probabilidad marginal de obtener un resultado positivo
P_positivo <- sum(conjunta)  # P(Positivo) = suma de las probabilidades conjuntas

Probabilidad total de positivo

cat("P(Positivo) =", round(P_positivo, 4), "\n")
## P(Positivo) = 0.103

Tabla con todos los resultados

# Paso 5: cálculo de probabilidades posteriores (Teorema de Bayes)
posterior <- conjunta / P_positivo  # P(estado | positivo)

# Construcción de una tabla con todos los resultados
tabla <- data.frame(
  Estado      = estados,        # Nombre del estado
  Prior       = prior,          # Probabilidad previa
  Verosimil   = likel,          # Verosimilitud
  Conjunta    = conjunta,       # Probabilidad conjunta
  Posterior   = round(posterior, 4)  # Probabilidad posterior redondeada
)

# Mostrar la tabla
print(tabla)
##      Estado Prior Verosimil Conjunta Posterior
## 1    Cancer  0.01     0.800  0.00800    0.0776
## 2 No Cancer  0.99     0.096  0.09504    0.9224
# Interpretación del resultado clave
cat("\n→ P(Cancer | Positivo) =", round(posterior[1] * 100, 1), "%\n")
## 
## → P(Cancer | Positivo) = 7.8 %
# Mensaje interpretativo
cat("→ Aunque la prueba es positiva, solo el",
    round(posterior[1] * 100, 1), "% tiene cancer.\n")
## → Aunque la prueba es positiva, solo el 7.8 % tiene cancer.

Interpretación:

El análisis bayesiano aplicado a este caso muestra con claridad que un resultado positivo en una mamografía no implica, por sí solo, una alta probabilidad de padecer cáncer de mama. A pesar de que la prueba presenta una sensibilidad relativamente alta (80%) y una especificidad considerable (90.4%), la baja prevalencia de la enfermedad en la población analizada (1%) condiciona de manera decisiva la probabilidad posterior. En este contexto, la probabilidad de que una paciente tenga realmente cáncer dado un resultado positivo es de aproximadamente 7.8%, lo cual evidencia una discrepancia significativa entre la percepción intuitiva y la realidad estadística.

Este resultado se explica por el peso relativo de los falsos positivos en poblaciones con baja prevalencia. Aunque la tasa de falsos positivos (9.6%) pueda parecer moderada, aplicada a un grupo grande de individuos sanos (99% de la población), genera un número absoluto de resultados positivos erróneos muy superior al de verdaderos positivos. En consecuencia, la mayoría de los resultados positivos provienen de individuos sin la enfermedad, lo que reduce sustancialmente el valor predictivo positivo de la prueba.

VISUALIZACIÓN DEL EFECTO DE LA PREVALENCIA

# Cargar librería para gráficos
library(ggplot2)

# Crear una secuencia de posibles prevalencias (desde 0.1% hasta 20%)
prevalencias <- seq(0.001, 0.20, 0.001)

# Calcular la probabilidad posterior para cada prevalencia
post_cancer <- sapply(prevalencias, function(p) {
  # Probabilidades conjuntas para cada valor de p
  conj <- c(sensibilidad * p, falso_pos * (1 - p))
  
  # Retornar P(Cáncer | Positivo)
  conj[1] / sum(conj)
})

# Crear un data frame para graficar
df_prev <- data.frame(prevalencia = prevalencias, posterior = post_cancer)

# Construcción del gráfico
ggplot(df_prev, aes(x = prevalencia * 100, y = posterior * 100)) +
  
  # Línea principal de la relación
  geom_line(color = "#3a7fbd", linewidth = 1.2) +
  
  # Punto que representa el caso específico (prevalencia = 1%)
  geom_point(data = data.frame(x = 1, y = posterior[1] * 100),
             aes(x = x, y = y), color = "#b0305a", size = 4) +
  
  # Anotación del punto clave
  annotate("text", x = 2, y = posterior[1] * 100,
           label = paste0("Prevalencia 1%\nP(Cancer|+) = ",
                           round(posterior[1] * 100, 1), "%"),
           hjust = 0, color = "#b0305a", size = 3.5) +
  
  # Títulos del gráfico
  labs(title = "Efecto de la Prevalencia sobre el Valor Predictivo Positivo",
       subtitle = "Mamografia: Sensibilidad=80%, Tasa FP=9.6%",
       x = "Prevalencia (%)", 
       y = "P(Cancer | Positivo) (%)") +
  
  # Tema visual limpio
  theme_minimal() +
  
  # Formato del eje X en porcentaje
  scale_x_continuous(labels = function(x) paste0(x, "%")) +
  
  # Formato del eje Y en porcentaje
  scale_y_continuous(labels = function(x) paste0(x, "%"))

Interpretación:

El análisis gráfico muestra cómo el valor predictivo positivo aumenta de manera no lineal con la prevalencia. A medida que la enfermedad se vuelve más frecuente en la población, la proporción de verdaderos positivos crece más rápidamente que la de falsos positivos, mejorando así la capacidad diagnóstica del test. Esto pone de manifiesto que el desempeño de una prueba diagnóstica no es una propiedad intrínseca fija, sino que depende críticamente del contexto poblacional en el que se aplica..