# Cargar librerías
library(readxl)
library(kableExtra)
library(tidyverse)
library(psych) # para descripción extendida
# Leer archivo Excel
datos <- read_excel("Fertility 3.0.xlsx")
# Renombrar columnas para evitar errores con espacios y tildes
colnames(datos) <- c("estacion", "edad", "enfermedades_infantiles", "accidente",
"intervencion_quirurgica", "fiebre_alta", "alcohol",
"habito_fumar", "horas_sentado", "diagnostico")
# Mostrar estructura (en consola, no se muestra bonito en knit)
# glimpse(datos) # opcional: solo para debug
# Mostrar primeras filas
datos %>%
head(10) %>%
kable(caption = "Primeras 10 Filas del Dataset") %>%
kable_styling(bootstrap_options = c("striped", "hover", "condensed"),
full_width = FALSE,
position = "left") %>%
scroll_box(width = "100%", height = "300px")| estacion | edad | enfermedades_infantiles | accidente | intervencion_quirurgica | fiebre_alta | alcohol | habito_fumar | horas_sentado | diagnostico |
|---|---|---|---|---|---|---|---|---|---|
| 0.33 | 0.52 | 1 | 0 | 1 | 1 | 0.8 | -1 | 0.71 | O |
| 0.33 | 0.88 | 1 | 0 | 1 | 1 | 0.4 | -1 | 0.67 | O |
| 0.33 | 0.70 | 1 | 0 | 0 | 1 | 0.4 | -1 | 0.33 | N |
| -0.33 | 0.66 | 1 | 0 | 1 | 1 | 1.0 | 1 | 0.28 | N |
| 0.33 | 0.60 | 1 | 0 | 0 | 1 | 1.0 | 1 | 0.52 | N |
| -0.33 | 0.84 | 0 | 1 | 1 | 0 | 0.2 | 1 | 0.43 | O |
| -0.33 | 0.58 | 1 | 0 | 0 | 0 | 1.0 | 1 | 0.33 | N |
| -0.33 | 0.54 | 0 | 0 | 0 | -1 | 0.6 | -1 | 0.50 | N |
| 0.33 | 0.49 | 1 | 1 | 1 | 1 | 0.8 | -1 | 0.29 | N |
| -1.00 | 0.49 | 1 | 0 | 0 | -1 | 0.6 | -1 | 0.52 | N |
# Mostrar resumen estadístico con psych::describe
datos %>%
select(-diagnostico) %>% # excluir variable categórica
describe() %>%
kable(caption = "Resumen Estadístico de Variables Numéricas") %>%
kable_styling(bootstrap_options = c("striped", "hover"),
full_width = FALSE) %>%
scroll_box(width = "100%", height = "400px")| vars | n | mean | sd | median | trimmed | mad | min | max | range | skew | kurtosis | se | |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| estacion | 1 | 200 | -0.01005 | 0.7063442 | 0.000 | -0.0125625 | 0.489258 | -1.00 | 1.00 | 2.00 | 0.0014397 | -1.2266825 | 0.0499461 |
| edad | 2 | 200 | 0.64470 | 0.1466919 | 0.635 | 0.6423750 | 0.185325 | 0.40 | 0.90 | 0.50 | 0.1139814 | -1.2283587 | 0.0103727 |
| enfermedades_infantiles | 3 | 200 | 0.71500 | 0.4525472 | 1.000 | 0.7687500 | 0.000000 | 0.00 | 1.00 | 1.00 | -0.9454262 | -1.1116527 | 0.0319999 |
| accidente | 4 | 200 | 0.28500 | 0.4525472 | 0.000 | 0.2312500 | 0.000000 | 0.00 | 1.00 | 1.00 | 0.9454262 | -1.1116527 | 0.0319999 |
| intervencion_quirurgica | 5 | 200 | 0.42000 | 0.4947970 | 0.000 | 0.4000000 | 0.000000 | 0.00 | 1.00 | 1.00 | 0.3217481 | -1.9059330 | 0.0349874 |
| fiebre_alta | 6 | 200 | 0.31500 | 0.7866825 | 1.000 | 0.3937500 | 0.000000 | -1.00 | 1.00 | 2.00 | -0.6124289 | -1.1351441 | 0.0556269 |
| alcohol | 7 | 200 | 0.65800 | 0.3084016 | 0.600 | 0.6725000 | 0.593040 | 0.20 | 1.00 | 0.80 | -0.2516581 | -1.4542560 | 0.0218073 |
| habito_fumar | 8 | 200 | -0.09500 | 0.8242402 | 0.000 | -0.1187500 | 1.482600 | -1.00 | 1.00 | 2.00 | 0.1759220 | -1.5142365 | 0.0582826 |
| horas_sentado | 9 | 200 | 0.49365 | 0.1603112 | 0.470 | 0.4812500 | 0.163086 | 0.22 | 1.09 | 0.87 | 0.7233741 | 0.3283551 | 0.0113357 |
# 1.3 Definición de variables
# --------------------------------------
def_variables <- data.frame(
Variable = c("estación", "edad", "enfermedades infantiles", "accidente",
"intervención quirúrgica", "fiebre alta", "alcohol",
"Hábito de fumar", "horas sentado", "diagnóstico"),
Descripción = c("Estación del año cuando se tomó la muestra (Invierno=-1, Primavera=-0.33, Verano=0.33, Otoño=1)",
"Edad normalizada entre 18 y 36 años",
"Historial de enfermedades infantiles (0=Sí, 1=No)",
"Accidente o traumatismo grave (0=Sí, 1=No)",
"Intervención quirúrgica previa (0=Sí, 1=No)",
"Fiebre alta en el último año (-1=<3 meses, 0=>3 meses, 1=No)",
"Frecuencia de consumo de alcohol (0.2=varias veces/día a 1=casi nunca)",
"Hábito de fumar (-1=nunca, 0=ocasional, 1=diario)",
"Horas que pasa sentado al día (0=Pocas, 1=Muchas)",
"Diagnóstico de fertilidad (N=Normal, O=Alterado)"),
Tipo = c("Categórica ordinal", "Numérica continua", "Categórica nominal",
"Categórica nominal", "Categórica nominal", "Categórica ordinal",
"Numérica continua", "Categórica ordinal", "Categórica nominal",
"Categórica nominal")
)
def_variables %>% kable() %>% kable_styling(bootstrap_options = "striped", full_width = F)| Variable | Descripción | Tipo |
|---|---|---|
| estación | Estación del año cuando se tomó la muestra (Invierno=-1, Primavera=-0.33, Verano=0.33, Otoño=1) | Categórica ordinal |
| edad | Edad normalizada entre 18 y 36 años | Numérica continua |
| enfermedades infantiles | Historial de enfermedades infantiles (0=Sí, 1=No) | Categórica nominal |
| accidente | Accidente o traumatismo grave (0=Sí, 1=No) | Categórica nominal |
| intervención quirúrgica | Intervención quirúrgica previa (0=Sí, 1=No) | Categórica nominal |
| fiebre alta | Fiebre alta en el último año (-1=<3 meses, 0=>3 meses, 1=No) | Categórica ordinal |
| alcohol | Frecuencia de consumo de alcohol (0.2=varias veces/día a 1=casi nunca) | Numérica continua |
| Hábito de fumar | Hábito de fumar (-1=nunca, 0=ocasional, 1=diario) | Categórica ordinal |
| horas sentado | Horas que pasa sentado al día (0=Pocas, 1=Muchas) | Categórica nominal |
| diagnóstico | Diagnóstico de fertilidad (N=Normal, O=Alterado) | Categórica nominal |
Enfermedades infantiles, accidente, intervención quirúrgica: Variables binarias (0/1) con medias que indican una proporción mayor a 40% de individuos expuestos.Tienen potencial como predictores, valores bien distribuidos.
Alcohol y hábito de fumar: Alcohol: media alta (≈ 0.66), indicando prevalencia elevada.Hábito de fumar sí puede ser una variable predictora relevante, ya que está ordinalmente escalada.
Estación y horas sentado: Estación tiene media cercana a 0, indicando buena dispersión por estaciones. Horas sentado: asimetría y curtosis moderadas.
library(ggplot2)
library(scales) # para usar percent_format en proporciones
# Boxplot: Edad según diagnóstico
ggplot(datos, aes(x = diagnostico, y = edad, fill = diagnostico)) +
geom_boxplot() +
labs(title = "Edad según Diagnóstico", x = "Diagnóstico", y = "Edad") +
theme_minimal()# Boxplot: Horas sentado según diagnóstico
ggplot(datos, aes(x = diagnostico, y = horas_sentado, fill = diagnostico)) +
geom_boxplot() +
labs(title = "Horas Sentado según Diagnóstico", x = "Diagnóstico", y = "Horas sentado") +
theme_minimal()# Barras: Fiebre alta vs diagnóstico (proporción)
ggplot(datos, aes(x = fiebre_alta, fill = diagnostico)) +
geom_bar(position = "fill") +
labs(title = "Proporción de Diagnóstico según Fiebre Alta", x = "Fiebre Alta (Sí/No)", y = "Proporción") +
scale_y_continuous(labels = percent_format()) +
theme_minimal()# Barras: Alcohol vs diagnóstico
ggplot(datos, aes(x = alcohol, fill = diagnostico)) +
geom_bar(position = "fill") +
labs(title = "Proporción de Diagnóstico según Consumo de Alcohol", x = "Alcohol (Sí/No)", y = "Proporción") +
scale_y_continuous(labels = percent_format()) +
theme_minimal()# Barras: Hábito de fumar vs diagnóstico
ggplot(datos, aes(x = habito_fumar, fill = diagnostico)) +
geom_bar(position = "fill") +
labs(title = "Proporción de Diagnóstico según Hábito de Fumar", x = "Fuma (Sí/No)", y = "Proporción") +
scale_y_continuous(labels = percent_format()) +
theme_minimal()Edad según Diagnóstico: No hay diferencia significativa en la edad entre hombres con diagnóstico normal (N) y alterado (O).
Horas sentado según Diagnóstico: Los hombres con diagnóstico alterado (O) tienden a pasar más horas sentados que los con diagnóstico normal (N).
Fiebre Alta según Diagnóstico: Haber tenido fiebre alta recientemente se asocia con mayor proporción de diagnóstico alterado.
Consumo de Alcohol según Diagnóstico: A mayor consumo de alcohol, aumenta la proporción de diagnósticos alterados (O).
Los hombres que fuman a diario (valor 1) tienen mayor proporción de diagnóstico alterado que los que no fuman o fuman ocasionalmente.
Las variables categóricas están etiquetadas para facilitar gráficos y modelos.
La estructura del dataset queda limpia y lista para análisis o visualizaciones.
# Cargar librerías necesarias
library(dplyr)
library(readxl)
# Leer el archivo
datos <- read_excel("Fertility 3.0.xlsx")
# Visualizamos la estructura original
str(datos)## tibble [200 × 10] (S3: tbl_df/tbl/data.frame)
## $ estación : num [1:200] 0.33 0.33 0.33 -0.33 0.33 -0.33 -0.33 -0.33 0.33 -1 ...
## $ edad : num [1:200] 0.52 0.88 0.7 0.66 0.6 0.84 0.58 0.54 0.49 0.49 ...
## $ enfermedades infantiles: num [1:200] 1 1 1 1 1 0 1 0 1 1 ...
## $ accidente : num [1:200] 0 0 0 0 0 1 0 0 1 0 ...
## $ intervención quirúrgica: num [1:200] 1 1 0 1 0 1 0 0 1 0 ...
## $ fiebre alta : num [1:200] 1 1 1 1 1 0 0 -1 1 -1 ...
## $ alcohol : num [1:200] 0.8 0.4 0.4 1 1 0.2 1 0.6 0.8 0.6 ...
## $ Hábito de fumar : num [1:200] -1 -1 -1 1 1 1 1 -1 -1 -1 ...
## $ horas sentado : num [1:200] 0.71 0.67 0.33 0.28 0.52 0.43 0.33 0.5 0.29 0.52 ...
## $ diagnóstico : chr [1:200] "O" "O" "N" "N" ...
# Convertir diagnóstico a factor
datos$diagnóstico <- as.factor(datos$diagnóstico)
# Convertimos variables binarias en factores (sin eliminar el -1)
datos <- datos %>%
mutate(
`Hábito de fumar` = factor(`Hábito de fumar`, levels = c(-1, 0, 1), labels = c("Desconocido", "No", "Sí")),
accidente = factor(accidente, levels = c(0, 1), labels = c("No", "Sí")),
`intervención quirúrgica` = factor(`intervención quirúrgica`, levels = c(0, 1), labels = c("No", "Sí")),
`enfermedades infantiles` = factor(`enfermedades infantiles`, levels = c(0, 1), labels = c("No", "Sí")),
estación = factor(estación, levels = c(-1, -0.33, 0.33, 1),
labels = c("Invierno", "Primavera", "Verano", "Otoño"))
)
# Ver la estructura final
str(datos)## tibble [200 × 10] (S3: tbl_df/tbl/data.frame)
## $ estación : Factor w/ 4 levels "Invierno","Primavera",..: 3 3 3 2 3 2 2 2 3 1 ...
## $ edad : num [1:200] 0.52 0.88 0.7 0.66 0.6 0.84 0.58 0.54 0.49 0.49 ...
## $ enfermedades infantiles: Factor w/ 2 levels "No","Sí": 2 2 2 2 2 1 2 1 2 2 ...
## $ accidente : Factor w/ 2 levels "No","Sí": 1 1 1 1 1 2 1 1 2 1 ...
## $ intervención quirúrgica: Factor w/ 2 levels "No","Sí": 2 2 1 2 1 2 1 1 2 1 ...
## $ fiebre alta : num [1:200] 1 1 1 1 1 0 0 -1 1 -1 ...
## $ alcohol : num [1:200] 0.8 0.4 0.4 1 1 0.2 1 0.6 0.8 0.6 ...
## $ Hábito de fumar : Factor w/ 3 levels "Desconocido",..: 1 1 1 3 3 3 3 1 1 1 ...
## $ horas sentado : num [1:200] 0.71 0.67 0.33 0.28 0.52 0.43 0.33 0.5 0.29 0.52 ...
## $ diagnóstico : Factor w/ 2 levels "N","O": 2 2 1 1 1 2 1 1 1 1 ...
# Cargar librerías necesarias
library(dplyr)
library(knitr)
library(tidyr)
# Limpiar nombres de columnas (sin acentos ni caracteres especiales)
colnames(datos) <- c("estacion", "edad", "enfermedades_infantiles", "accidente",
"intervencion_quirurgica", "fiebre_alta", "alcohol",
"habito_fumar", "horas_sentado", "diagnostico")
# Preparar los datos: convertir diagnóstico a numérico (1 = Alterado, 0 = Normal)
datos_modelo <- datos %>%
mutate(diagnostico_num = ifelse(diagnostico == "O", 1, 0))
# Ajustar modelo de regresión lineal
modelo_completo <- lm(diagnostico_num ~ estacion + edad + enfermedades_infantiles +
accidente + intervencion_quirurgica + fiebre_alta +
alcohol + habito_fumar + horas_sentado,
data = datos_modelo)
# Extraer resultados
resultados_completos <- summary(modelo_completo)$coefficients
# Crear tabla de resultados con nombres simples
tabla_resultados <- data.frame(
Variable = rownames(resultados_completos),
Coef = round(resultados_completos[, 1], 4),
SE = round(resultados_completos[, 2], 4),
t_val = round(resultados_completos[, 3], 2),
p_val = round(resultados_completos[, 4], 4),
Sig = ifelse(resultados_completos[, 4] < 0.001, "***",
ifelse(resultados_completos[, 4] < 0.01, "**",
ifelse(resultados_completos[, 4] < 0.05, "*", "NS")))
)
# Mostrar tabla con texto simple (sin acentos)
kable(tabla_resultados,
align = c("l", "c", "c", "c", "c", "c"),
caption = "Resultados del Modelo de Regresion Lineal") %>%
kable_styling(bootstrap_options = c("striped", "hover"),
full_width = FALSE)| Variable | Coef | SE | t_val | p_val | Sig | |
|---|---|---|---|---|---|---|
| (Intercept) | (Intercept) | -0.2811 | 0.1365 | -2.06 | 0.0408 |
|
| estacionPrimavera | estacionPrimavera | -0.0136 | 0.0574 | -0.24 | 0.8136 | NS |
| estacionVerano | estacionVerano | -0.0396 | 0.0572 | -0.69 | 0.4897 | NS |
| estacionOtoño | estacionOtoño | -0.0259 | 0.0623 | -0.42 | 0.6783 | NS |
| edad | edad | 0.0571 | 0.1377 | 0.41 | 0.6790 | NS |
| enfermedades_infantilesSí | enfermedades_infantilesSí | 0.2506 | 0.0451 | 5.56 | 0.0000 | *** |
| accidenteSí | accidenteSí | 0.0206 | 0.0450 | 0.46 | 0.6475 | NS |
| intervencion_quirurgicaSí | intervencion_quirurgicaSí | 0.5370 | 0.0416 | 12.90 | 0.0000 | *** |
| fiebre_alta | fiebre_alta | -0.1209 | 0.0257 | -4.70 | 0.0000 | *** |
| alcohol | alcohol | -0.5268 | 0.0667 | -7.90 | 0.0000 | *** |
| habito_fumarNo | habito_fumarNo | 0.0223 | 0.0486 | 0.46 | 0.6470 | NS |
| habito_fumarSí | habito_fumarSí | 0.2428 | 0.0493 | 4.92 | 0.0000 | *** |
| horas_sentado | horas_sentado | 0.9936 | 0.1276 | 7.79 | 0.0000 | *** |
Los factores más influyentes en el diagnóstico alterado son: haber tenido enfermedades infantiles, una intervención quirúrgica, fiebre alta reciente, consumo de alcohol, hábito de fumar y pasar muchas horas sentado.
Pasar más horas sentado tiene el mayor efecto positivo sobre el diagnóstico alterado (coef = 0.9936, p < 0.001), lo que indica que este factor está fuertemente asociado con un deterioro en la calidad seminal.
Consumir alcohol tiene un efecto negativo notable (coef = -0.5268, p < 0.001), lo que sugiere una fuerte relación con un diagnóstico alterado.
Intervención quirúrgica previa muestra también un efecto positivo muy fuerte (coef = 0.5370, p < 0.001), lo que implica que puede influir significativamente en el diagnóstico.
# Cargar librerías necesarias
library(caret)
library(ggplot2)
library(kableExtra)
library(tibble)
library(dplyr)
## Modelo de regresión lineal
modelo_lineal <- lm(diagnostico_num ~ estacion + edad + enfermedades_infantiles +
accidente + intervencion_quirurgica + fiebre_alta +
alcohol + habito_fumar + horas_sentado,
data = datos_modelo)
## Predicciones numéricas
predicciones <- predict(modelo_lineal, newdata = datos_modelo)
## Clasificación con umbral de 0.5
predicciones_clase <- ifelse(predicciones > 0.5, 1, 0)
## Conversión a factor para evaluar
real <- factor(datos_modelo$diagnostico_num, levels = c(1, 0), labels = c("Alterado", "Normal"))
pred <- factor(predicciones_clase, levels = c(1, 0), labels = c("Alterado", "Normal"))
## Matriz de confusión con caret
conf_mat <- confusionMatrix(pred, real)
## --- Presentación bonita ---
# Matriz de confusión como tabla
conf_table <- as.table(conf_mat$table)
conf_df <- as.data.frame.matrix(conf_table)
# Mostrar tabla
conf_df %>%
kable(caption = "Matriz de Confusión", align = "c") %>%
kable_styling(bootstrap_options = c("striped", "hover"), full_width = FALSE)| Alterado | Normal | |
|---|---|---|
| Alterado | 61 | 6 |
| Normal | 5 | 128 |
# Extraer métricas
metricas <- tibble(
Métrica = c("Accuracy", "Kappa", "Sensibilidad", "Especificidad",
"Valor predictivo positivo", "Valor predictivo negativo",
"Prevalencia", "Exactitud balanceada"),
Valor = round(c(conf_mat$overall["Accuracy"],
conf_mat$overall["Kappa"],
conf_mat$byClass["Sensitivity"],
conf_mat$byClass["Specificity"],
conf_mat$byClass["Pos Pred Value"],
conf_mat$byClass["Neg Pred Value"],
conf_mat$byClass["Prevalence"],
conf_mat$byClass["Balanced Accuracy"]), 3)
)
# Mostrar tabla de métricas
metricas %>%
kable(caption = "Estadísticas del Modelo de Clasificación") %>%
kable_styling(bootstrap_options = c("striped", "hover"), full_width = FALSE)| Métrica | Valor |
|---|---|
| Accuracy | 0.945 |
| Kappa | 0.876 |
| Sensibilidad | 0.924 |
| Especificidad | 0.955 |
| Valor predictivo positivo | 0.910 |
| Valor predictivo negativo | 0.962 |
| Prevalencia | 0.330 |
| Exactitud balanceada | 0.940 |
Clasifica muy bien ambas clases: De los 66 casos realmente “Alterado”, acertó 61 (aciertos) y solo se equivocó en 5 (falsos negativos). De los 134 casos “Normal”, acertó 128 y se equivocó en 6 (falsos positivos).
Alta precisión general: El modelo clasifica correctamente el 94.5% de los casos (accuracy = 0.945), lo que indica un rendimiento muy sólido.
Excelente sensibilidad y especificidad: Detecta bien los casos “Alterado” (sensibilidad = 92.4%) y “Normal” (especificidad = 95.5%), lo cual lo hace confiable para ambas clases.
# 1. Cargar librerías necesarias
library(dplyr)
library(caret)
library(knitr)
library(kableExtra)
# 2. Normalizar nombres de columnas (sin acentos ni espacios)
colnames(datos) <- c("estacion", "edad", "enfermedades_infantiles", "accidente",
"intervencion_quirurgica", "fiebre_alta", "alcohol",
"habito_fumar", "horas_sentado", "diagnostico")
# 3. Preparar datos: variable binaria 1 = Alterado (O), 0 = Normal (N)
datos_modelo <- datos %>%
mutate(diagnostico_num = ifelse(diagnostico == "O", 1, 0))
# 4. Ajustar modelo de regresión lineal
modelo_lineal <- lm(diagnostico_num ~ estacion + edad + enfermedades_infantiles +
accidente + intervencion_quirurgica + fiebre_alta +
alcohol + habito_fumar + horas_sentado,
data = datos_modelo)
# 5. Elegir umbral de clasificación (ejemplo: 0.3 en lugar de 0.5)
umbral <- 0.3
# 6. Predecir valores y clasificar
predicciones <- predict(modelo_lineal, newdata = datos_modelo)
predicciones_clase <- ifelse(predicciones > umbral, 1, 0)
# Reetiquetar 0 = "N" (Normal), 1 = "O" (Alterado)
predicciones_etiquetas <- factor(predicciones_clase, levels = c(0, 1), labels = c("N", "O"))
reales_etiquetas <- factor(datos_modelo$diagnostico_num, levels = c(0, 1), labels = c("N", "O"))
matriz_confusion <- confusionMatrix(
data = predicciones_etiquetas,
reference = reales_etiquetas,
positive = "O"
)
# 8. Extraer métricas importantes
metricas <- data.frame(
"Exactitud" = matriz_confusion$overall["Accuracy"],
"Sensibilidad" = matriz_confusion$byClass["Sensitivity"],
"Especificidad" = matriz_confusion$byClass["Specificity"],
"Valor Predictivo Positivo" = matriz_confusion$byClass["Pos Pred Value"],
"Valor Predictivo Negativo" = matriz_confusion$byClass["Neg Pred Value"],
check.names = FALSE
)
# 9. Visualizar matriz de confusión en tabla bonita
kable(matriz_confusion$table,
caption = "Matriz de Confusión",
col.names = c("Predicción: Normal", "Predicción: Alterado")) %>%
kable_styling(bootstrap_options = c("striped", "hover")) %>%
add_header_above(c(" " = 1, "Real" = 2))| Predicción: Normal | Predicción: Alterado | |
|---|---|---|
| N | 101 | 0 |
| O | 33 | 66 |
# 10. Visualizar métricas
kable(metricas, caption = "Métricas de Desempeño") %>%
kable_styling(bootstrap_options = c("striped", "hover")) %>%
column_spec(1, bold = TRUE)| Exactitud | Sensibilidad | Especificidad | Valor Predictivo Positivo | Valor Predictivo Negativo | |
|---|---|---|---|---|---|
| Accuracy | 0.835 | 1 | 0.7537313 | 0.6666667 | 1 |
Se maximizó la sensibilidad (1.00): el modelo identificó todos los casos “Alterado” correctamente. No hubo falsos negativos.
Cayó la especificidad (0.75): el modelo empezó a clasificar como “Alterado” a muchos casos que eran realmente “Normales” (33 falsos positivos).
Se sacrificó el valor predictivo positivo (0.66): solo 2 de cada 3 predicciones “Alterado” eran correctas.
Link app: https://ryrl5r.csb.app/ (Se tiene que abrir en otra pestaña)
Identificar los factores más asociados con diagnósticos alterados de fertilidad: Los factores más influyentes en el diagnóstico alterado son: haber tenido enfermedades infantiles, una intervención quirúrgica, fiebre alta reciente, consumo de alcohol, hábito de fumar y pasar muchas horas sentado. Estos se identificaron con base en la importancia de variables en el modelo y sus asociaciones consistentes con un estado alterado.
Explorar patrones y relaciones entre las variables: Se observaron patrones claros entre estilos de vida poco saludables y diagnósticos alterados. El modelo muestra alta sensibilidad (0.924) y especificidad (0.955), lo que indica que la mayoría de relaciones entre factores de riesgo y diagnóstico están bien capturadas. Además, bajar el umbral a 0.3 mejora la detección de casos alterados, aunque reduce la precisión del modelo en clasificar como alterado a quienes realmente lo son (valor predictivo positivo baja a 0.66).
Proporcionar insights para futuros estudios clínicos: Se recomienda que futuros estudios clínicos prioricen la investigación de factores modificables como el consumo de alcohol, el tabaquismo y el sedentarismo, ya que estos mostraron una fuerte asociación con diagnósticos alterados de fertilidad.