library(readxl)
library(readr)
library(tableone)
library(knitr)
library(kableExtra)
library(dplyr)
## 
## Adjuntando el paquete: 'dplyr'
## The following object is masked from 'package:kableExtra':
## 
##     group_rows
## The following objects are masked from 'package:stats':
## 
##     filter, lag
## The following objects are masked from 'package:base':
## 
##     intersect, setdiff, setequal, union
library(tibble)
library(survival)
library(ggplot2)
library(broom)

Tabla 2 usando la distancia de mahalanobis de los 20 biomarcadores de M4 con la varianza más alta, las distancias de mahalanobis escaladas por sd, log base 10 de las distancias de mahalanobis y ln de las distancias de mahalanobis

Basecom2 = read_excel("C:\\Users\\gio73\\Documents\\Tesis\\Data\\tesis\\Base de mahalanobis\\Sin pacientes con datos erroneos\\base_completa1 mahal.xlsx")

Tabla 2

# Convertir group en binaria (0 = saludable, 1 = diabético)
Basecom2 <- Basecom2 %>%
  mutate(Group_bin = ifelse(Group == 1, 1, 0))

# Distancias de mahal
dist_vars <- c("D_M_M4_20var", "D_M_M4_varscaled", "D_M_M4_varlog10", "D_M_M4_varln", 
               "DM_M4_20menor_cor", "DM_M4_20menor_cor_mayorvar")

# Para guardar resultados
resultados <- list()

# Ajustar modelo por cada distancia
for (dist in dist_vars) {
  # Confirmar que sea num
  Basecom2[[dist]] <- as.numeric(Basecom2[[dist]])
  
  #Como genera error usar este, para una sola distancia usar el otro
  formula_logit <- as.formula(paste0("Group_bin ~ `", dist, "`"))
  
  # Modelo
  modelo <- glm(formula_logit, data = Basecom2, family = binomial())
  
  # Resultados
  resumen <- summary(modelo)
  beta <- coef(modelo)[2]
  OR <- exp(beta)
  
  # Intervalos de confianza IC 95%
  conf <- exp(confint.default(modelo))
  
  # Extraer AIC y BIC
  AIC_val <- AIC(modelo)
  BIC_val <- BIC(modelo)
  
  # Crear tabla parcial
  resultado <- tibble(
    Predictor = dist,
    Beta = round(beta, 4),
    OR = round(OR, 4),
    `IC 95% Inferior` = round(conf[2, 1], 4),
    `IC 95% Superior` = round(conf[2, 2], 4),
    `Valor p` = as.character(
      ifelse(coef(summary(modelo))[2, 4] < 0.0001, "<0.0001",
             round(coef(summary(modelo))[2, 4], 4))
    ),
    AIC = round(AIC_val, 2),
    BIC = round(BIC_val, 2)
  )
  
  resultados[[dist]] <- resultado
}

# Unir resultados
tabla_mahalanobis <- bind_rows(resultados)

# Mostrar con kableExtra
tabla_mahalanobis %>%
  kable(format = "html",
        caption = "Tabla 2: Relación entre las distancias de Mahalanobis de M4 y D/H") %>%
  kable_styling(bootstrap_options = c("striped", "hover", "condensed"),
                full_width = FALSE, position = "center")
Tabla 2: Relación entre las distancias de Mahalanobis de M4 y D/H
Predictor Beta OR IC 95% Inferior IC 95% Superior Valor p AIC BIC
D_M_M4_20var 0.0140 1.0141 1.0019 1.0265 0.023 370.02 377.38
D_M_M4_varscaled 0.3151 1.3705 1.0443 1.7984 0.023 370.02 377.38
D_M_M4_varlog10 1.1734 3.2330 1.4870 7.0289 0.0031 367.06 374.42
D_M_M4_varln 0.5096 1.6646 1.1881 2.3324 0.0031 367.06 374.42
DM_M4_20menor_cor 0.0066 1.0066 0.9994 1.0138 0.0718 372.69 380.05
DM_M4_20menor_cor_mayorvar 0.0098 1.0099 1.0020 1.0178 0.014 368.80 376.16

Tabla 2 ajustada Edad y Sexo

# Distancias de Mahal
dist_vars <- c("D_M_M4_20var", "D_M_M4_varscaled", "D_M_M4_varlog10", "D_M_M4_varln", 
               "DM_M4_20menor_cor", "DM_M4_20menor_cor_mayorvar")

# Para guardar resultados
resultados <- list()

