library(introexercises)  # get data for exercises 
library(learnr)          # create lessons from rmd 
library(gradethis)       # evaluate exercises
library(dplyr)           # wrangle data
library(flair)           # highlight code 
library(ggplot2)         # visualise data 
library(lubridate)       # work with dates
library(forcats)         # work with factors
library(fontawesome)     # for emojis 
library(scales)          # defining axes and units 
library(stringr)         # work with character strings
library(apyramid)        # creating demographic pyramids 
library(viridis)         # defining colour palettes 
library(janitor)         # clean data
library(tsibble)         # working with epiweeks
library(tidyr)           # clean data
# 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 --------------------------------------------------------------------
combined <- rio::import(system.file("dat/linelist_combined_20141201.rds", package = "introexercises"))

surv_raw <- rio::import(system.file("dat/surveillance_linelist_20141201.csv", package = "introexercises"))

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)

Obtener ayuda y solucionar errores

Este ejercicio enseña cómo solucionar los mensajes de error, leer la documentación de las funciones e interactuar eficazmente con las comunidades de usuarios de R para obtener ayuda.

Formato

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

Obtener ayuda

Hay varias formas de obtener ayuda:

1) Busca a los "ayudantes" (ver más abajo) 2) Pide ayuda al instructor/facilitador de tu curso en directo 3) Programa una llamada 1 a 1 con un instructor para "Tutoría del curso". 4) Publica una pregunta en Comunidad Epi Aplicada

Este es el aspecto que tendrán esos "ayudantes":

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(
    age > 25,
    district == "Bolo"
  )

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


