1. Preparación de los datos

Antes de realizar cualquier análisis, es esencial asegurarse de que los datos estén limpios y en un formato adecuado.

library(readxl)
drnandezmerged <- read_excel("E:\\OneDrive - CINVESTAV\\PROYECTO MDatos\\TRABAJOS\\Dr. Nandez\\drnandezmerged.xlsx")
data<-drnandezmerged
data
## # A tibble: 327 × 24
##    `N/P` NOMBRE    `AP. PATERNO` `AP. MATERNO` TELEFONO DIRECION     EDAD  SEXO
##    <lgl> <chr>     <chr>         <chr>         <lgl>    <chr>       <dbl> <dbl>
##  1 NA    ADELA     SOSA          ZARATE        NA       SALINA CRUZ    57     1
##  2 NA    ADELINA   ARTUZA        GARCIA        NA       SALINA CRUZ    57     1
##  3 NA    ADRIANA   MARQUEZ       DE LA ROSA    NA       SALINA CRUZ    52     1
##  4 NA    AIDE      FRANCO        GARAY         NA       SALINA CRUZ    51     1
##  5 NA    ALBAPETRA GALDAMEZ      GORDILLO      NA       SALINA CRUZ    61     1
##  6 NA    ALBERTINA REYES         TORREZ        NA       SALINA CRUZ    63     1
##  7 NA    ALBERTO   GOYTIA        LUIS          NA       SALINA CRUZ    61     2
##  8 NA    ALBINO    RAMIREZ       ASEL          NA       SALINA CRUZ    65     2
##  9 NA    ALEJANDRA HERNANDEZ     RAMIREZ       NA       SALINA CRUZ    34     1
## 10 NA    ALEJANDRO GONZALEZ      SANCHEZ       NA       SALINA CRUZ    49     2
## # ℹ 317 more rows
## # ℹ 16 more variables: RELIGION <dbl>, ALFABETISMO <dbl>, ESCOLARIDAD <dbl>,
## #   OCUPACION <dbl>, `ESTADO CIVIL` <dbl>, `ACUDE A CITAS MEDICAS` <dbl>,
## #   `JEFE DE FAMILIA` <dbl>, COMORBILIDAD <dbl>, TRATAMIENTO <dbl>,
## #   `TIEMPO DE EVOLUCION DE SU ENFERMEDAD` <dbl>, GLUCOSA <dbl>,
## #   `HEMOGLOBINA GLICOSILADA` <lgl>, PESO <dbl>, TALLA <dbl>, IMC <dbl>,
## #   Puntaje <chr>
# Recodificación

data$SEXO <- factor(data$SEXO, levels=c(1,2), labels=c('FEMENINO', 'MASCULINO'))
data$RELIGION <- factor(data$RELIGION, levels=c(1,2,3,4), labels=c('CATOLICA', 'CRISTIANA', 'ATEA', 'OTRA'))
data$ALFABETISMO <- factor(data$ALFABETISMO, levels=c(1,2), labels=c('ALFABETA', 'ANALFABETA'))
data$ESCOLARIDAD <- factor(data$ESCOLARIDAD, levels=c(1,2,3,4,5,6), labels=c('NINGUNA', 'PRIMARIA', 'PRIMARIA INCOMPLETA', 'SECUNDARIA', 'NIVEL MEDIO SUPERIOR', 'NIVEL SUPERIOR'))
data$OCUPACION <- factor(data$OCUPACION, levels=c(1,2,3,4,5,6), labels=c('OBRERO', 'CAMPESINO', 'PROFESIONISTA', 'COMERCIO INFORMAL', 'AMA DE CASA', 'PENSIONADO'))
data$`ESTADO CIVIL` <- factor(data$`ESTADO CIVIL`, levels=c(1,2,3,4), labels=c('SOLTERO', 'CASADO', 'UNION LIBRE', 'VIUDO/A'))
data$`ACUDE A CITAS MEDICAS` <- factor(data$`ACUDE A CITAS MEDICAS`, levels=c(1,2,3,4), labels=c('SIEMPRE', 'CASI SIEMPRE', 'CASI NUNCA', 'NUNCA'))
data$`JEFE DE FAMILIA` <- factor(data$`JEFE DE FAMILIA`, levels=c(1,2,3,4,5), labels=c('PADRE', 'MADRE', 'PADRE Y MADRE', 'HIJO', 'NO ESTA DEFINIDO'))
data$COMORBILIDAD <- factor(data$COMORBILIDAD, levels=c(1,2,3,4,5), labels=c('HAS', 'Dislipidemia', 'cardiopatia', 'enfermedades tiroideas', 'Otras'))
data$TRATAMIENTO <- factor(data$TRATAMIENTO, levels=c(1,2,3,4,5), labels=c('Glibenclamida', 'Metformina', 'Insulida', 'Dieta', 'Otras'))

