1. Introducción

Este conjunto de datos fue generado con el objetivo de simular información clínica destinada a predecir la presencia de diabetes en mujeres adultas. La población estudiada comprende mujeres entre 20 y 60 años de edad, todas con al menos un embarazo previo. Las variables consideradas incluyen características antropométricas y antecedentes de salud relevantes: índice de masa corporal (BMI), nivel de glucosa en sangre, edad, antecedentes familiares de diabetes y tipo de alimentación. Estas mediciones buscan aproximar factores de riesgo conocidos en el desarrollo de la enfermedad, permitiendo evaluar su asociación con la probabilidad de diagnóstico de diabetes en esta población.

Variables

Variable Tipo Descripción
Diabetes Numérica (0 = No, 1 = Sí) Indicador de diagnóstico de diabetes en la paciente.
BMI Numérica continua Índice de masa corporal (kg/m²) de la paciente.
Antecedentes Categórica (Sí / No) Presencia de antecedentes familiares de diabetes.
Alimentacion Categórica (3 niveles) Tipo de alimentación reportada: Saludable, Intermedia o No saludable.
Edad Numérica continua Edad de la paciente (años), comprendida entre 20 y 60 años.
Glucosa Numérica continua Concentración de glucosa en sangre medida en mg/dL.

Lectura y limpieza de datos

library(readxl)
datos5 <- read_excel("datos5.xlsx")
datos5 <- na.omit(datos5)
head(datos5)
## # A tibble: 6 × 6
##   Diabetes Antecedentes Alimentacion   BMI Glucosa  Edad
##      <dbl> <chr>        <chr>        <dbl>   <dbl> <dbl>
## 1        0 No           Saludable     30.2    86.2    28
## 2        1 Si           Intermedia    33.2   115.     44
## 3        0 Si           Saludable     23.1   134.     41
## 4        1 Si           No saludable  35.2    86.7    50
## 5        1 Si           Intermedia    30.3   101.     49
## 6        1 No           No saludable  38.2    97.8    20

2. Modelo Poisson con Varianza Robusta

modelo_poisson <- glm(Diabetes ~ BMI + Antecedentes + Alimentacion+Edad+Glucosa, family = poisson(link = "log"),data = datos5)

\[ \begin{aligned} \log ({ E( \operatorname{Diabetes} ) }) &= \beta_{0} + \beta_{1}(\operatorname{BMI}) + \beta_{2}(\operatorname{Antecedentes}_{\operatorname{Si}}) + \beta_{3}(\operatorname{Alimentacion}_{\operatorname{No\ saludable}})\ + \\ &\quad \beta_{4}(\operatorname{Alimentacion}_{\operatorname{Saludable}}) + \beta_{5}(\operatorname{Edad}) + \beta_{6}(\operatorname{Glucosa}) \end{aligned} \]

Reemplazando

\[ \begin{aligned} \log ({ \widehat{E( \operatorname{Diabetes} )} }) &= -0.09 + 0(\operatorname{BMI}) + 0.02(\operatorname{Antecedentes}_{\operatorname{Si}}) + 0(\operatorname{Alimentacion}_{\operatorname{No\ saludable}})\ + \\ &\quad 0(\operatorname{Alimentacion}_{\operatorname{Saludable}}) + 0(\operatorname{Edad}) + 0(\operatorname{Glucosa}) \end{aligned} \]

Verificación del modelo

# Verificación del modelo
check_model(modelo_poisson)

Visualización de efectos

fancy_plot = ggeffect(modelo_poisson) |> plot() |> plot_grid()

Errores estándar robustos

se_robust <- sqrt(diag(sandwich(modelo_poisson)))
se_robust
##              (Intercept)                      BMI           AntecedentesSi 
##              0.165912046              0.002788761              0.035243740 
## AlimentacionNo saludable    AlimentacionSaludable                     Edad 
##              0.034495575              0.053985600              0.001512368 
##                  Glucosa 
##              0.000662932

Riesgo relativo aproximado

exp(coef(modelo_poisson))
##              (Intercept)                      BMI           AntecedentesSi 
##                0.2403564                1.0091694                0.8684073 
## AlimentacionNo saludable    AlimentacionSaludable                     Edad 
##                1.1338673                0.7882504                1.0094810 
##                  Glucosa 
##                1.0052491

Contrastes de Pares entre Antecedentes (Modelo de Poisson)

emmeans(modelo_poisson, pairwise ~ Antecedentes,
        type = 'response', infer = T)
## $emmeans
##  Antecedentes  rate     SE  df asymp.LCL asymp.UCL null z.ratio p.value
##  No           0.852 0.0558 Inf     0.750     0.969    1  -2.440  0.0147
##  Si           0.740 0.0519 Inf     0.645     0.849    1  -4.290  <.0001
## 
## Results are averaged over the levels of: Alimentacion 
## Confidence level used: 0.95 
## Intervals are back-transformed from the log scale 
## Tests are performed on the log scale 
## 
## $contrasts
##  contrast ratio    SE  df asymp.LCL asymp.UCL null z.ratio p.value
##  No / Si   1.15 0.109 Inf     0.957      1.39    1   1.493  0.1355
## 
## Results are averaged over the levels of: Alimentacion 
## Confidence level used: 0.95 
## Intervals are back-transformed from the log scale 
## Tests are performed on the log scale

