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.
# 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 | |||||