Preguntas del concurso

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("When should I view the red 'helper' code?",
    answer("After trying to write the code myself", correct = TRUE),
    answer("Before I try coding", correct = FALSE),
    correct = "Reviewing best-practice code after trying to write yourself can help you improve",
    incorrect = "Please attempt the exercise yourself, or use the hint, before viewing the answer."
  )
)
question_numeric(
 "How anxious are you about beginning this tutorial - on a scale from 1 (least anxious) to 10 (most anxious)?",
 answer(10, message = "Try not to worry, we will help you succeed!", correct = T),
 answer(9, message = "Try not to worry, we will help you succeed!", correct = T),
 answer(8, message = "Try not to worry, we will help you succeed!", correct = T),
 answer(7, message = "Try not to worry, we will help you succeed!", correct = T),
 answer(6, message = "Ok, we will get there together", correct = T),
 answer(5, message = "Ok, we will get there together", correct = T),
 answer(4, message = "I like your confidence!", correct = T),
 answer(3, message = "I like your confidence!", correct = T),
 answer(2, message = "I like your confidence!", correct = T),
 answer(1, message = "I like your confidence!", correct = T),
 allow_retry = TRUE,
 correct = "Thanks for sharing. ",
 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

El objetivo de este ejercicio es que practiques cómo pedir ayuda a la comunidad con un problema de codificación.

En este módulo aprenderás a hacernos preguntas (y a muchos otros epis) de forma gratuita a través del foro de nuestra comunidad.

Limpieza de guiones

Estilo

Muchas organizaciones tienen guías de estilo del código R.

Echa un breve vistazo a estos ejemplos. Piensa en tu propio estilo de codificación y en cómo se ajusta:

Revisión del código

Reinicia tu sesión de R (menú desplegable Sesión -> Reiniciar R).

Asegúrate de que tu entorno está vacío (utiliza el botón "escoba" de la parte superior derecha si es necesario).

Tómate 5-10 minutos y revisa tu script de R. Asegúrate de que:

Pide ayuda a un instructor, consejos o una revisión final de tu guión.

Solución de errores

Esta sección del ejercicio calentará tu cerebro mostrándote mensajes de error comunes. Tu tarea es comprender la razón del mensaje de error.

Esfuérzate al máximo y considera esto como una oportunidad de aprendizaje. Seguro que muy pronto estarás en condiciones de solucionar errores en tu código o en el de otros.

Los mensajes de error de R pueden ser crípticos, pero practicar cómo entenderlos es extremadamente útil.

Recuerda que las respuestas son anónimas, ¡así que no te preocupes si te equivocas en algunas preguntas!

No se encuentra la función

knitr::include_graphics("images/error_import.png", error = F)
quiz(
  question_radio("In the image above, what is the likely cause of the error message?",
    answer("The user forgot to run the command to load their packages",
           correct = TRUE,
           message = "Right! The error 'could not find function' either means the function name was spelled incorrectly, or its package was not loaded."),
    answer("R has a memory lapse and cannot remember how to import data",
           correct = FALSE,
           message = "R does not just forget things, this is probably user error."),
    answer("The user is not in the correct RStudio project",
           correct = FALSE,
           message = "The ebola RStudio project is correct and is not the problem."),
    allow_retry = TRUE
  )
)

No existe tal archivo

knitr::include_graphics("images/error_import_extension.png", error = F)
quiz(
  question_radio("In the image above, what is the likely cause of the error message? Note, the files pane in the bottom right is show-casing the RSutdio project directory for reference.",
    answer("The user forgot to run the command to load their packages",
           correct = FALSE),
    answer("The linelist is not saved in the indicated folder",
           correct = FALSE,
           message = "It is visible in the Files pane that the linelist is saved in the indicated data/raw folder"),
    answer("The user forgot to write the file extension of the linelist (.csv)",
           correct = TRUE,
           message = "The file extension must be provided. The import() function also uses this to determine the best mechanism to import that type of data."),
    answer("The user is not in the correct RStudio project",
           correct = FALSE,
           message = "The ebola RStudio project is correct and is not the problem."),
    allow_retry = TRUE
  )
)

La columna no existe

knitr::include_graphics("images/error_rename_data.png", error = F)
knitr::include_graphics("images/error_rename_script.png", error = F)
quiz(
  question_radio("After loading packages and importing data, the user tried to run the data cleaning command. What is the likely cause of the error message?",
    answer("The column date_onset does not exist in the raw dataset",
           correct = FALSE,
           message = "By the time the rename() is run, are the columns in the raw data relevant anymore? Think about what is changing them before the rename() function is run."),
    answer("The old column name should be written with a space, like in the raw data",
           correct = FALSE,
           message = "By the time the rename() function is used, the column names have already been standardized by the clean_names() function, so all spaces have been replaced by underscores."),
    answer("The columns in rename() should be written in the opposite order",
           correct = TRUE,
           message = "The rename function expects the new name of the column first, then an equals sign, then the old name of the column. The column names used should have underscores instead of spaces, because they have been modified by clean_names()."),
    answer("The pipe is using the incorrect dataset",
           correct = FALSE,
           message = "The cleaning command is correctly set up to create a clean dataset, starting from the raw dataset."),
    allow_retry = TRUE
  )
)

Error en tabyl(): objeto no encontrado

knitr::include_graphics("images/error_missing_case.png", error = F)
quiz(
  question_radio("The user ran the cleaning command above, and then tried to produce the cross-tabulation of the clean data. What is the cause of the error message?",
    answer("The tabyl() function is not recognizing the surv object, because it is piped into it.",
           correct = FALSE,
           message = "The dataset can be piped into tabyl(), or provided as the first argument inside the parentheses."),
    answer("The user has created the object surv, but in the table is referencing Surv.",
           correct = TRUE,
           message = "R is case-sensitive. The difference between the lowercase 's' and the uppercase 'S' matters."),
    answer("The user forgot to save their script before running the table command.",
           correct = FALSE,
           message = "Saving of the script is not relevant to this. You can run commands without saving your script."),
    allow_retry = TRUE
  )
)

Obtener ayuda

Cuando te encuentres con un error u otro problema, ¿cuáles son tus opciones?

Documentación de funciones

Cuando un usuario de R crea una función de R (o un paquete entero), escribe "documentación" para ayudar a los usuarios de la función. Cuando se instala el paquete, la documentación también se descarga y está disponible en el panel de Ayuda de la parte inferior derecha de RStudio.

La calidad de esta documentación varía mucho. Aún así, conocer la estructura básica puede ayudarte si buscas ayuda para utilizar una función.

Vocabulario

La documentación mencionará a menudo objetos de varias clases, como "marco de datos", "vector", "lista", "matrices", etc.

Marco de d - Un "marco de datos" es la forma más común de almacenar datos en R. En lenguaje común, es un "conjunto de datos" con filas y columnas de igual longitud. Todos los conjuntos de datos con los que hemos trabajado en R son marcos de datos (surv_raw, surv, hosp etc.)

Vector - Un "vector" es una secuencia de valores, todos los cuales deben ser de la misma clase (por ejemplo, fecha, numérico, carácter, entero, etc.). En un marco de datos, cada columna es en sí misma un vector. También puedes tener vectores independientes que se crean con la función c().

Lista - Las listas en R son un objeto más intermedio/avanzado que no hemos enseñado en esta clase. En resumen, son como un vector de otros objetos. Por ejemplo, puedes tener una lista de marcos de datos, una lista de vectores, etc. Es un tipo de objeto muy útil para acciones repetidas (bucles u otros tipos de iteración).

quiz(
  question("Which of the following is a vector? (select all that apply)",
    answer("A data frame named linelist",
           correct = FALSE,
           message = "No, a data frame contains multiple columns."),

    answer("A column linelist$age",
           correct = TRUE,
           message = "Yes, a column is a vector."),

    answer("c('Suspect', 'Confirmed') used in a filter() command to keep certain rows",
           correct = TRUE,
           message = "Yes, the Suspect and Confirmed are combined into one vector using the function c()."),
    allow_retry = TRUE
  )
)

Estructura

La documentación de las funciones suele organizarse en distintas secciones:

Puedes buscar la Documentación de Ayuda de cualquier función de los paquetes de R cargados en tu sesión actual de RStudio utilizando un '?' seguido del nombre de la función sin paréntesis.

Por ejemplo, este comando ejecutado a través de tu consola muestra la documentación de tabyl() en el menú Ayuda de la Panel Archivos, Parcelas, Paquetes, Ayuda y Visor en RStudio.

?tabyl

Prueba a ejecutar el comando anterior en tu consola y revisa la documentación que aparece bajo el icono Ayuda Ayuda.

quiz(
  question_radio("Which formats can the first argument of the tabyl function take?",
    answer("Only a data.frame",
           correct = FALSE,
           message = "No, review the documentation of the tabyl function."),

    answer("Only a vector",
           correct = FALSE,
           message = "No, review the documentation of the tabyl function."),

    answer("As long as it is in character format, any object type works. ",
           correct = FALSE,
           message = "No, review the documentation of the tabyl function."),

    answer("data.frame or vector",
           correct = TRUE,
           message = "The tabyl() function requires a first argument to be data.frame or vector object."),
    allow_retry = TRUE
  )
)

Documentación del paquete

Desplázate hasta la parte inferior de tabyl() documentación.

Observa que al final hay información sobre paquete que tabyl() pertenece a:

Haz clic en el enlace "Índice" y revisa la documentación del {janitor} paquete. Verás enlaces a la documentación de todas las funciones del paquete.

También puedes acceder a la documentación del paquete con un comando como éste:

?janitor

Revisa la documentación del adorn_totals() en el paquete {janitor} paquete.

quiz(
  question_radio("What is the class of the output created from adorn_totals?",
    answer("Numeric",
           correct = FALSE,
           message = "Review the Value area of the documentation."),

    answer("Character",
           correct = FALSE,
           message = "Review the Value area of the documentation."),

    answer("Numeric or Character",
           correct = FALSE,
           message = "Review the Value area of the documentation."),

    answer("Data frame",
           correct = TRUE,
           message = "adorn_totals() outputs a data frame that also has the special class 'tabyl' which allows it to store additional information about the attached totals and underlying data."),
    allow_retry = TRUE
  )
)

A la mayoría de la gente le cuesta leer la documentación. Si te sientes así, no eres el único. A menudo, los autores de paquetes también crean páginas web o sitios web de recorrido para sus paquetes en línea, que son más legibles y pueden incluso incluir ejemplos más detallados (por ejemplo, viñetas) de cómo utilizar las funciones de un paquete.

Documentación en línea

Sitio CRAN y viñetas

CRAN es un lugar donde los paquetes pueden alojarse en línea y estar disponibles para su descarga. Cada paquete almacenado allí tiene un sitio web estándar y básico. A veces, se pueden encontrar enlaces a viñetas y tutoriales específicos de cada paquete.

Este es el sitio CRAN para rio. Consulta la sección "Viñetas" y haz clic en algunas para abrirlas. Aquí tienes sus viñeta introductoria.

Sitios web personalizados

Ir a este sitio web https://www.danieldsjoberg.com/gtsummary/. Se trata de un sitio web creado por Daniel Sjoberg, el creador del {gtsummary} paquete.

Además de la documentación estándar almacenada en RStudio, ha creado un sitio web para que la documentación sea más accesible. Muchos autores hacen esto como un servicio a su público.

Este es el sitio web de tidyverse (dplyr, ggplot2, stringr, forcats, y más...).

Github

Para muchos paquetes, su código subyacente está disponible en el sitio "Github". Allí, las actualizaciones se muestran públicamente y los usuarios pueden enviar solicitudes o problemas para que se solucionen. De hecho, ¡los usuarios también suelen enviar correcciones! Esta es una de las muchas formas en que los usuarios de R pueden demostrar lo útil que es programar en un lenguaje de código abierto como R.

Aquí está el sitio Github de conserje. Haz clic en la pestaña "Temas" de la parte superior para ver los temas pendientes y las sugerencias del público.

Ética del código abierto y agradecimiento a los autores

Recuerda que R ha sido creado por sus usuarios y está disponible gratuitamente. No hay ninguna empresa que supervise R y cree todos sus paquetes. Un usuario escribe un paquete y luego es examinado por millones de usuarios: los mejores llegan a la cima.

Antes de que te sientas frustrado por la falta de documentación, respira hondo y recuerda que la gran mayoría de los paquetes están hechos de forma voluntaria por personas que desean ayudar a los demás. A menudo, estos autores no disponen de mucho dinero libre.

A veces, tienen botones de donación, ¡o te sugieren que "pases" la buena voluntad a otra persona que esté aprendiendo R (por ejemplo, respondiendo a sus preguntas en nuestro Foro de la Comunidad)!

ChatGPT

Las herramientas de IA como ChatGPT pueden ser útiles para obtener ayuda con el código R, y te animamos a que las pruebes. Sin embargo, para este curso introductorio, nuestra prioridad es enseñarte programación en R sin la ayuda de la IA.

A veces, las herramientas como ChatGPT pueden dar respuestas incorrectas o confusas, pueden no conocer los últimos desarrollos de un paquete, y debes tener cuidado al darles información sensible. Aún así, tienes que saber cómo funciona el código R para entender en qué se equivoca la IA.

Creemos que los foros son un lugar para conectar con otros epidemiólogos y profesionales de la salud pública. En los foros puedes hacer preguntas matizadas sobre métodos epidemiológicos, sobre la red y sobre temas importantes: ayudar a los demás.

Nota a medida que la IA se hace más común, muchas instituciones han empezado a exigir que se cite la IA si se utiliza. Revisa las políticas de tu organismo antes de utilizar IA.

Estrategias de los motores de búsqueda

Los motores de búsqueda pueden ser un poderoso punto de partida para obtener ayuda, pero ciertas estrategias harán que tu búsqueda sea mucho menos eficaz.

Puede que te resulte útil intentar una búsqueda en Google cuando:

Estrategias de búsqueda:

Redactar una búsqueda eficaz:

Excluye la información que sea exclusiva de tus datos o análisis.

Por ejemplo, supongamos que recibes el siguiente mensaje de error:

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

En una búsqueda en Google no incluir el nombre del marco de datos ("surv"), los nombres de las columnas ("distrito") ni los valores específicos ("West II"), ya que son exclusivos de tus propios datos o análisis.

Debes centrarte en los mensaje de error más amplio. El mensaje de error anterior es específico del recode() función . En este caso, la búsqueda más eficaz sería sólo incluiría:

Causado por un error en recode.character() Falta el argumento ".x", sin valor por defecto

Vamos a probarlo ahora. **Copia y pega lo anterior en el archivo buscador Google ahora. **

Dependiendo de tu historial de búsqueda, puedes tener resultados diferentes a los de otros. Haz clic en los diferentes resultados para revisar algunas respuestas. ¿Has encontrado la solución a tu problema?

Algunos lugares útiles para buscar la respuesta pueden ser Stack Exchange, Stack Overflow o el Manual de Epi R. Por ejemplo, puede que aparezca el siguiente resultado en tu búsqueda en Google.

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

Si haces clic en esta página, encontrarás que el capítulo del Manual de Epi R proporciona la respuesta.

Ctrl f

Para buscar dentro de una página web un término específico, puedes utilizar la tecla Ctrl y la tecla "f" juntas para iniciar una búsqueda. Por ejemplo, el enlace anterior ofrece un capítulo de muchos errores comunes de R, así que puedes utilizar "ctrl" y "f" (o "cmd" y "f" en un mac) para buscar recode en la página:

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

¡Localizó rápidamente el texto relacionado con nuestro error específico de interés!

Nos falta el nombre de la columna dentro de recode(). ¡Una solución fácil!

Nota: Igual que usaste ctrl f (o cmd f para un mac) para buscar recode en esta página web, también puedes utilizar ctrl f o cmd f en RStudio para buscar términos específicos en tu script de R. Esto puede ser muy útil, ¡especialmente al depurar errores en el script!

Foros

Hay varios foros para publicar preguntas sobre el código R. Por ejemplo Pila de intercambio o Stack Overflow son muy populares. Pero puede intimidar o dar miedo publicar en estos foros.

Nuestro equipo de Applied Epi se ha dado cuenta de que la mayoría de los usuarios principiantes de R de salud pública no publican en estos foros porque

1) Se sienten intimidados por la estricta cultura del foro, y 2) Estos foros no se centran en la salud pública

