📍 Departamento de Epidemiología Clínica y Bioestadística. Facultad de Medicina. Pontificia Universidad Javeriana, Bogotá.
📚 Créditos
Este material ha sido desarrollado en el marco de la asignatura Introducción a la Bioestadística, primer semestre-2630 de la Maestría en Epidemiología Clínica
En esta sesión se espera que los estudiantes se familiaricen con herramientas de exploración y visualización de datos en R. A partir de una base de datos real sobre casos atendidos en UCI.
Para evitar problemas en la lectura de datos, se sugiere trabajar
dentro de un proyecto de RStudio (.Rproj) y mantener una
estructura de carpetas organizada. Guarde las bases de datos de los
materiales enviados para el desarrollo de este taller dentro de una
subcarpeta llamada datos ubicada en el directorio
principal del proyecto.
La base de datos contiene información de pacientes admitidos a la Unidad de Cuidados Intensivos (UCI), con el objetivo de describir sus características demográficas y clínicas al momento de la admisión. Incluye variables relacionadas con la identificación del paciente, la edad, el sexo y el grupo étnico, así como información clínica relevante al ingreso, como la presión arterial sistólica y la frecuencia cardíaca.
Asimismo, se incorporan variables asociadas al tipo y servicio de admisión a la UCI, permitiendo caracterizar a los pacientes según si su ingreso fue electivo o de emergencia, y si correspondió a un servicio médico o quirúrgico. Adicionalmente, se cuenta con el estado vital al egreso. En esta base se recolectó la información de todos los sujetos ingresados durante el año 2024 en un hospital de la ciudad de Bogotá.
| Nombre de la variable | Códigos / Valores | Abreviatura |
|---|---|---|
| Número de identificación | Número ID | ID |
| Estado vital | 0 = Vivo; 1 = Muerto | STA |
| Edad | Años | AGE |
| Sexo | 0 = Hombre; 1 = Mujer | GENDER |
| Grupo étnico | 1 = Blanco; 2 = Afro; 3 = Otro | RACE |
| Servicio de admisión a UCI | 0 = Médico; 1 = Quirúrgico | SER |
| Presión sistólica al ingreso a UCI | mmHg | SYS |
| Frecuencia cardíaca al ingreso a UCI | Latidos/min | HRA |
| Tipo de admisión | 0 = Electiva; 1 = Emergencia | TYP |
Un paquete en R es un conjunto organizado de funciones
que permiten realizar tareas específicas para análisis de datos,
visualización, modelado estadístico, entre otros.
install.packages("tidyverse") # Manipulación de datos
install.packages("skimr") # Manipulación de datos
install.packages("ggplot2") # Visualización, gráficos
install.packages("readxl") # Lectura de datos en Excel
install.packages("epitrix") # Unificación de nombres de variables
library(tidyverse) #Manipulación de datos
library(skimr) #Manipulación de datos
library(ggplot2) # Visualización
library(readxl) # para lectura de datos en excel
library(epitrix)# para unificación de nombre de variables
load("datos/uci2.RData")
datos <- read_excel("datos/uci2.xlsx")
# Unificación de labels
names(datos) <- names(datos) %>% epitrix::clean_labels()
Para visualizar un panorama general de la base de datos aplique la
función skim() al conjunto de datos por medio del siguiente
código:
skim(datos)
| Name | datos |
| Number of rows | 200 |
| Number of columns | 9 |
| _______________________ | |
| Column type frequency: | |
| numeric | 9 |
| ________________________ | |
| Group variables | None |
Variable type: numeric
| skim_variable | n_missing | complete_rate | mean | sd | p0 | p25 | p50 | p75 | p100 | hist |
|---|---|---|---|---|---|---|---|---|---|---|
| id | 0 | 1.00 | 444.82 | 271.92 | 4 | 210.25 | 412.5 | 671.75 | 929 | ▇▇▆▆▇ |
| sta | 5 | 0.98 | 0.19 | 0.40 | 0 | 0.00 | 0.0 | 0.00 | 1 | ▇▁▁▁▂ |
| age | 4 | 0.98 | 57.92 | 19.91 | 16 | 47.00 | 63.0 | 72.00 | 92 | ▃▂▅▇▃ |
| gender | 3 | 0.98 | 0.38 | 0.49 | 0 | 0.00 | 0.0 | 1.00 | 1 | ▇▁▁▁▅ |
| race | 0 | 1.00 | 1.18 | 0.50 | 1 | 1.00 | 1.0 | 1.00 | 3 | ▇▁▁▁▁ |
| ser | 0 | 1.00 | 0.54 | 0.50 | 0 | 0.00 | 1.0 | 1.00 | 1 | ▇▁▁▁▇ |
| sys | 2 | 0.99 | 132.18 | 32.95 | 36 | 110.00 | 130.0 | 150.00 | 256 | ▁▆▇▂▁ |
| hra | 2 | 0.99 | 99.39 | 26.52 | 44 | 80.25 | 96.0 | 118.75 | 192 | ▃▇▅▂▁ |
| typ | 0 | 1.00 | 0.74 | 0.44 | 0 | 0.00 | 1.0 | 1.00 | 1 | ▃▁▁▁▇ |
Funciones claves: factor(), case_when(),
recode().
# Ejemplo variable sexo
datos$gender <- factor(datos$gender,
levels = c(0, 1),
labels = c("Hombre", "Mujer"))
¿Cuántos hombres y mujeres hay en la base de datos?
datos%>%
count(gender)
## # A tibble: 3 × 2
## gender n
## <fct> <int>
## 1 Hombre 122
## 2 Mujer 75
## 3 <NA> 3
datos %>%
na.omit(age)%>% # Elimine los datos faltantes
summarise(n=n(), #Número de observaciones
min = min(age), #Minimo
q1 = quantile(age, 0.25), #Q1
median = median(age),#mediana
mean = mean(age), #media
sd= sd(age), #desviación estandar
q3 = quantile(age, 0.75), #Q3
max = max(age), # Máximo
cv=(sd/mean)*100 ) #CV
## # A tibble: 1 × 9
## n min q1 median mean sd q3 max cv
## <int> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>
## 1 187 16 46.5 64 57.9 20.3 72.5 92 35.1
Podemos realizar un histograma por medio del siguiente código:
#https://r-graph-gallery.com/ggplot2-package.html
# basic histogram
ggplot(datos, aes(x=age)) +
geom_histogram()
## `stat_bin()` using `bins = 30`. Pick better value `binwidth`.
## Warning: Removed 4 rows containing non-finite outside the scale range
## (`stat_bin()`).
¿Qué podemos decir de esos estadísticos (o parámetros) de tendencia central y dispersión? ¿Cuál es el mejor estadístico de tendencia central y dispersión para describir la edad de los pacientes ingresados a uci?
datos$edad_cod<-case_when(
datos$age <= 19 ~ "0-19",
datos$age >= 20 & datos$age <= 29 ~ "20-29",
datos$age >= 30 & datos$age <= 39 ~ "30-39",
datos$age >= 40 & datos$age <= 49 ~ "40-49",
datos$age >= 50 & datos$age <= 59 ~ "50-59",
datos$age >= 60 & datos$age <= 69 ~ "60-69",
datos$age >= 70 & datos$age <= 79 ~ "70-79",
datos$age >= 80 ~ "80+",
TRUE ~ as.character(NA) # NA al no cumplir ninguna condición
)
datos %>%
group_by(edad_cod) %>%
summarise(count = n()) %>%
mutate(perc = (count / sum(count)) * 100)
## # A tibble: 9 × 3
## edad_cod count perc
## <chr> <int> <dbl>
## 1 0-19 12 6
## 2 20-29 15 7.5
## 3 30-39 8 4
## 4 40-49 22 11
## 5 50-59 25 12.5
## 6 60-69 50 25
## 7 70-79 46 23
## 8 80+ 18 9
## 9 <NA> 4 2