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.

# 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=1, 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, y=3, label=sprintf("valor p = <%.3f", chi_test$p.value), size=5)

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