Así que decidimos hacer un para principiantes y centrado en la salud centrado en la salud pública. Ese es nuestro Comunidad Epi Aplicada ¡!

Puedes publicar preguntas sobre el código R, u otros temas de salud pública / métodos epi ¡!

Muchos organismos de salud pública están creando ahora sus propios grupos internos de usuarios de R o grupos de correo electrónico de apoyo. ¡Pero casi todos se hacen las mismas preguntas! Si más agencias publican sus preguntas (no sensibles) sobre el código R y los métodos epi en un foro público, todo el mundo podrá encontrar respuestas más fácilmente y se reducirán los muros entre naciones y agencias.

Haz una buena pregunta en un foro

La forma más eficaz de obtener una respuesta útil en un Foro, es tomarse el tiempo necesario para hacer una buena pregunta.

"¡Ayúdame a ayudarte!" - Muchos epidemiólogos dispuestos a ayudarte

Imagina que alguien intenta ayudarte con un error de código R. Para comprender rápidamente tu problema y solucionarlo, debe ser capaz de recrear tu problema en su ordenador.

No tienen acceso a tu conjunto de datos completo. Pero aún así quieren poder ejecutar tu código y ver el problema exacto que encontraste...

Puedes facilitarlo incluyendo un "ejemplo mínimo y reproducible" en tu post, lo que se llama un "reprex".

Sensibilidad e intercambio de datos

r fontawesome::fa("exclamation", fill = "red") Recuerda que siempre debes pensar detenidamente qué datos puedes publicar. Asegúrate de que no haya información de pacientes, identificable o sensible por cualquier otro motivo.

Nota - debes no publicar un conjunto de datos completo. Normalmente, sólo se necesitan entre 5 y 15 filas de datos, y unas pocas columnas, para que alguien pueda reproducir tu problema.

Como alternativa, considera:

Reprex ejemplo 1

Ahora, trabajarás en un ejemplo de construcción de un "ejemplo reproducible" de un problema, y lo publicarás en la sección Área de formación de Foro comunitario de Epi Aplicada. Si no tienes acceso al Área de formación por favor, avisa a uno de los instructores para que te den acceso y se aseguren de que puedes publicar en el foro. Necesitarás tu cuenta de Epi Aplicada para acceder al foro de la Comunidad de Epi Aplicada.

Finalidad de un reprex

La finalidad de un reprex es resumir tu problema para que los lectores puedan recrearlo en sus propios ordenadores.

Un buen reprex es

Ahora crearemos juntos un reprex. Si olvidas estos pasos más adelante, siempre puedes encontrarlos escritos en la página de Applied Epi de Applied Epi aquí.

Escenario

Empieza con un script R muy básico que utilice la función Ébola ébola.

Ve a la ébola/scripts/ejemplos y abre "ejemplo_análisis1.R"..

Debería tener este aspecto:

############################
# Example analysis 1
############################

# install and load packages
pacman::p_load(rio, here, janitor, tidyverse)

# import data
surv_raw <- import(here("data", "raw", "surveillance_linelist_20141201.csv"))

# clean the surveillance data
surv_clean <- surv_raw %>% 
  clean_names()

# make a horizontal bar plot of cases per district, filled by sex
ggplot(
  data = Surv_clean,
  mapping = aes(y = adm3_name_res, fill = sex))+
geom_bar()

Este script hace lo siguiente

1) Carga los paquetes 2) Importa los en bruto datos de la lista de líneas 3) Limpia los nombres de columna de los datos 4) Utiliza ggplot() para crear un gráfico de barras

Ejecuta todos los comandos uno a uno.

r fontawesome::fa("exclamation", fill = "red") ¡Algo ha ido mal!

Cuando intentaste producir el gráfico de barras, no apareció ningún gráfico y había un mensaje de error:

objeto 'Surv_clean' no encontrado

Es posible que ya puedas ver el motivo del error. Aunque ya conozcas el motivo del error, sigue los pasos que se indican a continuación para solicitar ayuda en el foro.

La habilidad que aprenderás hoy es cómo crear un post eficaz: es una habilidad que te ayudará durante muchos años.

¡Hagamos un post en el foro "reprex" para ver si alguien puede ayudar!

Crea un nuevo script para tu mensaje del foro

Comienza tu reprex con un script limpio. Abre un script R separado y guárdalo en la carpeta ebola/scripts/ejemplos como "reprex1.R".

Ten ambos scripts disponibles en RStudio para poder cambiar entre ellos ("ejemplo_análisis.R" y "reprex1.R").

Copiar comandos

Ahora rellena el script "reprex1.R" con sólo los comandos necesarios para recrear tu problema.

Tendrás que pensar en ello. Normalmente, esto incluye:

1) Una orden para cargar paquetes 2) Un comando para importar datos 3) Los pocos comandos que ejecutaste para procesar los datos, si procede 4) Los comandos que revelaron, o probablemente causaron, el problema/error

En este breve ejemplo, podemos copiar los siguientes comandos:

1) En pacman::p_load() comando. Esto indicará al respondedor del foro qué paquetes estaban cargados en ese momento.

2) La dirección import() comando. Lo ajustaremos dentro de un momento.

3) El comando de limpieza de datos que crea surv_clean

