# load packages ----------------------------------------------------------------
library(introexercises)  # obtener los datos para los ejercicios
library(learnr)          # crear las lecciones de rmd
library(gradethis)       # evaluar los ejercicios
library(dplyr)           # manejar los datos
library(flair)           # destacar datos
library(ggplot2)         # visualizar datos
library(gghighlight)     # enfatizar partes de los gráficos
library(janitor)         # limpiar datos
library(fontawesome)     # para emojis 
library(scales)          # definir ejes y unidades

# library(RMariaDB)        # connect to sql database 

## set options for exercises and checking ---------------------------------------

## Define how exercises are evaluated 
gradethis::gradethis_setup(
  ## note: the below arguments are passed to learnr::tutorial_options
  ## set the maximum execution time limit in seconds
  exercise.timelimit = 60, 
  ## set how exercises should be checked (defaults to NULL - individually defined)
  # exercise.checker = gradethis::grade_learnr
  ## set whether to pre-evaluate exercises (so users see answers)
  exercise.eval = FALSE 
)

# ## event recorder ---------------------------------------------------------------
# ## see for details: 
# ## https://pkgs.rstudio.com/learnr/articles/publishing.html#events
# ## https://github.com/dtkaplan/submitr/blob/master/R/make_a_recorder.R
# 
# ## connect to your sql database
# sqldtbase <- dbConnect(RMariaDB::MariaDB(),
#                        user     = Sys.getenv("userid"),
#                        password = Sys.getenv("pwd"),
#                        dbname   = 'excersize_log',
#                        host     = "144.126.246.140")
# 
# 
# ## define a function to collect datos 
# ## note that tutorial_id is defined in YAML
#     ## you could set the tutorial_version too (by specifying version:) but use package version instead 
# recorder_function <- function(tutorial_id, tutorial_version, user_id, event, datos) {

#     
#   ## define a sql query 
#   ## first bracket defines variable names
#   ## values bracket defines what goes in each variable
#   event_log <- paste("INSERT INTO responses (
#                        tutorial_id, 
#                        tutorial_version, 
#                        date_time, 
#                        user_id, 
#                        event, 
#                        section,
#                        label, 
#                        question, 
#                        answer, 
#                        code, 
#                        correct)
#                        VALUES('", tutorial_id,  "', 
#                        '", tutorial_version, "', 
#                        '", format(Sys.time(), "%Y-%M%-%D %H:%M:%S %Z"), "',
#                        '", Sys.getenv("SHINYPROXY_PROXY_ID"), "',
#                        '", event, "',
#                        '", datos$section, "',
#                        '", datos$label,  "',
#                        '", paste0('"', datos$question, '"'),  "',
#                        '", paste0('"', datos$answer,   '"'),  "',
#                        '", paste0('"', datos$code,     '"'),  "',
#                        '", datos$correct, "')",

#                        sep = '')
# 
#     # Execute the query on the sqldtbase that we connected to above
#     rsInsert <- dbSendQuery(sqldtbase, event_log)
#   
# }
# 
# options(tutorial.event_recorder = recorder_function)
#set to spanish

Sys.setlocale("LC_ALL", "Spanish")
# hide non-exercise code chunks ------------------------------------------------
knitr::opts_chunk$set(echo = FALSE)
# datos prep --------------------------------------------------------------------
vig <- rio::import(system.file("dat/listado_vigilancia_limpio_20141201.rds", package = "introexercises"))

Introducción a R para Epidemiología Aplicada y Salud Pública

Bienvenido/a

Bienvenido/a al curso "Introducción a R para epidemiología aplicada", ofrecido por Applied Epi - una organización sin ánimo de lucro y el principal proveedor de formación, apoyo y herramientas de R para profesionales de primera línea en salud pública.

knitr::include_graphics("images/logo.png", error = F)

Visualización de datos

Este ejercicio se centra en los fundamentos del uso de {ggplot2} para la visualización de datos.

Formato

Este ejercicio te guía a través de las tareas que debes realizar en RStudio en tu ordenador.

Obtener ayuda

Hay varias formas de obtener ayuda:

1) Busca la sección de ayuda (ver más abajo) 2) Pide ayuda a tu instructor/a o facilitador/a de tu curso en directo 3) Programa una llamada 1 a 1 con un/a instructor/a para "Tutoría del curso". 4) Publica una pregunta en la Comunidad de Applied Epi

Este es el aspecto que tendrán esa sección de ayuda:

r fontawesome::fa("lightbulb", fill = "gold") Haz clic para leer una pista

¡Aquí verás una pista útil!


r fontawesome::fa("check", fill = "red")Haz clic para ver una solución (¡pruébalo tú primero!)

linelist %>% 
  filter(
    edad > 25,
    distrito == "Bolo"

  )

Aquí tienes más explicaciones sobre por qué funciona la solución.


Cuestionario

Responder a las preguntas del cuestionario te ayudará a comprender el material. Las respuestas no se registran.

Para practicar, responde a las siguientes preguntas:

quiz(
  question_radio("¿Cuándo debería mirar las secciones de ayuda en rojo?",
    answer("Tras intentar escribir el código yo mismo", correct = TRUE),
    answer("Antes de intentar escribir el código", correct = FALSE),
    correct = "Revisar el código de ejemplo después de intentar escribirlo usted mismo puede ayudarle a mejorar",
    incorrect = "Por favor, intente completar el ejercicio usted mismo, o use las pistas disponibles, antes de mirar la respuesta."

  )
)
question_numeric(
 "¿Qué tan preocupado/a estás ante la idea de empezar este tutorial - en una escala de 1 (nada nervioso) a 10 (extremadamente preocupado/a)?",
 answer(10, message = "Intenta no preocuparte, ¡te ayudaremos a conseguirlo!", correct = T),
 answer(9, message = "Intenta no preocuparte, ¡te ayudaremos a conseguirlo!", correct = T),
 answer(8, message = "Intenta no preocuparte, ¡te ayudaremos a conseguirlo!", correct = T),
 answer(7, message = "Intenta no preocuparte, ¡te ayudaremos a conseguirlo!", correct = T),
 answer(6, message = "De acuerdo, lo conseguiremos juntos", correct = T),
 answer(5, message = "De acuerdo, lo conseguiremos juntos", correct = T),
 answer(4, message = "¡Me gusta tu confianza!", correct = T),
 answer(3, message = "¡Me gusta tu confianza!", correct = T),
 answer(2, message = "¡Me gusta tu confianza!", correct = T),
 answer(1, message = "¡Me gusta tu confianza!", correct = T),
 allow_retry = TRUE,
 correct = "Gracias por responder",

 min = 1,
 max = 10,
 step = 1
)

Licencia

Por favor, envía un correo electrónico a contact@appliedepi.org si tienes preguntas sobre el uso de estos materiales.

Objetivos de aprendizaje

En este ejercicio los objetivos son:

Prepara

Abre el proyecto de R "ebola", como de costumbre.

A continuación, abre tu script "ebola_analysis.R". Puedes localizar este archivo haciendo clic en los menús de "Archivo -> Abrir archivo", o haciendo clic en tu Panel de Archivos de RStudio (abajo a la derecha) y navegando hasta el archivo allí.

Cargar paquetes

Añade los paquetes {ggExtra} y {gghighlight} a los paquetes pacman::p_load() en la parte superior de tu script.

El paquete {ggplot2} no necesita aparecer explícitamente en este comando, porque está incluido en el paquete {tidyverse}.

Utilizaremos {ggExtra} para añadir funciones de visualización adicionales a {ggplot2} y {gghighlight} para resaltar partes de los gráficos.

Recuerda mantener siempre {tidyverse} como último paquete en tu comando pacman::p_load().

Ejecuta el código anterior en tu script

En el Módulo 1 te indicamos que ajustaras la configuración global de R para que cada sesión comenzara limpiamente, sin memoria almacenada de los comandos que ejecutaste o de los objetos que creaste en la sesión anterior.

Esta es la mejor práctica. Te obliga a escribir guiones independientes de las sesiones anteriores. Esto hace que tu trabajo sea más fácilmente "reproducible" por otros.

Mira tu panel de Entorno (Environment) de R. ¿Ves algún objeto guardado de la última sesión en el Entorno? Si es así, haz clic en el pequeño icono de la "escoba" para borrar todos los objetos. Vuelve al Módulo 1 o pide a un instructor que te ayude a ajustar la configuración.

Ahora, ejecuta todos los comandos importantes de tu guión, sección por sección:

1) Cargar paquetes 2) Importar el listado de vigilancia "en bruto" 3) Ejecuta el comando largo de limpieza (la secuencia unida por el operador pipe %>% que produce el listado limpio) 4) Exporta el listado limpio 5) Elabora unas cuantas tablas utilizando el listado limpio

Si has mantenido tu script limpio y organizado, todos estos comandos deberían poder ejecutarse en secuencia sin errores.

Comprueba que tienes el objeto vig en tu Entorno (Enviornment).

Como copia de seguridad de este módulo - SI tu script funciona mal con muchos errores, puedes importar la "copia de seguridad" limpia vig de la carpeta "ebola/datos/limpios/copia_seguridad", donde se guarda como "surveillance_linelist_clean_20141201.rds". Por favor, notifica a un instructor que necesitarás ayuda para limpiar tu script de modo que se ejecute sin problemas la próxima vez.

Crear una nueva sección para los gráficos

Añade un nuevo encabezado de sección en tu script llamado "Gráficos simples".

El nuevo encabezado debería tener este aspecto

# Gráficos simples ----------------------------------------------

Esta sección debe colocarse después de la sección "Tablas resumen" y antes del "Área de pruebas".

Construye un gráfico

Construiremos algunos gráficos para comprender la dinámica de los brotes en cada distrito.

Abrir el gráfico

Cualquier ggplot() comienza con la función ggplot(). Dentro de esta función, el primer argumento es data =. Proporciona el nombre de la base de datos a este argumento.

Ejecuta el siguiente comando

ggplot(data = vig)

En el panel Plots (Gráficos) de RStudio, se ha "abierto" el lienzo del gráfico en blanco y está listo para recibir más instrucciones. Irás añadiendo comandos a este ggplot() construyendo el gráfico paso a paso.

Mapear columnas a la "estética"

Ahora que tenemos un lienzo, tenemos que decirle a R lo que queremos en el eje X y en el eje Y. Las columnas que mapear a los ejes son simples ejemplos de la "estética" del gráfico. Fíjate en la palabra "aestética" - la raíz aes pasa a formar parte del siguiente argumento de ggplot().
El segundo argumento de ggplot() es mapping = aes(). Aquí es donde asignas las columnas de los datos a los componentes del gráfico. Más específicamente, señala los componentes del gráfico en los que hay variación para cada fila de los datos.

