Introducción a R y ggplot2 para Salud Pública

José Gerardo Mora Almanza

1. Introducción a R

¿Qué es R?

  • Lenguaje de programación y entorno para análisis estadístico y gráficos
  • Software libre y de código abierto
  • Ampliamente utilizado en investigación, incluyendo salud pública
  • Gran comunidad y muchos paquetes disponibles

Ventajas de R en Salud Pública

  • Capacidad para manejar grandes conjuntos de datos epidemiológicos
  • Reproducibilidad de análisis en estudios de salud
  • Visualizaciones avanzadas para comunicar resultados de investigación
  • Integración con otros sistemas (e.g., bases de datos de salud, GIS para mapeo de enfermedades)

2. Conceptos Básicos de R

Estructura de Datos en R

# Crear un vector de edades de pacientes
edades_pacientes <- c(25, 30, 35, 40, 45)
print(edades_pacientes)
[1] 25 30 35 40 45
# Calcular la media de las edades
media_edad <- mean(edades_pacientes)
print(paste("La edad promedio es:", media_edad))
[1] "La edad promedio es: 35"
# Posibles modificaciones:
# - Usar edades_pacientes[1:3] para seleccionar las primeras tres edades
# - Aplicar otras funciones como median() o sd() para más estadísticas
# Crear un dataframe con datos de pacientes
datos_pacientes <- data.frame(
  id = 1:4,
  edad = c(25, 30, 35, 40),
  peso = c(60, 70, 65, 80),
  hipertension = c(FALSE, TRUE, FALSE, TRUE)
)
print(datos_pacientes)
  id edad peso hipertension
1  1   25   60        FALSE
2  2   30   70         TRUE
3  3   35   65        FALSE
4  4   40   80         TRUE
# Calcular el IMC para cada paciente
datos_pacientes$imc <- datos_pacientes$peso / ((datos_pacientes$edad / 100) ^ 2)

# Posibles modificaciones:
# - Añadir más variables como género o nivel de colesterol
# - Usar subset() para filtrar pacientes con hipertensión
# Crear una lista con diferentes tipos de datos relacionados con un estudio de salud
estudio_salud <- list(
  descripcion = "Estudio sobre factores de riesgo cardiovascular",
  años = 2020:2023,
  datos_pacientes = datos_pacientes,
  centros_participantes = c("Hospital A", "Hospital B", "Clínica C")
)
print(estudio_salud)
$descripcion
[1] "Estudio sobre factores de riesgo cardiovascular"

$años
[1] 2020 2021 2022 2023

$datos_pacientes
  id edad peso hipertension      imc
1  1   25   60        FALSE 960.0000
2  2   30   70         TRUE 777.7778
3  3   35   65        FALSE 530.6122
4  4   40   80         TRUE 500.0000

$centros_participantes
[1] "Hospital A" "Hospital B" "Clínica C" 

3. Introducción a ggplot2 y la Gramática de Gráficos

¿Qué es ggplot2?

  • Sistema de visualización de datos basado en la “Gramática de Gráficos”
  • Permite crear gráficos complejos de manera intuitiva y sistemática
  • Altamente personalizable para necesidades específicas en salud pública

La Gramática de Gráficos

  1. Datos: La información que queremos visualizar
  2. Estética (aes): Mapeo de variables a propiedades visuales
  3. Geometría (geom): Formas que representan los datos
  4. Facetas: División del gráfico en subgráficos
  5. Estadísticas: Transformaciones estadísticas de los datos
  6. Coordenadas: El sistema de coordenadas del gráfico
  7. Temas: Estilos visuales del gráfico

Instalación y Carga de paquetes

# Instalación 
# install.packages(c("ggplot2", "dplyr", "gapminder"))

# Carga de paquetes
library(ggplot2)  # Para crear gráficos
library(dplyr)    # Para manipulación de datos
library(gapminder)  # Dataset de ejemplo con datos de salud global

# Posibles modificaciones:
# - Cargar paquetes adicionales como tidyr para reestructuración de datos
# - Usar pacman::p_load() para cargar e instalar paquetes en un solo paso

4. Fundamentos de ggplot2 con Ejemplos de Salud Pública

Estructura Básica

# Crear un gráfico base con datos de esperanza de vida y PIB per cápita
ggplot(data = gapminder, 
       aes(x = gdpPercap,  # PIB per cápita en el eje x
           y = lifeExp,    # Esperanza de vida en el eje y
           color = continent))  # Color por continente