Pregúntate: ¿es el ggplot() comando necesario para recrear el problema? Sí. Ahí es donde se identificó el problema por primera vez.

4) Incluye el ggplot() en el script "reprex1.R".

Tu script "reprex1.R" debería tener ahora este aspecto:

# reprex1 script  

# install and load packages
pacman::p_load(rio, here, janitor, tidyverse)

# import data
surv_raw <- import(here("data", "raw", "surveillance_linelist_20141201.csv"))

# clean the surveillance data
surv_clean <- surv_raw %>% 
  clean_names()

# make a horizontal bar plot of cases per district, filled by sex
ggplot(
  data = Surv_clean,
  mapping = aes(y = adm3_name_res, fill = sex))+
geom_bar()

Limpia tu Entorno (haz clic en el icono "escoba" de la esquina superior derecha) y luego ejecuta todos estos comandos de nuevo. Asegúrate de que sigues viendo el mensaje de error que esperas.

El conjunto de datos para el puesto

Quien responda en el foro no tendrá acceso al conjunto de datos "surveillance_linelist_20141201.csv". Éste se almacena en el proyecto RStudio de tu ordenador. En la mayoría de los casos, no es práctico ni permisible compartir todo el conjunto de datos en el foro.

En su lugar, puedes proporcionar al foro un mínimo de tu conjunto de datos - sólo unas pocas columnas y filas - que pueden utilizar para recrear tu problema en su ordenador.

Paso 1. Carga el {reprex} y {datapasta} paquetes

Instala y/o carga los paquetes "reprex" y "datapasta". Puedes hacerlo añadiéndolos a la carpeta pacman::p_load() al principio de tu script "reprex1.R". Tu pacman::p_load() debe tener ahora el siguiente aspecto:

# install and load packages
pacman::p_load(rio, here, janitor, tidyverse, reprex, datapasta)

Paso 2. Haz tu marco de datos mínimo

Identifica los mínimo filas y columnas necesarias para reproducir tu problema. Normalmente, bastará con 5-10 filas y unas pocas columnas.

En tu script "reprex1.R", escribe un nuevo comando en la parte inferior de tu script. Utilizará select() y head() para reducir tu surv_raw conjunto de datos a un conjunto de datos muy pequeño, con pocas filas y pocas columnas.

Escribe y ejecuta este comando:

# create a minimal dataset, by reducing surv_raw to 5 rows and 2 columns
surv_raw %>% 
  head(5) %>%                 # take the top 5 rows only
  select(adm3_name_res, sex)  # keep only the relevant columns

Nota: Este comando no crea un objeto nuevo. Simplemente debe imprimir un pequeño marco de datos en el Consola.

Nota: Inicia el comando con tu en bruto sin procesar. Esto garantiza que el usuario del foro comience su resolución de problemas a partir del mismo conjunto de datos con el que tú empezaste.

Paso 3. Un comando para generar los datos brutos

¿Tendrá la gente del foro acceso a surv_raw? No.

Esto significa que también tenemos que crear nuestros datos brutos dentro del script. El siguiente paso es transicionar nuestros comandos para que los datos brutos y el marco de datos mínimo se generen únicamente con código R. No dependeremos del código surv_raw original.

Añade una tubería al comando en la parte inferior de tu script y pasa el conjunto de datos mínimo al comando dpasta() función de la función {datapasta} paquete.

# create a minimal dataset, by reducing surv_raw to 5 rows and 3 columns
surv_raw %>% 
  head(5) %>%                      # take the top 5 rows only
  select(adm3_name_res, sex) %>%   # keep only the relevant columns
  dpasta()                         # convert to stand-alone R code

Cuando ejecutas este comando, te darás cuenta de que el código R se ha pegado automáticamente en tu script debajo del coma. Por ejemplo

data.frame(
  stringsAsFactors = FALSE,
     adm3_name_res = c(NA,"Mountain Rural",
                       "Mountain Rural","East II","West III"),
               sex = c("m", "f", "f", "f", "f")
)

Ejecuta este comando. Verás cómo produce exactamente el mismo conjunto de datos mínimo, utilizando la función base de R data.frame(). Los valores están "codificados" (escritos explícitamente en el comando) con la estructura de columnas adecuada.

El resultado: cualquier persona con este comando puede empezar a trabajar con tu conjunto de datos mínimo -a pesar de no tener acceso al original surv_raw origina.

Paso 4. Haz que el reprex sea totalmente reproducible

Ahora, en el script "reprex1.R", CORTA y PEGA la salida anterior data.frame() para sustituir el comando import() comando. En el script, el comando surv_raw debería crearse ahora a partir del objeto data.frame() en lugar de utilizar import().

# import data
surv_raw <- data.frame(
  stringsAsFactors = FALSE,
  adm3_name_res = c(NA,"Mountain Rural",
                    "Mountain Rural","East II","West III"),
  sex = c("m", "f", "f", "f", "f")
)

Una vez finalizado, puedes desactivar/comentar (utilizando el botón # ) el código de la parte inferior del script que crea el conjunto de datos mínimo.

Tu script debería tener ahora este aspecto:

# reprex 1

# install and load packages
pacman::p_load(rio, here, janitor, tidyverse, reprex, datapasta)

# import data
surv_raw <- data.frame(
  stringsAsFactors = FALSE,
  adm3_name_res = c(NA,"Mountain Rural",
                    "Mountain Rural","East II","West III"),
  sex = c("m", "f", "f", "f", "f")
)

# clean the surveillance data
surv_clean <- surv_raw %>% 
  clean_names()

# make a horizontal bar plot of cases per district, filled by sex
ggplot(
  data = Surv_clean,
  mapping = aes(y = adm3_name_res, fill = sex))+
geom_bar()


# make the minimal dataset
#surv_raw %>% 
#  head(5) %>%                      # take the top 5 rows only
#  select(adm3_name_res, sex) %>%   # keep only the relevant columns
#  dpasta()                         # convert to stand-alone R code

Paso 5. Prueba el reprex

Borra de nuevo tu Entorno haciendo clic en el icono de la escoba situado en la parte superior derecha del panel Entorno. Esto significa que no se guarda ningún objeto y garantiza que tu reprex se está probando de forma aislada.

Ejecuta todos los comandos del script "reprex1.R". El comando datos no debe tener import() sólo el comando data.frame() con los valores codificados.

Deberías seguir encontrando el mismo mensaje de error. Si no es así, considera la posibilidad de utilizar un conjunto de datos mínimo diferente (por ejemplo, más filas o columnas diferentes). Por ejemplo, para incluir 10 filas en lugar de 5, podrías utilizar head(10) en lugar de head(5) al crear tu marco de datos mínimo.

Paso 6. Genera un reprex compartible

El siguiente paso es procesar el reprex utilizando la función {reprex} paquete. Esto te ayudará a compartir fácilmente tu reprex en el foro.

Ya has cargado el paquete {reprex} como parte del paquete pacman::p_load de tu script de R.

# install and load packages
pacman::p_load(rio, janitor, tidyverse, reprex, datapasta)

En primer lugar, resalta todo el código R necesario en el script "reprex1.R" para recrear tu problema. Éste es el código que se ejecutará de forma aislada (desde un Entorno vacío), y que se publicará en el foro. Ten en cuenta al resaltar el código R, qué parte (si la hay) del script no es necesaria para tu ejemplo reproducible.

Una vez que hayas resaltado tu código R, ejecuta el siguiente comando en tu Consola reprex_addin(). Se abrirá una ventana emergente que te ayudará a crear tu reprex.

Selecciona las siguientes opciones en la ventana emergente:

1) ¿Dónde está la fuente reprex? "selección actual" (se refiere al script R resaltado) 2) Lugar de destino: "Github o Stack overflow" (se refiere al mensaje del foro en línea) 3) Desplázate hacia abajo para seleccionar "Añadir información de la sesión" (marca la casilla en la parte inferior de la ventana emergente)

