El conjunto de datos “Datos_practica” fue generado utilizando simulaciones de datos en el lenguaje de R Studio (ver código utilizado debajo), en ese sentido, estos datos solo deben ser usados con fines académicos, no pueden ser utilizados para hacer inferencias ni podrán ser extrapolados para otras poblaciones u otros contextos diferentes al objetivo de la sesión.
Este conjunto de datos fue generado con 100 registros y 17 variables, entre estas se incluyen tanto variables numéricas como categóricas, relevantes para un contexto biomédico. Estas variables son descritas a continuación:
Solo si no han sido previamente instaladas, favor de instalar las siguientes librerías, las cuales serán necesarias para realizar este taller.
install.packages("dplyr")
install.packages("table1")
install.packages("ggplot2")
# Cargar las librerías necesarias
library(dplyr)
library(table1)
library(ggplot2)
# Establecer la semilla para la reproducibilidad
set.seed(16)
# Definir número de registros
n <- 100
# Generando los vectores de datos
ID <- 1:n
Edad <- sample(20:69, n, replace = TRUE)
Género <- sample(c("Masculino", "Femenino"), n, replace = TRUE)
Peso <- round(runif(n, 50, 100), 1)
Altura <- round(runif(n, 1.5, 2.0), 2)
IMC <- round(runif(n, 18, 35), 1)
Fumador <- sample(c("Sí", "No"), n, replace = TRUE)
Presión_Sistólica <- sample(100:179, n, replace = TRUE)
Presión_Diastólica <- sample(60:119, n, replace = TRUE)
Colesterol <- round(runif(n, 150, 250), 1)
Diabetes <- sample(c("Sí", "No"), n, replace = TRUE)
Actividad_Física <- sample(c("Baja", "Moderada", "Alta"), n, replace = TRUE)
Ingreso_Mensual <- round(runif(n, 1000, 5000), 2)
Nivel_Educativo <- sample(c("Primaria", "Secundaria", "Universitaria"), n, replace = TRUE)
Satisfacción_con_la_Salud <- sample(c("Baja", "Media", "Alta"), n, replace = TRUE)
Medico_1 <- sample(c("Presente", "Ausente"), n, replace = TRUE)
Medico_2 <- sample(c("Presente", "Ausente"), n, replace = TRUE)
# Crear el data frame
datos <- data.frame(
ID,
Edad,
Género,
Peso,
Altura,
IMC,
Fumador,
Presión_Sistólica,
Presión_Diastólica,
Colesterol,
Diabetes,
Actividad_Física,
Ingreso_Mensual,
Nivel_Educativo,
Satisfacción_con_la_Salud,
Medico_1,
Medico_2
)
# Recodificación de variables categóricas a factores
datos$Género <- factor(datos$Género, levels = c("Masculino", "Femenino"))
datos$Fumador <- factor(datos$Fumador, levels = c("Sí", "No"))
datos$Diabetes <- factor(datos$Diabetes, levels = c("Sí", "No"))
datos$Actividad_Física <- ordered(datos$Actividad_Física, levels = c("Baja", "Moderada", "Alta"))
datos$Nivel_Educativo <- ordered(datos$Nivel_Educativo, levels = c("Primaria", "Secundaria", "Universitaria"))
datos$Satisfacción_con_la_Salud <- ordered(datos$Satisfacción_con_la_Salud, levels = c("Baja", "Media", "Alta"))
datos$Medico_1 <- factor(datos$Medico_1, levels = c("Presente", "Ausente"))
datos$Medico_2 <- factor(datos$Medico_2, levels = c("Presente", "Ausente"))
# Estadísticas descriptivas para la variable edad
summary(datos$Edad)
## Min. 1st Qu. Median Mean 3rd Qu. Max.
## 20.00 30.75 43.50 44.15 58.25 69.00
# Realizando un histograma para la variable edad
hist(datos$Edad)
# Histograma para la variable edad
boxplot(datos$Edad)
# Tabla para conocer el recuento de las variables categóricas
table(datos$Género)
##
## Masculino Femenino
## 42 58
prop.table(table(datos$Género))
##
## Masculino Femenino
## 0.42 0.58
# Gráfico para un análisis visual del recuento sobre las variables categóricas
plot(datos$Género)
A continuación, haremos uso de la función cut
de la
librería base
para recodificar la variable IMC en
categorías basadas en los humbrales definidos del índice de masa
corporal:
# Recodificación de la variable IMC en categorías
datos$IMC_Categoría <- cut(datos$IMC,
breaks = c(-Inf, 18.5, 24.9, 29.9, Inf),
labels = c("Bajo peso", "Peso normal", "Sobrepeso", "Obesidad"))
# Verificar la nueva variable
table(datos$IMC_Categoría)
##
## Bajo peso Peso normal Sobrepeso Obesidad
## 3 41 29 27
prop.table(table(datos$IMC_Categoría))
##
## Bajo peso Peso normal Sobrepeso Obesidad
## 0.03 0.41 0.29 0.27
Utilizando la función table1
de la librería que lleva su
mismo nombre (table1
), realizaremos un análisis
descriptivo.
# Análisis descriptivo
table1(~ Edad + Género + Nivel_Educativo + Ingreso_Mensual + Peso + Altura +
IMC + IMC_Categoría + Fumador + Presión_Sistólica + Presión_Diastólica +
Colesterol + Diabetes + Actividad_Física + Satisfacción_con_la_Salud +
Medico_1 + Medico_2,
data = datos)
Overall (N=100) |
|
---|---|
Edad | |
Mean (SD) | 44.2 (15.1) |
Median [Min, Max] | 43.5 [20.0, 69.0] |
Género | |
Masculino | 42 (42.0%) |
Femenino | 58 (58.0%) |
Nivel_Educativo | |
Primaria | 30 (30.0%) |
Secundaria | 24 (24.0%) |
Universitaria | 46 (46.0%) |
Ingreso_Mensual | |
Mean (SD) | 3050 (1130) |
Median [Min, Max] | 3060 [1060, 4950] |
Peso | |
Mean (SD) | 73.4 (14.4) |
Median [Min, Max] | 71.2 [50.2, 99.3] |
Altura | |
Mean (SD) | 1.75 (0.148) |
Median [Min, Max] | 1.77 [1.51, 2.00] |
IMC | |
Mean (SD) | 26.2 (4.82) |
Median [Min, Max] | 26.0 [18.2, 34.8] |
IMC_Categoría | |
Bajo peso | 3 (3.0%) |
Peso normal | 41 (41.0%) |
Sobrepeso | 29 (29.0%) |
Obesidad | 27 (27.0%) |
Fumador | |
Sí | 47 (47.0%) |
No | 53 (53.0%) |
Presión_Sistólica | |
Mean (SD) | 140 (25.2) |
Median [Min, Max] | 137 [100, 179] |
Presión_Diastólica | |
Mean (SD) | 90.2 (17.6) |
Median [Min, Max] | 92.5 [61.0, 119] |
Colesterol | |
Mean (SD) | 199 (27.8) |
Median [Min, Max] | 198 [151, 250] |
Diabetes | |
Sí | 54 (54.0%) |
No | 46 (46.0%) |
Actividad_Física | |
Baja | 31 (31.0%) |
Moderada | 25 (25.0%) |
Alta | 44 (44.0%) |
Satisfacción_con_la_Salud | |
Baja | 37 (37.0%) |
Media | 32 (32.0%) |
Alta | 31 (31.0%) |
Medico_1 | |
Presente | 56 (56.0%) |
Ausente | 44 (44.0%) |
Medico_2 | |
Presente | 49 (49.0%) |
Ausente | 51 (51.0%) |
Otra alternativa es obtener una tabla segmentada por sexo. A continuación se muestra como realizar esta segmentación:
# Análisis descriptivo
table1(~ Edad + Nivel_Educativo + Ingreso_Mensual + Peso + Altura + IMC +
IMC_Categoría + Fumador + Presión_Sistólica + Presión_Diastólica +
Colesterol + Diabetes + Actividad_Física + Satisfacción_con_la_Salud +
Medico_1 + Medico_2 | Género,
data = datos,
render.continuous=c(.="Mean (SD)", .="Median [Q1, Q3]"))
Masculino (N=42) |
Femenino (N=58) |
Overall (N=100) |
|
---|---|---|---|
Edad | |||
Mean (SD) | 45.3 (14.8) | 43.3 (15.4) | 44.2 (15.1) |
Median [Q1, Q3] | 47.0 [33.0, 58.5] | 43.0 [29.3, 58.0] | 43.5 [30.8, 58.3] |
Nivel_Educativo | |||
Primaria | 12 (28.6%) | 18 (31.0%) | 30 (30.0%) |
Secundaria | 10 (23.8%) | 14 (24.1%) | 24 (24.0%) |
Universitaria | 20 (47.6%) | 26 (44.8%) | 46 (46.0%) |
Ingreso_Mensual | |||
Mean (SD) | 2960 (1040) | 3110 (1190) | 3050 (1130) |
Median [Q1, Q3] | 3000 [2060, 3810] | 3090 [2170, 3930] | 3060 [2160, 3870] |
Peso | |||
Mean (SD) | 69.4 (13.2) | 76.4 (14.6) | 73.4 (14.4) |
Median [Q1, Q3] | 67.1 [59.7, 78.6] | 79.4 [63.9, 88.2] | 71.2 [62.1, 85.8] |
Altura | |||
Mean (SD) | 1.76 (0.132) | 1.75 (0.160) | 1.75 (0.148) |
Median [Q1, Q3] | 1.77 [1.65, 1.86] | 1.76 [1.61, 1.89] | 1.77 [1.64, 1.88] |
IMC | |||
Mean (SD) | 26.3 (4.82) | 26.1 (4.87) | 26.2 (4.82) |
Median [Q1, Q3] | 25.3 [23.3, 30.6] | 26.2 [21.7, 29.7] | 26.0 [21.9, 30.2] |
IMC_Categoría | |||
Bajo peso | 1 (2.4%) | 2 (3.4%) | 3 (3.0%) |
Peso normal | 19 (45.2%) | 22 (37.9%) | 41 (41.0%) |
Sobrepeso | 9 (21.4%) | 20 (34.5%) | 29 (29.0%) |
Obesidad | 13 (31.0%) | 14 (24.1%) | 27 (27.0%) |
Fumador | |||
Sí | 24 (57.1%) | 23 (39.7%) | 47 (47.0%) |
No | 18 (42.9%) | 35 (60.3%) | 53 (53.0%) |
Presión_Sistólica | |||
Mean (SD) | 141 (23.7) | 140 (26.4) | 140 (25.2) |
Median [Q1, Q3] | 135 [124, 164] | 140 [115, 163] | 137 [117, 163] |
Presión_Diastólica | |||
Mean (SD) | 90.8 (16.2) | 89.8 (18.6) | 90.2 (17.6) |
Median [Q1, Q3] | 93.0 [81.0, 102] | 91.0 [73.3, 106] | 92.5 [74.0, 103] |
Colesterol | |||
Mean (SD) | 196 (29.6) | 201 (26.5) | 199 (27.8) |
Median [Q1, Q3] | 196 [169, 221] | 201 [178, 221] | 198 [176, 221] |
Diabetes | |||
Sí | 28 (66.7%) | 26 (44.8%) | 54 (54.0%) |
No | 14 (33.3%) | 32 (55.2%) | 46 (46.0%) |
Actividad_Física | |||
Baja | 14 (33.3%) | 17 (29.3%) | 31 (31.0%) |
Moderada | 11 (26.2%) | 14 (24.1%) | 25 (25.0%) |
Alta | 17 (40.5%) | 27 (46.6%) | 44 (44.0%) |
Satisfacción_con_la_Salud | |||
Baja | 17 (40.5%) | 20 (34.5%) | 37 (37.0%) |
Media | 10 (23.8%) | 22 (37.9%) | 32 (32.0%) |
Alta | 15 (35.7%) | 16 (27.6%) | 31 (31.0%) |
Medico_1 | |||
Presente | 21 (50.0%) | 35 (60.3%) | 56 (56.0%) |
Ausente | 21 (50.0%) | 23 (39.7%) | 44 (44.0%) |
Medico_2 | |||
Presente | 22 (52.4%) | 27 (46.6%) | 49 (49.0%) |
Ausente | 20 (47.6%) | 31 (53.4%) | 51 (51.0%) |
Ahora, suponemos que queremos saber si existe una correlación significativa entre el Índice de masa corporal y el nivel de colesterol de las personas en estos datos. Para esto tenemos que considerar ciertas condiciones para saber qué tipo de análisis utilizar y si es correcto llevarlo a cabo. Por favor responder a las siguientes preguntas:
1. ¿Cuál es la naturaleza de los datos?, es decir, ¿Qué tipo de variables son?
str(datos$IMC)
## num [1:100] 30.9 29.3 18.6 21.7 25 32.4 30.1 31.5 30.5 28.3 ...
str(datos$Colesterol)
## num [1:100] 218 179 151 174 169 ...
2. Con base a su respuesta anterior, ¿Qué prueba estadística considera es la adecuada realizar en este escenario?
R. ¿?
3. ¿Cuál es la hipótesis a plantear en este escenario?
R. ¿?
4. ¿Son requeridos algunos supuestos para realizar esta prueba?
R. ¿?
# Prueba de normalidad de Shapiro-Wilk
shapiro.test(datos$IMC)
##
## Shapiro-Wilk normality test
##
## data: datos$IMC
## W = 0.9525, p-value = 0.001216
shapiro.test(datos$Colesterol)
##
## Shapiro-Wilk normality test
##
## data: datos$Colesterol
## W = 0.96168, p-value = 0.005307
5. ¿Se cumplen los supuestos requeridos en estas variables? en caso negativo, ¿Qué alternativa tenemos en este escenario?
R. ¿?
Luego de responder y discutir cada una de estas preguntas, realizaremos un análisis visual de la posible correlación en los datos:
# Crear gráfico de dispersión usando la librería 'base'
plot(x = datos$IMC, y = datos$Colesterol)
# Crear gráfico de dispersión usando la librería 'ggplot2'
ggplot(datos, aes(x = IMC, y = Colesterol)) +
geom_point() +
geom_smooth(method = "lm", col = "blue") +
labs(title = "Relación entre IMC y Nivel de Colesterol",
x = "Índice de Masa Corporal (IMC)",
y = "Nivel de Colesterol") +
theme_classic()
5.¿Cuál es su opinión después de realizar el análisis visual?
cor.test(x = datos$IMC, y = datos$Colesterol, method = "spearman")
##
## Spearman's rank correlation rho
##
## data: datos$IMC and datos$Colesterol
## S = 154859, p-value = 0.4842
## alternative hypothesis: true rho is not equal to 0
## sample estimates:
## rho
## 0.07075257
6. ¿Cuál es la conclusión que ha llegado luego de realizar el test?
Ahora, queremos evaluar si existe una asociación significativa entre el género de las personas y la presencia de diabetes. Para esto tenemos que considerar ciertas condiciones para saber qué tipo de análisis utilizar y si es correcto llevarlo a cabo. Favor responder a las siguientes preguntas:
1. ¿Cuál es la naturaleza de los datos?, es decir, ¿Qué tipo de variables son?
str(datos$Género)
## Factor w/ 2 levels "Masculino","Femenino": 1 2 1 2 1 1 2 2 1 2 ...
str(datos$Diabetes)
## Factor w/ 2 levels "Sí","No": 1 2 1 2 1 1 2 2 1 1 ...
2. Con base a su respuesta anterior, ¿Qué prueba estadística considera es la adecuada realizar en este escenario?
R. ¿?
3. ¿Cuál es la hipótesis a plantear en este escenario?
R. ¿?
4. ¿Son requeridos algunos supuestos para realizar esta prueba?
R. ¿?
Luego de responder y discutir cada una de estas preguntas, realizaremos una tabla de de contingencia o 2x2 entre las variables para conocer como es el recuento de los casos en cada categoría:
# Creando la tabla Utilizando la librería 'base'
table(datos$Género, datos$Diabetes)
##
## Sí No
## Masculino 28 14
## Femenino 26 32
# Creando la tabla Utilizando la librería 'table1'
table1(~ Género | Diabetes, data = datos)
Sí (N=54) |
No (N=46) |
Overall (N=100) |
|
---|---|---|---|
Género | |||
Masculino | 28 (51.9%) | 14 (30.4%) | 42 (42.0%) |
Femenino | 26 (48.1%) | 32 (69.6%) | 58 (58.0%) |
5. ¿Cual es su opiión al análizar la tabla?¿Considera que hay correlación entre las variables?
chisq.test(datos$Género, datos$Diabetes)
##
## Pearson's Chi-squared test with Yates' continuity correction
##
## data: datos$Género and datos$Diabetes
## X-squared = 3.8394, df = 1, p-value = 0.05006
Antes de concluir, tomemos unos minutos para responder cualquier pregunta que puedan tener y discutir cualquier duda o comentario sobre los temas tratados hoy.
Es importante que puedan aplicar estos conceptos y técnicas en sus propios proyectos y estudios. Les animo a:
¡Gracias a por su participación y entusiasmo!
Nos vemos en la próxima sesión.