data
## # A tibble: 327 × 24
##    `N/P` NOMBRE    `AP. PATERNO` `AP. MATERNO` TELEFONO DIRECION     EDAD SEXO  
##    <lgl> <chr>     <chr>         <chr>         <lgl>    <chr>       <dbl> <fct> 
##  1 NA    ADELA     SOSA          ZARATE        NA       SALINA CRUZ    57 FEMEN…
##  2 NA    ADELINA   ARTUZA        GARCIA        NA       SALINA CRUZ    57 FEMEN…
##  3 NA    ADRIANA   MARQUEZ       DE LA ROSA    NA       SALINA CRUZ    52 FEMEN…
##  4 NA    AIDE      FRANCO        GARAY         NA       SALINA CRUZ    51 FEMEN…
##  5 NA    ALBAPETRA GALDAMEZ      GORDILLO      NA       SALINA CRUZ    61 FEMEN…
##  6 NA    ALBERTINA REYES         TORREZ        NA       SALINA CRUZ    63 FEMEN…
##  7 NA    ALBERTO   GOYTIA        LUIS          NA       SALINA CRUZ    61 MASCU…
##  8 NA    ALBINO    RAMIREZ       ASEL          NA       SALINA CRUZ    65 MASCU…
##  9 NA    ALEJANDRA HERNANDEZ     RAMIREZ       NA       SALINA CRUZ    34 FEMEN…
## 10 NA    ALEJANDRO GONZALEZ      SANCHEZ       NA       SALINA CRUZ    49 MASCU…
## # ℹ 317 more rows
## # ℹ 16 more variables: RELIGION <fct>, ALFABETISMO <fct>, ESCOLARIDAD <fct>,
## #   OCUPACION <fct>, `ESTADO CIVIL` <fct>, `ACUDE A CITAS MEDICAS` <fct>,
## #   `JEFE DE FAMILIA` <fct>, COMORBILIDAD <fct>, TRATAMIENTO <fct>,
## #   `TIEMPO DE EVOLUCION DE SU ENFERMEDAD` <dbl>, GLUCOSA <dbl>,
## #   `HEMOGLOBINA GLICOSILADA` <lgl>, PESO <dbl>, TALLA <dbl>, IMC <dbl>,
## #   Puntaje <chr>
# Guardar el archivo recodificado
#write.csv(data, 'archivo_recodificado.csv', row.names = FALSE)

2. Análisis descriptivo

Esto nos dará una idea general de la distribución de los datos y nos ayudará a identificar cualquier anomalía o valor atípico.

#Paquetes:
library(tidyverse)
## ── Attaching core tidyverse packages ──────────────────────── tidyverse 2.0.0 ──
## ✔ dplyr     1.1.2     ✔ readr     2.1.4
## ✔ forcats   1.0.0     ✔ stringr   1.5.0
## ✔ ggplot2   3.4.2     ✔ tibble    3.2.1
## ✔ lubridate 1.9.2     ✔ tidyr     1.3.0
## ✔ purrr     1.0.1     
## ── Conflicts ────────────────────────────────────────── tidyverse_conflicts() ──
## ✖ dplyr::filter() masks stats::filter()
## ✖ dplyr::lag()    masks stats::lag()
## ℹ Use the conflicted package (<http://conflicted.r-lib.org/>) to force all conflicts to become errors
# Calcular la frecuencia y el porcentaje
apgar_counts <- table(data$`Puntaje`)
apgar_df <- as.data.frame(apgar_counts)
colnames(apgar_df) <- c("Puntaje", "Frecuencia")
apgar_df$Porcentaje <- (apgar_df$Frecuencia / sum(apgar_df$Frecuencia)) * 100

# Realizar la prueba chi cuadrada
chi_test <- chisq.test(apgar_df$Frecuencia)

# Obtener el valor p
p_value <- chi_test$p.value

ggplot(apgar_df, aes(x=Puntaje, y=Frecuencia)) +
  geom_bar(stat="identity", fill="skyblue") +
  geom_text(aes(label=sprintf("%d (%.1f%%)", Frecuencia, Porcentaje)), vjust=-0.5) +
  labs(title="Frecuencia del Puntaje APGAR Familiar", x="Puntaje APGAR", y="Frecuencia", subtitle=sprintf("p-value: %.3f", p_value)) +
  theme_minimal()

Queremos determinar un adecuado control glicemico

Una forma común de determinar el punto de corte es utilizando la mediana de la variable. Sin embargo, si prefieres un valor basado en la evidencia científica o en las recomendaciones clínicas, podemos usar ese valor. Por ejemplo, un nivel de glucosa en ayunas de 100 mg/dL o más podría considerarse “Mal control”, mientras que un valor menor a 100 mg/dL podría considerarse “Buen control”.

Vamos a proceder de la siguiente manera:

  1. Determinar el punto de corte.

  2. Crear una nueva columna en la base de datos “data” que contenga la categorización dicotómica.

A continuación, te muestro cómo hacerlo utilizando un punto de corte de 100 mg/dL:

# Punto de corte
punto_corte <- 100
data$Control_Glucemico <- ifelse(data$GLUCOSA >= punto_corte, "Mal control", "Buen control")
library(ggplot2)
library(ggrepel)
library(stats)

# Calcular frecuencias y porcentajes
control_counts <- as.data.frame(table(data$Control_Glucemico))
control_counts$Porcentaje <- (control_counts$Freq / sum(control_counts$Freq)) * 100

# Calcular el valor p de la prueba chi cuadrada
chi_test <- chisq.test(control_counts$Freq)
p_value <- chi_test$p.value
p_label <- ifelse(p_value < 0.0001, "< 0.0001", sprintf("p = %.4f", p_value))

# Definir paleta de colores
colors <- c("Buen control" = "skyblue3", "Mal control" = "tomato3")