A continuación, pulsa el botón Renderizar.

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

Esta acción toma el código R resaltado y lo ejecuta en un Entorno R aislado. Registra cualquier error, advertencia, salida, información sobre tu versión de R y paquetes cargados utilizados en el reprex.

Todo esto se combina en un bonito formato HTML que puede publicarse en un foro para que un respondedor lo reciba fácilmente. Esto aparece en el panel Visor, y también se añade automáticamente a tu portapapeles (lo que significa que está listo para que lo pegues en un mensaje del foro).

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

Si no aparece nada en el panel del Visor, ejecuta de nuevo el comando. Ocasionalmente puede tener errores y es necesario ejecutarlo dos veces. Comprueba el panel Visor para asegurarte de que el mensaje de error tiene el aspecto que esperabas.

Este ejemplo es totalmente reproducible y puede ejecutarlo cualquier otra persona. Es decir Cualquiera puede copiar esto en su script de R, ejecutarlo y empezar a solucionar su problema.

Publicar tu reprex

¡Por fin tienes tu reprex listo! Vamos a publicarlo en el foro.

Ve a Comunidad Epi Aplicada e inicia sesión con tu cuenta de Applied Epi.

Hay dos áreas donde puedes publicar problemas o preguntas sobre el código R:

1) La página Formación Utilízala para los ejercicios de hoy

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

2) El "Código R úsalo en el futuro para preguntas sobre tus análisis

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

Ve al área de Formación del foro y haz clic en "Nuevo Tema" en el lado derecho. Ten en cuenta que al escribir en los mensajes del foro, la parte escrita de tu mensaje utilizará el estilo de escritura Markdown. Aprenderemos más sobre esto en la próxima sesión, pero por ahora puedes probar a utilizar * para crear viñetas, o # para crear diferentes niveles de encabezados en tu mensaje (# para un encabezado grande, ## para un encabezado más pequeño, etc...). El formato del mensaje en el foro también proporciona opciones de apuntar y hacer clic para negrita, cursiva o crear viñetas.

Sigue las indicaciones del foro para escribir un post sencillo que:

En la parte inferior, pega tu reprex. Recuerda que el reprex ya está en tu portapapeles, está listo para ser pegado. Utiliza ctrl+v (cmd + v para macs) o haz clic con el botón derecho y pega. Si lo has perdido, simplemente vuelve a ejecutar el reprex resaltando el código necesario en tu script de R y ejecutando reprex_addin() en la Consola, y luego pégalo en el mensaje del foro.

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

El contenido de la parte derecha es una vista previa. Cuando hayas terminado de editar tu mensaje, haz clic en "Crear tema" y ¡ve a ver tu mensaje en el foro!

Una respuesta

Has publicado en el Área de formación por lo que es posible que no recibas respuesta.

Sin embargo, si publicas una pregunta en el área real de "Código R", epidemiólogos de todo el mundo serán alertados de tu pregunta y puede que decidan ayudarte.

¿Cómo se responde a una pregunta?

El respondedor copiará el reprex haciendo clic en el icono de copia de la esquina superior derecha. Podrán pegarlo fácilmente en un script R de su ordenador. Como el reprex contiene un conjunto de datos mínimo y es reproducible, pueden ejecutar tu código exactamente igual que tú y ver el mismo mensaje de error.

¡Una respuesta!

Identifican rápidamente que el problema está en los nombres de los objetos. Tu script guarda los datos limpios como surv_clean pero ggplot()'s data = argumento utiliza Surv_clean. Como R distingue entre mayúsculas y minúsculas, no conoce la Surv_clean conjunto de datos, por lo que informa de que este objeto no se encuentra.

El que responda en el foro puede editar tu código adecuadamente y pegarlo en su respuesta.

¡No olvides darle las gracias y marcar su respuesta como la "Solución"!

Más prácticas de solución de problemas

Intenta responder a estas preguntas sobre errores comunes de R. De nuevo, simplemente hazlo lo mejor que puedas y pide ayuda a un instructor si es necesario.

Si prefieres dedicar tu tiempo a practicar otro "reprex", puedes saltarte estas preguntas y avanzar a la siguiente sección.

Objeto no encontrado

knitr::include_graphics("images/error_pipe_missing_data.png", error = F)
knitr::include_graphics("images/error_pipe_missing.png", error = F)
quiz(
  question_radio("In the image above, the user received an error after running the entire data cleaning command. What is the cause of this error?",
    answer("The adm3_name_res column is not in the surv dataset",
           correct = FALSE,
           message = "This column is in the surv dataset."),
    answer("The adm3_name_res column is not in the surv_raw dataset",
           correct = FALSE,
           message = "This column is in the surv_raw dataset."),
    answer("Some of the values in adm3_name_res column are missing",
           correct = FALSE,
           message = "This column is in the surv dataset."),
    answer("The user forgot to put a pipe operator on the end of line 22",
           correct = TRUE,
           message = "Correct. The dataset was not piped to the filter() line. Therefore, R did not understand what the column adm3_name_res was, without the context of the dataset."),
    answer("The user should have written the filter() line above the mutate() line",
           correct = FALSE,
           message = "No, the order of these two lines has no impact on this error message."),
    allow_retry = TRUE
  )
)
quiz(
  question_radio("Why does the error message reference 'string', and 'pattern' if it has to do with a missing pipe?",
    answer("On line 23 the filter() function is applying a logical test to the rows in the dataset via the function str_detect(), which look for patterns in a character column.",
           correct = TRUE,
           message = "Learn more about str_detect() in the Epi R Handbook. Alternatively, run ?str_detect() in your console to access Help Documentation for str_detect()."),
    answer("The software R is constructed via microscopic strings that vibrate at varying speeds.",
           correct = FALSE,
           message = "R is a normal programming software."),
    answer("R error messages always contain these words",
           correct = FALSE,
           message = "While not always clear, R messages do not always have the same text."),
    allow_retry = TRUE
  )
)

Argumento no utilizado

knitr::include_graphics("images/error_cleaning_ifelse.png", error = F)
quiz(
  question_radio("In the image above, the user received an error after running the entire data cleaning command. What is the cause of this error?",
    answer("The ifelse() function requires the user to specify which argument is the test",
           correct = FALSE,
           message = "If the arguments of the ifelse() function are written in their default order, they do not need to be specified with their names."),
    answer("It is not necessary to write 'child'. Any row that is not an adult will be marked as NA.",
           correct = FALSE,
           message = "ifelse() does require the user to specify a value for when the logical test is met, and for when the test is not met."),
    answer("The age column must be converted to numeric before being used in ifelse()",
           correct = FALSE,
           message = "While it is true that age must be numeric or integer to be evaluated properly, in this case it already is numeric. This is not the source of the error."),
    answer("The user must nest the ifelse() within a mutate() function",
           correct = TRUE,
           message = "Correct. Each line that receives data piped from a previous line must begin with a function that accepts a dataset as its first argument. Within the mutate(), after an equals sign, the ifelse() can be written. The correct syntax for the line is: mutate(age_group = ifelse(age > 18, 'adult', 'child'))."),
    allow_retry = TRUE
  )
)

Comando inacabado