Tabla resumen

nice_table = tbl_regression(modelo_poisson,
                            exponentiate = TRUE,
                            add_pairwise_contrasts = TRUE,
                            weights= 'prop',
                            pairwise_reverse = FALSE) |>
  
  # pimp your table
  add_significance_stars(hide_p = FALSE, hide_se = TRUE, hide_ci = FALSE) |>
  modify_header(label = '**Predictor**') |>
  modify_caption('Table 1. Nice looking table!') |>
  modify_footnote(abbreviation = TRUE) |>
  bold_labels() |>
  italicize_levels() |>
  bold_p()
tidy_fun = broom.helpers::tidy_parameters
nice_table
Table 1. Nice looking table!
Predictor IRR1 95% CI p-value
BMI 1.01 0.99, 1.02 0.2
Antecedentes


    No / Si 1.15 0.96, 1.39 0.14
Alimentacion


    Intermedia / No saludable 0.88 0.68, 1.14 0.5
    Intermedia / Saludable 1.27 0.95, 1.69 0.13
    No saludable / Saludable 1.44** 1.09, 1.90 0.006
Edad 1.01* 1.00, 1.02 0.017
Glucosa 1.01*** 1.00, 1.01 <0.001
Abbreviations: CI = Confidence Interval, IRR = Incidence Rate Ratio
1 *p<0.05; **p<0.01; ***p<0.001

3. Modelo Logistico Binomial

library(logbin)
modelo_logbin <- logbin(Diabetes ~ Antecedentes+ Alimentacion + BMI+ Edad + Glucosa, data = datos5)

\[ \begin{aligned} \operatorname{Diabetes} &\sim Bernoulli\left(\operatorname{prob}_{\operatorname{Diabetes} = \operatorname{1}}= \hat{P}\right) \\ \log ({ \hat{P} }) &= \beta_{0} + \beta_{1}(\operatorname{BMI}) + \beta_{2}(\operatorname{Antecedentes}_{\operatorname{Si}}) + \beta_{3}(\operatorname{Alimentacion}_{\operatorname{No\ saludable}})\ + \\ &\quad \beta_{4}(\operatorname{Alimentacion}_{\operatorname{Saludable}}) + \beta_{5}(\operatorname{Edad}) + \beta_{6}(\operatorname{Glucosa}) \end{aligned} \]

Reemplazando

\[ \begin{aligned} \operatorname{Diabetes} &\sim Bernoulli\left(\operatorname{prob}_{\operatorname{Diabetes} = \operatorname{1}}= \hat{P}\right) \\ \log ({ \hat{P} }) &= -0.07 + 0.02(\operatorname{Antecedentes}_{\operatorname{Si}}) - 0.01(\operatorname{Alimentacion}_{\operatorname{No\ saludable}}) + 0(\operatorname{Alimentacion}_{\operatorname{Saludable}})\ + \\ &\quad 0(\operatorname{BMI}) + 0(\operatorname{Edad}) + 0(\operatorname{Glucosa}) \end{aligned} \]

Tabla resumen

nice_table = tbl_regression(modelo_logbin,
                            exponentiate = TRUE,
                            add_pairwise_contrasts = TRUE,
                            weights= 'prop',
                            pairwise_reverse = FALSE) |>
  
  # pimp your table
  add_significance_stars(hide_p = FALSE, hide_se = TRUE, hide_ci = FALSE) |>
  modify_header(label = '**Predictor**') |>
  modify_caption('Table 1. Nice looking table!') |>
  modify_footnote(abbreviation = TRUE) |>
  bold_labels() |>
  italicize_levels() |>
  bold_p()
tidy_fun = broom.helpers::tidy_parameters
nice_table
Table 1. Nice looking table!
Predictor RR1 95% CI p-value
Antecedentes


    No / Si 1.03

Alimentacion


    Intermedia / No saludable 0.95

    Intermedia / Saludable 1.25

    No saludable / Saludable 1.31

BMI 1.00

Edad 1.00

Glucosa 1.00

Abbreviations: CI = Confidence Interval, RR = Relative Risk
1 *p<0.05; **p<0.01; ***p<0.001

4. Comparación Final

RR_logbin <- exp(coef(modelo_logbin))
RR_poisson <- exp(coef(modelo_poisson))

comparacion_RR <- data.frame(
  Variable = names(RR_poisson),
  RR_Poisson = round(RR_poisson,3),
  RR_LogBinomial = round(RR_logbin,3)
)

print(comparacion_RR)
##                                          Variable RR_Poisson RR_LogBinomial
## (Intercept)                           (Intercept)      0.240          0.732
## BMI                                           BMI      1.009          0.969
## AntecedentesSi                     AntecedentesSi      0.868          1.048
## AlimentacionNo saludable AlimentacionNo saludable      1.134          0.800
## AlimentacionSaludable       AlimentacionSaludable      0.788          1.000
## Edad                                         Edad      1.009          1.004
## Glucosa                                   Glucosa      1.005          1.000