# 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)
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)
Este ejercicio se centra en desarrollar un informe de situación COVID-19 utilizando R Markdown.
Este ejercicio te guía a través de las tareas que debes realizar en RStudio en tu ordenador lo.
Por favor, envía un correo electrónico a contact@appliedepi.org si tienes preguntas sobre el uso de estos materiales.
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.
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 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":
r emo::ji("folder")
Escritorior emo::ji("folder")
intro_cursor emo::ji("folder")
módulo1r emo::ji("folder")
ébolar emo::ji("folder")
materiales_de_aprendizajer emo::ji("folder")
covidr emo::ji("file")
covid_sitrep.docxr emo::ji("folder")
guionesr emo::ji("folder")
copia de seguridadr emo::ji("folder")
datosr emo::ji("file")
ciudad_pops.xlsxr emo::ji("file")
covid_datos_ejemplo.xlsxEste 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.
Abre "covid_datos_ejemplo.xlsx" en Excel. Hay aproximadamente 80.000 registros. Observa las columnas:
report_dt
y sym_startdt
case_age
case_gender
City
es el municipio de su residencia, dentro del Condado. Ver el conjunto de datos correspondiente "city_pops.xlsx"case_zip
se refiere al "código postal" (ZIP code)hospitalized
died
confirmed_case
Abre el conjunto de datos "city_pops.xlsx" en Excel.
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".
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.
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?
La pirámide de edad / sexo está estratificada por sexos (¿recuerdas la age_pyrmaid()
función?)
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()
).
En el informe se incluyen dos tablas resumen:
Una tabla demográfica sobre el estado de hospitalización por raza (recuerda la tblsummary()
función?)
Una tabla que muestra incidencia acumulada de casos por 10.000 estratificada por ciudades (esto requerirá agrupar y resumir los datos, ¡y probablemente unirlos!)
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.
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.
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".
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.
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:
eval = TRUE
(se incluye la salida del fragmento de código; sin embargo, puede que quieras establecerlo en FALSE
para trozos de código de prueba o de análisis exploratorio)echo = FALSE
(el propio código no se imprime en el informe)warning = FALSE
(las advertencias no aparecen en el informe)message = FALSE
(los mensajes no aparecen en el informe)error = TRUE
(mostrar errores en el informe)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:
names()
están presentes en el marco de datos?class()
de columnas de interés?clean_names()
?rename()
algunas columnas para la normalización?ymd()
, mdy()
o dmy()
¿Orden?filter()
nuestro marco de datos basado en una fecha (por ejemplo, 21 de junio de 2021)?filter()
basarnos en el estado de los casos? (¡Sólo queremos casos confirmados!)age_categories()
columna para nuestra pirámide de edad?gender
columna?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:
names()
están presentes en el marco de datos?class()
de columnas de interés?clean_names()
?rename()
algunas columnas para la normalización?ymd()
, mdy()
o dmy()
¿orden?filter()
nuestro marco de datos basado en una fecha (por ejemplo, 21 de junio de 2021)?filter()
basarnos en el estado de los casos? (¡si sólo queremos casos confirmados!)age_categories()
columna para nuestra pirámide de edad?gender
columna?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.
clean_names()
función de {janitor} para convertir todos los nombres de columna a minúsculas sin espacios ni caracteres especialesrename()
-
RECUERDA la sintaxis esperada es NUEVO = VIEJOdmy()
, mdy()
o ymd()
. Utiliza la función que corresponda al formato que tengan las fechas antes de aplicar la función.filter()
.Recuerda asignar tu cadena de tuberías de limpieza a un nuevo objeto, llamado algo fácil de referenciar como linelist
o linelist_clean
.
Piensa en el orden de tu código. No olvides que, para imprimir esta declaración de texto con estadísticas resumidas en línea, esos cálculos y limpieza de datos tienen que ocurrir por encima de este texto en el R Markdown (pero no emitir ninguna salida visible).
Para mostrar fechas en un formato específico, puedes envolver la fecha en format()
y proporcionar el formato strptime
sintaxis que prefieras, por ejemplo: * Para mostrar fechas en un formato específico, puedes envolver la fecha en format()
y proporcionar el formato strptime
sintaxis que prefieras, por ejemplo
format(params$data_date, format = "%d %B, %Y")
fmt_count()
función de {epikit}. Acepta el nombre de un marco de datos y, a continuación, una sentencia lógica para filtrar las filas.fmt_count(combined, outcome == "Death")
paste("242 (44.9%)")
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.
clean_names()
función de {janitor} para convertir todos los nombres de columna a minúsculas sin espacios ni caracteres especialesrename()
-
RECUERDA la sintaxis esperada es NUEVO = VIEJOdmy()
, mdy()
o ymd()
. Utiliza la función que corresponda al formato que tengan las fechas antes de aplicar la función.filter()
.Recuerda asignar tu cadena de tuberías de limpieza a un nuevo objeto, llamado algo fácil de referenciar como linelist
o linelist_clean
.
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.
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
.
Crea un nuevo fragmento de código para la curva epidémica.
binwidth = 7
o, para ser más preciso, puedes definir una serie de valores de ruptura semanales que empiecen el lunes anterior al primer caso y terminen el lunes posterior al último caso.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")
Entonces tienes que proporcionar weekly_breaks
a la breaks =
argumento dentro de geom_histogram()
.
Para que las fechas aparezcan de forma agradable y eficaz (sin años duplicados), recuerda cómo asignar label_date_short()
a la labels =
argumento de geom_histogram()
.
Observa cómo la lista de ciudades (mostrada, y en la leyenda) se ha truncado a 5
y "Other"
... esto se ha hecho utilizando fct_lump_n()
dentro del comando ggplot, por ejemplo:
ggplot(data = linelist, mapping = aes( x = report_dt, fill = fct_lump_n(city, 5)))+ geom....
labs()
para añadir un título, un subtítulo, los nombres de los ejes, el nombre de la leyenda y la leyenda de la figura.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.
En realidad se trata de una tabla muy sencilla, gracias a la función {gtsummary} ¡paquete!
tbl_summary()
.add_p()
para añadir también los valores p.select()
las columnas que necesites antes de enviar los datos a tbl_summary()
utilizando una tubería (%>%
)race
columna, considera incluir lo siguiente en tu sección de cadena de tuberías de limpieza del R Markdown:# Change values in race column to title case mutate(race = str_to_title(race))
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.
group_by()
para agrupar los recuentos de casos por ciudades y luego utilizar summarise()
para sum()
el número de casos por ciudad.sum()
y sentencias lógicas dentro de summarise()
(no olvides na.rm = T
).data_date
parámetro, podrías incluirlo dentro del summarise()
comorecent_14d = sum(date_report >= params$data_date - 14)
(total_cases / population) * 10000
para calcular la tasa de incidencia por 10000 habitantes.round()
con el argumento digits = 1
para obtener el redondeo en la incidencia acumulada.select()
para eliminar las columnas no deseadas de la tabla final.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.
¡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!
Add the following code to your website.
For more information on customizing the embed code, read Embedding Snippets.