En este informe se analiza un caso clásico de diagnóstico médico
utilizando el Teorema de Bayes.
El objetivo es mostrar cómo la probabilidad de enfermedad real
(posterior) depende no solo del resultado de la prueba sino también de
la prevalencia y las características de la prueba (sensibilidad y
especificidad).
Contexto clínico:
- La prueba es una mamografía.
- La prevalencia de cáncer de mama en mujeres de 40–50 años es baja
(1%).
- La prueba tiene sensibilidad del 80 por ciento y tasa de falsos
positivos del 9.6 por ciento.
- Se calcula la probabilidad real de cáncer si la prueba es
positiva.
library(ggplot2)
## Warning: package 'ggplot2' was built under R version 4.5.2
library(dplyr)
## Warning: package 'dplyr' was built under R version 4.5.2
##
## Adjuntando el paquete: 'dplyr'
## The following objects are masked from 'package:stats':
##
## filter, lag
## The following objects are masked from 'package:base':
##
## intersect, setdiff, setequal, union
# Datos iniciales
prevalencia <- 0.01 # Probabilidad inicial de cáncer (prior)
sensibilidad <- 0.80 # P(Positivo | Cáncer)
falso_pos <- 0.096 # P(Positivo | No Cáncer) = 1 - especificidad
# Estados posibles
estados <- c("Cáncer", "No Cáncer")
# Priors y verosimilitudes
prior <- c(prevalencia, 1 - prevalencia)
verosimilitud <- c(sensibilidad, falso_pos)
# Mostrar variables para referencia
data.frame(Estado = estados, Prior = prior, Verosimilitud = verosimilitud)
Explicación:
prior representa la probabilidad inicial de cada estado antes de realizar la prueba. verosimilitud indica la capacidad de la prueba de detectar correctamente un estado. Estos son los ingredientes necesarios para aplicar Bayes.
# Función para calcular probabilidades posteriores
bayes_update <- function(prior, likelihood, estados){
# Probabilidad conjunta: P(E ∩ S)
prob_conjunta <- prior * likelihood
# Probabilidad marginal de la evidencia: P(E)
P_evidencia <- sum(prob_conjunta)
# Posterior: P(S | E)
posterior <- prob_conjunta / P_evidencia
# Tabla completa
df <- data.frame(
Estado = estados,
Prior = prior,
Verosimilitud = likelihood,
Prob_Conjunta = prob_conjunta,
Posterior = posterior
)
return(list(tabla = df, posterior = posterior, P_evidencia = P_evidencia))
}
# Aplicar función al caso
res_caso1 <- bayes_update(prior, verosimilitud, estados)
# Mostrar tabla completa
res_caso1$tabla
Interpretación:
Prob_Conjunta muestra la probabilidad de que ocurra el estado y se observe la evidencia simultáneamente. Posterior es la probabilidad actualizada de cada estado después de observar un resultado positivo. Aunque la prueba sea positiva, la probabilidad real de cáncer sigue siendo baja debido a la baja prevalencia.
cat(sprintf("P(Cáncer | Positivo) = %.1f%%\n", res_caso1$posterior[1] * 100))
## P(Cáncer | Positivo) = 7.8%
cat(sprintf("P(No Cáncer | Positivo) = %.1f%%\n", res_caso1$posterior[2] * 100))
## P(No Cáncer | Positivo) = 92.2%
Interpretación:
Solo alrededor de 7.7 por ciento de los pacientes con prueba positiva realmente tienen cáncer. Esto demuestra la necesidad de pruebas confirmatorias y la importancia de considerar la prevalencia antes de interpretar resultados diagnósticos.
# Rango de prevalencias a analizar
prevalencias <- seq(0.001, 0.20, 0.001)
# Calcular posterior de cáncer para cada prevalencia
post_cancer <- sapply(prevalencias, function(p) {
conj <- c(sensibilidad * p, falso_pos * (1 - p))
conj[1] / sum(conj)
})
# Dataframe para graficar
df_prev <- data.frame(prevalencia = prevalencias, posterior = post_cancer)
# Gráfico
ggplot(df_prev, aes(x = prevalencia * 100, y = posterior * 100)) +
geom_line(color = "#3a7fbd", linewidth = 1.2) +
geom_point(aes(x = 1, y = res_caso1$posterior[1] * 100),
color = "#b0305a", size = 4) +
annotate("text", x = 2, y = res_caso1$posterior[1] * 100,
label = paste0("Prevalencia 1%\nP(Cáncer|+) = ",
round(res_caso1$posterior[1]*100,1), "%"),
hjust = 0, color = "#b0305a", size = 3.5) +
labs(title = "Impacto de la Prevalencia en el Valor Predictivo Positivo",
subtitle = "Sensibilidad = 80%, Tasa FP = 9.6%",
x = "Prevalencia (%)",
y = "P(Cáncer | Positivo) (%)") +
theme_minimal() +
scale_x_continuous(labels = function(x) paste0(x,"%")) +
scale_y_continuous(labels = function(x) paste0(round(x,1),"%"))
## Warning in geom_point(aes(x = 1, y = res_caso1$posterior[1] * 100), color = "#b0305a", : All aesthetics have length 1, but the data has 200 rows.
## ℹ Please consider using `annotate()` or provide this layer with data containing
## a single row.
Interpretación:
La probabilidad posterior aumenta con la prevalencia. El gráfico permite visualizar cómo la información previa afecta la interpretación del test. Es relevante para médicos y científicos de datos al evaluar riesgos en poblaciones distintas.
Conclusiones del Caso 1 La probabilidad de tener cáncer dado un resultado positivo es mucho menor que la sensibilidad de la prueba debido a la baja prevalencia. Este caso demuestra la importancia de considerar la prevalencia antes de interpretar un test y usar pruebas confirmatorias para decisiones críticas. Desde la perspectiva de Data Science, el modelo muestra cómo se puede actualizar la información con nueva evidencia, modelar incertidumbre y visualizar riesgos poblacionales.