# Añadir puntos al gráfico base
ggplot(data = gapminder, 
       aes(x = gdpPercap, 
           y = lifeExp, 
           color = continent)) +
  geom_point(alpha = 0.7)  # Puntos con 70% de opacidad
# Dividir el gráfico por continente
ggplot(data = gapminder, 
       aes(x = gdpPercap, 
           y = lifeExp, 
           color = continent)) +
  geom_point(alpha = 0.7) +
  facet_wrap(~continent)  # Crear un subgráfico para cada continente

Estructura Básica

# Posibles modificaciones:
# - Usar facet_grid(continent ~ year) para una matriz de gráficos
# - Ajustar escalas con scales = "free" en facet_wrap()

Estructura Básica

# Posibles modificaciones:
# - Cambiar geom_point() por geom_line() para ver tendencias
# - Añadir geom_smooth() para una línea de tendencia

Estructura Básica

# Posibles modificaciones:
# - Cambiar color por otra variable como 'year'
# - Añadir aes(size = pop) para representar población con tamaño

5. Casos Prácticos en Salud Pública

Caso 1: Relación entre Esperanza de Vida y Gasto en Salud

# Filtrar datos para el año más reciente
datos_recientes <- gapminder %>% 
  filter(year == max(year))

# Crear el gráfico
ggplot(datos_recientes, aes(x = gdpPercap, y = lifeExp, color = continent, size = pop)) +
  geom_point(alpha = 0.7) +
  scale_x_log10(labels = scales::dollar_format()) +  # Escala logarítmica para PIB
  scale_size_continuous(range = c(2, 12), labels = scales::comma_format()) +
  labs(title = "Esperanza de Vida vs. PIB per cápita (2007)",
       x = "PIB per cápita (escala log)", 
       y = "Esperanza de Vida (años)",
       size = "Población",
       color = "Continente") +
  theme_minimal()

Caso 1: Relación entre Esperanza de Vida y Gasto en Salud

# Posibles modificaciones:
# - Añadir geom_text() para etiquetar países específicos
# - Usar scale_color_brewer() para un esquema de colores diferente
# - Añadir geom_smooth() para mostrar la tendencia general

Caso 2: Tendencias de Mortalidad Infantil por Continente

# Preparar datos
datos_mortalidad <- gapminder %>%
  group_by(continent, year) %>%
  summarise(mortalidad_infantil = mean(1000 / lifeExp, na.rm = TRUE))

# Crear el gráfico
ggplot(datos_mortalidad, aes(x = year, y = mortalidad_infantil, color = continent)) +
  geom_line(size = 1) +
  geom_point(size = 2) +
  labs(title = "Tendencias de Mortalidad Infantil por Continente",
       x = "Año", 
       y = "Mortalidad Infantil (por 1000 nacidos vivos)",
       color = "Continente") +
  theme_light() +
  scale_y_continuous(limits = c(0, NA))  # Empezar el eje y en 0

Caso 2: Tendencias de Mortalidad Infantil por Continente

# Posibles modificaciones:
# - Usar geom_area() para un gráfico de área apilada
# - Añadir puntos de datos con geom_point()
# - Personalizar la paleta de colores con scale_color_brewer()

Caso 3: Distribución de la Esperanza de Vida por Continente

# Crear el gráfico
ggplot(gapminder, aes(x = continent, y = lifeExp, fill = continent)) +
  geom_boxplot() +
  geom_jitter(width = 0.2, alpha = 0.2) +  # Añadir puntos individuales
  labs(title = "Distribución de la Esperanza de Vida por Continente",
       x = "Continente", 
       y = "Esperanza de Vida (años)") +
  theme_minimal() +
  theme(legend.position = "none")  # Remover la leyenda redundante

Caso 3: Distribución de la Esperanza de Vida por Continente

# Posibles modificaciones:
# - Usar coord_flip() para un boxplot horizontal
# - Añadir facet_wrap(~year) para ver la evolución en el tiempo
# - Reemplazar geom_boxplot() con geom_violin() para una visualización de densidad

6. Actividades Prácticas

Ejercicio 1: Gráfico de Dispersión de Factores de Riesgo

Crea un gráfico de dispersión que muestre la relación entre el consumo de alcohol per cápita y la prevalencia de obesidad en diferentes países.

# Datos simulados (en la práctica, usarías datos reales)
set.seed(123)
datos_riesgo <- data.frame(
  pais = LETTERS[1:20],
  consumo_alcohol = runif(20, 5, 15),
  prevalencia_obesidad = runif(20, 10, 35),
  region = sample(c("Europa", "América", "Asia", "África"), 20, replace = TRUE)
)

# Tu código aquí
#