Comprension del problema:

  • La base de datos contiene información de 200 voluntarios que aportaron muestras de semen analizadas según los criterios de la OMS de 2010. Se estudia la relación entre la concentración de espermatozoides (diagnóstico) y factores sociodemográficos, ambientales, de salud y hábitos de vida. El objetivo es explorar cómo estos factores influyen en la fertilidad masculina

Objetivo:

  1. Identificar los factores más asociados con diagnósticos alterados de fertilidad.
  2. Explorar patrones y relaciones entre las variables.
  3. Proporcionar insights para futuros estudios clínicos.

Comprension de los datos:

Tablas:

# 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")
Primeras 10 Filas del Dataset
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")
Resumen Estadístico de Variables Numéricas
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.

Graficos:

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()

  1. Edad según Diagnóstico: No hay diferencia significativa en la edad entre hombres con diagnóstico normal (N) y alterado (O).

  2. 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).

  3. Fiebre Alta según Diagnóstico: Haber tenido fiebre alta recientemente se asocia con mayor proporción de diagnóstico alterado.

  4. Consumo de Alcohol según Diagnóstico: A mayor consumo de alcohol, aumenta la proporción de diagnósticos alterados (O).

  5. Los hombres que fuman a diario (valor 1) tienen mayor proporción de diagnóstico alterado que los que no fuman o fuman ocasionalmente.

Preparacion de los datos:

  • 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 ...

Modelado Regresion Logistica:

# 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)
Resultados del Modelo de Regresion Lineal
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.

Evaluacion:

Matriz de confusion:

# 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)
Matriz de Confusión
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)
Estadísticas del Modelo de Clasificación
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.

umbral de clasificación 0,3:

# 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))
Matriz de Confusión
Real
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)
Métricas de Desempeño
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.

Despliegue

  • El modelo se utilizo para la realizacion de una aplicacion web que determina la probabilidad de la fertilidad masculina ademas de un gráfico de radar para mostrar fortalezas/debilidades.

Link app: https://ryrl5r.csb.app/ (Se tiene que abrir en otra pestaña)

Conclusiones:

  1. 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.

  2. 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).

  3. 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.