knitr::include_graphics("images/error_cleaning_paren.png", error = F)
quiz(
  question_radio("As shown above, the user ran the entire cleaning command, but no output or changes occurred. The Console shows a + symbol, indicating the command is not finished. What is the cause of this?",
    answer("There is too much space between each line in the cleaning command.",
           correct = FALSE,
           message = "Empty space does not impact code execution, but can make it easier to read."),
    answer("Ending with a filter() command will always cause this situation",
           correct = FALSE,
           message = "There is no function that will always cause this situation."),
    answer("It is not a problem, the user should continue with their next command.",
           correct = FALSE,
           message = "If R thinks that this command is not finished, then running the next command will produce unexpected results because the two commands will be linked in unintended ways."),
    answer("The X's are clues - there is a missing closing parentheses on line 41",
           correct = FALSE,
           message = "Line 41 is complete and accurate. One opening parenthesis, and one closing parenthesis."),
    answer("The X's are clues - there is a missing closing parentheses on line 38",
           correct = TRUE,
           message = "On line 38 there are two functions. The filter() function is restricting the dataset to only three districts. The districts are three character values combined into a vector by the c() function. This allows the %in% operator to evaluate them all at one time. However, there is only one closing parenthesis on the line, when there should be two. One set of parentheses for mutate() and one for c()."),
    allow_retry = TRUE
  )
)

Objeto no encontrado (ggplot)

knitr::include_graphics("images/error_ggplot_data.png", error = F)
quiz(
  question_radio("In the image above, what is the cause of the error?",
    answer("The district_res column is not in the surv dataset.",
           correct = FALSE,
           message = "This column is in the surv dataset."),
    answer("The ggplot2 package has not been loaded so the ggplot() function is not working properly.",
           correct = FALSE,
           message = "The ggplot2 package has been loaded. If it was not loaded, the error ggplot function not found would appear instead."),
    answer("The dataset object to be used for the plot has not been specified.",
           correct = TRUE,
           message = "Yes, this command is missing a specification of the data. It must either be specified to the data= argument in the ggplot() function, data= argument in the geom_bar() function, or piped into the ggplot command from above."),
    allow_retry = TRUE
  )
)

surv_raw no encontrado

knitr::include_graphics("images/error_pipe_hang.png", error = F)
quiz(
  question_radio("The user above clicked on the cleaning command and pressed the Run button. No clean data appeared in the Environment. What is the cause of the error message?",
    answer("The tabyl() command below should have referenced surv, not surv_raw.",
           correct = FALSE,
           message = "This is not the problem. One of the underlying problems is that the surv data has not even been created! (see the Environment pane)"),
    answer("A package has not been loaded, so R cannot find the surv_raw() function.",
           correct = FALSE,
           message = "Although you are correct that this message 'cannot find function...' usually indicates a mis-spelling of a function or an unloaded package, in this case surv_raw is not a function we want to run - it is a dataset!"),
    answer("R thinks surv_raw on line 18 is a function, because it has a pipe written after it.",
           correct = FALSE,
           message = "Yes, R thinks surv_raw is a function, but NOT because it has a pipe written AFTER it."),
    answer("R thinks surv_raw on line 18 is a function, because it has a pipe written before it.",
           correct = TRUE,
           message = "Yes, R thinks surv_raw is a function, because there is an extra pipe written on line 14, at the end of the cleaning command. This should be removed. It is causing R to think that the output of line 14 (the clean dataset) should be piped into a function on line 18."),
    allow_retry = TRUE
  )
)

surv no encontrado

knitr::include_graphics("images/error_assign.png", error = F)
quiz(
  question_radio("The user ran the cleaning command above, and then tried to produce the cross-tabulation of the clean data. What is the cause of the error message?",
    answer("The surv object was not created, because the user did not run the cleaning command separately from the table command.",
           correct = FALSE,
           message = "The surv object was not created, but not because of how they ran the commands. It is possible to run multiple commands at once by highlighting them as shown."),
    answer("The surv object was not created, because the select() function removes unused objects in the cleaning pipeline.",
           correct = FALSE,
           message = "The select() function does not remove objects. It selects columns to keep or remove (using the - symbol)."),
    answer("The surv object was not created, because the cleaning pipeline starting in line 29 was not assigned (<-) to an object called surv. ",
           correct = TRUE,
           message = "You can see in the Environment that surv has not been created. You can see in the Console that the dataset printed to the Console instead of being saved to the Environment. On line 29, there should be the name surv, and the assignment operator, to save the object in the Environment."),
    allow_retry = TRUE
  )
)

"Quería una epicurva coloreada por el hospital"

knitr::include_graphics("images/error_ggplot_quotes.png", error = F)
quiz(
  question_radio("The user wanted an epidemic curve histogram with 'stacked bars' and one color for each hospital. Why is the histogram all one color?",
    answer("The user should have used geom_col() instead of geom_histogram",
           correct = FALSE,
           message = "No, geom_histogram() is the correct function to show an epidemic curve from case linelist data and a continuous date variable."),
    answer("The command is missing the stat = 'identity' argument",
           correct = FALSE,
           message = "No, this adjustment is outdated and not even relevant for this scenario."),
    answer("The user has placed the fill aesthetic in quotation/speech marks",
           correct = TRUE,
           message = "The speech marks inside the aes() function are not correct - R does not understand hospital to be a column in the data, but instead just as a text value/word. The fill is therefore not using the column hospital to distinguish groupings in the data."),
    answer("The user should add facet_wrap() to the end of the command.",
           correct = FALSE,
           message = "facet_wrap() creates small plots for each group indicated to it. It does not create stacked bars with different colors in one plot."),
    allow_retry = TRUE
  )
)
quiz(
  question_radio("What is the reason for the warning message in the Console?",
    answer("There are 33 rows missing a hospital value.",
           correct = FALSE,
           message = "Almost... "),
    answer("There are 33 rows missing a date_onset value.",
           correct = TRUE,
           message = "Yes, a histogram can only plot observations that have a value for the variable mapped to the x-axis."),
    answer("There are 33 rows missing either hospital or date_onset value",
           correct = FALSE,
           message = "For a histogram, the x-axis is most important and any missing values will be excluded out of necessity."),
    answer("33 rows had dates of onset that were more than 2 incubation periods after the last reported case, so they are not part of this outbreak.",
           correct = FALSE,
           message = "R is not an epidemiologist."),
    allow_retry = TRUE
  )
)

La columna adm3_nombre_res no existe

knitr::include_graphics("images/error_missing_select.png", error = F)
quiz(
  question_radio("The user ran the cleaning command above, and then tried to produce the cross-tabulation of the clean data. What is the cause of the error message?",
    answer("The table command should be in its own section of the script",
           correct = FALSE,
           message = "Sections in the script are for readability purposes, but do not impact execution of the code."),

    answer("The column adm3_name_res is not present in the surv_raw dataset.",
           correct = FALSE,
           message = "This column is present in the raw data."),

    answer("The column adm3_name_res is not present in the surv dataset, because it is removed by the filter() line.",
           correct = FALSE,
           message = "filter() does not remove columns. In fact, the filter() line in this cleaning command uses the adm3_name_res column."),

    answer("The column adm3_name_res is not present in the surv dataset, because it is removed by the select() line.",
           correct = TRUE,
           message = "The select() line of the cleaning command lists the columns to keep in the new surv dataset. The adm3_name_res column is not listed, so it is removed. The tabyl function subsequently tries to use this column, but it is no longer present."),
    allow_retry = TRUE
  )
)

Tipo de argumento no válido

knitr::include_graphics("images/error_dplyr_equals.png", error = F)
quiz(
  question_radio("Using the clean data, the user tried to make a summary table of cases and number of feverish cases by district. What is the cause of the error message?",
    answer("The user should have grouped by both district and fever.",
           correct = FALSE,
           message = "No, the wants one row in the table per district. They were correct to use group_by() on the district column."),

    answer("The user should have used summarize() instead of summarise().",
           correct = FALSE,
           message = "Both of these spellings of the function work."),

    answer("The user should have added na.rm = TRUE to their sum() function.",
           correct = FALSE,
           message = "True, they should have included this to get accurate results, but this is not the cause of the error."),

    answer("They used the incorrect number of equals signs inside the sum() function when counting the fevers.",
           correct = TRUE,
           message = "Within the sum() function, the user wishes to count the number of times per district that the value in the column fever is 'yes'. Therefore, they are asking a question and should use double equals (==). The way this is written, it seems the user is trying to assign / make an affirmative statement that the column fever IS yes... so R is confused."),
    allow_retry = TRUE
  )
)

