# load packages ----------------------------------------------------------------
library(introexercises)
library(learnr)
library(gradethis)
library(dplyr)
library(flair)
library(ggplot2)
library(lubridate)
library(fontawesome)
library(janitor)
library(kableExtra)
# 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 data 
# ## 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, data) {
#     
#   ## 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, "',
#                        '", data$section, "',
#                        '", data$label,  "',
#                        '", paste0('"', data$question, '"'),  "',
#                        '", paste0('"', data$answer,   '"'),  "',
#                        '", paste0('"', data$code,     '"'),  "',
#                        '", data$correct, "')",
#                        sep = '')
# 
#     # Execute the query on the sqldtbase that we connected to above
#     rsInsert <- dbSendQuery(sqldtbase, event_log)
#   
# }
# 
# options(tutorial.event_recorder = recorder_function)
# hide non-exercise code chunks ------------------------------------------------
knitr::opts_chunk$set(echo = FALSE)


# Data prep --------------------------------------------------------------------
# Import
surv <- rio::import(system.file("dat/surveillance_linelist_clean_20141201.rds", package = "introexercises")) 

hospitals <- bind_rows(rio::import(system.file("dat/hospitals/20141201_hosp_port.csv", package = "introexercises")),
                    rio::import(system.file("dat/hospitals/20141201_hosp_central.csv", package = "introexercises"))) %>% 
             select(hospital, date_hospitalisation, outcome, date_outcome) %>% 
             janitor::clean_names()

## NOT USED ANYMORE
# geo_data <- rio::import(system.file("dat/pop/sle_admpop_adm3_2020.csv", package = "introexercises")) %>% 
#                  select(-c(Female, Male), -starts_with("T"))


## NOT USED ANYMORE Make the hospital information dataframe
# hospital_dirty = data.frame(
#   hosp_name     = c("central hospital", "military", "military", "port", "St. Mark's", "ignace", "sisters"),
#   catchment_pop = c(1950280, 40500, 10000, 50280, 12000, 5000, 4200),
#   level         = c("Tertiary", "Secondary", "Primary", "Secondary", "Secondary", "Primary", "Primary")
# )
# 
# hospital_clean <- hospital_dirty %>% 
#   mutate(
#     hosp_name = case_when(
#       # criteria                       # new value
#       hosp_name == "military"          ~ "Military Hospital",
#       hosp_name == "port"              ~ "Port Hospital",
#       hosp_name == "St. Mark's"        ~ "St. Mark's Maternity Hospital (SMMH)",
#       hosp_name == "central hospital"  ~ "Central Hospital",
#       TRUE                             ~ hosp_name
#       )
#     )

# Create smaller linelists for the easier exemples
patients <- tibble(ID = c("patient_1", "patient_2", "patient_3", 
                            "patient_4", "patient_10"), 
                     sexe = c("F", "M", "M", "F", "F"), 
                     age = c(5, 10, 2, 15, 14), 
                     age_unit = c("Year", "Year", "Year", "Year", "Year"))

results <- tibble(ID = c("patient_1", "patient_2", "patient_4", 
                        "patient_5", "patient_6"), 
                 test_result = c("positive", "negative", 
                                 "negative", "positive", "positive"))


df1 <- tibble(ID = c("patient_1", "patient_2", "patient_3"),
              sexe = c("F", "M", "M"))

df2 <- tibble(ID = c("patient_1", "patient_1", "patient_1", "patient_2", "patient_4"),
              date_test = as.Date(c("2021-12-01", "2021-12-26", "2022-01-05", "2021-12-18", "2022-01-01")),
                 test_result = c("positive", "negative", "negative", "positive", "positive"))

hosp_central <- rio::import(system.file("dat/hospitals/20141201_hosp_central.csv", package = "introexercises"))
hosp_military <- rio::import(system.file("dat/hospitals/20141201_hosp_military.csv", package = "introexercises"))
hosp_port <- rio::import(system.file("dat/hospitals/20141201_hosp_port.csv", package = "introexercises"))
hosp_smmh <- rio::import(system.file("dat/hospitals/20141201_hosp_smmh.csv", package = "introexercises"))
hosp_other <- rio::import(system.file("dat/hospitals/20141201_hosp_other.csv", package = "introexercises"))
hosp_missing <- rio::import(system.file("dat/hospitals/20141201_hosp_missing.csv", package = "introexercises"))

