📍 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

1 Introducción

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.

2 Recomendación sobre directorio de trabajo

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.

3 Base de datos

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

3.1 Tabla de variables

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

Desafío 1

¿Estamos trabajando con una muestra o una población?

Desafío 2

¿Los estadísticos descriptivos que se calculen corresponden a parámetros o a estadísticos? ¿En qué situaciones ocurre cada caso?

Desafío 3

¿Cuál podría ser una posible pregunta de investigación valida que justificará la recolección de datos?

Desafío 4

¿Cuál es la escala de medición de cada una de las variables?

4 Lectura de datos en R

4.1 Paquetes requeridos

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

4.2 Lectura de datos desde archivo RData

load("datos/uci2.RData")

4.3 Lectura directa del archivo en Excel

datos <- read_excel("datos/uci2.xlsx")

# Unificación de labels 
names(datos) <- names(datos) %>% epitrix::clean_labels()

Desafío 5

Al cargar la base de datos en R, ¿estas escalas de medición se conservan o son identificadas correctamente por el programa?

4.4 Exploración de la base de datos e identificación de variables

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)
Data summary
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 ▃▁▁▁▇

4.5 Etiquetas y recodificación de variables

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

Desafío 6

Realice la correcta codificación de la variable RACE.

Actividad para la Casa 1

Asigne la escala de medición correcta a cada una de las variables del conjunto de datos, y posteriormente verifique que el programa R las identifique de manera consistente con dicha clasificación.

4.6 Variable edad

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?

Desafío 7

¿De qué manera la variable edad (age), originalmente cuantitativa, puede recodificarse como una variable cualitativa ordinal mediante la definición de rangos de edad?.

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