Por ejemplo, si "mapeamos" la columna edad_anios al eje de las Y, entonces cada fila de los datos se evaluará y podrá situarse a una altura diferente en el eje Y.

aes()

El argumento mapping = aes() es atípico en el sentido de que debes proporcionarle los valores dentro de la función aes().

mapping = aes(x = COLUMN, y = COLUMN)

Recuerda que este código de arriba está ocurriendo dentro de la función ggplot(). El código mapping = aes() es en SÍ MISMO el segundo argumento de ggplot().

Intenta escribir un comando ggplot() en el que asignes la columna distrito al eje de las X y la columna edad_anios al eje de las Y, y luego responde a las preguntas sobre el gráfico que aparece en RStudio.

r fontawesome::fa("check", fill = "red")Haz clic para ver la solución (¡pruébalo tú primero!)

ggplot(data = vig, mapping = aes(x = distrito, y = edad_anios))


quiz(caption = "Pregunta - estética (aesthetics)",
  question("¿Cuántos intervalos hay en el eje de las X?",

    allow_retry = T,
    answer("12"),
    answer("9"),
    answer("10", correct = T),
    answer("4")
  ),
  question("¿Cúal es el intervalo por defecto de las etiquetas del eje de las Y?",
    allow_retry = T,
    answer("5"),
    answer("20", correct = T, message = "Esto cambiará dependiendo del rango de los datos."),

    answer("30"),
    answer("10")
  )
)

Añadir capas "geom"

Ahora que tenemos nuestro lienzo y hemos asignado nuestros ejes... ¡podemos empezar a visualizar los datos!

Esto se hace añadiendo capas de geometría geom_() que crean cada uno un tipo diferente de visualización.

Hemos completado un componente completo del ggplot() los paréntesis están cerrados y el comando puede ejecutarse sin errores. Entonces, ¿cómo añadimos componentes adicionales al gráfico?

Añade componentes del comando con +

El símbolo "más" conecta los componentes del comando del gráfico. En cierto modo, es como el operador pipe, pero une los pasos dentro de un comando general de un gráfico.

Añade el signo más, y en la nueva línea escribe geom_point(). Luego ejecuta el comando

r fontawesome::fa("check", fill = "red")Haz clic para ver la solución (¡pruébalo tú primero!)

ggplot(data = vig, mapping = aes(x = distrito, y = edad_anios))+
  geom_point()


El geom_point() ha visualizado cada fila de la base de datos vig como puntos, correspondientes a valores de distrito o distrito (eje X) y a valores de la edad o edad_anios (eje Y).

quiz(caption = "Pregunta - puntos",
  question("¿Cuántos casos han sido notificados en el distrito Central I?",
    allow_retry = T,
    answer("25"),
    answer("35"),
    answer("No es posible saberlo en este gráfico", correct = T),

    answer("21")
  )
)

Con una variable discreta en el eje X y una distribución continua en el eje Y, ¡es difícil saber exactamente cuántos casos hay! Cada punto representa un caso, pero podrías estar viendo 5 puntos de la misma edad que se superponen y se ocultan entre sí.

Probemos otra geometría (geom) para resolver este problema. Sustituye geom_point() por geom_jitter() y vuelve a ejecutar el comando.

r fontawesome::fa("check", fill = "red")Haz clic para ver la solución (¡pruébalo tú primero!)

ggplot(data = vig, mapping = aes(x = distrito, y = edad_anios))+
     geom_jitter()



Ve al panel de Ayuda de RStudio (Help, junto al panel Gráficos o Plots) y busca "geom_jitter" en la barra de búsqueda de la parte superior derecha.

Esta es la documentación en R de la función geom_jitter(). Toda función, ya sea en {base} R, o de un paquete instalado, tiene documentación sobre sus funciones. Puedes acceder a esta documentación sin conexión: se almacena dentro de R una vez descargado el paquete.

A veces, esta documentación es difícil de leer. Practicaremos la lectura de la documentación a lo largo del curso. Sin embargo, a menudo hay tutoriales, guías y "viñetas" en Internet que son más fáciles de leer e interpretar. También practicaremos su revisión.

De momento, haz lo siguiente:

Lee la "Descripción" o "Description". para entender exactamente qué hace la función para evitar la superposición de puntos.

Revisa la "Estética" o "Aesthetics" de la parte inferior. Éstas son otras estéticas de los gráficos que puedes ajustar, para variar la apariencia de esta capa geom.

Dentro de geom_jitter() introduce algunas de estas estéticas y prueba a ajustarlas como se indica a continuación:

quiz(caption = "Pregunta - estéticas (aesthetics)",
  question("¿Qué crees que la estética del gráfico `alpha` ajusta?",
    allow_retry = T,
    answer("Orden alfabético"),
    answer("El color del eje"),
    answer("La transparencia", correct = T),
    answer("El tamaño")
  ),
  question("¿Qué forma es procudia cuando se configura `shape = 3` dentro geom_jitter()?",
    allow_retry = T,
    answer("Círculo"),
    answer("Triángulo"),
    answer("Más", correct = T),
    answer("Cuadrado")

  )
)

Añade más geoms

El gráfico jitter es bonito, pero añadámosle alguna visualización estadística. Añade geom_boxplot() debajo del comando geom_jitter().

r fontawesome::fa("lightbulb", fill = "gold") Haz clic para leer una sugerencia

No olvides añadir un + al final de geom_jitter()

r fontawesome::fa("check", fill = "red")Haz clic para ver una solución (¡pruébalo tú primero!)