# Crear gráfica de pastel mejorada
# Crear gráfica de pastel con etiquetas fuera y líneas señalando las porciones
ggplot(control_counts, aes(x="", y=Freq, fill=Var1)) +
  geom_bar(width=1, stat="identity", color="white", size=0.5) + # Agregar bordes blancos a las porciones
  coord_polar(theta="y") +
  geom_text_repel(aes(y = Freq/2 + c(0, cumsum(Freq)[-length(Freq)]), 
                     label=sprintf("%s\n(%d, %.1f%%)", Var1, Freq, Porcentaje)), 
                 nudge_x = 1.5, nudge_y = 0.5, direction = "y", 
                 segment.color = "black", size=4, fontface="bold", color="black") + # Ajustar posición y formato del texto con líneas señalando las porciones
  labs(title="Distribución del Control Glucémico", x=NULL, y=NULL) +
  scale_fill_manual(values=colors) + # Usar paleta de colores definida
  theme_minimal() +
  theme(axis.text.x=element_blank(),
        axis.ticks=element_blank(),
        legend.position="none",
        plot.title=element_text(hjust=0.5, size=16, face="bold")) + # Centrar título y ajustar tamaño
  annotate("text", x=1.5, y=max(control_counts$Freq)/3, label=sprintf("valor p = %s", p_label), size=5, color="black", fontface="bold", hjust="right") # Ajustar posición y tamaño del valor p
## Warning: Using `size` aesthetic for lines was deprecated in ggplot2 3.4.0.
## ℹ Please use `linewidth` instead.
## This warning is displayed once every 8 hours.
## Call `lifecycle::last_lifecycle_warnings()` to see where this warning was
## generated.

# Crear gráfico de pastel
grafico_pastel <- ggplot(control_counts, aes(x = "", y = Freq, fill = Var1)) +
  geom_bar(width = 1, stat = "identity",color="white", size=0.5) +
  coord_polar(theta = "y") +
  geom_text(aes(y = cumsum(Freq) - Freq / 2, label = paste0(Freq, " (", round(Porcentaje, 1), "%)")), position = position_stack(vjust = 0.5)) +
  labs(x = NULL, y = NULL, fill = NULL, title = "Distribución del Control Glucémico") +
  theme_minimal() +
  theme(axis.text = element_blank(),
        axis.ticks = element_blank(),
        panel.grid  = element_blank())

# Añadir valor de p al gráfico
grafico_pastel_con_p <- grafico_pastel +
  annotate("text", x = 1.5, y = -1, label=sprintf("Chi-cuadrada: Valor p = %s", p_label), color="black", fontface="bold", hjust = 0.8, vjust = -1)


grafico_pastel_con_p

# 1. Preparar los datos
library(dplyr)
library(ggplot2)

tabla_frecuencia <- data %>%
  group_by(Control_Glucemico) %>%
  summarise(Frecuencia = n()) %>%
  mutate(Porcentaje = (Frecuencia / sum(Frecuencia)) * 100)

# 2. Crear la gráfica de pastel
grafico_pastel <- ggplot(tabla_frecuencia, aes(x="", y=Frecuencia, fill=Control_Glucemico)) +
  geom_bar(width=5, stat="identity") +
  coord_polar(theta="y") +
  geom_text(aes(label=sprintf("%d (%.1f%%)", Frecuencia, Porcentaje)), position=position_stack(vjust=0.5)) +
  labs(title="Distribución de Control Glucémico", x=NULL, y=NULL) +
  theme_minimal() +
  theme(axis.text.x=element_blank())


# 4. Agregar el valor p a la gráfica
grafico_pastel + annotate("text", x=-1.5, y=2, label=sprintf("valor p = <%.3f", chi_test$p.value), size=5,hjust = 0.8, vjust = -1)

library(gtsummary)


data %>%select(EDAD:Control_Glucemico) %>%  tbl_summary(by=Puntaje) %>% add_p() 
## There was an error in 'add_p()/add_difference()' for variable 'ESCOLARIDAD', p-value omitted:
## Error in stats::fisher.test(structure(c(2L, 2L, 4L, 3L, 2L, 1L, 4L, 2L, : FEXACT error 6.  LDKEY=620 is too small for this problem,
##   (ii := key2[itp=429] = 19467185, ldstp=18600)
## Try increasing the size of the workspace and possibly 'mult'
## There was an error in 'add_p()/add_difference()' for variable 'OCUPACION', p-value omitted:
## Error in stats::fisher.test(structure(c(5L, 5L, 5L, 5L, 5L, 5L, 1L, 1L, : FEXACT error 6.  LDKEY=620 is too small for this problem,
##   (ii := key2[itp=682] = 19698078, ldstp=18600)
## Try increasing the size of the workspace and possibly 'mult'
## There was an error in 'add_p()/add_difference()' for variable 'ACUDE A CITAS MEDICAS', p-value omitted:
## Error in stats::fisher.test(structure(c(1L, 1L, 1L, 2L, 1L, 1L, 1L, 1L, : FEXACT error 6 (f5xact).  LDKEY=620 is too small for this problem: kval=1655914.
## Try increasing the size of the workspace.
## There was an error in 'add_p()/add_difference()' for variable 'COMORBILIDAD', p-value omitted:
## Error in stats::fisher.test(structure(c(5L, 5L, 2L, 5L, 5L, 5L, 1L, 5L, : FEXACT error 6.  LDKEY=620 is too small for this problem,
##   (ii := key2[itp=1227] = 16375424, ldstp=18600)
## Try increasing the size of the workspace and possibly 'mult'
## There was an error in 'add_p()/add_difference()' for variable 'TRATAMIENTO', p-value omitted:
## Error in stats::fisher.test(structure(c(2L, 2L, 2L, 2L, 1L, 3L, 3L, 2L, : FEXACT error 6.  LDKEY=620 is too small for this problem,
##   (ii := key2[itp=566] = 19684249, ldstp=18600)
## Try increasing the size of the workspace and possibly 'mult'
## There was an error in 'add_p()/add_difference()' for variable 'HEMOGLOBINA GLICOSILADA', p-value omitted:
## Error in stats::chisq.test(x = c(NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, : 'x' and 'y' must have at least 2 levels
Characteristic Disfunción leve, N = 651 Disfunción moderada, N = 271 Disfunción severa, N = 611 Normal, N = 1741 p-value2
EDAD 57 (53, 62) 58 (52, 61) 57 (51, 61) 58 (53, 62) 0.5
SEXO 0.8
    FEMENINO 42 (65%) 18 (67%) 44 (72%) 123 (71%)
    MASCULINO 23 (35%) 9 (33%) 17 (28%) 51 (29%)