# Ajustar modelo para cada distancia por edad y sexo
for (dist in dist_vars) {
  # Asegurar que las columnas sean del tipo correcto
  Basecom2[[dist]] <- as.numeric(Basecom2[[dist]])
  Basecom2$Age <- as.numeric(Basecom2$Age)
  Basecom2$Gender <- as.factor(Basecom2$Gender)
  
  # Igualmente es para evitar error
  formula_logit <- as.formula(paste0("Group_bin ~ `", dist, "` + Age + Gender"))
  
  # Ajustar modelo logístico
  modelo <- glm(formula_logit, data = Basecom2, family = binomial())
  
  # Extraer resumen y coeficientes
  coefs <- summary(modelo)$coefficients
  conf <- exp(confint.default(modelo))
  
  # Guardar resultados de las distancias
  beta <- coefs[2, 1]
  OR <- exp(beta)
  
  resultado <- tibble(
    Predictor = dist,
    Beta = round(beta, 4),
    OR = round(OR, 4),
    `IC 95% Inferior` = round(conf[2, 1], 4),
    `IC 95% Superior` = round(conf[2, 2], 4),
    `Valor p` = as.character(
      ifelse(coefs[2, 4] < 0.0001, "<0.0001", round(coefs[2, 4], 4))
    ),
    AIC = round(AIC(modelo), 2),
    BIC = round(BIC(modelo), 2)
  )
  
  resultados[[dist]] <- resultado
}

# Unir resultados
tabla_mahalanobis_ajustada <- bind_rows(resultados)

# Mostrar tabla con kableExtra
tabla_mahalanobis_ajustada %>%
  kable(format = "html",
        caption = "Tabla 2: Relación entre las distancias de Mahalanobis de M4 y D/H, ajustada por edad y sexo") %>%
  kable_styling(bootstrap_options = c("striped", "hover", "condensed"),
                full_width = FALSE, position = "center")
Tabla 2: Relación entre las distancias de Mahalanobis de M4 y D/H, ajustada por edad y sexo
Predictor Beta OR IC 95% Inferior IC 95% Superior Valor p AIC BIC
D_M_M4_20var 0.0127 1.0127 1.0008 1.0249 0.0371 361.48 376.20
D_M_M4_varscaled 0.2842 1.3286 1.0171 1.7355 0.0371 361.48 376.20
D_M_M4_varlog10 1.1010 3.0072 1.3559 6.6693 0.0067 358.97 373.69
D_M_M4_varln 0.4782 1.6131 1.1414 2.2798 0.0067 358.97 373.69
DM_M4_20menor_cor 0.0057 1.0058 0.9984 1.0132 0.1257 364.07 378.79
DM_M4_20menor_cor_mayorvar 0.0084 1.0084 1.0004 1.0165 0.039 361.51 376.23

Tabla 2 ajustada por Edad, Sexo, Peso y SBP

# Distancias de Mahal
dist_vars <- c("D_M_M4_20var", "D_M_M4_varscaled", "D_M_M4_varlog10", "D_M_M4_varln", 
               "DM_M4_20menor_cor", "DM_M4_20menor_cor_mayorvar")

# Para guardar resultados
resultados <- list()

# Ajustar modelo para cada distancia por edad y sexo
for (dist in dist_vars) {
  # Asegurar que las columnas sean del tipo correcto
  Basecom2[[dist]] <- as.numeric(Basecom2[[dist]])
  Basecom2$Age <- as.numeric(Basecom2$Age)
  Basecom2$Gender <- as.factor(Basecom2$Gender)
  
  # Igualmente es para evitar error
  formula_logit <- as.formula(paste0("Group_bin ~ `", dist, "` + Age + Gender + Weight + `SBP (mmHg)`"))
  
  # Ajustar modelo logístico
  modelo <- glm(formula_logit, data = Basecom2, family = binomial())
  
  # Extraer resumen y coeficientes
  coefs <- summary(modelo)$coefficients
  conf <- exp(confint.default(modelo))
  
  # Guardar resultados de las distancias
  beta <- coefs[2, 1]
  OR <- exp(beta)
  
  resultado <- tibble(
    Predictor = dist,
    Beta = round(beta, 4),
    OR = round(OR, 4),
    `IC 95% Inferior` = round(conf[2, 1], 4),
    `IC 95% Superior` = round(conf[2, 2], 4),
    `Valor p` = as.character(
      ifelse(coefs[2, 4] < 0.0001, "<0.0001", round(coefs[2, 4], 4))
    ),
    AIC = round(AIC(modelo), 2),
    BIC = round(BIC(modelo), 2)
  )
  
  resultados[[dist]] <- resultado
}

# Unir resultados
tabla_mahalanobis_ajustada <- bind_rows(resultados)

# Mostrar tabla con kableExtra
tabla_mahalanobis_ajustada %>%
  kable(format = "html",
        caption = "Tabla 2: Relación entre las distancias de Mahalanobis de M4 y D/H, ajustada por edad, sexo, peso y SBP") %>%
  kable_styling(bootstrap_options = c("striped", "hover", "condensed"),
                full_width = FALSE, position = "center")