ggplot(data = vig, mapping = aes(x = distrito, y = edad_anios))+
     geom_jitter()+
     geom_boxplot()



Ahora podemos ver dónde se encuentran los valores estadísticos de resumen para cada distrito, como la mediana y los rangos intercuartílicos. Pero ahora los puntos están ocultos por los gráficos de caja.

Añade y ajusta la estética alpha = sólo para los gráficos de caja. ¿Qué valor alfa te permite ver los gráficos?

r fontawesome::fa("lightbulb", fill = "gold") Haz clic para leer una sugerencia

Prueba con varios valores entre 0 y 1.


r fontawesome::fa("check", fill = "red")Haz clic para ver una solución (¡pruébalo tú primero!)

ggplot(data = vig, mapping = aes(x = distrito, y = edad_anios))+

     geom_jitter()+
     geom_boxplot(alpha = 0.5)


Gráficos de violín

Como alternativa, sustituye el geom_boxplot() por geom_violin() y utiliza el alpha = al mismo nivel anterior para tener cierta transparencia.

ggplot(data = vig, mapping = aes(x = distrito, y = edad_anios))+

     geom_jitter()+
     geom_violin(alpha = 0.5)

No hay mucha diferencia entre las edades de los casos de cada distrito... probemos un gráfico de violín con otra métrica. Prueba con este código:

ggplot(data = vig, mapping = aes(x = sexo, y = alt_cm))+

     geom_violin(alpha = 0.5, size = 2)
quiz(caption = "Pregunta - gráfico de violin",
  question("¿Qué está configurando el comando aes(x = sexo, y = alt_cm)?",
    allow_retry = T,
    answer("Configura sexo en el eje de las Y y la altura en el eje de las X", message = "Casi... pero verifica de nuevo - ¿qué ejes?"),
    answer("Configura los Ajustes Estéticos Sensatos (AES)", message = "No, esto no existe."),
    answer("Configura sexon en el eje de las X y la altura en el eje de las Y", correct = T)
  ),
  question("¿Qué ajusta la estética (aes) 'size = ' en estos gráficos de violín?",
    allow_retry = T,
    answer("El tamaño del violin"),
    answer("El tamaño de la línea del borde", correct = T),
    answer("El tamaño del gráfico"),
    answer("El tamaño de las etiquetas del gráfico")

  )
)

Piensa en las siguientes preguntas:

¿Cuál crees que es, en general, la mejor combinación de estas tres geometrías (puntos, boxplots, violines)?

Estética dinámica

Hasta ahora, editabas las estéticas como color, alpha, size y shape asignándolas valores estáticos como 3, "azul" o 0,2.

Ahora, asignaremos las estéticas a columnas de nuestra base de datos, y la visualización de cada punto de los datos variará.

Relleno del gráfico de caja (boxplot)

Reconstruye el antiguo gráfico de caja (boxplot), con la estética color asignada estáticamente a "azul" ("blue"), y alpha asignada estáticamente a 0,5:

ggplot(data = vig, mapping = aes(x = distrito, y = edad_anios))+

     geom_jitter()+
     geom_boxplot(fill = "blue", alpha = 0.5)

Ahora cambia el comando para que fill se asigne a la columna distrito.

quiz(caption = "Pregunta - asignar estéticas",
  question("¿Qué pasa cuando ejecutas el comando anterior reemplazando 'blue' con el nombre de la columna: distrito?",
    allow_retry = T,
    answer("El gráfico de caja se reordena de acuerdo a los distritos"),
    answer("Las cajas se convierten en la forma geográfica del distrito"),
    answer("El relleno de las cajas (color) cambia y es diferente para cada distrito",
           message = "No... esto es lo que queríamos, pero no sucedió."),
    answer("Hay un error de R que dice: 'object distrito not found' (el objecto distrito no ha sido encontrado)",

           correct = T)
  )
)
quiz(caption = "Pregunta - asignar estéticas dinámicas",
  question("¿Qué necesita cambiar para que cada gráfico de caja (boxplot) tenga un color de relleno diferente?",
    allow_retry = T,
    answer("Intentar con otro nombre de columna"),
    answer("Mover esta parte del comando ('fill = distrito') dentro del aes()",
           correct = T),
    answer("Intentar ejecutar el comendo cinco veces más, como está escrito"),
    answer("Reiniciar R e intentarlo de nuevo")

  )
)

Hay dos pasos importantes para resolver este error:

1) Cambia el valor "blue" (azul) por distrito (fíjate en que no hay comillas alrededor de distrito) 2) Mueve este argumento dentro de mapping = aes() en la función de la parte superior de ggplot()

Dado que estamos asignando un columna a la estética fill = debe hacerse dentro del "mapeado" del ggplot. ¿Recuerdas cómo asignamos columnas al eje X y al eje Y? Esas asignaciones también eran dinámicas, y se encuentran dentro del elemento mapping = aes().

r fontawesome::fa("check", fill = "red")Haz clic para ver la solución (¡pruébalo tú primero!)

ggplot(data = vig, mapping = aes(x = distrito, y = edad_anios, fill = distrito))+
     geom_jitter()+
     geom_boxplot(alpha = 0.5)


Observa la leyenda que ha aparecido automáticamente en la parte derecha del gráfico.

Piensa: ¿cómo se han tratado los valores ausentes en este gráfico? ¿Cómo están marcados? ¿Qué color se les asignó automáticamente? ¿En qué lugar del orden aparecen, a lo largo del eje X y en la leyenda?

