## ====================================================
# 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
# Imprimir la probabilidad total de positivo
cat("P(Positivo) =", round(P_positivo, 4), "\n")
## P(Positivo) = 0.103
# 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.
# ====================================================
# VISUALIZACIÓN DEL EFECTO DE LA PREVALENCIA
# ====================================================
# Cargar librería para gráficos
library(ggplot2)
## Warning: package 'ggplot2' was built under R version 4.5.3
# 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, "%"))