Símbolo inesperado

knitr::include_graphics("images/error_symbol_comma.png", error = F)
quiz(
  question_radio("The user is trying to use the clean data to produce a bar plot. What is the cause of the error message?",
    answer("The user should have used the raw data.",
           correct = FALSE,
           message = "No, the clean data is the correct dataset."),

    answer("The ggplot() command should close with a parenthesis after the data is assigned.",
           correct = FALSE,
           message = "The aesthetic mappings should also occur in the ggplot() function. This is not the source of the error."),

    answer("There should be a + symbol after surv, on line 54.",
           correct = FALSE,
           message = "In ggplot commands, the + symbol should be written only after the close of a function's parentheses."),

    answer("There should be a comma after surv, on line 54.",
           correct = TRUE,
           message = "There is a comma missing between the data= argument and the mapping= argument."),
    answer("The user needs to define an x-axis column in the mappings.",
           correct = FALSE,
           message = "There is a comma missing between the data= argument and the mapping= argument."),
    allow_retry = TRUE
  )
)

falta el argumento

knitr::include_graphics("images/error_missing_recode.png", error = F)
quiz(
  question_radio("The user is trying to clean values in the district column with recode(). What is the cause of the error message?",
    answer("The user should have used the function case_when()",
           correct = FALSE,
           message = "No, to do manual recoding, the function recode() is a valid option."),

    answer("The user needs to write .x = TRUE inside the recode() function",
           correct = FALSE,
           message = "No, this is not an argument of recode()."),

    answer("There is an extra parenthesis on line 36.",
           correct = FALSE,
           message = "The parenthesis on line 36 is correctly closing the mutate() that starts on line 32."),

    answer("The recode() function does not know which column to use.",
           correct = TRUE,
           message = "The recode() function requires a first argument which is the name of the column. So the correct line will be mutate(district = recode(district, ...)"),
    allow_retry = TRUE
  )
)

Reprex ejemplo 2

Si aún tienes tiempo, haz otro puesto de Formación utilizando la función "ejemplo_análisis2.R" que también se encuentra en la carpeta "ebola/scripts/examples/".

El script debe tener el siguiente aspecto:

# Example script 2

# install and load packages
pacman::p_load(rio, here, janitor, tidyverse)

# import data
surv_raw <- import(here("data", "raw", "surveillance_linelist_20141201.csv"))

# try to convert column to class "Date"
surv_clean <- surv_raw %>% 
  clean_names() %>% 
  mutate(onset_date = ymd(onset_date))  

# epicurve
ggplot(data = surv_clean,
       mapping = aes(x = onset_date))+
geom_histogram()

Este script hace lo siguiente

1) Carga los paquetes 2) Importa los en bruto datos de la lista de líneas 3) Limpia los datos convirtiendo la columna de fecha de inicio en la clase Fecha, utilizando mutate() y ymd() 4) Traza una curva epidémica (histograma)

No hay mensaje de error

Ejecuta los comandos en "ejemplo_análisis2.R".

Apareció un mensaje de advertencia después del comando de limpieza:

No se han podido analizar todos los formatos. No se han encontrado formatos.

Un conjunto de datos mínimo

¡Y la curva epidémica está vacía!

¿Cómo puedes identificar dónde empezó el problema?

Añade comandos al final del script para examinar el onset_date de la columna surv_clean conjunto de datos

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

Utiliza class() en la columna para comprobar la Clase. Por ejemplo

class(surv_clean$onset_date)

Utiliza range() en la columna para comprobar los valores máximo y mínimo. Por ejemplo

range(surv_clean$onset_date)


Observa que el comando de limpieza ha cambiado correctamente la clase de la columna a Fecha... pero el rango (valores mínimo y máximo) es totalmente NA ¡!

Si abrimos surv_clean para ver los valores, verás que todos los valores de fecha se convirtieron a NA ¡durante el proceso de limpieza!

¡Haz un post en el foro "reprex" para ver si alguien puede ayudarte! A continuación te recordamos algunos pasos...

Crea un nuevo script

Crea un nuevo script R y guárdalo como "reprex2.R" en la carpeta "ebola/scripts/ejemplos".
Incluye sólo los comandos necesarios para recrear tu problema.

Normalmente, esto incluiría

1) Una orden para cargar paquetes 2) Un comando para importar datos 3) Los pocos comandos que ejecutaste para procesar los datos, si procede 4) Los comandos que revelaron, o probablemente causaron, el problema/error

En este caso, todos los comandos son necesarios excepto el ggplot() comando. Si decides incluirlo, está bien, pero no es necesario.

# REPREX 2
# install and load packages
pacman::p_load(rio, here, janitor, tidyverse)

# import data
surv_raw <- import(here("data", "raw", "surveillance_linelist_20141201.csv"))

# try to convert column to class "Date"
surv_clean <- surv_raw %>% 
  clean_names() %>% 
  mutate(onset_date = ymd(onset_date))

# check the CLEANED date column class and date range
class(surv_clean$onset_date)
range(surv_clean$onset_date)

Crea el conjunto de datos mínimo

Nadie en el foro tiene acceso a "lista_de_vigilancia_20141201.csv", así que tienes que proporcionarles un conjunto de datos mínimo surv_raw mínimo creado con head(), select() y dpasta().

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

Carga el {reprex} y {datapasta} añadiéndolos a tu pacman::p+load() función.

Inicia un nuevo comando en la parte inferior del script "reprex2.R", comenzando con los datos RAW.

Pasa a head() y select() para restringir el conjunto de datos a sólo unas pocas filas y las columnas pertinentes. Para seleccionar onset date de los datos sin procesar, es posible que tengas que rodear su nombre con puntos suspensivos, ya que en el conjunto de datos sin procesar contiene un espacio.

Una vez que compruebes esta salida, añade una tubería para pasar los datos a dpasta(). Esto imprimirá la versión autónoma de los datos mínimos en tu script.


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

Mantuvimos 3 columnas, simplemente para dar algo de contexto a los valores de fecha de inicio.

surv_raw %>% 
  head(5) %>%                             # take the top 5 rows only
  select(case_id, sex, `onset date`) %>%  # keep only these columns
  dpasta()                                # produce standalone code


Cortar y pegar el conjunto de datos mínimo en el comando de importación y sustituye el import() función

Entonces comprueba que se reproduce el mismo problema utilizando este conjunto de datos mínimo

1) Haz clic en el icono "escoba" de tu Entorno para borrar todos los objetos 2) Vuelve a ejecutar el código en tu script para asegurarte de que estás recreando el mismo problema 3) Utiliza la función class() y range() para revisar el marco de datos de salida: haz que las funciones surv_clean valores de fecha se han convertido a NA? Abre el conjunto de datos y mira.

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

# REPREX 2
# install and load packages
pacman::p_load(rio, here, janitor, tidyverse, datapasta, reprex)

# import data
surv_raw <- data.frame(
  stringsAsFactors = FALSE,
  case_id = c("694928","86340d","92d002","544bd1","6056ba"),
  sex = c("m", "f", "f", "f", "f"),
  onset_date = c("11/9/2014","10/30/2014","8/16/2014","8/29/2014","10/20/2014")


# try to convert column to class "Date"
surv_clean <- surv_raw %>% 
  clean_names() %>% 
  mutate(onset_date = ymd(onset_date))

# check the CLEANED date column class and date range
class(surv_clean$onset_date)
range(surv_clean$onset_date)


Esto significa que el ejemplo es ahora completamente independiente del conjunto de datos original. ¡Tenemos un ejemplo mínimo y reproducible del problema!

Haz el reprex

Resalta todo el código del reprex, y en la consola ejecuta reprex_addin().

Selecciona lo siguiente en la ventana emergente:

1) "selección actual" 2) "Github o Stack Overflow" 3) "añadir información de la sesión" (casilla de verificación en la parte inferior) 4) A continuación, pulsa el botón "Renderizar