Tabla 2: Relación entre las distancias de Mahalanobis de M4 y D/H, ajustada por edad, sexo, peso y SBP
Predictor Beta OR IC 95% Inferior IC 95% Superior Valor p AIC BIC
D_M_M4_20var 0.0184 1.0186 1.0036 1.0338 0.0146 303.21 325.29
D_M_M4_varscaled 0.4132 1.5116 1.0849 2.1063 0.0146 303.21 325.29
D_M_M4_varlog10 1.3969 4.0428 1.6267 10.0469 0.0026 300.79 322.87
D_M_M4_varln 0.6067 1.8343 1.2353 2.7238 0.0026 300.79 322.87
DM_M4_20menor_cor 0.0066 1.0066 0.9986 1.0147 0.1075 307.61 329.69
DM_M4_20menor_cor_mayorvar 0.0079 1.0079 0.9997 1.0162 0.0595 306.20 328.28

Tabla 2 ajustada por Edad, Sexo, Peso, SBP y glucosa

# Distancias de Mahal
dist_vars <- c("D_M_M4_20var", "D_M_M4_varscaled", "D_M_M4_varlog10", "D_M_M4_varln", 
               "DM_M4_20menor_cor", "DM_M4_20menor_cor_mayorvar")

# Para guardar resultados
resultados <- list()

# Ajustar modelo para cada distancia por edad y sexo
for (dist in dist_vars) {
  # Asegurar que las columnas sean del tipo correcto
  Basecom2[[dist]] <- as.numeric(Basecom2[[dist]])
  Basecom2$Age <- as.numeric(Basecom2$Age)
  Basecom2$Gender <- as.factor(Basecom2$Gender)
  
  # Igualmente es para evitar error
  formula_logit <- as.formula(paste0("Group_bin ~ `", dist, "` + Age + Gender + Weight + `SBP (mmHg)` + `FBG (mM)` "))
  
  # Ajustar modelo logístico
  modelo <- glm(formula_logit, data = Basecom2, family = binomial())
  
  # Extraer resumen y coeficientes
  coefs <- summary(modelo)$coefficients
  conf <- exp(confint.default(modelo))
  
  # Guardar resultados de las distancias
  beta <- coefs[2, 1]
  OR <- exp(beta)
  
  resultado <- tibble(
    Predictor = dist,
    Beta = round(beta, 4),
    OR = round(OR, 4),
    `IC 95% Inferior` = round(conf[2, 1], 4),
    `IC 95% Superior` = round(conf[2, 2], 4),
    `Valor p` = as.character(
      ifelse(coefs[2, 4] < 0.0001, "<0.0001", round(coefs[2, 4], 4))
    ),
    AIC = round(AIC(modelo), 2),
    BIC = round(BIC(modelo), 2)
  )
  
  resultados[[dist]] <- resultado
}
## Warning: glm.fit: algorithm did not converge
## Warning: glm.fit: fitted probabilities numerically 0 or 1 occurred
## Warning: glm.fit: algorithm did not converge
## Warning: glm.fit: fitted probabilities numerically 0 or 1 occurred
## Warning: glm.fit: algorithm did not converge
## Warning: glm.fit: fitted probabilities numerically 0 or 1 occurred
## Warning: glm.fit: algorithm did not converge
## Warning: glm.fit: fitted probabilities numerically 0 or 1 occurred
## Warning: glm.fit: algorithm did not converge
## Warning: glm.fit: fitted probabilities numerically 0 or 1 occurred
## Warning: glm.fit: algorithm did not converge
## Warning: glm.fit: fitted probabilities numerically 0 or 1 occurred
# Unir resultados
tabla_mahalanobis_ajustada <- bind_rows(resultados)

# Mostrar tabla con kableExtra
tabla_mahalanobis_ajustada %>%
  kable(format = "html",
        caption = "Tabla 2: Relación entre las distancias de Mahalanobis de M4 y D/H, ajustada por edad, sexo, peso, SBP y glucosa") %>%
  kable_styling(bootstrap_options = c("striped", "hover", "condensed"),
                full_width = FALSE, position = "center")
Tabla 2: Relación entre las distancias de Mahalanobis de M4 y D/H, ajustada por edad, sexo, peso, SBP y glucosa
Predictor Beta OR IC 95% Inferior IC 95% Superior Valor p AIC BIC
D_M_M4_20var -0.1556 0.8559 0 Inf 0.9998 14 39.76
D_M_M4_varscaled -3.4906 0.0305 0 Inf 0.9998 14 39.76
D_M_M4_varlog10 -5.5585 0.0039 0 Inf 0.9998 14 39.76
D_M_M4_varln -2.4140 0.0895 0 Inf 0.9998 14 39.76
DM_M4_20menor_cor 0.2107 1.2345 0 6.177617e+136 0.999 14 39.76
DM_M4_20menor_cor_mayorvar 0.2443 1.2768 0 3.646579e+156 0.9989 14 39.76