lab <- rio::import(system.file("dat/lab_results_20141201.xlsx", package = "introexercises"))
investigations <- rio::import(system.file("dat/case_investigations_20141201.xlsx", package = "introexercises"))
# hide non-exercise code chunks ------------------------------------------------
knitr::opts_chunk$set(echo = FALSE)

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

Bienvenido

Bienvenido al curso "Introducción a R para epidemiología aplicada", ofrecido por Epidemiología - 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 de la salud pública.

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

Informe de situación COVID-19

Este ejercicio se centra en desarrollar un informe de situación COVID-19 utilizando R Markdown.

Formato

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

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

ESTO NO ES UN EXAMEN. Se trata de un ejercicio exigente, pero puedes enfrentarte a él con el nivel de dificultad que te convenga.

Prepara

Abre RStudio y crea un nuevo proyecto RStudio, dentro de la carpeta "covid" dentro de tu directorio "intro_curso".

Vas a iniciar un brote y un análisis distintos, por lo que merecen su propio proyecto (entorno R autónomo y portátil con datos, scripts, salidas, etc.).

Si no recuerdas cómo hacer un nuevo proyecto, consulta la "pista" que aparece a continuación.

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

1) Abre RStudio (asegúrate de abrir RStudio y no sólo R).

2) En RStudio pulsa Archivo -> Nuevo Proyecto. En la ventana emergente, selecciona "Directorio existente".

knitr::include_graphics("images/create_project.png")

3) Crea el proyecto en la subcarpeta "intro_curso/covid


Confirma que estás en el proyecto correcto

Confirma que el nombre del proyecto en la esquina superior derecha de la sesión actual de RStudio es "covid". Si no estás en ningún proyecto de RStudio, se leerá "Proyecto: (Ninguno)".

Así es como debe quedar la estructura de tu carpeta "covid":

El escenario

Este caso práctico es una oportunidad para aplicar todas las habilidades que has aprendido en el curso. ¡Diviértete!

Estos datos de COVID-19 son anónimos y están fragmentados. Fueron facilitados a Applied Epi por el departamento de salud pública de Condado de Fulton Georgia, Estados Unidos, para su uso en la formación de epidemiólogos.

Como antecedente, el Ciudad de Atlanta es una importante área metropolitana del estado de Georgia, en el sureste de EEUU. Alrededor del 90% de Atlanta se encuentra dentro del condado de Fulton. El condado de Fulton tiene una población de alrededor de 1 millón de habitantes, e incluye numerosos municipios más pequeños además de Atlanta.

Consulta los datos

Abre "covid_datos_ejemplo.xlsx" en Excel. Hay aproximadamente 80.000 registros. Observa las columnas:

Abre el conjunto de datos "city_pops.xlsx" en Excel.

Revisar el documento del informe de situación

Tienes la tarea de volver a crear el documento "covid_sitrep.docx" que se encuentra en la carpeta "covid". Debes escribir un script R Markdown que produzca un documento Word lo más parecido posible a este informe.

En la carpeta se han incluido todas las funciones y métodos necesarios para crear este informe de salida.

Abre y revisa "covid_sitrep.docx".

Elementos del título

Observa el título, el subtítulo y la fecha en la parte superior. Todos ellos se pueden especificar en la opción YAML de R Markdown.

Texto resumido y viñetas

Observa la información resumida sobre el brote COVID-19: un encabezamiento y algunas viñetas que incluyen números y fechas de los datos (probablemente creados con código R "en línea").

¿Recuerdas cómo crear encabezamientos y viñetas en la parte de texto escrito de un RMD?

Pirámide demográfica

La pirámide de edad / sexo está estratificada por sexos (¿recuerdas la age_pyrmaid() función?)

Curva epidémica

La curva epidémica está coloreada por ciudad (recuerda el fill = argumento).