Color de los puntos

¿Cómo cambiarías el color de los puntos?

Ten en cuenta este matiz:

Cambia el color de los puntos para que también varíen según el distrito, y establece una transparencia de alpha = 0 al gráfico de caja (boxplot).

r fontawesome::fa("check", fill = "red")Haz clic para ver la solución (¡pruébalo tú primero!)

ggplot(data = vig, mapping = aes(x = distrito, y = edad_anios, fill = distrito, color = distrito))+
     geom_jitter()+
     geom_boxplot(alpha = 0)



Ahora, elimina el color = distrito de la mapping = aes() para devolver a los puntos su color negro original.

Etiquetas (y sangrías)

Vamos a añadir unas cuantas etiquetas rápidas para que nuestro gráfico de caja sea más claro.

Añade labs() al final del comando (utilizando el símbolo +), y proporciona los siguientes argumentos dentro de la función:

r fontawesome::fa("check", fill = "red")Haz clic para ver la solución (¡pruébalo tú primero!)

ggplot(                                             # abrir el ggplot
  data = vig,                                      # usar el listado de vigilancia
  mapping = aes(                                    # asignar columnas a la estética del gráfico
    x = distrito,                                      # distrito en el eje de las X
    y = edad_anios,                                     # edad en el eje de las Y
    fill = distrito))+                                 # relleno de los gráficos de caja por distrito
geom_jitter()+                                      # añadir puntos jitter  
geom_boxplot(                                       # añadir gráficos de caja (boxplots), semi transparentes
  alpha = 0.5)+
labs(                                               # añadir etiquetas al gráfico
  title = "Mi título",
  subtitle = "Subtítulo aquí",
  x = "District",
  y = "Age (anios)",
  caption = "En el brote de Ébola, 2014",
  fill = "District"
  )


**Ahora mira el código de la solución anterior - ** ¿Qué tiene de diferente, aparte del nuevo comando labs()?

Se ha escrito en un formato "más largo". Los argumentos de los paréntesis se escriben después de una nueva línea y una sangría. Así se puede leer más fácilmente, como un índice:

El sangrado y las nuevas líneas no afectarán a la ejecución del código pero ahora tienes espacio a la derecha para añadir # comentarios.

Aunque puede llevar más tiempo escribir comentarios detallados, puede ayudar mucho en el futuro a las personas que lean tu código y se pregunten qué estás haciendo (¡incluso a ti mismo en el futuro!).

quiz(caption = "Pregunta - Etiquetas de los gráficos",
  question("¿En qué lado del gráfico está el pie de foto, for defecto?",
    allow_retry = T,
    answer("Arriba al centro"),
    answer("Abajo a la izquierda"),
    answer("Abajo a la derecha", correct = T),
    answer("Arriba a la derecha")
  ),
  question("¿Porqué usamos un argumento de relleno para ajustr el título de la etiqueta?",
    allow_retry = T,
    answer("Porque el relleno siempre ajusta el título de la etiqueta", message = "No, inténtalo de nuevo. Si la etiqueta fuese creada en otro modo, la ajustarías utilizando un parámetro diferente."),
    answer("Porque la leyenda fue creada cuando mapeamos el relleno (fill) a una columna", correct = T),
    answer("Porque la palabra 'fill' significa 'leyenda' en Castellano antiguo", message = "No, no es correcto.")

  )
)

Gráficos de barras

Ahora que ya has explorado los puntos, los puntos jittered, los gráficos de caja y los violines, vamos a probar otros geoms:

Se podría utilizar un gráfico de barras para mostrar el número de casos notificados en cada distrito.

Prueba a utilizar el comando geom geom_bar().

Ten en cuenta que para geom_bar() sólo debes proporcionar una estética x =. No es necesario la y = porque se contará el número de filas de la base datos por distrito y este número se reflejará en la altura de la barra.

r fontawesome::fa("lightbulb", fill = "gold") Haz clic para leer una pista

En este nuevo comando ggplot, elimina la opción geom_jitter() y geom_boxplot() . Sustitúyelos por uno geom_bar() comando.


r fontawesome::fa("check", fill = "red")Haz clic para ver una solución (¡pruébalo tú primero!)

ggplot(data = vig, mapping = aes(x = distrito))+
     geom_bar()


¡Ahora las filas de los datos se han representado como un diagrama de barras!

¿Puedes cambiar las barras para que todas sean del color "lightblue" (azul claro) utilizando el argumento fill (piensa: ¿dónde debe colocarse este argumento, ya que "lightblue" (azul claro) es una asignación a un valor estático?)

Establece la estética de relleno en manera dinámica

¿Cómo cambiaríamos el gráfico para mostrar la distribución por edades en cada distrito?

Cambia el gráfico para que la estética fill = se asigne dinámicamente a un categórica que refleja la edad.

r fontawesome::fa("lightbulb", fill = "gold") Haz clic para leer una sugerencia

Asigna fill = a la columna edad_cat.


r fontawesome::fa("check", fill = "red")Haz clic para ver una solución (¡pruébalo tú primero!)

ggplot(data = vig, mapping = aes(x = distrito, fill = edad_cat))+
  geom_bar()


Ahora podemos ver las categorías de edad en la leyenda, y las barras están "stacked" (apiladas).

Orden de las barras apiladas

¿Y si quieres invertir el orden de las barras?

Tal vez quieras la categoría de edad más joven en la parte inferior: te daremos este código:

ggplot(data = vig, mapping = aes(x = distrito, fill = fct_rev(edad_cat)))+
  geom_bar()

En el código anterior hemos utilizado la función fct_rev() que proviene del paquete {forcats} (que es parte de {tidyverse}). Lo explicaremos más adelante, pero este paquete contiene funciones que crean un orden explícito de los valores. Metiendo la columna edad_cat dentro de la función fct_rev() el ggplot invierte el orden por defecto de esa variable.

Si los colores te parecen feos, no te preocupes. Más adelante aprenderemos a ajustar los colores.

Barras adyacentes

geom_bar() acepta el argumento position = al que se le puede asignar el valor "dodge" (esquivar). Intenta añadir este argumento a geom_bar() y mira a ver qué pasa (no olvides las comillas).

r fontawesome::fa("check", fill = "red")Haz clic para ver la solución (¡pruébalo tú primero!)

ggplot(data = vig, mapping = aes(x = distrito, fill = edad_cat))+
  geom_bar(position = "dodge")


Diagramas de barras a partir de datos agregados

Hasta ahora, hemos utilizado nuestro listado de vigilancia para crear estos gráficos. Los gráficos tratan cada fila como un punto de datos. Por ejemplo, en el gráfico de barras del distrito realizado con geom_bar() la altura de la barra se determinó por el número de filas por distrito en el listado de vigilancia vig .

Pero, a menudo, tenemos bases de datos que nos llegan agregadas (por ejemplo, el número semanal de casos de paludismo notificados por cada región). Esto también puede ocurrir si un centro concreto está desbordado y ya no puede comunicar información individual detallada sobre los casos.

Para explicar cómo manejar estos datos, usaremos aquello que aprendimos del módulo anterior, creando una base de datos agregada:

Crea un nuevo conjunto de datos que incluya sólo el recuento total de casos por distrito. Utiliza tus conocimientos de las funciones de {dplyr} group_by() y summarise() para ello, y guarda la base de datos resultante como case_counts_district.

r fontawesome::fa("lightbulb", fill = "gold") Haz clic para leer una sugerencia

Empieza la base de datos vig y pásala a ``group_bycount(distrito).

Alternativamente, introduce group_by() y luego summarise(). En summarise() crea una columna en la nueva base de datos agregada con n() (para obtener el número total de filas de cada grupo de distritos).


r fontawesome::fa("check", fill = "red")Haz clic para ver una solución (¡pruébalo tú primero!)

case_counts_district <- vig %>% 
  count(distrito)


case_counts_district %>% 
  knitr::kable()

Cuando tus datos sean agregagos, no hagas gráficos de barras con geom_bar(). Esto se debe a quegeom_bar() registra un segmento de barra por cada fila de datos.

Prueba a ejecutar este comando y comprueba el resultado (fíjate en la base de datos modificada):

ggplot(data = case_counts_district,
       mapping = aes(x = distrito))+
  geom_bar()

¡Ése no es el gráfico que queremos! El geom_bar() ha aceptado los datos y sólo ha reconocido una fila para cada distrito. En consecuencia, ha trazado exactamente una barra para cada distrito, a la altura 1.

¿Cómo solucionarlo?

1) Añade y = n dentro de las asignaciones estéticas de ggplot. Esto asigna la altura de la barra al valor numérico de recuento de la columna n. 2) Cambia geom_bar() a geom_col()

Ahora ejecuta el comando. El gráfico debería tener exactamente el mismo aspecto que el anterior geom_bar() cuando utilizamos el listado individual vig.

ggplot(data = case_counts_district,
       mapping = aes(x = distrito, y = n))+
  geom_col()

¿Qué hizo que esto funcionara?

La función geom_col() está pensada para manejar datos agregados: no apila las filas de la base de datos unas sobre otras, sino que acepta el valor de una columna con el recuento de casos y = , y luego dibuja las columnas con las alturas que corresponden a esos valores.

Es importante que recuerdes utilizar geom_bar() para los datos de listados individuales, y geom_col() para bases de datos agregados.

Por último, intenta añadir un mapeo estético de fill = para que la barra muestre el grupo de edad. ¿Puedes hacerlo con datos agregados?

No, no puedes, porque nuestros datos agregados no tienen el detalle del grupo de edad que estaba disponible en el listado individual.

Gráficos de dispersión

Escribe un nuevo comando de gráfico que utilice geom_point() en el listado vig limpio para mostrar las dos variables continuas: edad_anios y alt_cm asignadas al eje X y al eje Y, respectivamente.

A continuación, añade la estética color = y asígnala dinámicamente a la columna edad_cat.

r fontawesome::fa("lightbulb", fill = "gold") Haz clic para leer una sugerencia

El color de los puntos se ajusta con la estética color = (fill es para formas como barras e histogramas, que tienen un área). Asegúrate de colocar esta estética dentro del mapping = aes()


r fontawesome::fa("check", fill = "red")Haz clic para ver la solución (¡pruébalo tú primero!)

Este código se ha escrito en estilo "largo". Pero puede que tú tengas otras preferencias de sangría.

ggplot(data = vig,
       mapping = aes(
         x = edad_anios,
         y = alt_cm,
         color = edad_cat))+

  geom_point()


Esto parece bonito, pero en realidad no es tan útil. Sin embargo, sirve para mostrar que las categorías de edad se alinean con los valores continuos.

¿Y si asignas dinámicamente la estética color = a la columna sexo? ¿Eres capaz de ver algún patrón en los datos? Sigue siendo difícil.