RELIGION 0.7
    CATOLICA 59 (91%) 25 (93%) 57 (93%) 149 (86%)
    CRISTIANA 5 (7.7%) 2 (7.4%) 3 (4.9%) 22 (13%)
    ATEA 0 (0%) 0 (0%) 0 (0%) 0 (0%)
    OTRA 1 (1.5%) 0 (0%) 1 (1.6%) 3 (1.7%)
ALFABETISMO 0.6
    ALFABETA 64 (98%) 27 (100%) 60 (98%) 166 (95%)
    ANALFABETA 1 (1.5%) 0 (0%) 1 (1.6%) 8 (4.6%)
ESCOLARIDAD
    NINGUNA 1 (1.5%) 0 (0%) 1 (1.6%) 4 (2.3%)
    PRIMARIA 26 (40%) 11 (41%) 26 (43%) 86 (49%)
    PRIMARIA INCOMPLETA 9 (14%) 0 (0%) 10 (16%) 16 (9.2%)
    SECUNDARIA 23 (35%) 12 (44%) 22 (36%) 54 (31%)
    NIVEL MEDIO SUPERIOR 4 (6.2%) 0 (0%) 2 (3.3%) 8 (4.6%)
    NIVEL SUPERIOR 2 (3.1%) 4 (15%) 0 (0%) 6 (3.4%)
OCUPACION
    OBRERO 16 (25%) 3 (11%) 13 (21%) 36 (21%)
    CAMPESINO 3 (4.6%) 0 (0%) 1 (1.6%) 4 (2.3%)
    PROFESIONISTA 3 (4.6%) 4 (15%) 3 (4.9%) 6 (3.4%)
    COMERCIO INFORMAL 2 (3.1%) 2 (7.4%) 6 (9.8%) 13 (7.5%)
    AMA DE CASA 35 (54%) 12 (44%) 37 (61%) 94 (54%)
    PENSIONADO 6 (9.2%) 6 (22%) 1 (1.6%) 21 (12%)
ESTADO CIVIL 0.9
    SOLTERO 1 (1.5%) 1 (3.7%) 2 (3.3%) 6 (3.4%)
    CASADO 56 (86%) 25 (93%) 56 (92%) 150 (86%)
    UNION LIBRE 1 (1.5%) 0 (0%) 0 (0%) 5 (2.9%)
    VIUDO/A 7 (11%) 1 (3.7%) 3 (4.9%) 13 (7.5%)
ACUDE A CITAS MEDICAS
    SIEMPRE 42 (65%) 7 (26%) 8 (13%) 162 (93%)
    CASI SIEMPRE 21 (32%) 17 (63%) 23 (38%) 10 (5.7%)
    CASI NUNCA 1 (1.5%) 3 (11%) 30 (49%) 1 (0.6%)
    NUNCA 1 (1.5%) 0 (0%) 0 (0%) 1 (0.6%)
JEFE DE FAMILIA 0.3
    PADRE 54 (83%) 23 (85%) 55 (90%) 150 (86%)
    MADRE 10 (15%) 2 (7.4%) 5 (8.2%) 21 (12%)
    PADRE Y MADRE 1 (1.5%) 2 (7.4%) 0 (0%) 2 (1.1%)
    HIJO 0 (0%) 0 (0%) 1 (1.6%) 0 (0%)
    NO ESTA DEFINIDO 0 (0%) 0 (0%) 0 (0%) 1 (0.6%)
COMORBILIDAD
    HAS 30 (46%) 9 (33%) 25 (41%) 71 (41%)
    Dislipidemia 4 (6.2%) 6 (22%) 11 (18%) 19 (11%)
    cardiopatia 1 (1.5%) 1 (3.7%) 1 (1.6%) 6 (3.4%)
    enfermedades tiroideas 2 (3.1%) 0 (0%) 3 (4.9%) 3 (1.7%)
    Otras 28 (43%) 11 (41%) 21 (34%) 75 (43%)