Los usuarios avanzados observarán el pie de foto y otros elementos de la trama que podrían utilizar str_glue(). También que no todos los ciudades reciben explícitamente colores: sólo las que aparecen con más frecuencia en los datos (... fct_lump()).

Tablas

En el informe se incluyen dos tablas resumen:

NOTA el ejercicio de hoy te proporcionará algunos consejos y trucos para recrear el R Markdown que daría salida a este informe. No obstante, no se proporcionarán respuestas.

Cómo proceder

Puedes proceder sin ayuda, para poner a prueba tus habilidades.

Sin embargo, las secciones del ejercicio que aparecen a continuación pueden considerarse una "hoja de consejos" que puede proporcionarte sugerencias y recordatorios. Sin embargo, no te proporcionará soluciones.

También puedes solicitar ayuda a un instructor en cualquier momento.

Recuerda: no es un examen. Diviértete. Esfuérzate al máximo.

Nuevo script R Markdown

Abre un nuevo script R Markdown y guárdalo en tu carpeta "covid/scripts" como "covid_sitrep_2.Rmd". Elige un nombre distinto de "covid_sitrep.docx" para evitar sobrescribir por accidente el informe original de Word, por ejemplo "covid_sitrep_TU_NOMBRE.docx".

Elimina el contenido de ejemplo de la plantilla R Markdown script. Mantén el YAML y el trozo de código "setup".

YAML

Comienza con el YAML estándar proporcionado en la plantilla. Edita el YAML para incluir un título y un subtítulo que coincidan con el informe de Word:

Reconoce que el informe es a partir del "21 de junio de 2021", por lo que un enfoque es especificar esa fecha como una parámetro en el YAML, de modo que puedas utilizarlo para filtrar los datos en el proceso de limpieza. Si no te sientes cómodo con los parámetros, puedes saltarte esta parte o pedir ayuda.

El método más sencillo es simplemente añadir a params sección en la parte inferior del YAML y añade esta fecha como se indica a continuación. Recuerda YAML es muy sensible a los espacios, dos puntos y sangrías. No olvides la ! antes de la r.

---
params:
  data_date: !r lubridate::ymd("2021-06-21")
---

Alternativamente, puedes hacer que el proceso de selección de fecha sea una interfaz de apuntar y hacer clic utilizando el siguiente YAML.

Ahora, si haces clic en "Tejer con parámetros", una ventana emergente te pedirá que selecciones la fecha_datos. Pregunta a los instructores si tienes dudas sobre la apuntar y hacer clic de la interfaz.

---
params:
  data_date:
    label: "Date of data:"
    value: !r lubridate::ymd("2021-06-21")
    input: date
---

Elijas el modo que elijas - debes hacer referencia al parámetro fecha en tu código como params$data_date.

Por último, asegúrate de que tu YAML está configurado para generar un documento Word.

Trozo de código de configuración

El primer fragmento de código de "configuración" de un R Markdown suele establecer las opciones de visibilidad por defecto para todos los fragmentos. Considera establecer lo siguiente:

Cargar paquetes

Crea un fragmento de código de carga de paquetes en tu RMD. Piensa qué paquetes vas a necesitar para crear este documento. Te recomendamos que adaptes el código del informe de situación del análisis del ébola RMD mientras realizas este ejercicio.

Considera en particular los siguientes paquetes:

Utiliza pacman::p_load() para instalar paquetes si es necesario y cargarlos para su uso. Además, recuerda poner {tidyverse} en último lugar en el comando.

La importación de datos debe tener su propio chunk. Dado que se trata de un R Markdown, es especialmente importante utilizar el comando here() dentro de la función import() para localizar los archivos.

Recuerda que hay dos archivos de interés para el presente análisis:

Ambos conjuntos de datos se encuentran en la subcarpeta "datos", lo que significa que tendrás que incluir "datos" en tu here() función.

Da a los conjuntos de datos nombres que sean fáciles de referenciar, por ejemplo linelist_raw y pops.

Antes de limpiar los datos, considera la posibilidad de examinarlos en un trozo de código de análisis exploratorio. Considera establecer este fragmento en eval=FALSE para que los resultados no se impriman en el informe.