Paquetes que extienden ggplot

Prueba el código avanzado de R que aparece a continuación. Existe un paquete {ggExtra} con varias funciones que añaden dimensiones a los ggplots.

Añade este paquete a tu comando pacman y vuelve a ejecutarlo para que se instale y se cargue.

Ahora, ejecuta el siguiente comando:

height_plot <- ggplot(
  data = vig,
  mapping = aes(
    x = edad_anios,
    y = alt_cm,
    color = sexo))+

  geom_point()

ggMarginal(height_plot)

¿Qué ocurre?

1) Tenemos asignado al comando ggplot un nombre (height_plot) y de este modo lo guardas como un objeto. Mira, ahora aparece en el Entorno como un objeto al que puedes hacer referencia en otros comandos.

2) El segundo comando utiliza la función ggMarginal() del paquete {ggExtra}. Ésta dibuja distribuciones en los "márgenes" (exteriores) del gráfico.

Ahora vuelve a ejecutar el comando, pero con el argumento groupFill = TRUE especificado.

ggMarginal(height_plot, groupFill = TRUE)
quiz(caption = "Pregunta - Gráficos de dispersión",
  question("En el comando ggMarginal, ¿a qué se refiere exáctamente el término 'height_plot'?",
    allow_retry = T,
    answer("Un ajuste que determina la altura del gráfico"),
    answer("Asegura que el gráfico tiene altura"),
    answer("height_plot es el nombre del ggplot guardado como objeto en un comando anterior", correct = T),
    answer("Es el argumento que no necesita ser especificado")
  ),
  question("¿Qué muestran las distribuciones marginales sobre la altura de los casos hombres y mujeres?",
    allow_retry = T,
    answer("Que los casos hombres son generalmente más altos que los casos mujeres", correct = T),
    answer("Que en una determinada edad, los casos hombres son más altos que los casos mujeres", message = "No, no podemos inferir esto de estos gráficos. Sabemos sólo la distribución general de los datos."),
    answer("Los casos son más frecuentemente hombres que mujeres", message = "No, las distribuciones no nos dicen nada sobre si los casos son más frecuentemente hombres o mujeres.")
  ),
  question("¿Qué es ggMarginal()?",
    allow_retry = T,
    answer("Una función del paquete {ggplot2}"),
    answer("Una función del paquete {ggExtra} que puede ser usada junto con las funciones de {ggplot2}", correct = T),
    answer("Una función de {base} R")
  )
)

Añadir medias suavizadas a un gráfico de dispersión

Por último, prueba otro gráfico de dispersión utilizando fecha_notifica en el eje X y difer en el eje Y. Añade geom_smooth() para ver una línea de tendencia.

r fontawesome::fa("check", fill = "red")Haz clic para ver la solución (¡pruébalo tú primero!)

ggplot(
  data = vig,
  mapping = aes(
     x = fecha_notifica,
     y = difer))+
geom_point()+
geom_smooth()


Volver a la sección Help (Ayuda) de RStudio (cerca del panel "Plots" (gráficos), en la parte inferior derecha). Escribe geom_smooth en la barra de búsqueda. Lee la sección "Details" para saber exactamente qué geom_smooth() hace para producir la línea e intervalo de confianza.

Histograma

Los histogramas se utilizan para mostrar la distribución de variables continuas. Si tienes una columna con números o fechas, es mejor utilizar geom_histogram() - en vez de geom_bar() o geom_col(). Esto asume que tus datos están en formato de listado individual (una fila por observación).

Sintaxis básica del histograma

Trataremos en profundidad los matices de las curvas epidémicas ("epicurvas") en un módulo posterior, pero de momento:

Haz un histograma básico con las fechas de inicio de los síntomas asignando el eje X a la columna fecha_sintomas. Cambia su coloración por defecto a "darkgreen" (verde oscuro).

r fontawesome::fa("lightbulb", fill = "gold") Haz clic para leer una sugerencia

Para geom_histogram() el color interior de las "barras" se establece mediante la estética fill =. El color del contorno de las barras se establece mediante color =.

Si asignas el relleno o el color a un valor estático como "purple" (morado), esta asignación debe hacerse fuera de de aes() y dentro de geom_histogram().


r fontawesome::fa("check", fill = "red")Haz clic para ver una solución (¡pruébalo tú primero!)

ggplot(data = vig, mapping = aes(x = fecha_sintomas))+
  geom_histogram(fill = "darkgreen")


Advertencias y errores

Mira en tu consola de R, donde se imprime el comando que has ejecutado. ¿Ves alguna advertencia (Warning), escrita en rojo?

En R, una advertencia o "Warning" significa que R ha podido ejecutar tu comando, pero que ha encontrado algo inesperado que cree que deberías saber.

En cambio, un "error significa que R no ha podido ejecutar tu comando.

quiz(caption = "Pregunta - advertencia (warning) en el histograma",
  question("¿Qué significa esta advertencia (warning) (Removed XX rows containing non-finite values)",
    allow_retry = T,
    answer("Que los casos tenían un pésimo sentido del humor"),
    answer("Esos casos tenían valores de fechas que quedaban fuera del rango del gráfico", message = "No hemos configurado ningún límite a los ejes del gráfico, así que R nos mostrará todos los posibles valores."),
    answer("Que los casos con valores ausentes en la fecha de inicio síntomas (fecha_sintomas) no se muestran en el gráfico.", correct = T),
    answer("Que el ggplot ha eliminado esas filas de tu listado de datos", message = "ggplot no alterará el contenido de tu base de datos.")
  )
)