TRATAMIENTO
    Glibenclamida 3 (4.6%) 1 (3.7%) 4 (6.6%) 13 (7.5%)
    Metformina 38 (58%) 19 (70%) 32 (52%) 116 (67%)
    Insulida 23 (35%) 7 (26%) 24 (39%) 41 (24%)
    Dieta 0 (0%) 0 (0%) 0 (0%) 1 (0.6%)
    Otras 1 (1.5%) 0 (0%) 1 (1.6%) 3 (1.7%)
TIEMPO DE EVOLUCION DE SU ENFERMEDAD 10.0 (7.0, 14.0) 9.0 (2.0, 11.0) 8.0 (5.0, 12.0) 9.0 (6.0, 12.8) 0.2
GLUCOSA 148 (142, 158) 180 (164, 196) 246 (203, 277) 119 (104, 133) <0.001
HEMOGLOBINA GLICOSILADA 0 (NA%) 0 (NA%) 0 (NA%) 0 (NA%)
    Unknown 65 27 61 174
PESO 537 (76, 722) 511 (75, 677) 599 (78, 735) 93 (67, 670) 0.10
TALLA 155 (145, 162) 152 (145, 163) 155 (148, 159) 154 (146, 159) >0.9
IMC 278 (236, 317) 267 (234, 304) 277 (241, 331) 275 (235, 306) 0.8
Control_Glucemico <0.001
    Buen control 1 (1.5%) 0 (0%) 0 (0%) 28 (16%)
    Mal control 64 (98%) 27 (100%) 61 (100%) 146 (84%)
1 Median (IQR); n (%)
2 Kruskal-Wallis rank sum test; Pearson’s Chi-squared test; Fisher’s exact test
glimpse(data)
## Rows: 327
## Columns: 25
## $ `N/P`                                  <lgl> NA, NA, NA, NA, NA, NA, NA, NA,…
## $ NOMBRE                                 <chr> "ADELA", "ADELINA", "ADRIANA", …
## $ `AP. PATERNO`                          <chr> "SOSA", "ARTUZA", "MARQUEZ", "F…
## $ `AP. MATERNO`                          <chr> "ZARATE", "GARCIA", "DE LA ROSA…
## $ TELEFONO                               <lgl> NA, NA, NA, NA, NA, NA, NA, NA,…
## $ DIRECION                               <chr> "SALINA CRUZ", "SALINA CRUZ", "…
## $ EDAD                                   <dbl> 57, 57, 52, 51, 61, 63, 61, 65,…
## $ SEXO                                   <fct> FEMENINO, FEMENINO, FEMENINO, F…
## $ RELIGION                               <fct> CATOLICA, CRISTIANA, CATOLICA, …
## $ ALFABETISMO                            <fct> ALFABETA, ALFABETA, ALFABETA, A…
## $ ESCOLARIDAD                            <fct> PRIMARIA, PRIMARIA, SECUNDARIA,…
## $ OCUPACION                              <fct> AMA DE CASA, AMA DE CASA, AMA D…
## $ `ESTADO CIVIL`                         <fct> CASADO, CASADO, CASADO, CASADO,…
## $ `ACUDE A CITAS MEDICAS`                <fct> SIEMPRE, SIEMPRE, SIEMPRE, CASI…
## $ `JEFE DE FAMILIA`                      <fct> PADRE, PADRE, PADRE, PADRE, PAD…
## $ COMORBILIDAD                           <fct> Otras, Otras, Dislipidemia, Otr…
## $ TRATAMIENTO                            <fct> Metformina, Metformina, Metform…
## $ `TIEMPO DE EVOLUCION DE SU ENFERMEDAD` <dbl> 8, 3, 9, 8, 1, 20, 19, 10, 5, 1…
## $ GLUCOSA                                <dbl> 135, 126, 93, 152, 100, 136, 10…
## $ `HEMOGLOBINA GLICOSILADA`              <lgl> NA, NA, NA, NA, NA, NA, NA, NA,…
## $ PESO                                   <dbl> 57, 53, 673, 824, 80, 64, 82, 8…
## $ TALLA                                  <dbl> 156, 157, 156, 168, 149, 16, 16…
## $ IMC                                    <dbl> 234, 215, 276, 292, 36, 25, 32,…
## $ Puntaje                                <chr> "Normal", "Normal", "Normal", "…
## $ Control_Glucemico                      <chr> "Mal control", "Mal control", "…

código creará un boxplot donde el eje Y representa los niveles de glucosa y el eje X representa las categorías del APGAR familiar. Los boxplots estarán coloreados según el control glucémico (buen control vs. mal control). Además, se agregará la significancia estadística entre los grupos según el APGAR familiar utilizando una prueba t. Si deseas utilizar otra prueba estadística, simplemente cambia el argumento method en stat_compare_means.

# Cargar las bibliotecas necesarias
library(ggplot2)
library(ggpubr)

# Leer los datos (asumiendo que ya están cargados en una variable llamada datos)

# Crear el boxplot
p <- ggplot(data, aes(x = Puntaje, y = GLUCOSA)) +
  geom_boxplot(fill="skyblue") +
  labs(title = "Niveles de glucosa según APGAR familiar",
       x = "APGAR familiar",
       y = "Glucosa (mg/dL)") +
  theme_minimal()