Recuerda que, cuando tienes varios comandos en un trozo, puedes resaltar comandos concretos y pulsar Ctrl + Intro para ejecutarlos solos.

Para ejecutar código R desde trozos de código a través de la consola, podemos

Asegúrate de que has ejecutado los paquetes y los trozos de importación antes de comenzar tu análisis exploratorio.

Examina el marco de datos de la lista de casos y ten en cuenta lo siguiente al desarrollar un proceso de limpieza:

Recuerda que, cuando tienes varios comandos en un trozo, puedes resaltar comandos concretos y pulsar Ctrl + Intro para ejecutarlos solos.

Asegúrate de haber ejecutado los paquetes e importado los trozos antes de comenzar tu análisis exploratorio.

Examina la lista de casos:

Crea un fragmento de código de limpieza. Es posible que tu número exacto de casos no coincida perfectamente con el informe; no pasa nada. Puedes tomarte la libertad de tomar decisiones sobre los criterios de inclusión y exclusión.

Recuerda asignar tu cadena de tuberías de limpieza a un nuevo objeto, llamado algo fácil de referenciar como linelist o linelist_clean.

Texto y viñetas

format(params$data_date, format = "%d %B, %Y")
fmt_count(combined, outcome == "Death")
paste("242 (44.9%)")

Limpieza de la cadena de tuberías

Crear un trozo de código de. Es posible que tu número exacto de casos no coincida perfectamente con el informe; no pasa nada. Puedes tomarte la libertad de tomar decisiones sobre los criterios de inclusión y exclusión.

Recuerda asignar tu cadena de tuberías de limpieza a un nuevo objeto, llamado algo fácil de referenciar como linelist o linelist_clean.

Saltos de página

Para obtener saltos de página en lugares específicos (por ejemplo, después de la parte de texto del resumen), inserta \pagebreak en el área de texto de R Markdown. Esto no es código R.

Pirámide de edades

Utiliza la {apyramid} y su paquete age_pyramid() (no olvides añadir {apyramid} a tus paquetes!).

Recuerda esto crea un objeto ggplot, por lo que puedes modificarlo añadiendo una etiqueta + después y luego utilizar labs() para añadir etiquetas como título y leyenda. Repasa el ejercicio de gráficos epidemiológicos (módulo 9) o tu ebola_sitrep.Rmd si no recuerdas esta función. Alternativamente, busca la documentación de la función utilizando ?age_pyramid.

Curva epidémica

Crea un nuevo fragmento de código para la curva epidémica.

 weekly_breaks <- seq.Date(
      from = floor_date(min(linelist$date_report, na.rm=T),   "week", week_start = 1), # Monday before first case
      to   = ceiling_date(max(linelist$date_report, na.rm=T), "week", week_start = 1), # Monday after last case
      by   = "week")  
ggplot(data = linelist, 
       mapping = aes(
         x = report_dt, 
         fill = fct_lump_n(city, 5)))+
     geom....  

Recuerda str_glue() es una función muy útil para crear leyendas de figuras que une los valores de tu marco de datos con el contexto escrito.

Tabla de resultados

En realidad se trata de una tabla muy sencilla, gracias a la función {gtsummary} ¡paquete!

# Change values in race column to title case  

mutate(race = str_to_title(race))

Tabla de incidencia de casos

Crea un nuevo fragmento de código para la tabla de incidencia acumulada, ¡el último resultado de tu informe R Markdown!

Esta es la salida más avanzada del informe, ya que implica múltiples pasos de limpieza y cálculo antes de crear la tabla.

Puedes utilizar qflextable() para crear fácilmente una tabla a partir del marco de datos resumido, y set_header_labels() para actualizar los títulos de las columnas de la tabla.

¡Suerte!

¡Bien hecho! Aunque tu R Markdown no recree exactamente el mismo documento de Word, no te preocupes, ¡hazlo lo mejor que puedas!
Esto no es un examen, y es un MUY pero el proceso de aprendizaje que implica ¡hace que merezca la pena!



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