Histogramas apilados (stacked)

Ahora intenta hacer un histograma para la columna edad_anios con fill = asignado dinámicamente a sexo.

r fontawesome::fa("check", fill = "red")Haz clic para ver la solución (¡pruébalo tú primero!)

ggplot(data = vig, mapping = aes(x = edad_anios, fill = sexo))+
  geom_histogram()


Ahora tienes histogramas "apilados". A veces pueden ser difíciles de interpretar, pero son una herramienta útil.

Intervalos del histograma

Los histogramas muestran "barras", pero no hay espacio entre ellas. Esto se debe a que la variable es continua. Aun así, el tamaño y la frecuencia de las "barras" del histograma se pueden ajustar.

Prueba a ejecutar el histograma con los siguientes ajustes (de uno en uno):

r fontawesome::fa("check", fill = "red")Haz clic para ver la solución (¡pruébalo tú primero!)

ggplot(data = vig, mapping = aes(x = edad_anios, fill = sexo))+
  geom_histogram(bins = 100)

ggplot(data = vig, mapping = aes(x = edad_anios, fill = sexo))+
  geom_histogram(bins = 5)

ggplot(data = vig, mapping = aes(x = edad_anios, fill = sexo))+
  geom_histogram(binwidth = 5)



Considera lo siguiente:

Todas estas son preguntas que los epidemiólogos y los trabajadores de la sanidad pública deben plantearse al observar una curva epidémica.

En el próximo módulo sobre gráficos de salud pública, trataremos los entresijos de hacer curvas epidémicas que empiecen en fechas concretas y que utilicen intervalos de anchura específica (por ejemplo, semanas de lunes, semanas de domingo, etc.).

Facetas

Un histograma apilado puede ser difícil de interpretar. Facetado en R se refiere al proceso de crear un gráfico más pequeño para cada categoría única de una variable (también se denomina "múltiplos pequeños" o "small-multiples" en inglés).

Esto se hace añadiendo el comando facet_wrap() al comando ggplot. Dentro de esta función, escribe una virgulilla ~ y el nombre de la columna que queremos en facetas a la derecha.

Intenta crear facetas en el histograma por sexo sexo (deja también fill = sexo).

ggplot(data = vig, mapping = aes(x = fecha_sintomas, fill = sexo))+

  geom_histogram()

r fontawesome::fa("check", fill = "red")Haz clic para ver la solución (¡pruébalo tú primero!)

ggplot(data = vig, mapping = aes(x = fecha_sintomas, fill = sexo))+
  geom_histogram()+
  facet_wrap(~ sexo)


Ahora prueba otro gráfico: en lugar de sexo configura el gráfico para que tenga facetas por distrito distrito. Puedes elegir eliminar la estética fill = sexo para que sea más claro. No influirá en el facetado.

quiz(caption = "Preguntas - facetas",
  question("¿Qué distrito tuvo los primeros casos?",

    allow_retry = T,
    answer("West I"),
    answer("East II"),
    answer("West III", correct = T),
    answer("Central I")
  )
)

Puedes leer más sobre el facetado en esta sección del Manual de Epi R.

Fin

¡Enhorabuena! ggplot es un tema difícil, pero una herramienta que ofrece mucho una vez que entiendes lo básico. Lo reforzaremos más en los próximos días.

Extra - gghighlight

Igual que {ggExtra}, el paquete {gghighlight} es una extensión que funciona con {ggplot2} para añadir funcionalidades a tus gráficos.

Muchos paquetes de R tienen "viñetas" para ayudar a las personas que utilizan el paquete. Entra en Internet y mira esto {gghighlight} viñeta para responder a las siguientes preguntas:

quiz(caption = "Pregunta - gghighlight",
  question("¿Cuando ha sido actualizada esta viñeta?",

    allow_retry = T,
    answer("2021-01-01"),
    answer("1999-04-03"),
    answer("2023-12-16", correct = T),
    answer("2022-03-12")
  ),
    question("¿A qué función de ggplot2 cree el autor que este paquete es equivalente?",
    allow_retry = T,
    answer("select()", message = "Mira al final de la sección 'Motivation'"),
    answer("filter()", correct = T),
    answer("mutate()", message = "Mira al final de la sección 'Motivation'"),
    answer(" %>% ", message = "Mira al final de la sección 'Motivation'")
  ),
    question("¿Cuál es la principal función del paquete {gghighlight}?",
    allow_retry = T,
    answer("flair()", message = "Mira a la sección llamada gghighlight()"),
    answer("stark()", message = "Mira a la sección llamada gghighlight()"),
    answer("gghighlight()", correct = T),
    answer("highlighter()", message = "Mira a la sección llamada gghighlight()")
  )
)

Ahora, haz un histograma utilizando los siguientes ajustes:

Por último, haz una variación de este gráfico:

r fontawesome::fa("check", fill = "red")Haz clic para ver la solución (¡pruébalo tú primero!)

# Plot 1
########
ggplot(data = vig, mapping = aes(x = fecha_sintomas, fill = distrito))+
  geom_histogram()+
  facet_wrap(~ distrito)+
gghighlight()


# Plot 2
########
ggplot(data = vig, mapping = aes(x = fecha_sintomas, fill = distrito))+
  geom_histogram()+
  gghighlight(distrito == "West III")




appliedepi/introexercises documentation built on April 22, 2024, 1:01 a.m.