Si no funciona, vacía tu entorno, resalta el código R necesario en tu script para la reprex, y ejecuta reprex_addin() de nuevo en tu Consola.

Publica el reprex en el foro

Ir a comunidad.appliedepi.org y entra en Formación de Formación. Crea un "Tema nuevo".

El reprex ya debería estar en tu portapapeles, listo para pegar (ctrl + v, cmd + v para macs, o haz clic con el botón derecho y pega). La vista previa aparecerá en la parte derecha.

Una respuesta

El escenario termina...

En una hora, un epidemiólogo de otro país ha leído el post, ha copiado el reprex y ha ejecutado el script en su ordenador.

Rápidamente identificaron que utilizábamos la función ymd() para convertir la columna de fecha, pero nuestros datos en bruto estaban escritos como Día-Mes-Año. Por tanto, deberíamos haber utilizado la función dmy() ¡! Por eso la columna se convirtió a la clase Fecha, pero todos los valores pasaron a ser NA (no se entendió ninguno).

En tu script "ejemplo_análisis2.R", prueba a cambiar el parámetro ymd() por mdy() y comprueba si la curva epidémica se crea correctamente...

¡Misterio resuelto! Responderías dando las gracias a quien te haya respondido y marcando su respuesta como "Solución".

Fin

¡Enhorabuena! Guarda los enlaces de tus mensajes. Tendrás que proporcionar un enlace para obtener tu certificado de finalización del curso.

Te animamos a que sigas el foro, ¡e incluso a que ofrezcas ayuda a los demás!

Extras


Responder al post de otra persona

¡También puedes ayudar a otras personas! Simplemente copia su reprex, pégalo en un script en tu ordenador y ejecuta los comandos. A ver si puedes responder a algunos de los mensajes de formación...

Publica un reprex a partir de tus propios datos

Idealmente, ¡utiliza un proyecto de tu trabajo!

Crea una nueva subcarpeta "intro_curso" para tu análisis y añade un proyecto de RStudio. A continuación, crea un script y encuentra un error o un resultado inesperado.

Publica el reprex en el Foro de la Comunidad de Epi Aplicada utilizando el mismo método que has aprendido hoy. Esta vez, puedes publicar en la sección Código R (no en el área de Formación), para que otras personas puedan ayudarte.

Si quieres otros conjuntos de datos de ejemplo con los que practicar, consulta más abajo:

Otros conjuntos de datos de práctica

Brote de gripe H7N9

Datos Estos datos se almacenan aquí: "intro_course/learning_materials/extra_datasets/H7N9_china_2013_EN.csv". Puedes cortar/pegar el archivo en tu proyecto RStudio para este módulo.

Estos datos comprenden 136 casos de gripe A H7N9 en China, analizados por Kucharski et al. (2014). Los datos fueron recopilados por Adam Kucharski et al. a partir de ProMed, la OMS, FluTrackers, noticias y artículos de investigación. Transferencia a R y su documentación en el {outbreaks} fue obra de Simon Frost (sdwfrost@gmail.com). Los datos fueron modificados ligeramente por Applied Epi con fines de entrenamiento.

Objetivos propuestos: (modifícalos como desees)

En {outbreaks} contiene 22 conjuntos de datos sobre brotes epidémicos disponibles públicamente. El paquete está mantenido por RECON.

Instala el {outbreaks} paquete desde CRAN y ejecuta este código para ver una lista de los conjuntos de datos:

data(package="outbreaks")

Puedes guardar uno de los conjuntos de datos en tu entorno R haciendo referencia a él desde el archivo {outbreaks} así:

# save the measles outbreak dataset as "measles" in your R environment
measles <- outbreaks::measles_hagelloch_1861

A continuación se muestran dos conjuntos de datos que proponemos como opciones.



1861 Brote de sarampión

Estos datos comprenden 188 casos de sarampión entre los niños de la ciudad alemana de Hagelloch, en 1861. Los datos fueron recogidos originalmente por el Dr. Albert Pfeilsticker (1863) y aumentados y reanalizados por la Dra. Heike Oesterle (1992).

Puedes leer la descripción de cada columna en el panel de Ayuda, utilizando este comando:

?outbreaks::measles_hagelloch_1861

Objetivos sugeridos: (modifícalos como desees)



Lista MERS 2015 y localización de contactos

Estos conjuntos de datos corresponden a la información inicial recogida por el grupo de Inteligencia Epidémica del Centro Europeo para la Prevención y el Control de las Enfermedades (ECDC) durante las primeras semanas del brote del síndrome respiratorio de Oriente Medio (MERS-CoV) (Corea del Sur) en 2015. Los datos se utilizaron para seguir la evolución diaria de este brote utilizando la información pública disponible. Este conjunto de datos tiene fines didácticos; no representa ni los resultados finales de la investigación del brote ni una descripción consolidada y completa de la cadena de transmisión.

Lee una descripción completa de los datos, y las columnas, corriendo:

# Read about South Korea MERS dataset
?outbreaks::mers_korea_2015

Datos: Hay dos marcos de datos:

1) Una lista de casos MERS Co-V y sus atributos

# save case linelist to Environment
mers_cases <- outbreaks::mers_korea_2015$linelist

2) Un marco de datos que describe la relación entre los casos MERS Co-V.

# save contacts linelist to Environment
mers_contacts <- outbreaks::mers_korea_2015$contacts

Objetivos propuestos



Recuento de casos de paludismo

Datos: Se trata de un conjunto de datos ficticios generados por el personal de Applied Epi. Estos datos se almacenan aquí: "intro_course/learning_materials/extra_datasets/malaria_facility_case_counts.rds". Puedes cortar/pegar el archivo en tu proyecto de RStudio para este módulo.

Cada fila representa el recuento de casos de paludismo para un "día de centro" concreto. Los recuentos de casos (las columnas situadas más a la derecha) se almacenan en un formato "amplio", de forma que la información de cada grupo de edad en un determinado día de centro se almacena en una única fila.

Objetivos propuestos:

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

Para las curvas epidémicas, recuerda la diferencia entre geom_histogram() (la altura de las barras refleja el número de filas de los datos) y geom_col() (uso de aes(y = ) puede hacer que la altura de la barra refleje el valor de recuento agregado)

Para pivotar, recuerda que puedes utilizar tidyselect() como starts_with() para seleccionar todas las columnas que empiecen por la palabra "malaria". Puedes obtener más ayuda sobre el pivotaje en este capítulo del Manual de Epi R


Nuevo proyecto RStudio

Después de haber seleccionado un conjunto de datos para este módulo, crea una nueva subcarpeta en "intro_curso" con un proyecto de RStudio, y dale un nombre apropiado para los datos que has seleccionado.

Mira en la esquina superior derecha de RStudio para asegurarte de que estás trabajando en el proyecto correcto.

Explora tu conjunto de datos

Visita 10-15 minutos para hacer lo siguiente:

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

Utiliza pacman::p_load() para cargar e instalar paquetes R

Utiliza import() y here() para localizar tus datos dentro del proyecto RStudio, e importarlos a R

Utiliza algunas de las funciones siguientes para comprender tus datos:


Elige un problema

Mientras trabajas, elige un problema para publicarlo en el foro de la Comunidad. Para este ejercicio, lo mejor es uno de los siguientes:

Aunque no tengas ningún problema, puedes inventarte un problema realista (sólo para practicar la contabilización).



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