Análisis epidemiológico del COVID-19 en Sinaloa

Author

Curso de Epidemiología - Maestría en Ciencias en Biomedicina Molecular - Dr. Osuna

Introducción y Objetivos

En esta sesión práctica, emplearemos R, un lenguaje de programación y ambiente de software libre para el análisis estadístico y gráfico, para explorar y analizar datos de mortalidad por COVID-19 en el estado de Sinaloa. A través de este ejercicio, buscamos:

  • Familiarizar a los estudiantes con el manejo de paquetes especializados en R para el análisis epidemiológico.

Introducción y Objetivos

  • Desarrollar habilidades en la preparación y limpieza de datos epidemiológicos.

  • Aplicar técnicas de análisis de supervivencia y visualización de datos para interpretar tendencias y patrones en la mortalidad por COVID-19.

Paquetes de R Utilizados

A lo largo de la práctica, utilizaremos varios paquetes de R, cada uno con funciones específicas que facilitan el análisis de los datos:

  • tidyverse: Colección de paquetes para la ciencia de datos, que incluye herramientas para la manipulación, visualización y exploración de datos.
  • Hmisc, survival, survminer: Paquetes dedicados al análisis de supervivencia, permitiendo realizar estimaciones de supervivencia, comparaciones de grupos, y visualización de curvas de supervivencia.

Paquetes de R Utilizados

  • ggpubr, gtable, gt: Herramientas para mejorar la presentación de tablas y gráficos, facilitando la creación de visualizaciones publicables y personalizadas.

install.packages(c("tidyverse", "Hmisc","survival", "survminer","gtable","gt"))

Paquetes de R Utilizados

  • lubridate: Facilita el manejo de fechas y tiempos, esencial para el análisis temporal de los datos epidemiológicos.
  • funModeling, forestmodel: Proporcionan funciones para el modelado estadístico y el análisis exploratorio de datos, incluyendo la creación de modelos de bosques aleatorios.
  • plotly, cowplot: Paquetes para la creación de gráficos interactivos y la combinación de múltiples gráficos, respectivamente.

install.packages(c("lubridate","funModeling", "forestmodel", "plotly", "cowplot"))

Preparación y Limpieza de Datos

Preparación de los datos

La calidad del análisis de datos depende en gran medida de la preparación inicial de los mismos. En este paso, nos enfocamos en importar, filtrar y clasificar los datos de COVID-19 obtenidos para el estado de Sinaloa. La correcta manipulación de los datos es esencial para realizar análisis posteriores con precisión.

Importación de Datos

-Usamos read_delim de readr (parte de tidyverse) para importar los datos:

-library(readr): Carga el paquete readr, que ofrece funciones eficientes para leer archivos de datos tabulares.

library(readr)

dbcovid <- read_delim("dbcovid.txt", delim = "|", escape_double = FALSE, trim_ws = TRUE)
Warning: One or more parsing issues, call `problems()` on your data frame for details,
e.g.:
  dat <- vroom(...)
  problems(dat)
Rows: 429902 Columns: 130
── Column specification ────────────────────────────────────────────────────────
Delimiter: "|"
chr (106): ORIGEN, SECTOR, CVEMUNUNI, ENTIDAD, DELEGA, UNIDAD, FECHREG, CLUE...
dbl  (12): ID_REGISTRO, CVEENTUNI, CVENTINE, CVELOCAL, LATLOCA, LONGLOCA, SE...
lgl  (12): RESDEFIN2, PAISORI, FINGMEX, PAISTRAN1, PAISTRAN2, PAISTRAN3, PAI...

ℹ Use `spec()` to retrieve the full column specification for this data.
ℹ Specify the column types or set `show_col_types = FALSE` to quiet this message.

Detalle de la función read_delim de readr

  • "dbcovid.txt": Nombre del archivo de datos. Debe estar en el directorio actual o especificarse la ruta completa.
  • delim = "|": Especifica que el carácter | se utiliza como delimitador entre los campos en el archivo.
  • escape_double = FALSE: Indica que las comillas dobles en el archivo no se utilizan para escapar otros caracteres, tratándolas como caracteres normales.
  • trim_ws = TRUE: Activa la eliminación automática de espacios en blanco que puedan existir al inicio y al final de los campos en el archivo, asegurando la limpieza de los datos.

Preparación y Limpieza de Datos

Utilizar dplyr para filtrar y clasificar los datos

  • Objetivo: Hacer disponibles las funciones de manipulación de datos de dplyr. Función: library(dplyr) prepara el entorno de R para el uso de funciones avanzadas de manipulación de datos, como filter y mutate.

Filtrar Casos Específicos:

  • Objetivo: Seleccionar solo las filas relevantes basadas en el estado de la definición de resultados (RESDEFIN).

Preparación y Limpieza de Datos