# Realizar las comparaciones múltiples con referencia al grupo "Normal"
comparaciones <- list( c("Normal", "Disfunción leve"), 
                       c("Normal", "Disfunción moderada"), 
                       c("Normal", "Disfunción severa") )

p+stat_compare_means(comparisons = comparaciones,label = "p.signif")+ # Add pairwise comparisons p-value
  stat_compare_means(label.y = 50)     # Add global p-value

# Realizar las comparaciones múltiples con referencia al grupo "Normal"
comparaciones <- list( c("Normal", "Disfunción leve"), 
                       c("Normal", "Disfunción moderada"), 
                       c("Normal", "Disfunción severa") )

p+stat_compare_means(comparisons = comparaciones,label = "p.signif")+ # Add pairwise comparisons p-value
  stat_compare_means(label.y = 50)     # Add global p-value

Asociar el control glucémico con la función familiar con otras variables: Utilizaremos una regresión logística ya que el control glucémico (buen control vs. mal control) es una variable binaria.

Realizar un análisis multivariado utilizando regresión logística múltiple. Asumiré que el control glucémico (por ejemplo, “Buen control” vs. “Mal control”) es tu variable dependiente binaria y que deseas investigar cómo las otras variables (edad, sexo, religión, etc.) influyen en el control glucémico ajustando por factores de confusión.

data %>% select(Control_Glucemico, Puntaje) %>% tbl_summary(by= Control_Glucemico) %>% add_p() %>% add_overall()
Characteristic Overall, N = 3271 Buen control, N = 291 Mal control, N = 2981 p-value2
Puntaje <0.001
    Disfunción leve 65 (20%) 1 (3.4%) 64 (21%)
    Disfunción moderada 27 (8.3%) 0 (0%) 27 (9.1%)
    Disfunción severa 61 (19%) 0 (0%) 61 (20%)
    Normal 174 (53%) 28 (97%) 146 (49%)
1 n (%)
2 Fisher’s exact test
# Cargar la biblioteca necesaria
#install.packages("glm2")
library(glm2)

# Asumiendo que tu dataframe se llama 'data' y que 'Control_Glucemico_Dicotomizado' es tu variable dependiente binaria
# Convertir la variable dependiente a factor (si aún no lo es)
data$CControl_Glucemico <- as.factor(data$Control_Glucemico)

# Recodificar la variable dependiente
datarlog <- data %>% mutate(Control_Glucemico = ifelse (Control_Glucemico == "Mal control", 1, 0))


# Realizar la regresión logística múltiple
modelo <- glm(Control_Glucemico ~ EDAD + SEXO + RELIGION + ESCOLARIDAD + OCUPACION + 
               `ESTADO CIVIL` + COMORBILIDAD + TRATAMIENTO  + Puntaje, 
               family = binomial(link = "logit"), data = datarlog)
## Warning: glm.fit: fitted probabilities numerically 0 or 1 occurred
# Ver el resumen del modelo
summary(modelo)
## 
## Call:
## glm(formula = Control_Glucemico ~ EDAD + SEXO + RELIGION + ESCOLARIDAD + 
##     OCUPACION + `ESTADO CIVIL` + COMORBILIDAD + TRATAMIENTO + 
##     Puntaje, family = binomial(link = "logit"), data = datarlog)
## 
## Coefficients:
##                                      Estimate Std. Error z value Pr(>|z|)   
## (Intercept)                         3.236e+00  2.569e+00   1.260  0.20778   
## EDAD                                4.595e-03  1.349e-02   0.341  0.73333   
## SEXOMASCULINO                       7.635e-01  8.276e-01   0.923  0.35624   
## RELIGIONCRISTIANA                  -1.717e+00  5.820e-01  -2.950  0.00318 **
## RELIGIONOTRA                        1.643e+01  6.782e+03   0.002  0.99807   
## ESCOLARIDADPRIMARIA                 3.108e-01  1.286e+00   0.242  0.80904   
## ESCOLARIDADPRIMARIA INCOMPLETA      6.446e-01  1.484e+00   0.435  0.66391   
## ESCOLARIDADSECUNDARIA               5.323e-01  1.436e+00   0.371  0.71088   
## ESCOLARIDADNIVEL MEDIO SUPERIOR     5.160e-01  1.828e+00   0.282  0.77769   
## ESCOLARIDADNIVEL SUPERIOR           3.558e+00  2.972e+00   1.197  0.23124   
## OCUPACIONCAMPESINO                 -9.651e-02  1.592e+00  -0.061  0.95166   
## OCUPACIONPROFESIONISTA             -3.617e+00  2.255e+00  -1.604  0.10865   
## OCUPACIONCOMERCIO INFORMAL          8.109e-02  1.109e+00   0.073  0.94171   
## OCUPACIONAMA DE CASA                9.969e-01  1.060e+00   0.940  0.34706   
## OCUPACIONPENSIONADO                 5.416e-01  1.017e+00   0.533  0.59424   
## `ESTADO CIVIL`CASADO               -9.699e-01  1.425e+00  -0.681  0.49600   
## `ESTADO CIVIL`UNION LIBRE           1.819e+01  6.225e+03   0.003  0.99767   
## `ESTADO CIVIL`VIUDO/A              -7.252e-01  1.611e+00  -0.450  0.65262   
## COMORBILIDADDislipidemia           -1.394e-01  7.658e-01  -0.182  0.85553   
## COMORBILIDADcardiopatia             1.817e+01  5.065e+03   0.004  0.99714   
## COMORBILIDADenfermedades tiroideas -1.771e+00  1.371e+00  -1.292  0.19652   
## COMORBILIDADOtras                   2.175e-01  5.713e-01   0.381  0.70336   
## TRATAMIENTOMetformina               1.191e+00  7.696e-01   1.547  0.12184   
## TRATAMIENTOInsulida                 7.976e-01  8.747e-01   0.912  0.36187   
## TRATAMIENTODieta                   -2.083e+01  1.773e+04  -0.001  0.99906   
## TRATAMIENTOOtras                    1.890e+01  6.677e+03   0.003  0.99774   
## PuntajeDisfunción moderada          1.610e+01  3.230e+03   0.005  0.99602   
## PuntajeDisfunción severa            1.679e+01  2.026e+03   0.008  0.99339   
## PuntajeNormal                      -2.856e+00  1.137e+00  -2.512  0.01199 * 
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## (Dispersion parameter for binomial family taken to be 1)
## 
##     Null deviance: 195.86  on 326  degrees of freedom
## Residual deviance: 137.46  on 298  degrees of freedom
## AIC: 195.46
## 
## Number of Fisher Scoring iterations: 19
# Instalar y cargar los paquetes necesarios
library(gtsummary)

