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)
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:
Determinar el punto de corte.
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=-1, 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.
# 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 | |||||||