library(tidyverse)
Warning: package 'tidyverse' was built under R version 4.3.2
Warning: package 'dplyr' was built under R version 4.3.2
Warning: package 'stringr' was built under R version 4.3.2
── Attaching core tidyverse packages ──────────────────────── tidyverse 2.0.0 ──
✔ dplyr     1.1.4     ✔ purrr     1.0.2
✔ forcats   1.0.0     ✔ stringr   1.5.1
✔ ggplot2   3.4.4     ✔ tibble    3.2.1
✔ lubridate 1.9.3     ✔ tidyr     1.3.0
── Conflicts ────────────────────────────────────────── tidyverse_conflicts() ──
✖ dplyr::filter() masks stats::filter()
✖ dplyr::lag()    masks stats::lag()
ℹ Use the conflicted package (<http://conflicted.r-lib.org/>) to force all conflicts to become errors
covidsin<-dbcovid #Renombrando objetos

covidsintotal<-covidsin

library(tidyverse): Carga el conjunto de paquetes tidyverse, que incluye herramientas poderosas como ggplot2, dplyr, tidyr, readr, entre otros, para la manipulación y visualización de datos. Aquí, el enfoque principal es en dplyr para la manipulación de los datos.

Esta línea crea una copia del dataframe covidsin, probablemente conteniendo datos preliminares de COVID-19, y lo asigna a una nueva variable covidsintotal para realizar operaciones de limpieza y clasificación sin alterar el conjunto original.

Preparación y Limpieza de Datos

  • Reclasificamos todos los casos no negativos a “POSITIVO”
covidsintotal$RESDEFIN <- ifelse(covidsintotal$RESDEFIN == "NEGATIVO", "NEGATIVO", "POSITIVO")

ifelse(): Es una función condicional que evalúa cada elemento de covidsintotal$RESDEFIN. Si el resultado de una prueba es “NEGATIVO”, mantiene el valor “NEGATIVO”; de lo contrario, lo cambia a “POSITIVO”. Esto simplifica la clasificación de resultados en dos categorías principales, lo que facilita análisis posteriores.

Preparación y Limpieza de Datos

  • Filtramos los datos para incluir solo los casos “POSITIVO” y “NEGATIVO”
covidsinfilttotal <- covidsintotal %>% filter(RESDEFIN == "POSITIVO" | RESDEFIN == "NEGATIVO")

filter(): Parte de dplyr, esta función se usa para subconjuntar el dataframe basándose en una condición específica. En este caso, selecciona solo las filas donde RESDEFIN es “POSITIVO” o “NEGATIVO”, excluyendo cualquier otro tipo de resultado que no se haya clasificado en estos términos.

-Utilizamos la función freq() del paquete ‘questionr’ para obtener la frecuencia -Nota: Asegúrate de tener instalado el paquete questionr para usar freq()

library(questionr)
freq(covidsinfilttotal$RESDEFIN)
             n    % val%
NEGATIVO 59452 51.8 51.8
POSITIVO 55323 48.2 48.2

freq(): Función del paquete questionr, que no es parte del tidyverse pero se utiliza aquí para obtener un recuento y porcentaje de cada nivel dentro de la variable RESDEFIN en el dataframe filtrado covidsinfilttotal. Proporciona una visión rápida de la distribución de los casos positivos y negativos.

Preparación y Limpieza de Datos

covidsinfilttotal %>% select(RESDEFIN) %>% drop_na() %>% 
summarise(count = n())
# A tibble: 1 × 1
   count
   <int>
1 114775
  • Esta cadena de funciones realiza tres operaciones:
  • select(RESDEFIN): Selecciona únicamente la columna RESDEFIN.
  • drop_na(): Elimina filas donde RESDEFIN tenga valores NA (datos faltantes).
  • summarise(count = n()): Agrupa los datos resultantes y cuenta el número total de filas, proporcionando el total de casos clasificados como “POSITIVO” o “NEGATIVO”.

Preparación y Limpieza de Datos

#SE EXCLUYEN POSITIVOS POR OTRAS CEPAS
covidsinfilt <-  covidsin %>% filter(RESDEFIN == "SARS-CoV-2" & CLASCOVID19 =="CONF LAB")

-Usamos filter(): Nuevamente, para filtra el dataframe original covidsin, pero esta vez selecciona solo aquellos casos confirmados de COVID-19 (“SARS-CoV-2”) que tienen una clasificación de confirmación de laboratorio (CLASCOVID19 == “CONF LAB”). Este subconjunto puede ser utilizado para análisis más específicos que requieran solo casos confirmados mediante pruebas de laboratorio.

Incluyendo Negativos y Positivos Específicos

Este paso filtra el conjunto de datos para incluir solo casos específicos de COVID-19, incluyendo varios tipos de cepas y casos negativos.

library(dplyr) #parte de tydiverse

covidsinfilttotal <-  covidsin %>%
  filter(RESDEFIN == "SARS-CoV-2" | RESDEFIN == "SARS-CoV-2 - DELTA" |
         RESDEFIN == "SARS-CoV-2 - OMICRON" | RESDEFIN == "SARS-CoV-2 - B.1.1.519" |
         RESDEFIN == "SARS-CoV-2 - LAMBDA" | RESDEFIN == "SARS-CoV-2 - GAMMA" |
         RESDEFIN == "SARS-CoV-2 - ALPHA" | RESDEFIN == "SARS-CoV-2 - OTRA" |
         RESDEFIN == "SARS-CoV-2 - B.1.427/B.1.429" | RESDEFIN == "NEGATIVO")

Filtrar Casos Específicos:

-filter(): Pertenece al paquete dplyr y se utiliza para subconjuntar los datos basándose en condiciones específicas. Aquí, seleccionamos casos basados en la definición del resultado (RESDEFIN), incluyendo varias cepas de SARS-CoV-2 y casos negativos.

ifelse(): Función condicional que evalúa una condición y devuelve un valor si la condición es verdadera y otro si es falsa. Utilizada para recodificar variables basadas en criterios específicos.

Exploración de Variables

Para comprender mejor la estructura y el contenido de nuestras variables, utilizamos:

str(): Muestra la estructura interna de un objeto R, incluyendo el tipo y la longitud de las variables. Es útil para obtener una visión rápida de los datos.

str(covidsinfilttotal$RESDEFIN)
 chr [1:111766] "SARS-CoV-2" "SARS-CoV-2" "SARS-CoV-2" "SARS-CoV-2" ...
unique(covidsinfilttotal$RESDEFIN)
 [1] "SARS-CoV-2"                   "NEGATIVO"                    
 [3] "SARS-CoV-2 - DELTA"           "SARS-CoV-2 - ALPHA"          
 [5] "SARS-CoV-2 - B.1.1.519"       "SARS-CoV-2 - OMICRON"        
 [7] "SARS-CoV-2 - B.1.427/B.1.429" "SARS-CoV-2 - GAMMA"          
 [9] "SARS-CoV-2 - OTRA"            "SARS-CoV-2 - LAMBDA"         

Exploración de Variables

summary(): Proporciona un resumen estadístico de las variables, incluyendo medidas de tendencia central y dispersión para variables cuantitativas, y frecuencias para variables cualitativas.

summary(covidsinfilttotal$RESDEFIN)
   Length     Class      Mode 
   111766 character character 

Exploración de Variables

freq() del paquete questionr (opcionalmente mencionado): Ofrece un resumen de la distribución de frecuencias de una variable, muy útil para datos categóricos.

library(questionr)
freq(covidsinfilttotal$RESDEFIN)
                                 n    % val%
NEGATIVO                     59452 53.2 53.2
SARS-CoV-2                   51921 46.5 46.5
SARS-CoV-2 - ALPHA              19  0.0  0.0
SARS-CoV-2 - B.1.1.519          22  0.0  0.0
SARS-CoV-2 - B.1.427/B.1.429    11  0.0  0.0
SARS-CoV-2 - DELTA             178  0.2  0.2
SARS-CoV-2 - GAMMA              11  0.0  0.0
SARS-CoV-2 - LAMBDA              2  0.0  0.0
SARS-CoV-2 - OMICRON           142  0.1  0.1
SARS-CoV-2 - OTRA                8  0.0  0.0

Importancia de la Exploración de Datos

La exploración de los elementos de una variable es crucial para identificar posibles anomalías, valores atípicos o errores de codificación, permitiendo una limpieza de datos más efectiva y un análisis posterior más fiable.

Referencias:

  • Wickham, H. (2016). dplyr: A Grammar of Data Manipulation. R package version 1.0.0. https://dplyr.tidyverse.org
  • Grolemund, G., & Wickham, H. (2017). R for Data Science: Import, Tidy, Transform, Visualize, and Model Data. O’Reilly Media. https://r4ds.had.co.nz/exploration.html

Recodificar Resultados:

Preparación y Limpieza de Datos

con la función uniquepodemos revisar si esta variable quedo redefinida

unique(covidsinfilttotal$RESDEFIN)
 [1] "SARS-CoV-2"                   "NEGATIVO"                    
 [3] "SARS-CoV-2 - DELTA"           "SARS-CoV-2 - ALPHA"          
 [5] "SARS-CoV-2 - B.1.1.519"       "SARS-CoV-2 - OMICRON"        
 [7] "SARS-CoV-2 - B.1.427/B.1.429" "SARS-CoV-2 - GAMMA"          
 [9] "SARS-CoV-2 - OTRA"            "SARS-CoV-2 - LAMBDA"         

Limpieza de Datos

Aquí, volvemos a filtrar el conjunto de datos para retener solo los casos recodificados como “POSITIVO” o “NEGATIVO”.

covidsinfilttotal %>% select(RESDEFIN) %>% drop_na() %>% 
summarise(count = n())
# A tibble: 1 × 1
   count
   <int>
1 111766

select(), drop_na(), summarise(): Estas funciones de dplyr se utilizan para seleccionar una columna específica (RESDEFIN), eliminar filas con valores NA, y luego resumir el número total de filas, respectivamente, proporcionando un recuento de casos positivos y negativos limpios.

Revisión Final de los Datos

Antes de proceder al análisis, es esencial realizar una última revisión de los datos para asegurarse de que estén correctamente preparados para el análisis:

# Revisar la estructura de los datos filtrados
str(covidsinfilt)
spc_tbl_ [51,921 × 130] (S3: spec_tbl_df/tbl_df/tbl/data.frame)
 $ ORIGEN         : chr [1:51921] "FUERA DE USMI" "USMI" "USMI" "FUERA DE USMI" ...
 $ SECTOR         : chr [1:51921] "ESTATAL" "SSA" "ISSSTE" "MUNICIPAL" ...
 $ ID_REGISTRO    : num [1:51921] 2637014 2263815 1529764 1636123 952212 ...
 $ CVEENTUNI      : num [1:51921] 25 25 25 25 25 25 25 25 25 25 ...
 $ CVEMUNUNI      : chr [1:51921] "006" "006" "006" "012" ...
 $ ENTIDAD        : chr [1:51921] "SINALOA" "SINALOA" "SINALOA" "SINALOA" ...
 $ DELEGA         : chr [1:51921] "SINALOA" "SINALOA" "SINALOA" "SINALOA" ...
 $ UNIDAD         : chr [1:51921] "HOSPITAL CIVIL DE CULIACAN" "HOSPITAL GENERAL CULIACAN" "DR. M.CARDENAS DE LA VEGA" "HOSPITAL MARGARITA MAZA DE JUAREZ" ...
 $ FECHREG        : chr [1:51921] "23/09/2020" "26/08/2020" "07/07/2020" "14/07/2020" ...
 $ CLUES          : chr [1:51921] "SLSME000016" "SLSSA000666" "SLIST000085" "SLSMM000014" ...
 $ FOLIO SINAVE   : chr [1:51921] "2592637014" "2532263815" "2511529764" "25111636123" ...
 $ FOLIO_IMSS     : chr [1:51921] NA NA NA NA ...
 $ APEPATER       : chr [1:51921] "ARREDONDO" "ARREDONDO" "ARREDONDO" "ARRAZOLA" ...
 $ APEMATER       : chr [1:51921] "MUÑOZ" "LECHUGA" "LEAL" "RODRIGUEZ" ...
 $ NOMBRE         : chr [1:51921] "OSCAR ALEXIS" "WENDY" "JENIFER" "ADARAPSNI GUADALUPE" ...
 $ SEXO           : chr [1:51921] "MASCULINO" "FEMENINO" "FEMENINO" "FEMENINO" ...
 $ CURP           : chr [1:51921] "AEMO970921HSLRXS" "AELW701015MSLRCN" "AELJ870322MSLRLN" "AARA801011MSLRDD" ...
 $ ENTNACI        : chr [1:51921] "SINALOA" "SINALOA" "SINALOA" "SINALOA" ...
 $ ENTRESI        : chr [1:51921] "SINALOA" "SINALOA" "SINALOA" "SINALOA" ...
 $ CVENTINE       : num [1:51921] 25 25 25 25 25 25 25 25 25 25 ...
 $ MPIORESI       : chr [1:51921] "CULIACAN" "CULIACAN" "CULIACAN" "MAZATLAN" ...
 $ CVEMUNI        : chr [1:51921] "006" "006" "006" "012" ...
 $ LOCRESI        : chr [1:51921] "CULIACAN ROSALES" "CULIACAN ROSALES" "CULIACAN ROSALES" "MAZATLAN" ...
 $ CVELOCAL       : num [1:51921] 1 1 1 1 177 1 1 1 1 1 ...
 $ LATLOCA        : num [1:51921] 24.8 24.8 24.8 23.2 25.7 ...
 $ LONGLOCA       : num [1:51921] NA NA NA NA NA NA NA NA NA NA ...
 $ TIPACIEN       : chr [1:51921] "AMBULATORIO" "AMBULATORIO" "HOSPITALIZADO" "AMBULATORIO" ...
 $ EVOLUCI        : chr [1:51921] "SEGUIMIENTO TERMINADO" "SEGUIMIENTO TERMINADO" "SEGUIMIENTO TERMINADO" "SEGUIMIENTO TERMINADO" ...
 $ FEGRESO        : chr [1:51921] "22/09/2020" "26/08/2020" "20/07/2020" "20/07/2020" ...
 $ FECDEF         : chr [1:51921] NA NA NA NA ...
 $ SEMDEF         : num [1:51921] NA NA NA NA 21 NA NA 38 NA 19 ...
 $ CERTIDEF       : num [1:51921] NA NA NA NA 1.91e+08 ...
 $ DEFPORINF      : chr [1:51921] NA NA NA NA ...
 $ DEFVERIFI      : chr [1:51921] NA NA NA NA ...
 $ INTUBADO       : chr [1:51921] NA NA NA NA ...
 $ DIGCLINE       : chr [1:51921] "NO" "NO" "SI" "NO" ...
 $ FECNACI        : chr [1:51921] "21/09/1997" "15/10/1970" "22/03/1987" "11/10/1980" ...
 $ EDAD           : num [1:51921] 23 50 33 40 79 32 44 82 25 89 ...
 $ NACIONA        : chr [1:51921] "MEXICANA" "MEXICANA" "MEXICANA" "MEXICANA" ...
 $ ESTAEMBA       : chr [1:51921] NA "NO" "NO" "NO" ...
 $ MESESEMB       : num [1:51921] NA NA NA NA NA NA NA NA 0 NA ...
 $ DOMICILIO      : chr [1:51921] "MAUTO No. SIN NUMERO ENTRE  Y  COLONIA: JOEL RAMIREZ C.P." "FRANSISCO MIRANDA No. 2847 ENTRE  Y  COLONIA: 21 DE MARZO C.P." "SANTA ELVIRA  No. 3498 ENTRE PALO ALTO  Y VISTA HERMOSA  COLONIA: FRACC LOS ANGELES  C.P.80014" "PALMAS No. 18 ENTRE ALAMOS Y ROBLES COLONIA: PLAZA REFORMA C.P.82120" ...
 $ CP             : chr [1:51921] NA NA "80014" "82120" ...
 $ TELEFONO       : chr [1:51921] "6675038894" "6672676286" "6671533101" "6691488158" ...
 $ ESINDIGE       : chr [1:51921] "NO" "NO" "NO" "NO" ...
 $ HABLEIND       : chr [1:51921] "NO" "NO" "NO" "NO" ...
 $ OCUPACIO       : chr [1:51921] "ESTUDIANTES" "HOGAR" "OTROS TRABAJADORES DE LA SALUD" "EMPLEADOS" ...
 $ SERINGRE       : chr [1:51921] "CONSULTA EXTERNA" "CONSULTA EXTERNA" "OBSERVACION DE URGENCIAS" "CONSULTA EXTERNA" ...
 $ FECINGRE       : chr [1:51921] "22/09/2020" "26/08/2020" "07/07/2020" "14/07/2020" ...
 $ FECINISI       : chr [1:51921] "17/09/2020" "22/08/2020" "28/06/2020" "07/07/2020" ...
 $ DIAGPROB       : chr [1:51921] "ENFERMEDAD TIPO INFLUENZA (ETI)" "ENFERMEDAD TIPO INFLUENZA (ETI)" "INFECCION RESPIRATORIA AGUDA GRAVE (IRAG)" "ENFERMEDAD TIPO INFLUENZA (ETI)" ...
 $ FIEBRE         : chr [1:51921] "NO" "NO" "SI" "SI" ...
 $ TOS            : chr [1:51921] "SI" "SI" "SI" "SI" ...
 $ ODINOGIA       : chr [1:51921] "SI" "SI" "SI" "SI" ...
 $ DISNEA         : chr [1:51921] "NO" "SI" "SI" "NO" ...
 $ IRRITABI       : chr [1:51921] "SI" "NO" "SI" "SI" ...
 $ DIARREA        : chr [1:51921] "SI" "NO" "SI" "NO" ...
 $ DOTORACI       : chr [1:51921] "SI" "NO" "SI" "NO" ...
 $ CALOFRIOS      : chr [1:51921] "NO" "NO" "SI" "NO" ...
 $ CEFALEA        : chr [1:51921] "SI" "SI" "SI" "SI" ...
 $ MIALGIAS       : chr [1:51921] "SI" "NO" "SI" "SI" ...
 $ ARTRAL         : chr [1:51921] "SI" "NO" "SI" "SI" ...
 $ ATAEDOGE       : chr [1:51921] "NO" "NO" "NO" "SI" ...
 $ RINORREA       : chr [1:51921] "SI" "SI" "SI" "NO" ...
 $ POLIPNEA       : chr [1:51921] "NO" "NO" "NO" "NO" ...
 $ VOMITO         : chr [1:51921] "NO" "NO" "SI" "NO" ...
 $ DOLABDO        : chr [1:51921] "NO" "NO" "NO" "NO" ...
 $ CONJUN         : chr [1:51921] "SI" "NO" "NO" "NO" ...
 $ CIANOSIS       : chr [1:51921] "NO" "NO" "NO" "NO" ...
 $ INISUBIS       : chr [1:51921] "NO" "NO" "SI" "NO" ...
 $ ANOSMIA        : chr [1:51921] "NO" "NO" "SI" "NO" ...
 $ DISGEUSIA      : chr [1:51921] "SI" "SI" "SI" "NO" ...
 $ ASINTOMATICO   : chr [1:51921] "NO" "NO" "NO" "NO" ...
 $ DIABETES       : chr [1:51921] "NO" "NO" "NO" "NO" ...
 $ EPOC           : chr [1:51921] "NO" "NO" "NO" "NO" ...
 $ ASMA           : chr [1:51921] "NO" "NO" "NO" "NO" ...
 $ INMUSUPR       : chr [1:51921] "NO" "NO" "NO" "SI" ...
 $ HIPERTEN       : chr [1:51921] "NO" "NO" "NO" "NO" ...
 $ VIH/SIDA       : chr [1:51921] "NO" "NO" "NO" "NO" ...
 $ OTRACON        : chr [1:51921] "NO" "NO" "NO" "NO" ...
 $ ENFCARDI       : chr [1:51921] "NO" "NO" "NO" "NO" ...
 $ OBESIDAD       : chr [1:51921] "NO" "NO" "NO" "NO" ...
 $ INSRENCR       : chr [1:51921] "NO" "NO" "NO" "NO" ...
 $ TABAQUIS       : chr [1:51921] "NO" "NO" "NO" "NO" ...
 $ RECTRATA       : chr [1:51921] "NO" "NO" "NO" "NO" ...
 $ TXCROBIA       : chr [1:51921] "SI" "NO" "NO" "SI" ...
 $ TXANTIVI       : chr [1:51921] "SI" "NO" "NO" "NO" ...
 $ ANTIVIRA       : chr [1:51921] "OSELTAMIVIR" NA NA NA ...
 $ FECINITXANTIVI : chr [1:51921] NA NA NA NA ...
 $ CONOCASO       : chr [1:51921] "NO" "NO" "SI" "NO" ...
 $ CONTAVES       : chr [1:51921] "NO" "NO" "NO" "NO" ...
 $ CONCERDO       : chr [1:51921] "NO" "NO" "NO" "NO" ...
 $ CONANIMA       : chr [1:51921] "PERRO" "PERROS" NA NA ...
 $ VACUNADO       : chr [1:51921] "SI" "NO" "SI" "NO" ...
 $ FECVAEST       : chr [1:51921] "20/10/2019" NA "18/02/2020" NA ...
 $ TOMMUE         : chr [1:51921] "SI" "SI" "SI" "SI" ...
 $ LABORA         : chr [1:51921] "SINALOA" "SINALOA" "SINALOA" "SINALOA" ...
 $ FOLLABOR       : num [1:51921] 24899 21544 15191 16552 8104 ...
 $ RESDEFIN       : chr [1:51921] "SARS-CoV-2" "SARS-CoV-2" "SARS-CoV-2" "SARS-CoV-2" ...
  [list output truncated]
 - attr(*, "spec")=
  .. cols(
  ..   ORIGEN = col_character(),
  ..   SECTOR = col_character(),
  ..   ID_REGISTRO = col_double(),
  ..   CVEENTUNI = col_double(),
  ..   CVEMUNUNI = col_character(),
  ..   ENTIDAD = col_character(),
  ..   DELEGA = col_character(),
  ..   UNIDAD = col_character(),
  ..   FECHREG = col_character(),
  ..   CLUES = col_character(),
  ..   `FOLIO SINAVE` = col_character(),
  ..   FOLIO_IMSS = col_character(),
  ..   APEPATER = col_character(),
  ..   APEMATER = col_character(),
  ..   NOMBRE = col_character(),
  ..   SEXO = col_character(),
  ..   CURP = col_character(),
  ..   ENTNACI = col_character(),
  ..   ENTRESI = col_character(),
  ..   CVENTINE = col_double(),
  ..   MPIORESI = col_character(),
  ..   CVEMUNI = col_character(),
  ..   LOCRESI = col_character(),
  ..   CVELOCAL = col_double(),
  ..   LATLOCA = col_double(),
  ..   LONGLOCA = col_double(),
  ..   TIPACIEN = col_character(),
  ..   EVOLUCI = col_character(),
  ..   FEGRESO = col_character(),
  ..   FECDEF = col_character(),
  ..   SEMDEF = col_double(),
  ..   CERTIDEF = col_double(),
  ..   DEFPORINF = col_character(),
  ..   DEFVERIFI = col_character(),
  ..   INTUBADO = col_character(),
  ..   DIGCLINE = col_character(),
  ..   FECNACI = col_character(),
  ..   EDAD = col_double(),
  ..   NACIONA = col_character(),
  ..   ESTAEMBA = col_character(),
  ..   MESESEMB = col_double(),
  ..   DOMICILIO = col_character(),
  ..   CP = col_character(),
  ..   TELEFONO = col_character(),
  ..   ESINDIGE = col_character(),
  ..   HABLEIND = col_character(),
  ..   OCUPACIO = col_character(),
  ..   SERINGRE = col_character(),
  ..   FECINGRE = col_character(),
  ..   FECINISI = col_character(),
  ..   DIAGPROB = col_character(),
  ..   FIEBRE = col_character(),
  ..   TOS = col_character(),
  ..   ODINOGIA = col_character(),
  ..   DISNEA = col_character(),
  ..   IRRITABI = col_character(),
  ..   DIARREA = col_character(),
  ..   DOTORACI = col_character(),
  ..   CALOFRIOS = col_character(),
  ..   CEFALEA = col_character(),
  ..   MIALGIAS = col_character(),
  ..   ARTRAL = col_character(),
  ..   ATAEDOGE = col_character(),
  ..   RINORREA = col_character(),
  ..   POLIPNEA = col_character(),
  ..   VOMITO = col_character(),
  ..   DOLABDO = col_character(),
  ..   CONJUN = col_character(),
  ..   CIANOSIS = col_character(),
  ..   INISUBIS = col_character(),
  ..   ANOSMIA = col_character(),
  ..   DISGEUSIA = col_character(),
  ..   ASINTOMATICO = col_character(),
  ..   DIABETES = col_character(),
  ..   EPOC = col_character(),
  ..   ASMA = col_character(),
  ..   INMUSUPR = col_character(),
  ..   HIPERTEN = col_character(),
  ..   `VIH/SIDA` = col_character(),
  ..   OTRACON = col_character(),
  ..   ENFCARDI = col_character(),
  ..   OBESIDAD = col_character(),
  ..   INSRENCR = col_character(),
  ..   TABAQUIS = col_character(),
  ..   RECTRATA = col_character(),
  ..   TXCROBIA = col_character(),
  ..   TXANTIVI = col_character(),
  ..   ANTIVIRA = col_character(),
  ..   FECINITXANTIVI = col_character(),
  ..   CONOCASO = col_character(),
  ..   CONTAVES = col_character(),
  ..   CONCERDO = col_character(),
  ..   CONANIMA = col_character(),
  ..   VACUNADO = col_character(),
  ..   FECVAEST = col_character(),
  ..   TOMMUE = col_character(),
  ..   LABORA = col_character(),
  ..   FOLLABOR = col_double(),
  ..   RESDEFIN = col_character(),
  ..   RESDEFIN2 = col_logical(),
  ..   ESMIGRA = col_character(),
  ..   PAISNAL = col_character(),
  ..   PAISORI = col_logical(),
  ..   FINGMEX = col_logical(),
  ..   PAISTRAN1 = col_logical(),
  ..   PAISTRAN2 = col_logical(),
  ..   PAISTRAN3 = col_logical(),
  ..   PAISTRAN4 = col_logical(),
  ..   PUERPERIO = col_character(),
  ..   DIASPUERP = col_logical(),
  ..   ANTIPIRETICOS = col_character(),
  ..   UCI = col_character(),
  ..   ORIGEN_DATOS = col_double(),
  ..   ASODIC = col_character(),
  ..   ANTIGENCOVID = col_character(),
  ..   FECMUEANT = col_character(),
  ..   CLASCOVID19 = col_character(),
  ..   CLASFLU = col_character(),
  ..   PROTOCOLO = col_character(),
  ..   VACUNA_COV = col_character(),
  ..   TIPO_VAC_COV = col_character(),
  ..   FEC_VAC_COV = col_character(),
  ..   REF_VAC_COV = col_character(),
  ..   FEC_REF_VAC_COV = col_character(),
  ..   LINAJE = col_character(),
  ..   VIAJE1 = col_character(),
  ..   VIAJE2 = col_logical(),
  ..   VIAJE3 = col_logical(),
  ..   VIAJE4 = col_logical(),
  ..   VIAJE5 = col_logical()
  .. )
 - attr(*, "problems")=<externalptr> 
# Resumen de frecuencias para las definiciones de resultado
freq(covidsinfilt$RESDEFIN)
               n   % val%
SARS-CoV-2 51921 100  100
# Visualizar un resumen de los datos
glimpse(covidsinfilt)
Rows: 51,921
Columns: 130
$ ORIGEN          <chr> "FUERA DE USMI", "USMI", "USMI", "FUERA DE USMI", "FUE…
$ SECTOR          <chr> "ESTATAL", "SSA", "ISSSTE", "MUNICIPAL", "SSA", "SSA",…
$ ID_REGISTRO     <dbl> 2637014, 2263815, 1529764, 1636123, 952212, 1681922, 3…
$ CVEENTUNI       <dbl> 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25…
$ CVEMUNUNI       <chr> "006", "006", "006", "012", "011", "006", "006", "006"…
$ ENTIDAD         <chr> "SINALOA", "SINALOA", "SINALOA", "SINALOA", "SINALOA",…
$ DELEGA          <chr> "SINALOA", "SINALOA", "SINALOA", "SINALOA", "SINALOA",…
$ UNIDAD          <chr> "HOSPITAL CIVIL DE CULIACAN", "HOSPITAL GENERAL CULIAC…
$ FECHREG         <chr> "23/09/2020", "26/08/2020", "07/07/2020", "14/07/2020"…
$ CLUES           <chr> "SLSME000016", "SLSSA000666", "SLIST000085", "SLSMM000…
$ `FOLIO SINAVE`  <chr> "2592637014", "2532263815", "2511529764", "25111636123…
$ FOLIO_IMSS      <chr> NA, NA, NA, NA, NA, NA, NA, NA, "IMSS2021041581", NA, …
$ APEPATER        <chr> "ARREDONDO", "ARREDONDO", "ARREDONDO", "ARRAZOLA", "AR…
$ APEMATER        <chr> "MUÑOZ", "LECHUGA", "LEAL", "RODRIGUEZ", "CASTRO", "MO…
$ NOMBRE          <chr> "OSCAR ALEXIS", "WENDY", "JENIFER", "ADARAPSNI GUADALU…
$ SEXO            <chr> "MASCULINO", "FEMENINO", "FEMENINO", "FEMENINO", "MASC…
$ CURP            <chr> "AEMO970921HSLRXS", "AELW701015MSLRCN", "AELJ870322MSL…
$ ENTNACI         <chr> "SINALOA", "SINALOA", "SINALOA", "SINALOA", "SINALOA",…
$ ENTRESI         <chr> "SINALOA", "SINALOA", "SINALOA", "SINALOA", "SINALOA",…
$ CVENTINE        <dbl> 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25…
$ MPIORESI        <chr> "CULIACAN", "CULIACAN", "CULIACAN", "MAZATLAN", "GUASA…
$ CVEMUNI         <chr> "006", "006", "006", "012", "011", "006", "006", "006"…
$ LOCRESI         <chr> "CULIACAN ROSALES", "CULIACAN ROSALES", "CULIACAN ROSA…
$ CVELOCAL        <dbl> 1, 1, 1, 1, 177, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1270, 5…
$ LATLOCA         <dbl> 24.79194, 24.79194, 24.79194, 23.24139, 25.70889, 24.7…
$ LONGLOCA        <dbl> NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA…
$ TIPACIEN        <chr> "AMBULATORIO", "AMBULATORIO", "HOSPITALIZADO", "AMBULA…
$ EVOLUCI         <chr> "SEGUIMIENTO TERMINADO", "SEGUIMIENTO TERMINADO", "SEG…
$ FEGRESO         <chr> "22/09/2020", "26/08/2020", "20/07/2020", "20/07/2020"…
$ FECDEF          <chr> NA, NA, NA, NA, "17/05/2020", NA, NA, "09/09/2020", NA…
$ SEMDEF          <dbl> NA, NA, NA, NA, 21, NA, NA, 38, NA, 19, NA, NA, NA, NA…
$ CERTIDEF        <dbl> NA, NA, NA, NA, 190701292, NA, NA, 200662662, NA, 2006…
$ DEFPORINF       <chr> NA, NA, NA, NA, "SI", NA, NA, "SI", NA, "SI", NA, NA, …
$ DEFVERIFI       <chr> NA, NA, NA, NA, "SI", NA, NA, "SI", NA, "SI", NA, NA, …
$ INTUBADO        <chr> NA, NA, NA, NA, "NO", NA, NA, "SI", NA, "NO", NA, NA, …
$ DIGCLINE        <chr> "NO", "NO", "SI", "NO", "SI", "NO", "NO", "SI", "NO", …
$ FECNACI         <chr> "21/09/1997", "15/10/1970", "22/03/1987", "11/10/1980"…
$ EDAD            <dbl> 23, 50, 33, 40, 79, 32, 44, 82, 25, 89, 33, 23, 52, 57…
$ NACIONA         <chr> "MEXICANA", "MEXICANA", "MEXICANA", "MEXICANA", "MEXIC…
$ ESTAEMBA        <chr> NA, "NO", "NO", "NO", NA, "NO", NA, NA, "NO", NA, NA, …
$ MESESEMB        <dbl> NA, NA, NA, NA, NA, NA, NA, NA, 0, NA, NA, NA, NA, NA,…
$ DOMICILIO       <chr> "MAUTO No. SIN NUMERO ENTRE  Y  COLONIA: JOEL RAMIREZ …
$ CP              <chr> NA, NA, "80014", "82120", "81131", "80029", NA, "40080…
$ TELEFONO        <chr> "6675038894", "6672676286", "6671533101", "6691488158"…
$ ESINDIGE        <chr> "NO", "NO", "NO", "NO", "NO", "NO", "NO", "NO", "NO", …
$ HABLEIND        <chr> "NO", "NO", "NO", "NO", "NO", "NO", "NO", "NO", "NO", …
$ OCUPACIO        <chr> "ESTUDIANTES", "HOGAR", "OTROS TRABAJADORES DE LA SALU…
$ SERINGRE        <chr> "CONSULTA EXTERNA", "CONSULTA EXTERNA", "OBSERVACION D…
$ FECINGRE        <chr> "22/09/2020", "26/08/2020", "07/07/2020", "14/07/2020"…
$ FECINISI        <chr> "17/09/2020", "22/08/2020", "28/06/2020", "07/07/2020"…
$ DIAGPROB        <chr> "ENFERMEDAD TIPO INFLUENZA (ETI)", "ENFERMEDAD TIPO IN…
$ FIEBRE          <chr> "NO", "NO", "SI", "SI", "SI", "SI", "SI", "SI", "NO", …
$ TOS             <chr> "SI", "SI", "SI", "SI", "SI", "SI", "NO", "SI", "SI", …
$ ODINOGIA        <chr> "SI", "SI", "SI", "SI", "NO", "SI", "NO", "NO", "NO", …
$ DISNEA          <chr> "NO", "SI", "SI", "NO", "SI", "NO", "NO", "SI", "NO", …
$ IRRITABI        <chr> "SI", "NO", "SI", "SI", "SI", "SI", "SI", "NO", "SI", …
$ DIARREA         <chr> "SI", "NO", "SI", "NO", "NO", "NO", "NO", "NO", "NO", …
$ DOTORACI        <chr> "SI", "NO", "SI", "NO", "NO", "SI", "SI", "NO", "NO", …
$ CALOFRIOS       <chr> "NO", "NO", "SI", "NO", "NO", "SI", "NO", "NO", "NO", …
$ CEFALEA         <chr> "SI", "SI", "SI", "SI", "SI", "SI", "SI", "NO", "SI", …
$ MIALGIAS        <chr> "SI", "NO", "SI", "SI", "NO", "SI", "SI", "NO", "SI", …
$ ARTRAL          <chr> "SI", "NO", "SI", "SI", "NO", "SI", "SI", "SI", "SI", …
$ ATAEDOGE        <chr> "NO", "NO", "NO", "SI", "NO", "SI", "NO", "SI", "NO", …
$ RINORREA        <chr> "SI", "SI", "SI", "NO", "NO", "SI", "NO", "NO", "NO", …
$ POLIPNEA        <chr> "NO", "NO", "NO", "NO", "NO", "NO", "NO", "NO", "NO", …
$ VOMITO          <chr> "NO", "NO", "SI", "NO", "SI", "NO", "NO", "NO", "NO", …
$ DOLABDO         <chr> "NO", "NO", "NO", "NO", "NO", "NO", "NO", "NO", "NO", …
$ CONJUN          <chr> "SI", "NO", "NO", "NO", "NO", "SI", "NO", "NO", "NO", …
$ CIANOSIS        <chr> "NO", "NO", "NO", "NO", "NO", "NO", "NO", "SI", "NO", …
$ INISUBIS        <chr> "NO", "NO", "SI", "NO", "NO", "SI", "NO", "NO", "NO", …
$ ANOSMIA         <chr> "NO", "NO", "SI", "NO", "SE IGNORA", "SI", "SI", "NO",…
$ DISGEUSIA       <chr> "SI", "SI", "SI", "NO", "SE IGNORA", "SI", "NO", "NO",…
$ ASINTOMATICO    <chr> "NO", "NO", "NO", "NO", "NO", "NO", "NO", "NO", "NO", …
$ DIABETES        <chr> "NO", "NO", "NO", "NO", "SI", "NO", "NO", "SI", "NO", …
$ EPOC            <chr> "NO", "NO", "NO", "NO", "NO", "NO", "NO", "NO", "NO", …
$ ASMA            <chr> "NO", "NO", "NO", "NO", "NO", "SI", "NO", "NO", "NO", …
$ INMUSUPR        <chr> "NO", "NO", "NO", "SI", "NO", "NO", "NO", "NO", "NO", …
$ HIPERTEN        <chr> "NO", "NO", "NO", "NO", "SI", "NO", "NO", "SI", "NO", …
$ `VIH/SIDA`      <chr> "NO", "NO", "NO", "NO", "NO", "NO", "NO", "NO", "NO", …
$ OTRACON         <chr> "NO", "NO", "NO", "NO", "NO", "NO", "NO", "NO", "NO", …
$ ENFCARDI        <chr> "NO", "NO", "NO", "NO", "NO", "NO", "NO", "NO", "NO", …
$ OBESIDAD        <chr> "NO", "NO", "NO", "NO", "NO", "NO", "NO", "NO", "NO", …
$ INSRENCR        <chr> "NO", "NO", "NO", "NO", "NO", "NO", "NO", "NO", "NO", …
$ TABAQUIS        <chr> "NO", "NO", "NO", "NO", "NO", "NO", "NO", "NO", "NO", …
$ RECTRATA        <chr> "NO", "NO", "NO", "NO", "NO", "SI", "NO", "NO", "NO", …
$ TXCROBIA        <chr> "SI", "NO", "NO", "SI", "SI", "NO", "SI", "SI", NA, "S…
$ TXANTIVI        <chr> "SI", "NO", "NO", "NO", "SI", "NO", "SI", "SI", "SI", …
$ ANTIVIRA        <chr> "OSELTAMIVIR", NA, NA, NA, "OSELTAMIVIR", NA, "OSELTAM…
$ FECINITXANTIVI  <chr> NA, NA, NA, NA, NA, "16/07/2020", NA, NA, NA, NA, NA, …
$ CONOCASO        <chr> "NO", "NO", "SI", "NO", "NO", "NO", "NO", "NO", "SI", …
$ CONTAVES        <chr> "NO", "NO", "NO", "NO", "SI", "NO", "NO", "NO", "NO", …
$ CONCERDO        <chr> "NO", "NO", "NO", "NO", "SI", "NO", "NO", "NO", "NO", …
$ CONANIMA        <chr> "PERRO", "PERROS", NA, NA, "NO", "NO", "PERROS", NA, N…
$ VACUNADO        <chr> "SI", "NO", "SI", "NO", "NO", "NO", "SI", "NO", "NO", …
$ FECVAEST        <chr> "20/10/2019", NA, "18/02/2020", NA, NA, NA, "10/10/202…
$ TOMMUE          <chr> "SI", "SI", "SI", "SI", "SI", "SI", "SI", "SI", "SI", …
$ LABORA          <chr> "SINALOA", "SINALOA", "SINALOA", "SINALOA", "SINALOA",…
$ FOLLABOR        <dbl> 24899, 21544, 15191, 16552, 8104, 16691, 34132, 19894,…
$ RESDEFIN        <chr> "SARS-CoV-2", "SARS-CoV-2", "SARS-CoV-2", "SARS-CoV-2"…
$ RESDEFIN2       <lgl> NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA…
$ ESMIGRA         <chr> NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA…
$ PAISNAL         <chr> NA, NA, NA, NA, NA, NA, NA, NA, "México", NA, NA, NA, …
$ PAISORI         <lgl> NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA…
$ FINGMEX         <lgl> NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA…
$ PAISTRAN1       <lgl> NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA…
$ PAISTRAN2       <lgl> NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA…
$ PAISTRAN3       <lgl> NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA…
$ PAISTRAN4       <lgl> NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA…
$ PUERPERIO       <chr> NA, "NO", "NO", "NO", NA, "NO", NA, NA, NA, NA, NA, NA…
$ DIASPUERP       <lgl> NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA…
$ ANTIPIRETICOS   <chr> "NO", "SI", NA, "SI", "SI", "SI", "SI", "SI", "SI", "S…
$ UCI             <chr> NA, NA, NA, NA, "NO", NA, NA, "NO", NA, "NO", NA, NA, …
$ ORIGEN_DATOS    <dbl> 1, 1, 1, 1, 1, 1, 1, 1, 2, 1, 1, 1, 1, 1, 1, 1, 1, 2, …
$ ASODIC          <chr> "NO", "NO", "NO", "NO", "NO", "NO", "NO", "NO", NA, "N…
$ ANTIGENCOVID    <chr> NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA…
$ FECMUEANT       <chr> NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA…
$ CLASCOVID19     <chr> "CONF LAB", "CONF LAB", "CONF LAB", "CONF LAB", "CONF …
$ CLASFLU         <chr> "NEGATIVO", "NEGATIVO", "NEGATIVO", "NEGATIVO", "NEGAT…
$ PROTOCOLO       <chr> NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA…
$ VACUNA_COV      <chr> "NO APLICADA", "NO APLICADA", "NO APLICADA", "NO APLIC…
$ TIPO_VAC_COV    <chr> NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA…
$ FEC_VAC_COV     <chr> NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA…
$ REF_VAC_COV     <chr> NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA…
$ FEC_REF_VAC_COV <chr> NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA…
$ LINAJE          <chr> NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA…
$ VIAJE1          <chr> NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA…
$ VIAJE2          <lgl> NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA…
$ VIAJE3          <lgl> NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA…
$ VIAJE4          <lgl> NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA…
$ VIAJE5          <lgl> NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA…

Revisión Final de los Datos

Describiremos el proceso final de limpienza con dos etapas de análisis de datos de casos de COVID-19, utilizando el lenguaje de programación R y la librería dplyr, que es parte del conjunto de paquetes tidyverse. dplyr es una herramienta poderosa para la manipulación de datos que utiliza una gramática de manipulación de datos consistente en funciones que corresponden a las operaciones más comunes de manipulación de datos.

Revisión Final de los Datos

El propósito de este código es limpiar y simplificar los datos para su análisis posterior, recodificando los resultados de pruebas de COVID-19 en dos categorías claras y revisando la distribución de estos resultados para asegurar la integridad de los datos.

Reclasificamos todos los casos no negativos a “POSITIVO”

covidsintotal$RESDEFIN <- ifelse(covidsintotal$RESDEFIN == "NEGATIVO", "NEGATIVO", "SARS-CoV2")
  • ifelse(test, yes, no): Esta función evalúa una condición lógica (test) para cada elemento de un vector y retorna un valor correspondiente de yes si la condición es verdadera, o de no si es falsa. Aquí se utiliza para recodificar la columna RESDEFIN del dataframe covidsintotal. Si el valor original es “NEGATIVO”, se mantiene como “NEGATIVO”; de lo contrario, se cambia a “SARS-CoV2”. Esto simplifica la clasificación de los casos en dos categorías.

Reclasificación de los datos

unique(covidsintotal$RESDEFIN)
[1] NA          "SARS-CoV2" "NEGATIVO" 
  • unique(x): Esta función devuelve un vector con los valores únicos del vector x, eliminando duplicados. Aquí se utiliza para inspeccionar los valores únicos resultantes en la columna RESDEFIN después de la recodificación, asegurando que solo existan las categorías “NEGATIVO” y “SARS-CoV2”.

Limpieza de los datos

covidsintotal<-covidsintotal %>% select(RESDEFIN) %>% drop_na()

unique(covidsintotal$RESDEFIN)
[1] "SARS-CoV2" "NEGATIVO" 
  • select(): Esta función de dplyr selecciona una o más columnas de un dataframe. Aquí se selecciona solo la columna RESDEFIN.

  • drop_na(): También de dplyr, elimina las filas que contienen valores NA en las columnas seleccionadas. Este paso asegura que solo se mantengan los registros con información definida en RESDEFIN.

  • Se repite el uso de unique() para verificar los valores únicos de RESDEFIN después de eliminar los NA, asegurando la consistencia de los datos.

Creación de una Curva Epidemiológica con ggplot2

La curva epidemiológica es fundamental para entender la dinámica de una enfermedad a lo largo del tiempo. Utilizando el paquete ggplot2 de R, podemos visualizar la distribución de casos de COVID-19 y analizar patrones importantes como brotes y tendencias. A continuación, se detallan los pasos para crear una curva epidemiológica:

# Cargar las bibliotecas necesarias
library(ggplot2)
library(dplyr)
library(lubridate)

Creación de una Curva Epidemiológica con ggplot2

ggplot2 es parte de tidyverse y proporciona un sistema poderoso para declarativamente crear gráficos basados en la gramática de gráficos. lubridate facilita el trabajo con fechas y tiempos, permitiendo manipular, realizar operaciones y acomodar fechas de manera más intuitiva.

Preparación de los Datos

Antes de crear la curva, necesitamos asegurarnos de que los datos estén en el formato adecuado, especialmente las fechas:

-Conversión de Fechas: Las variables FECINISI (fecha de inicio de síntomas) y FECDEF (fecha de defunción) son cruciales para el análisis de supervivencia, ya que permiten calcular el tiempo transcurrido desde el inicio de síntomas hasta la defunción o el último seguimiento conocido. Estas fechas necesitan ser manejadas como objetos de fecha para realizar cálculos de tiempo.

Preparación de los Datos

covidsinfilt$FECINISI <- strptime(as.character(covidsinfilt$FECINISI), "%d/%m/%Y")
covidsinfilt$FECINISI = as.Date(covidsinfilt$FECINISI)
covidsinfilt$FECDEF <- strptime(as.character(covidsinfilt$FECDEF), "%d/%m/%Y")
covidsinfilt$FECDEF = as.Date(covidsinfilt$FECDEF)

strptime() y as.Date()
-strptime() convierte una cadena de caracteres en un objeto de fecha y hora según el formato especificado (“%d/%m/%Y”), mientras que -as.Date() convierte el resultado en un objeto de fecha. Este proceso asegura que las fechas sean interpretadas correctamente por R, permitiendo su manipulación y cálculo en análisis subsiguientes.

Preparación de los Datos

-Cálculo del Tiempo de Supervivencia: Una vez que las fechas están en el formato correcto, se calcula el tiempo de supervivencia (deftime), que es la diferencia en días entre la fecha de inicio de síntomas y la fecha de defunción o el último seguimiento para los pacientes.

covidsinfilt <- covidsinfilt %>% mutate(deftime = as.double(FECDEF - FECINISI))

-mutate() y as.double(): -mutate() se usa para crear o modificar columnas dentro del data frame,
- as.double() convierte el resultado en un número de días, facilitando el análisis numérico y estadístico del tiempo de supervivencia.

Generación de la Curva Epidemiológica

CURVA EPIDEMIOLOGICA

-La curva epidemiológica es una herramienta esencial en el análisis de datos de salud pública, ya que muestra la distribución de los casos a lo largo del tiempo, ayudando a identificar patrones, tendencias y posibles brotes.

Paso 1: Cargar las Bibliotecas Necesarias

El primer paso es cargar las bibliotecas ggplot2 para la visualización y scales para formatear las etiquetas de las fechas.

library(ggplot2)
library(scales)
Warning: package 'scales' was built under R version 4.3.2

Attaching package: 'scales'
The following object is masked from 'package:purrr':

    discard
The following object is masked from 'package:readr':

    col_factor
  • scales en R es una herramienta especializada para el manejo y transformación de escalas en el proceso de visualización de datos. Esta librería es comúnmente utilizada en conjunto con ggplot2, una de las librerías más poderosas y populares para la creación de gráficos en R. La finalidad de scales es proporcionar una serie de funciones que permitan una personalización detallada de las escalas de los ejes, las guías de colores y las leyendas, entre otros elementos de un gráfico.

Paso 2: Preparar los Datos

-Se asegura que la columna de fecha FECINISI esté en formato de fecha adecuado para su uso en ggplot2.

covidsinfilt$FECINISI <- as.Date(covidsinfilt$FECINISI)

as.Date transforma la variable a fechas

Paso 3: Crear la Curva Epidemiológica

utilizando la librería ggplot2 en R. Esta curva tiene como objetivo visualizar la cantidad de casos nuevos de COVID-19 a lo largo del tiempo. A continuación, se describe cada línea y función del código:

epiplot <- ggplot(data = covidsinfilt, aes(x = FECINISI)) +

  • ggplot(data = covidsinfilt, aes(x = FECINISI)): Inicializa un objeto ggplot.

  • covidsinfilt es el dataframe que contiene los datos y aes(x = FECINISI) establece las estéticas del gráfico, asignando la variable FECINISI al eje x.

  • separamos con una +, despues de cada bloque de código, para separar función e ir agregando las diferentes capas al gráfico.

Crear la Curva Epidemiológica

theme_bw() +

  • theme_bw(): Aplica un tema predefinido con un fondo blanco y líneas negras, que es generalmente bueno para la impresión y tiene un aspecto clásico.

Crear la Curva Epidemiológica

geom_histogram(binwidth = 7, colour = "black", fill = "#3e78d6", size = 0.1) +

  • geom_histogram(): Añade un histograma al gráfico.
  • binwidth = 7 sugiere que cada barra del histograma representa una semana de datos.
  • colour = "black" define el color del borde de las barras y

Crear la Curva Epidemiológica

geom_histogram(binwidth = 7, colour = "black", fill = "#3e78d6", size = 0.1) +

  • fill = "#3e78d6" el color de relleno. Puedes observar más opciones en Color-Hex o puedes crear tu paleta en Hexcolor o Coolors, variedad de paletas de colores, usa el de tu preferencia.
  • size = 0.1 ajusta el grosor del borde de las barras. También en

Crear la Curva Epidemiológica

geom_density(aes(y = ..density.. * (nrow(covidsinfilt) * 2)), colour = "red", size=0.8) +

  • geom_density(...): Superpone una curva de densidad, que es una estimación suavizada de la distribución de frecuencias.

  • Aquí, aes(y = ..density.. * (nrow(covidsinfilt) * 2)) está escalando la densidad por un factor para hacerla visible en la misma escala que el histograma. El color de la línea es rojo y su grosor es 0.8.

Crear la Curva Epidemiológica

scale_x_date(date_breaks = "1 month", labels = date_format("%d/%m/%Y"), name = "") +

  • scale_x_date(...): Configura la escala del eje x para tratar las fechas correctamente.

  • date_breaks = "1 month" establece los intervalos de las marcas de graduación en un mes, y

  • labels = date_format("%d/%m/%Y") define el formato de la fecha mostrada en las etiquetas del eje x.

Curva Epidemiológica

scale_y_continuous(breaks = seq(from = 0, to = 1500, by = 100), name = "Number of cases") +

  • scale_y_continuous(...): Configura la escala del eje y, que es continua.

  • breaks = seq(from = 0, to = 1500, by = 100) establece las marcas en el eje y en secuencias de 100 desde 0 hasta 1500. El nombre del eje y es “Number of cases”.

Curva Epidemiológica

theme_classic() +

  • theme_classic(): Aplica otro tema predefinido que tiene una apariencia más “clásica” con menos elementos gráficos que theme_bw().

theme(axis.text.x = element_text(angle = 90, hjust = 1)) +

  • theme(axis.text.x = element_text(angle = 90, hjust = 1)): Modifica la estética del texto del eje x, rotándolo 90 grados y ajustando la alineación horizontal.

Curva Epidemiológica

theme(legend.text = element_text(size = 12, color = "black", face = "bold")) +

  • theme(legend.text = element_text(size = 12, color = "black", face = "bold")): Personaliza el texto de la leyenda, cambiando el tamaño, color y tipo de letra (negrita).

theme(text = element_text(size = 18))

  • theme(text = element_text(size = 18)): Ajusta el tamaño global del texto en el gráfico a 18 puntos para mejorar la legibilidad.

Curva Epidemiológica

Juntamos el codigo

epiplot <-ggplot(data = covidsinfilt, aes(x = as.Date(FECINISI))) +
  theme_bw() +
  geom_histogram(binwidth = 7, colour = "black", fill = "#3e78d6", size = 0.1) +
  geom_density(aes(y = ..density.. * (nrow(covidsinfilt) * 2)), colour = "red", size=0.8) +
  scale_x_date(date_breaks = "1 month",labels = date_format("%d/%m/%Y"), 
     name = "") +
  scale_y_continuous(breaks = seq(from = 0, to =1500, by = 100), name = "Number of cases") + theme_classic()+
  theme(axis.text.x = element_text(angle = 90, hjust = 1))+ 
  theme(legend.text = element_text(size = 12, color = "black", face = "bold"))+theme(text = element_text(size = 18)) 
Warning: Using `size` aesthetic for lines was deprecated in ggplot2 3.4.0.
ℹ Please use `linewidth` instead.

Curva Epidemiológica

Warning: The dot-dot notation (`..density..`) was deprecated in ggplot2 3.4.0.
ℹ Please use `after_stat(density)` instead.

Utilidad Curva Epidemiológica

Basándonos en la curva epidemiológica, se pueden realizar varios análisis epidemiológicos para comprender mejor la dinámica de la enfermedad, la efectividad de las intervenciones y el impacto en la salud pública.

A continuación, se describen algunos análisis potenciales y se proporciona el código de R como ejercicio para cada análisis.

Análisis 1: Estimación de la Tasa de Crecimiento

Un análisis inicial podría involucrar la estimación de la tasa de crecimiento de los casos a lo largo del tiempo. Esto puede ayudar a identificar períodos de expansión rápida de la enfermedad y evaluar el impacto de las intervenciones de salud pública.

Tasa de crecimiento

Funciones Usadas:

  • geom_line(): Crea una línea que conecta puntos en una gráfica, lo que es útil para visualizar tendencias a lo largo del tiempo.

  • scale_x_date(): Formatea el eje x para manejar fechas, lo que permite una interpretación más clara del tiempo.

  • labs(): Añade etiquetas al gráfico, como el título y los ejes x y y.

  • theme_minimal(): Proporciona un tema minimalista que facilita la lectura del gráfico.

Tasa de crecimiento:

En este primer bloque de código:

  1. covidsinfilt: Este es el dataframe que contiene los datos de COVID-19.

  2. %>%: Este es el operador de tubería de dplyr que permite encadenar varias operaciones. Pasa el resultado de una función al primer argumento de la siguiente función.

  3. group_by(FECINISI): Agrupa los datos por la fecha de inicio de síntomas (FECINISI), lo que permite realizar cálculos dentro de cada grupo de fechas.

  4. summarise(casos = n()): Resume los datos agrupados, contando el número de filas en cada grupo, lo que representa el número de casos nuevos por día.

  5. mutate(casos_acumulados = cumsum(casos)): Añade una nueva columna al dataframe que calcula el total acumulado de casos usando la función cumsum(), que realiza una suma acumulativa de los casos diarios.

Tasa de crecimiento:

En el segundo bloque de código:

library(dplyr)
library(ggplot2)

# Calcular el número de casos diarios
casos_diarios <- covidsinfilt %>%
  group_by(FECINISI) %>%
  summarise(casos = n()) %>%
  mutate(casos_acumulados = cumsum(casos))
  1. mutate(tasa_crecimiento = (casos_acumulados/lag(casos_acumulados)) - 1): Se calcula la tasa de crecimiento diaria y se agrega como una nueva columna. Para cada día, toma el número acumulado de casos y lo divide por el número acumulado del día anterior (utilizando la función lag() que desplaza los datos una posición), y luego resta 1 para obtener la tasa de crecimiento. Esto proporciona una medida de qué tan rápido está aumentando el número de casos de un día para otro.

Tasa de crecimiento:

El resultado es un dataframe casos_diarios que ahora incluye dos columnas adicionales: casos_acumulados, que es el total acumulativo de casos hasta la fecha correspondiente, y tasa_crecimiento, que es la tasa de cambio diaria en el número acumulado de casos. Estos cálculos son fundamentales para entender la dinámica de la transmisión del COVID-19 a lo largo del tiempo.

# Calcular la tasa de crecimiento diaria
casos_diarios <- casos_diarios %>%
  mutate(tasa_crecimiento = (casos_acumulados/lag(casos_acumulados)) - 1)

Tasa de crecimiento:

la librería ggplot2, que es parte del conjunto de paquetes tidyverse en R, para crear un gráfico de líneas que muestra la tasa de crecimiento diaria de los casos de COVID-19 en función del tiempo. A continuación, desgloso cada línea del código y describo su función:

# Gráfico de la tasa de crecimiento
tc<-ggplot(casos_diarios, aes(x = FECINISI, y = tasa_crecimiento)) +
  geom_line() +
  scale_x_date(date_breaks = "1 month", date_labels = "%b %Y") +
  labs(x = "Fecha", y = "Tasa de Crecimiento", title = "Tasa de Crecimiento Diaria de COVID-19") +
  theme_minimal()
  1. tc: Este es el objeto que almacenará el gráfico creado.

  2. ggplot(casos_diarios, aes(x = FECINISI, y = tasa_crecimiento)): Inicializa el gráfico basado en el dataframe casos_diarios. La función aes establece las estéticas del gráfico, asignando la fecha de inicio de síntomas (FECINISI) al eje x y la tasa de crecimiento calculada anteriormente al eje y.

  3. geom_line(): Añade una capa al gráfico que representa los datos con líneas, conectando los puntos de datos de la tasa de crecimiento diaria en el orden en que aparecen en el dataframe.

    Tasa de crecimiento:

  4. scale_x_date(date_breaks = "1 month", date_labels = "%b %Y"): Esta función modifica la escala del eje x, que representa fechas. date_breaks = "1 month" establece que las marcas en el eje x se mostrarán mensualmente y date_labels = "%b %Y" establece el formato de la fecha mostrada, donde %b representa el mes abreviado y %Y el año con cuatro dígitos.

  5. labs(x = "Fecha", y = "Tasa de Crecimiento", title = "Tasa de Crecimiento Diaria de COVID-19"): Establece las etiquetas del eje x y eje y, y el título del gráfico.

  6. theme_minimal(): Aplica un tema predefinido al gráfico, que proporciona un aspecto minimalista y limpio, eliminando la mayoría de los elementos de fondo para enfocarse en los datos.

Tasa de crecimiento:

Warning: Removed 1 row containing missing values (`geom_line()`).

  • La gráfica muestra un pico pronunciado al inicio, lo que indica una rápida aceleración en la propagación del virus. Esto podría corresponder al comienzo de la pandemia, donde el número de casos estaba aumentando exponencialmente.

  • Con el tiempo, la tasa de crecimiento diaria disminuye y se estabiliza cerca de cero, lo que sugiere que el número de casos nuevos se ha estabilizado o está creciendo a una tasa muy baja. Esto puede ser el resultado de medidas de control efectivas o de una saturación de la infección dentro de la población.

Número R0

EpiEstim es un paquete de R que permite estimar el número reproductivo efectivo (R0) de una enfermedad infecciosa en el tiempo, a partir de datos de incidencia y el intervalo serial conocido o estimado. El número reproductivo efectivo (R0), R, es el promedio de casos secundarios que cada caso infecta y es un indicador clave de la transmisibilidad de una enfermedad.

Aquí te presento cómo adaptarías el código y base de datos anteriores para utilizar EpiEstim:

Paso 1: Instalar y cargar el paquete EpiEstim

Primero, necesitas asegurarte de que el paquete está instalado y luego cargarlo en tu sesión de R.

#install.packages("EpiEstim")

# Cargar el paquete EpiEstim
library(EpiEstim)
Warning: package 'EpiEstim' was built under R version 4.3.2

Paso 2: Preparar los datos de incidencia diaria

EpiEstim requiere un vector de incidencia diaria, que puedes obtener a partir de los datos que ya has limpiado y preparado.

# Asumiendo que covidsinfilt contiene los datos limpios con una columna de fecha FECINISI
library(tidyverse)
incidence <- covidsinfilt %>%
  count(FECINISI) %>%
  .$n

Paso 3: Especificar el intervalo serial

El intervalo serial es el tiempo entre la aparición de síntomas en el caso primario y los casos secundarios. Puede estar basado en estudios previos o estimaciones.

# Definir un intervalo serial (ejemplo)
# Estos datos deben ser reemplazados por estimaciones reales o datos de estudios

# Definir un intervalo serial como una lista para acceder fácilmente a sus elementos
si_distr <- dnorm(1:20, mean = 4.7, sd = 2.9)  # Ejemplo con 20 días
si_distr <- si_distr / sum(si_distr)  # Normalizar para que sume 1

Paso 4: Estimar R usando EpiEstim

Ahora puedes estimar el número reproductivo efectivo (R) utilizando los datos de incidencia y el intervalo serial.

# Estimación de R utilizando EpiEstim
# Se corrige la configuración para incluir directamente si_distr
#result <- estimate_R(incidence,
 #                    method = "non_parametric_si",
  #                   config = make_config(si_distr = si_distr))

# Ver los resultados
#print(result)

Paso 5: Visualizar los resultados

Finalmente, visualiza los resultados para interpretarlos mejor.

Visualización y Resultados

  • estimate_R(): Es la función principal de EpiEstim que estima R.

  • method: El método de estimación, donde "non_parametric_si" significa que usamos un intervalo serial que no asume una distribución paramétrica.

  • make_config(): Una función de EpiEstim que crea una configuración para la estimación, donde especificas el intervalo serial medio y su desviación estándar.

  • plot(): Función genérica para visualizar los resultados de la estimación de R.

#library(EpiEstim)
#install.packages("EpiNow2")
#library(EpiNow2)
# Define a dataset covidsinfilt with a column FECINISI
#covidsinfilt <- tibble(FECINISI = seq(as.Date('2021-01-01'), as.Date('2021-06-30'), by="day"))
# Count the number of cases per day in FECINISI
#incidence <- covidsinfilt %>%
 # count(FECINISI) %>%
  #.$n
# Define a serial interval distribution as a list for easy access to its elements
#si_distr <- dnorm(1:20, mean = 4.7, sd = 2.9)  # Example with 20 days
#si_distr <- si_distr / sum(si_distr)  # Normalize for it to sum up to 1
# Estimate R using the non-parametric SI method
#result <- estimate_R(incidence,
 #                    method = "non_parametric_si",
  #                   config = make_config(t_start=1, t_end=20, si_distr=si_distr))
# Print the results
#print(result)