# Realizar la regresión logística univariada para cada variable independiente
modelo_univariado_EDAD <- glm(Control_Glucemico ~ EDAD, family = binomial(link = "logit"), data = datarlog)
modelo_univariado_SEXO <- glm(Control_Glucemico ~ SEXO, family = binomial(link = "logit"), data = datarlog)
modelo_univariado_RELIGION <- glm(Control_Glucemico ~ RELIGION, family = binomial(link = "logit"), data = datarlog)
modelo_univariado_ESCOLARIDAD <- glm(Control_Glucemico ~ ESCOLARIDAD, family = binomial(link = "logit"), data = datarlog)
modelo_univariado_OCUPACION <- glm(Control_Glucemico ~ OCUPACION, family = binomial(link = "logit"), data = datarlog)
modelo_univariado_ESTADO_CIVIL <- glm(Control_Glucemico ~ `ESTADO CIVIL`, family = binomial(link = "logit"), data = datarlog)
modelo_univariado_COMORBILIDAD <- glm(Control_Glucemico ~ COMORBILIDAD, family = binomial(link = "logit"), data = datarlog)
modelo_univariado_TRATAMIENTO <- glm(Control_Glucemico ~ TRATAMIENTO, family = binomial(link = "logit"), data = datarlog)
modelo_univariado_Puntaje <- glm(Control_Glucemico ~ Puntaje, family = binomial(link = "logit"), data = datarlog)

# Crear tablas individuales para cada modelo univariado
tabla_EDAD <- tbl_regression(modelo_univariado_EDAD)
tabla_SEXO <- tbl_regression(modelo_univariado_SEXO)
tabla_RELIGION <- tbl_regression(modelo_univariado_RELIGION)
tabla_ESCOLARIDAD <- tbl_regression(modelo_univariado_ESCOLARIDAD)
tabla_OCUPACION <- tbl_regression(modelo_univariado_OCUPACION)
tabla_ESTADO_CIVIL <- tbl_regression(modelo_univariado_ESTADO_CIVIL)
tabla_COMORBILIDAD <- tbl_regression(modelo_univariado_COMORBILIDAD)
tabla_TRATAMIENTO <- tbl_regression(modelo_univariado_TRATAMIENTO)
tabla_Puntaje <- tbl_regression(modelo_univariado_Puntaje)

# Realizar la regresión logística multivariada
modelo_multivariado <- glm(Control_Glucemico ~ EDAD + SEXO + RELIGION + ESCOLARIDAD + OCUPACION + COMORBILIDAD + TRATAMIENTO  + Puntaje, 
               family = binomial(link = "logit"), data = datarlog)

# Crear una tabla para el modelo multivariado
tabla_multivariado <- tbl_regression(modelo_multivariado)

# Combinar todas las tablas en una sola
tabla_combinada <- tbl_merge(
  list(
    "EDAD" = tabla_EDAD,
    "SEXO" = tabla_SEXO,
    "RELIGION" = tabla_RELIGION,
    "ESCOLARIDAD" = tabla_ESCOLARIDAD,
    "OCUPACION" = tabla_OCUPACION,
    "COMORBILIDAD" = tabla_COMORBILIDAD,
    "TRATAMIENTO" = tabla_TRATAMIENTO,
    "Puntaje" = tabla_Puntaje,
    "Multivariado" = tabla_multivariado
  )
)

# Crear una tabla resumen para cada modelo univariado
tabla_univariada <- tbl_uvregression(
  method = glm,
  y = Control_Glucemico,
  family = binomial(link = "logit"),
  data = datarlog,
  include = c(EDAD, SEXO, RELIGION, ESCOLARIDAD, OCUPACION, COMORBILIDAD, TRATAMIENTO, Puntaje)
)
## ! `broom::tidy()` failed to tidy the model.
## ✔ `tidy_parameters()` used instead.
## ℹ Add `tidy_fun = broom.helpers::tidy_parameters` to quiet these messages.
## ! `broom::tidy()` failed to tidy the model.
## ✔ `tidy_parameters()` used instead.
## ℹ Add `tidy_fun = broom.helpers::tidy_parameters` to quiet these messages.
## ! `broom::tidy()` failed to tidy the model.
## ✔ `tidy_parameters()` used instead.
## ℹ Add `tidy_fun = broom.helpers::tidy_parameters` to quiet these messages.
## ! `broom::tidy()` failed to tidy the model.
## ✔ `tidy_parameters()` used instead.
## ℹ Add `tidy_fun = broom.helpers::tidy_parameters` to quiet these messages.
## ! `broom::tidy()` failed to tidy the model.
## ✔ `tidy_parameters()` used instead.
## ℹ Add `tidy_fun = broom.helpers::tidy_parameters` to quiet these messages.
## ! `broom::tidy()` failed to tidy the model.
## ✔ `tidy_parameters()` used instead.
## ℹ Add `tidy_fun = broom.helpers::tidy_parameters` to quiet these messages.
## ! `broom::tidy()` failed to tidy the model.
## ✔ `tidy_parameters()` used instead.
## ℹ Add `tidy_fun = broom.helpers::tidy_parameters` to quiet these messages.
## ! `broom::tidy()` failed to tidy the model.
## ✔ `tidy_parameters()` used instead.
## ℹ Add `tidy_fun = broom.helpers::tidy_parameters` to quiet these messages.
# Combinar los resultados de los modelos univariados con el modelo multivariado
tabla_combinada <- tbl_merge(
  list(
    "Univariado" = tabla_univariada,
    "Multivariado" = tbl_regression(modelo_multivariado)),
    tab_spanner = c("**Análisis Univariado**","**Análisis Multivariado**")
  )


# Imprimir la tabla combinada
tabla_combinada
Characteristic Análisis Univariado Análisis Multivariado
N Beta 95% CI1 p-value log(OR)1 95% CI1 p-value
EDAD 327 0.00 0.00, 0.00 0.7 0.01 -0.01, 0.07 0.7
SEXO 327
    FEMENINO
    MASCULINO 0.03 -0.04, 0.09 0.4 0.82 -0.79, 2.5 0.3
RELIGION 327
    CATOLICA
    CRISTIANA -0.18 -0.28, -0.08 <0.001 -1.6 -2.6, -0.45 0.005
    OTRA 0.07 -0.18, 0.32 0.6 17 -279, 2,340 >0.9
ESCOLARIDAD 327
    NINGUNA
    PRIMARIA 0.07 -0.17, 0.30 0.6 0.33 -2.8, 2.6 0.8
    PRIMARIA INCOMPLETA 0.11 -0.14, 0.36 0.4 0.69 -2.7, 3.5 0.6
    SECUNDARIA 0.09 -0.14, 0.33 0.4 0.49 -2.8, 3.1 0.7
    NIVEL MEDIO SUPERIOR 0.02 -0.25, 0.30 0.9 0.53 -3.2, 4.3 0.8
    NIVEL SUPERIOR 0.08 -0.20, 0.36 0.6 4.3 -1.3, 10 0.14
OCUPACION 327
    OBRERO
    CAMPESINO -0.05 -0.26, 0.16 0.6 -0.20 -3.1, 3.4 0.9
    PROFESIONISTA -0.05 -0.21, 0.10 0.5 -3.6 -8.5, 0.60 0.10
    COMERCIO INFORMAL -0.10 -0.24, 0.03 0.15 0.11 -1.9, 2.3 >0.9
    AMA DE CASA -0.01 -0.08, 0.07 0.9 1.0 -1.0, 3.1 0.3
    PENSIONADO -0.01 -0.13, 0.10 0.8 0.63 -1.3, 2.8 0.5
COMORBILIDAD 327
    HAS
    Dislipidemia 0.01 -0.09, 0.11 0.8 -0.15 -1.6, 1.5 0.8
    cardiopatia 0.09 -0.10, 0.28 0.4 18 -230, 1,540 >0.9
    enfermedades tiroideas -0.04 -0.24, 0.17 0.7 -1.3 -3.8, 1.9 0.3
    Otras -0.01 -0.08, 0.06 0.8 0.22 -0.89, 1.4 0.7
TRATAMIENTO 327
    Glibenclamida
    Metformina 0.11 -0.01, 0.24 0.080 1.1 -0.43, 2.5 0.14
    Insulida 0.11 -0.03, 0.24 0.12 0.67 -1.0, 2.3 0.4
    Dieta -0.81 -1.4, -0.25 0.005 -21 >0.9
    Otras 0.19 -0.08, 0.46 0.2 19 -301, 2,099 >0.9
Puntaje 327
    Disfunción leve
    Disfunción moderada 0.02 -0.11, 0.14 0.8 16 -137, 1,032 >0.9
    Disfunción severa 0.02 -0.08, 0.11 0.8 17 -76, 653 >0.9
    Normal -0.15 -0.22, -0.07 <0.001 -2.7 -5.8, -1.0 0.014
1 CI = Confidence Interval, OR = Odds Ratio
library(writexl)
# Guardar el dataframe en un archivo Excel
write_xlsx(data, "dfdrfelicianomdatos.xlsx")