Ir al contenido

La librería de covidmx está para ayudarte a analizar los datos abiertos de COVID-19 de México, generar estadísticos de interés y visualizaciones rápidas. La idea es ahorrarte tiempo.

Instalación

#install.packages("remotes")
remotes::install_github("RodrigoZepeda/covidmx")

No olvides llamar la librería y ¡a codear!

NOTA (datos precargados) Si lo que quieres hacer es ponerte a jugar con las funciones del paquete directamente puedes saltar hasta la sección de casos y usar los datos precargados:

datos_covid <- covidmx::datosabiertos #Uso de los datos precargados

Datos Abiertos de la Dirección General de Epidemiología

Descarga automática de base de datos abiertos

Lo más importante es comenzar descargando la base de datos abiertos. Esto lo puedes hacer como sigue:

datos_covid <- descarga_datos_abiertos()

Para propósito de este tutorial trabajaremos con una base de datos más pequeña disponible en el repositorio de Github la cual guardaremos en duckdb bajo el nombre de tutorial.

#Cómo vas a guardar tu base .duckdb
base_duck   <- "mi_archivo.duckdb"
dlink       <- c("tutorial" = 
                   "https://github.com/RodrigoZepeda/covidmx/raw/main/datos_abiertos_covid19.zip")
datos_covid <- descarga_datos_abiertos(sites.covid = dlink, tblname = "tutorial", 
                                       dbdir = base_duck) 

La descarga contiene una conexión a duckdb dentro de datos_covid$dats la cual puedes operar con dbplyr.

NO se agregan las etiquetas a los datos pues es muy tardado hacerlo:

datos_covid$dats |> dplyr::glimpse()
#> Rows: ??
#> Columns: 40
#> Database: DuckDB 0.7.0 [root@Darwin 22.2.0:R 4.2.2//var/folders/42/2kdf45dd1qz5n7kf9lm8ld9r0000gn/T//RtmpxTTKw1/file162953974c417.duckdb]
#> $ FECHA_ACTUALIZACION   <dttm> 2022-07-14, 2022-07-14, 2022-07-14, 2022-07-14,…
#> $ ID_REGISTRO           <chr> "78ce0b", "526821", "4ab051", "ba3171", "b970bb"…
#> $ ORIGEN                <int> 2, 1, 1, 1, 1, 2, 1, 2, 1, 1, 1, 2, 1, 1, 2, 2, …
#> $ SECTOR                <int> 12, 4, 4, 4, 6, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,…
#> $ ENTIDAD_UM            <chr> "03", "03", "03", "03", "03", "03", "03", "03", …
#> $ SEXO                  <int> 1, 2, 2, 2, 2, 2, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, …
#> $ ENTIDAD_NAC           <chr> "09", "03", "25", "03", "03", "25", "03", "17", …
#> $ ENTIDAD_RES           <chr> "03", "03", "03", "03", "03", "03", "03", "03", …
#> $ MUNICIPIO_RES         <chr> "003", "008", "008", "008", "003", "003", "008",…
#> $ TIPO_PACIENTE         <int> 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 1, 1, 1, 1, …
#> $ FECHA_INGRESO         <dttm> 2021-07-08, 2021-07-01, 2021-07-01, 2021-07-01,…
#> $ FECHA_SINTOMAS        <dttm> 2021-07-04, 2021-07-01, 2021-07-01, 2021-07-01,…
#> $ FECHA_DEF             <dttm> NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA,…
#> $ INTUBADO              <int> 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 2, 9…
#> $ NEUMONIA              <int> 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 1, 2, 2, 2, 2, …
#> $ EDAD                  <int> 17, 28, 30, 22, 32, 35, 24, 40, 21, 78, 13, 54, …
#> $ NACIONALIDAD          <int> 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, …
#> $ EMBARAZO              <int> 2, 97, 97, 97, 97, 97, 97, 2, 2, 2, 2, 2, 2, 2, …
#> $ HABLA_LENGUA_INDIG    <int> 99, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,…
#> $ INDIGENA              <int> 99, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,…
#> $ DIABETES              <int> 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 1, 2, 2, 2, 2, …
#> $ EPOC                  <int> 2, 2, 2, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, …
#> $ ASMA                  <int> 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, …
#> $ INMUSUPR              <int> 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, …
#> $ HIPERTENSION          <int> 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, …
#> $ OTRA_COM              <int> 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, …
#> $ CARDIOVASCULAR        <int> 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, …
#> $ OBESIDAD              <int> 2, 1, 1, 2, 2, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, …
#> $ RENAL_CRONICA         <int> 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, …
#> $ TABAQUISMO            <int> 2, 2, 2, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, …
#> $ OTRO_CASO             <int> 2, 1, 1, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, …
#> $ TOMA_MUESTRA_LAB      <int> 1, 2, 2, 2, 2, 1, 2, 2, 2, 2, 2, 1, 2, 2, 2, 2, …
#> $ RESULTADO_LAB         <int> 2, 97, 97, 97, 97, 1, 97, 97, 97, 97, 97, 4, 97,…
#> $ TOMA_MUESTRA_ANTIGENO <int> 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, …
#> $ RESULTADO_ANTIGENO    <int> 2, 2, 1, 2, 2, 1, 1, 1, 2, 2, 1, 2, 2, 2, 2, 2, …
#> $ CLASIFICACION_FINAL   <int> 7, 7, 3, 7, 7, 3, 3, 3, 7, 7, 3, 6, 7, 7, 7, 7, …
#> $ MIGRANTE              <int> 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, …
#> $ PAIS_NACIONALIDAD     <chr> "México", "México", "México", "México", "México"…
#> $ PAIS_ORIGEN           <chr> "97", "97", "97", "97", "97", "97", "97", "97", …
#> $ UCI                   <int> 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 2, 9…

Sin embargo el diccionario se almacena como una lista en dict para su consulta y uso por las funciones internas:

datos_covid$dict |> dplyr::glimpse()
#> List of 31
#>  $ ORIGEN               : tibble [3 × 2] (S3: tbl_df/tbl/data.frame)
#>   ..$ CLAVE      : num [1:3] 1 2 99
#>   ..$ DESCRIPCIÓN: chr [1:3] "USMER" "FUERA DE USMER" "NO ESPECIFICADO"
#>  $ SECTOR               : tibble [14 × 2] (S3: tbl_df/tbl/data.frame)
#>   ..$ CLAVE      : num [1:14] 1 2 3 4 5 6 7 8 9 10 ...
#>   ..$ DESCRIPCIÓN: chr [1:14] "CRUZ ROJA" "DIF" "ESTATAL" "IMSS" ...
#>  $ SEXO                 : tibble [3 × 2] (S3: tbl_df/tbl/data.frame)
#>   ..$ CLAVE      : num [1:3] 1 2 99
#>   ..$ DESCRIPCIÓN: chr [1:3] "MUJER" "HOMBRE" "NO ESPECIFICADO"
#>  $ PACIENTE             : tibble [3 × 2] (S3: tbl_df/tbl/data.frame)
#>   ..$ CLAVE      : num [1:3] 1 2 99
#>   ..$ DESCRIPCIÓN: chr [1:3] "AMBULATORIO" "HOSPITALIZADO" "NO ESPECIFICADO"
#>  $ NACIONALIDAD         : tibble [3 × 2] (S3: tbl_df/tbl/data.frame)
#>   ..$ CLAVE      : num [1:3] 1 2 99
#>   ..$ DESCRIPCIÓN: chr [1:3] "MEXICANA" "EXTRANJERA" "NO ESPECIFICADO"
#>  $ RESULTADO_LAB        : tibble [5 × 2] (S3: tbl_df/tbl/data.frame)
#>   ..$ CLAVE      : num [1:5] 1 2 3 4 97
#>   ..$ DESCRIPCIÓN: chr [1:5] "POSITIVO A SARS-COV-2" "NO POSITIVO A SARS-COV-2" "RESULTADO PENDIENTE" "RESULTADO NO ADECUADO" ...
#>  $ RESULTADO_ANTIGENO   : tibble [3 × 2] (S3: tbl_df/tbl/data.frame)
#>   ..$ CLAVE      : num [1:3] 1 2 97
#>   ..$ DESCRIPCIÓN: chr [1:3] "POSITIVO A SARS-COV-2" "NEGATIVO A SARS-COV-2" "NO APLICA (CASO SIN MUESTRA)"
#>  $ CLASIFICACION_FINAL  : tibble [7 × 3] (S3: tbl_df/tbl/data.frame)
#>   ..$ CLAVE        : num [1:7] 1 2 3 4 5 6 7
#>   ..$ CLASIFICACIÓN: chr [1:7] "CASO DE COVID-19 CONFIRMADO POR ASOCIACIÓN CLÍNICA EPIDEMIOLÓGICA" "CASO DE COVID-19 CONFIRMADO POR COMITÉ DE  DICTAMINACIÓN" "CASO DE SARS-COV-2  CONFIRMADO" "INVÁLIDO POR LABORATORIO" ...
#>   ..$ DESCRIPCIÓN  : chr [1:7] "Confirmado por asociación aplica cuando el caso informó ser contacto de un positivo a COVID-19 (y este se encue"| __truncated__ "Confirmado por dictaminación solo aplica para defunciones bajo las siguientes condiciones: \r\nAl caso no se le"| __truncated__ "Confirmado aplica cuando:\r\nEl caso tiene muestra de laboratorio o prueba antigénica y resultó positiva  a SAR"| __truncated__ "Inválido aplica cuando el caso no tienen asociación clínico epidemiológica, ni dictaminación a COVID-19. Se le "| __truncated__ ...
#>  $ MUNICIPIO_RES        : tibble [2,501 × 3] (S3: tbl_df/tbl/data.frame)
#>   ..$ CLAVE_MUNICIPIO: chr [1:2501] "001" "002" "003" "004" ...
#>   ..$ MUNICIPIO      : chr [1:2501] "AGUASCALIENTES" "ASIENTOS" "CALVILLO" "COSÍO" ...
#>   ..$ CLAVE_ENTIDAD  : chr [1:2501] "01" "01" "01" "01" ...
#>  $ INTUBADO             : tibble [5 × 2] (S3: tbl_df/tbl/data.frame)
#>   ..$ CLAVE      : num [1:5] 1 2 97 98 99
#>   ..$ DESCRIPCIÓN: chr [1:5] "SI" "NO" "NO APLICA" "SE IGNORA" ...
#>  $ NEUMONIA             : tibble [5 × 2] (S3: tbl_df/tbl/data.frame)
#>   ..$ CLAVE      : num [1:5] 1 2 97 98 99
#>   ..$ DESCRIPCIÓN: chr [1:5] "SI" "NO" "NO APLICA" "SE IGNORA" ...
#>  $ EMBARAZO             : tibble [5 × 2] (S3: tbl_df/tbl/data.frame)
#>   ..$ CLAVE      : num [1:5] 1 2 97 98 99
#>   ..$ DESCRIPCIÓN: chr [1:5] "SI" "NO" "NO APLICA" "SE IGNORA" ...
#>  $ HABLA LENGUA INDIGENA: tibble [5 × 2] (S3: tbl_df/tbl/data.frame)
#>   ..$ CLAVE      : num [1:5] 1 2 97 98 99
#>   ..$ DESCRIPCIÓN: chr [1:5] "SI" "NO" "NO APLICA" "SE IGNORA" ...
#>  $ INDIGENA             : tibble [5 × 2] (S3: tbl_df/tbl/data.frame)
#>   ..$ CLAVE      : num [1:5] 1 2 97 98 99
#>   ..$ DESCRIPCIÓN: chr [1:5] "SI" "NO" "NO APLICA" "SE IGNORA" ...
#>  $ DIABETES             : tibble [5 × 2] (S3: tbl_df/tbl/data.frame)
#>   ..$ CLAVE      : num [1:5] 1 2 97 98 99
#>   ..$ DESCRIPCIÓN: chr [1:5] "SI" "NO" "NO APLICA" "SE IGNORA" ...
#>  $ EPOC                 : tibble [5 × 2] (S3: tbl_df/tbl/data.frame)
#>   ..$ CLAVE      : num [1:5] 1 2 97 98 99
#>   ..$ DESCRIPCIÓN: chr [1:5] "SI" "NO" "NO APLICA" "SE IGNORA" ...
#>  $ ASMA                 : tibble [5 × 2] (S3: tbl_df/tbl/data.frame)
#>   ..$ CLAVE      : num [1:5] 1 2 97 98 99
#>   ..$ DESCRIPCIÓN: chr [1:5] "SI" "NO" "NO APLICA" "SE IGNORA" ...
#>  $ INMUSUPR             : tibble [5 × 2] (S3: tbl_df/tbl/data.frame)
#>   ..$ CLAVE      : num [1:5] 1 2 97 98 99
#>   ..$ DESCRIPCIÓN: chr [1:5] "SI" "NO" "NO APLICA" "SE IGNORA" ...
#>  $ HIPERTENSION         : tibble [5 × 2] (S3: tbl_df/tbl/data.frame)
#>   ..$ CLAVE      : num [1:5] 1 2 97 98 99
#>   ..$ DESCRIPCIÓN: chr [1:5] "SI" "NO" "NO APLICA" "SE IGNORA" ...
#>  $ CARDIOVASCULAR       : tibble [5 × 2] (S3: tbl_df/tbl/data.frame)
#>   ..$ CLAVE      : num [1:5] 1 2 97 98 99
#>   ..$ DESCRIPCIÓN: chr [1:5] "SI" "NO" "NO APLICA" "SE IGNORA" ...
#>  $ OTRO_CASO            : tibble [5 × 2] (S3: tbl_df/tbl/data.frame)
#>   ..$ CLAVE      : num [1:5] 1 2 97 98 99
#>   ..$ DESCRIPCIÓN: chr [1:5] "SI" "NO" "NO APLICA" "SE IGNORA" ...
#>  $ TOMA_MUESTRA_LAB     : tibble [5 × 2] (S3: tbl_df/tbl/data.frame)
#>   ..$ CLAVE      : num [1:5] 1 2 97 98 99
#>   ..$ DESCRIPCIÓN: chr [1:5] "SI" "NO" "NO APLICA" "SE IGNORA" ...
#>  $ TOMA_MUESTRA_ANTIGENO: tibble [5 × 2] (S3: tbl_df/tbl/data.frame)
#>   ..$ CLAVE      : num [1:5] 1 2 97 98 99
#>   ..$ DESCRIPCIÓN: chr [1:5] "SI" "NO" "NO APLICA" "SE IGNORA" ...
#>  $ OTRA_COMORBILIDAD    : tibble [5 × 2] (S3: tbl_df/tbl/data.frame)
#>   ..$ CLAVE      : num [1:5] 1 2 97 98 99
#>   ..$ DESCRIPCIÓN: chr [1:5] "SI" "NO" "NO APLICA" "SE IGNORA" ...
#>  $ OBESIDAD             : tibble [5 × 2] (S3: tbl_df/tbl/data.frame)
#>   ..$ CLAVE      : num [1:5] 1 2 97 98 99
#>   ..$ DESCRIPCIÓN: chr [1:5] "SI" "NO" "NO APLICA" "SE IGNORA" ...
#>  $ RENAL_CRONICA        : tibble [5 × 2] (S3: tbl_df/tbl/data.frame)
#>   ..$ CLAVE      : num [1:5] 1 2 97 98 99
#>   ..$ DESCRIPCIÓN: chr [1:5] "SI" "NO" "NO APLICA" "SE IGNORA" ...
#>  $ TABAQUISMO           : tibble [5 × 2] (S3: tbl_df/tbl/data.frame)
#>   ..$ CLAVE      : num [1:5] 1 2 97 98 99
#>   ..$ DESCRIPCIÓN: chr [1:5] "SI" "NO" "NO APLICA" "SE IGNORA" ...
#>  $ UCI                  : tibble [5 × 2] (S3: tbl_df/tbl/data.frame)
#>   ..$ CLAVE      : num [1:5] 1 2 97 98 99
#>   ..$ DESCRIPCIÓN: chr [1:5] "SI" "NO" "NO APLICA" "SE IGNORA" ...
#>  $ ENTIDAD_UM           : tibble [36 × 3] (S3: tbl_df/tbl/data.frame)
#>   ..$ CLAVE_ENTIDAD     : chr [1:36] "01" "02" "03" "04" ...
#>   ..$ ENTIDAD_FEDERATIVA: chr [1:36] "AGUASCALIENTES" "BAJA CALIFORNIA" "BAJA CALIFORNIA SUR" "CAMPECHE" ...
#>   ..$ ABREVIATURA       : chr [1:36] "AS" "BC" "BS" "CC" ...
#>  $ ENTIDAD_RES          : tibble [36 × 3] (S3: tbl_df/tbl/data.frame)
#>   ..$ CLAVE_ENTIDAD     : chr [1:36] "01" "02" "03" "04" ...
#>   ..$ ENTIDAD_FEDERATIVA: chr [1:36] "AGUASCALIENTES" "BAJA CALIFORNIA" "BAJA CALIFORNIA SUR" "CAMPECHE" ...
#>   ..$ ABREVIATURA       : chr [1:36] "AS" "BC" "BS" "CC" ...
#>  $ ENTIDAD_NAC          : tibble [36 × 3] (S3: tbl_df/tbl/data.frame)
#>   ..$ CLAVE_ENTIDAD     : chr [1:36] "01" "02" "03" "04" ...
#>   ..$ ENTIDAD_FEDERATIVA: chr [1:36] "AGUASCALIENTES" "BAJA CALIFORNIA" "BAJA CALIFORNIA SUR" "CAMPECHE" ...
#>   ..$ ABREVIATURA       : chr [1:36] "AS" "BC" "BS" "CC" ...

por ejemplo para ver el diccionario de antígeno:

datos_covid$dict$RESULTADO_ANTIGENO
#> # A tibble: 3 × 2
#>   CLAVE DESCRIPCIÓN                 
#>   <dbl> <chr>                       
#> 1     1 POSITIVO A SARS-COV-2       
#> 2     2 NEGATIVO A SARS-COV-2       
#> 3    97 NO APLICA (CASO SIN MUESTRA)

¿Se te fue el Internet? No te preocupes, descarga_datos_abiertos trabajará con tu descarga más reciente.

Lectura desde duckdb

No es necesario volver a descargar si reinicias tu sesión de R siempre y cuando los hayas guardado en duckdb estableciendo un dbdir (de lo contrario la base de datos sólo dura lo que dure tu sesión de R). Puedes sólo leer los datos abiertos que ya tienes usando la función read_datos_abiertos.R;

read_datos_abiertos(base_duck, tblname = "tutorial") |> glimpse()
#> List of 3
#>  $ dats      :List of 2
#>   ..$ FECHA_ACTUALIZACION  :List of 2
#>   .. ..$ con  :Formal class 'duckdb_connection' [package "duckdb"] with 6 slots
#>   .. ..$ disco: NULL
#>   .. ..- attr(*, "class")= chr [1:4] "src_duckdb_connection" "src_dbi" "src_sql" "src"
#>   ..$ ID_REGISTRO          :List of 12
#>   .. ..$ x                :List of 12
#>   .. .. ..- attr(*, "class")= chr [1:2] "lazy_select_query" "lazy_query"
#>   .. ..$ select           : tibble [40 × 5] (S3: tbl_df/tbl/data.frame)
#>   .. ..$ where            : NULL
#>   .. ..$ group_by         : NULL
#>   .. ..$ order_by         : NULL
#>   .. ..$ distinct         : logi FALSE
#>   .. ..$ limit            : NULL
#>   .. ..$ select_operation : chr "mutate"
#>   .. ..$ message_summarise: NULL
#>   .. ..$ group_vars       : chr(0) 
#>   .. ..$ order_vars       : NULL
#>   .. ..$ frame            : NULL
#>   .. ..- attr(*, "class")= chr [1:2] "lazy_select_query" "lazy_query"
#>   ..- attr(*, "class")= chr [1:5] "tbl_duckdb_connection" "tbl_dbi" "tbl_sql" "tbl_lazy" ...
#>  $ disconnect:function (quiet = FALSE)  
#>  $ dict      :List of 31
#>   ..$ ORIGEN               : tibble [3 × 2] (S3: tbl_df/tbl/data.frame)
#>   ..$ SECTOR               : tibble [14 × 2] (S3: tbl_df/tbl/data.frame)
#>   ..$ SEXO                 : tibble [3 × 2] (S3: tbl_df/tbl/data.frame)
#>   ..$ PACIENTE             : tibble [3 × 2] (S3: tbl_df/tbl/data.frame)
#>   ..$ NACIONALIDAD         : tibble [3 × 2] (S3: tbl_df/tbl/data.frame)
#>   ..$ RESULTADO_LAB        : tibble [5 × 2] (S3: tbl_df/tbl/data.frame)
#>   ..$ RESULTADO_ANTIGENO   : tibble [3 × 2] (S3: tbl_df/tbl/data.frame)
#>   ..$ CLASIFICACION_FINAL  : tibble [7 × 3] (S3: tbl_df/tbl/data.frame)
#>   ..$ MUNICIPIO_RES        : tibble [2,501 × 3] (S3: tbl_df/tbl/data.frame)
#>   ..$ INTUBADO             : tibble [5 × 2] (S3: tbl_df/tbl/data.frame)
#>   ..$ NEUMONIA             : tibble [5 × 2] (S3: tbl_df/tbl/data.frame)
#>   ..$ EMBARAZO             : tibble [5 × 2] (S3: tbl_df/tbl/data.frame)
#>   ..$ HABLA LENGUA INDIGENA: tibble [5 × 2] (S3: tbl_df/tbl/data.frame)
#>   ..$ INDIGENA             : tibble [5 × 2] (S3: tbl_df/tbl/data.frame)
#>   ..$ DIABETES             : tibble [5 × 2] (S3: tbl_df/tbl/data.frame)
#>   ..$ EPOC                 : tibble [5 × 2] (S3: tbl_df/tbl/data.frame)
#>   ..$ ASMA                 : tibble [5 × 2] (S3: tbl_df/tbl/data.frame)
#>   ..$ INMUSUPR             : tibble [5 × 2] (S3: tbl_df/tbl/data.frame)
#>   ..$ HIPERTENSION         : tibble [5 × 2] (S3: tbl_df/tbl/data.frame)
#>   ..$ CARDIOVASCULAR       : tibble [5 × 2] (S3: tbl_df/tbl/data.frame)
#>   ..$ OTRO_CASO            : tibble [5 × 2] (S3: tbl_df/tbl/data.frame)
#>   ..$ TOMA_MUESTRA_LAB     : tibble [5 × 2] (S3: tbl_df/tbl/data.frame)
#>   ..$ TOMA_MUESTRA_ANTIGENO: tibble [5 × 2] (S3: tbl_df/tbl/data.frame)
#>   ..$ OTRA_COMORBILIDAD    : tibble [5 × 2] (S3: tbl_df/tbl/data.frame)
#>   ..$ OBESIDAD             : tibble [5 × 2] (S3: tbl_df/tbl/data.frame)
#>   ..$ RENAL_CRONICA        : tibble [5 × 2] (S3: tbl_df/tbl/data.frame)
#>   ..$ TABAQUISMO           : tibble [5 × 2] (S3: tbl_df/tbl/data.frame)
#>   ..$ UCI                  : tibble [5 × 2] (S3: tbl_df/tbl/data.frame)
#>   ..$ ENTIDAD_UM           : tibble [36 × 3] (S3: tbl_df/tbl/data.frame)
#>   ..$ ENTIDAD_RES          : tibble [36 × 3] (S3: tbl_df/tbl/data.frame)
#>   ..$ ENTIDAD_NAC          : tibble [36 × 3] (S3: tbl_df/tbl/data.frame)

El proceso de descarga de cualquier base de covidmx es un proceso inteligente. Si no ha pasado más de un día desde que descargaste la base el programa te advertirá de que no tiene sentido volver a descargar.

Podemos ver un ejemplo descargando sólo el diccionario (que ya descargamos arriba con descarga_datos_abiertos)

diccionario_datos <- descarga_diccionario()
#> Warning: La descarga mas reciente de fue hace 0.01335 dias. Como tiene menos de un dia
#> usare esa. Escribe `force_download = TRUE` si quieres descargar de todas
#> formas. Para desactivar este mensaje `show_warnings = FALSE.`

Si de todas maneras quieres reintentar la descarga puedes usar force_download = TRUE

diccionario_datos <- descarga_diccionario(force_download = TRUE)

lo cual verificará mediante pins que la base en línea sea distinta de la que tienes almacenada y en caso afirmativo descargará los datos.

Lectura de base de datos de zip o csv

Si el proceso de descarga se interrumpe en algún momento puedes leer los datos abiertos de zip o bien del csv descomprimido con read_datos_abiertos también:

#Descarga sólo el zip
zip_path    <- descarga_db_datos_abiertos_tbl(sites.covid = dlink, show_warnings = F, quiet = T)
datos_covid <- read_datos_abiertos(zip_path, tblname = "tutorial")

#O bien descomprime el zip y lee el csv
csv_path    <- unzip_db_datos_abiertos_tbl(zip_path)
datos_covid <- read_datos_abiertos_csv(csv_path, tblname = "tutorial")

Lo mismo puedes hacer si tienes el diccionario descargado con las variables diccionario_zip_path, diccionario_unzipped_path y diccionario para cuando el diciconario es un archivo zip, un archivo xlsx o un tibble en tu sesiòn de R (respectivamente) como sigue:

#Descarga el diccionario en zip
zip_path    <- descarga_db_diccionario_ssa()
datos_covid <- read_datos_abiertos(base_duck, diccionario_zip_path = zip_path, tblname = "tutorial")

Una vez descargados (o leídos), basta componer la base de datos con cualquiera de las funciones para tener una tabla de datos agregada por fecha y entidad.

Para terminar de usar los datos, nos desconectamos de la base con:

datos_covid$disconnect()
#>  Desconectado

Lectura de la base de datos del tutorial

Para lo que sigue del tutorial usaremos los datos precargados:

datos_covid <- covidmx::datosabiertos #Uso de los datos precargados

Casos (Incidencia)

Las bases de datos se agregan a la lista bajo el nombre default casos. Por ejemplo:

datos_covid <- datos_covid |> casos()

El objeto casos por default es un tibble con el que ya puedes operar:

datos_covid$casos |> head()
#> # A tibble: 6 × 5
#>   FECHA_SINTOMAS      ENTIDAD_UM     n ENTIDAD_FEDERATIVA  ABREVIATURA
#>   <dttm>              <chr>      <int> <chr>               <chr>      
#> 1 2021-07-01 00:00:00 02           139 BAJA CALIFORNIA     BC         
#> 2 2021-07-01 00:00:00 03           519 BAJA CALIFORNIA SUR BS         
#> 3 2021-07-02 00:00:00 02           164 BAJA CALIFORNIA     BC         
#> 4 2021-07-02 00:00:00 03           357 BAJA CALIFORNIA SUR BS         
#> 5 2021-07-03 00:00:00 02           170 BAJA CALIFORNIA     BC         
#> 6 2021-07-03 00:00:00 03           421 BAJA CALIFORNIA SUR BS

Nota que lo que hace es agregar por fecha y por entidad de la unidad médica los casos.

Se puede filtar por entidad de la unidad médica seleccionando las entidades de interés:

datos_covid |> 
  casos(entidades = c("BAJA CALIFORNIA","BAJA CALIFORNIA SUR"),
        list_name = "BC/BCS") 
#> # A tibble: 6 × 5
#>   FECHA_SINTOMAS      ENTIDAD_UM     n ENTIDAD_FEDERATIVA  ABREVIATURA
#>   <dttm>              <chr>      <int> <chr>               <chr>      
#> 1 2021-07-01 00:00:00 02           139 BAJA CALIFORNIA     BC         
#> 2 2021-07-01 00:00:00 03           519 BAJA CALIFORNIA SUR BS         
#> 3 2021-07-02 00:00:00 02           164 BAJA CALIFORNIA     BC         
#> 4 2021-07-02 00:00:00 03           357 BAJA CALIFORNIA SUR BS         
#> 5 2021-07-03 00:00:00 02           170 BAJA CALIFORNIA     BC         
#> 6 2021-07-03 00:00:00 03           421 BAJA CALIFORNIA SUR BS

Si se quiere filtrar por entidad de nacimiento y que la fecha sea la de ingreso, por ejemplo:

datos_covid |> 
    casos(entidades    = "BAJA CALIFORNIA",
          entidad_tipo = "Nacimiento",
          fecha_tipo   = "Ingreso",
          list_name    = "DB_Filtro_Nac") 
#> # A tibble: 6 × 5
#>   FECHA_INGRESO       ENTIDAD_NAC     n ENTIDAD_FEDERATIVA ABREVIATURA
#>   <dttm>              <chr>       <int> <chr>              <chr>      
#> 1 2021-07-01 00:00:00 02              9 BAJA CALIFORNIA    BC         
#> 2 2021-07-02 00:00:00 02             33 BAJA CALIFORNIA    BC         
#> 3 2021-07-03 00:00:00 02             14 BAJA CALIFORNIA    BC         
#> 4 2021-07-04 00:00:00 02             16 BAJA CALIFORNIA    BC         
#> 5 2021-07-05 00:00:00 02            156 BAJA CALIFORNIA    BC         
#> 6 2021-07-06 00:00:00 02            119 BAJA CALIFORNIA    BC

Finalmente, si sólo se desean casos confirmados e inválidos:

datos_covid |> 
    casos(entidades    = "BAJA CALIFORNIA",
          entidad_tipo = "Nacimiento",
          fecha_tipo   = "Ingreso",
          tipo_clasificacion = c("Confirmados COVID", "Invalido"),
          list_name = "BC_conf_inv")
#> # A tibble: 6 × 5
#>   FECHA_INGRESO       ENTIDAD_NAC     n ENTIDAD_FEDERATIVA ABREVIATURA
#>   <dttm>              <chr>       <int> <chr>              <chr>      
#> 1 2021-07-01 00:00:00 02              3 BAJA CALIFORNIA    BC         
#> 2 2021-07-02 00:00:00 02              3 BAJA CALIFORNIA    BC         
#> 3 2021-07-03 00:00:00 02              4 BAJA CALIFORNIA    BC         
#> 4 2021-07-04 00:00:00 02              1 BAJA CALIFORNIA    BC         
#> 5 2021-07-05 00:00:00 02             24 BAJA CALIFORNIA    BC         
#> 6 2021-07-06 00:00:00 02             26 BAJA CALIFORNIA    BC

Nota que por default el programa rellena con ceros lo que no se observó. Si quieres cancelar esta opción basta con cambiar fill_zeros = FALSE:

datos_covid |> 
    casos(entidades    = c("QUINTANA ROO","AGUASCALIENTES"),
          entidad_tipo = "Nacimiento",
          fecha_tipo   = "Ingreso",
          tipo_clasificacion = c("Confirmados COVID", "Invalido"),
          list_name = "Sin fill zeros",
          fill_zeros = FALSE)
#> # A tibble: 6 × 5
#>   FECHA_INGRESO       ENTIDAD_NAC     n ENTIDAD_FEDERATIVA ABREVIATURA
#>   <dttm>              <chr>       <int> <chr>              <chr>      
#> 1 2021-07-05 00:00:00 01              1 AGUASCALIENTES     AS         
#> 2 2021-07-09 00:00:00 23              1 QUINTANA ROO       QR         
#> 3 2021-07-11 00:00:00 01              1 AGUASCALIENTES     AS         
#> 4 2021-07-12 00:00:00 01              1 AGUASCALIENTES     AS         
#> 5 2021-07-18 00:00:00 01              1 AGUASCALIENTES     AS         
#> 6 2021-07-19 00:00:00 01              1 AGUASCALIENTES     AS

Si se desea que los casos vengan agregados (es decir QUINTANA ROO + AGUASCALIENTES) se puede cambiar la opción de group_by_entidad a FALSE:

datos_covid |> 
    casos(entidades          = c("QUINTANA ROO","AGUASCALIENTES"),
          entidad_tipo       = "Nacimiento",
          fecha_tipo         = "Ingreso",
          tipo_clasificacion = c("Confirmados COVID", "Invalido"),
          group_by_entidad   = FALSE,
          list_name          =   "QROO_AGS_juntos") 
#> # A tibble: 6 × 2
#>   FECHA_INGRESO           n
#>   <dttm>              <int>
#> 1 2021-07-01 00:00:00     0
#> 2 2021-07-02 00:00:00     0
#> 3 2021-07-03 00:00:00     0
#> 4 2021-07-04 00:00:00     0
#> 5 2021-07-05 00:00:00     1
#> 6 2021-07-06 00:00:00     0

La variable edad_cut te permite quedarte sòlo con un grupo de edad o bien definir múltiples. Por ejemplo para quedarte sólo con los casos de 5 a 25 años:

datos_covid |> 
  casos(edad_cut = c(5, 25), list_name = "5_25") 
#> # A tibble: 6 × 6
#>   FECHA_SINTOMAS      EDAD_CAT ENTIDAD_UM     n ENTIDAD_FEDERATIVA  ABREVIATURA
#>   <dttm>              <fct>    <chr>      <int> <chr>               <chr>      
#> 1 2021-07-01 00:00:00 [5,25]   02            40 BAJA CALIFORNIA     BC         
#> 2 2021-07-01 00:00:00 [5,25]   03           132 BAJA CALIFORNIA SUR BS         
#> 3 2021-07-02 00:00:00 [5,25]   02            35 BAJA CALIFORNIA     BC         
#> 4 2021-07-02 00:00:00 [5,25]   03            93 BAJA CALIFORNIA SUR BS         
#> 5 2021-07-03 00:00:00 [5,25]   02            35 BAJA CALIFORNIA     BC         
#> 6 2021-07-03 00:00:00 [5,25]   03           114 BAJA CALIFORNIA SUR BS

O bien definir grupos de edad de la forma 0-20, 20-60 y 60+

datos_covid |> 
  casos(edad_cut = c(0, 20, 60, Inf), list_name = "0_20_60") 
#> # A tibble: 6 × 6
#>   FECHA_SINTOMAS      EDAD_CAT ENTIDAD_UM     n ENTIDAD_FEDERATIVA  ABREVIATURA
#>   <dttm>              <fct>    <chr>      <int> <chr>               <chr>      
#> 1 2021-07-01 00:00:00 [0,20]   02            23 BAJA CALIFORNIA     BC         
#> 2 2021-07-01 00:00:00 [0,20]   03            72 BAJA CALIFORNIA SUR BS         
#> 3 2021-07-01 00:00:00 (20,60]  02           107 BAJA CALIFORNIA     BC         
#> 4 2021-07-01 00:00:00 (20,60]  03           426 BAJA CALIFORNIA SUR BS         
#> 5 2021-07-01 00:00:00 (60,Inf] 02             9 BAJA CALIFORNIA     BC         
#> 6 2021-07-01 00:00:00 (60,Inf] 03            21 BAJA CALIFORNIA SUR BS

Puedes acumular diferentes bases de datos en la misma lista asignándoles nombres:

datos_covid <- datos_covid |> 
  casos(list_name = "Todos por entidad") |>
  casos(list_name = "Todos (nacional)",    group_by_entidad = FALSE) |> 
  casos(list_name = "Defunciones (todos)", defunciones = TRUE) 

datos_covid$`Todos (nacional)` |> head()
#> # A tibble: 6 × 2
#>   FECHA_SINTOMAS          n
#>   <dttm>              <int>
#> 1 2021-07-01 00:00:00   658
#> 2 2021-07-02 00:00:00   521
#> 3 2021-07-03 00:00:00   591
#> 4 2021-07-04 00:00:00   643
#> 5 2021-07-05 00:00:00   736
#> 6 2021-07-06 00:00:00   728

datos_covid$`Todos por entidad` |> head()
#> # A tibble: 6 × 5
#>   FECHA_SINTOMAS      ENTIDAD_UM     n ENTIDAD_FEDERATIVA  ABREVIATURA
#>   <dttm>              <chr>      <int> <chr>               <chr>      
#> 1 2021-07-01 00:00:00 02           139 BAJA CALIFORNIA     BC         
#> 2 2021-07-01 00:00:00 03           519 BAJA CALIFORNIA SUR BS         
#> 3 2021-07-02 00:00:00 02           164 BAJA CALIFORNIA     BC         
#> 4 2021-07-02 00:00:00 03           357 BAJA CALIFORNIA SUR BS         
#> 5 2021-07-03 00:00:00 02           170 BAJA CALIFORNIA     BC         
#> 6 2021-07-03 00:00:00 03           421 BAJA CALIFORNIA SUR BS

datos_covid$`Defunciones (todos)` |> head()
#> # A tibble: 6 × 5
#>   FECHA_SINTOMAS      ENTIDAD_UM     n ENTIDAD_FEDERATIVA  ABREVIATURA
#>   <dttm>              <chr>      <int> <chr>               <chr>      
#> 1 2021-07-01 00:00:00 02             3 BAJA CALIFORNIA     BC         
#> 2 2021-07-01 00:00:00 03            24 BAJA CALIFORNIA SUR BS         
#> 3 2021-07-02 00:00:00 02             4 BAJA CALIFORNIA     BC         
#> 4 2021-07-02 00:00:00 03             5 BAJA CALIFORNIA SUR BS         
#> 5 2021-07-03 00:00:00 02             4 BAJA CALIFORNIA     BC         
#> 6 2021-07-03 00:00:00 03            18 BAJA CALIFORNIA SUR BS

Hay múltiples opciones permitiendo seleccionar variables específicas de unidades de cuidado intensivo, defunciones y si devolver la tabla como tibble o como conexión de dbplyr a MARIADB:

datos_covid <- datos_covid |> 
  casos(
    #Lista de entidades que deseas
    entidades = c("AGUASCALIENTES", "BAJA CALIFORNIA", "BAJA CALIFORNIA SUR",
                      "CAMPECHE", "CHIAPAS", "CHIHUAHUA","CIUDAD DE M\u00c9XICO",
                      "COAHUILA DE ZARAGOZA" , "COLIMA", "DURANGO", "GUANAJUATO",
                      "GUERRERO","HIDALGO", "JALISCO", "M\u00c9XICO",
                      "MICHOAC\u00c1N DE OCAMPO", "MORELOS","NAYARIT",
                      "NUEVO LE\u00d3N", "OAXACA", "PUEBLA", "QUER\u00c9TARO",
                      "QUINTANA ROO", "SAN LUIS POTOS\u00cd", "SINALOA", "SONORA",
                      "TABASCO", "TAMAULIPAS", "TLAXCALA", "VERACRUZ DE IGNACIO DE LA LLAVE", 
                      "YUCAT\u00c1N", "ZACATECAS"),
    
    #Si quieres que los resultados salgan por entidad = TRUE o ya agregados = FALSE
    group_by_entidad   = TRUE,
    
    #Selecciona esas entidades a qué tipo de entidad refieren: Unidad Médica, Residencia, Nacimiento
    entidad_tipo       = "Nacimiento", #c("Unidad Medica", "Residencia", "Nacimiento"),
    
    #Selecciona la fecha para la base de datos: Síntomas, Ingreso, Defunción
    fecha_tipo         = "Ingreso",
    
    #Selecciona todas las variables de clasificación que deseas agregar:
    tipo_clasificacion = c("Sospechosos","Confirmados COVID", "Negativo a COVID", "Inválido", 
                           "No realizado"),
    
    #Selecciona si deseas agrupar por la variable tipo_clasificacion
    group_by_tipo_clasificacion = TRUE,
    
    #Selecciona todos los pacientes quieres incluir:
    tipo_paciente       = c("AMBULATORIO", "HOSPITALIZADO", "NO ESPECIFICADO"),
    
    #Selecciona si agrupar por tipo de paciente
    group_by_tipo_paciente = TRUE,
    
    #Selecciona todas las opciones de Unidad de Cuidado Intensivo del paciente:
    tipo_uci      = c("SI","NO","NO APLICA","SE IGNORA","NO ESPECIFICADO"),
    
    #Selecciona si agrupar por tipo de unidad
    group_by_tipo_uci  = TRUE,
    
    #Selecciona los sectores del sistema de salud a incluir
    tipo_sector   = c("CRUZ ROJA", "DIF", "ESTATAL", "IMSS", "IMSS-BIENESTAR", "ISSSTE", 
                      "MUNICIPAL", "PEMEX", "PRIVADA", "SEDENA", "SEMAR", "SSA", 
                      "UNIVERSITARIO","NO ESPECIFICADO"),
    
    #Selecciona si deseas agrupar por tipo de sector
    group_by_tipo_sector = FALSE,
    
    #Selecciona si deseas sólo los que tuvieron defunción
    defunciones   = TRUE,
    
    #Selecciona los grupos de edad que deseas incluir en rango
    edad_cut      = c(20, 40, 60), #Edades 20-40 y 40-60
    
    #Selecciona si devolver el objeto como tibble
    as_tibble     = TRUE,
    
    #Selecciona si rellenar los conteos (n) con ceros cuando no haya observaciones.
    fill_zeros    = TRUE,
    
    #Nombre para llamarle en el objeto lista que regresa
    list_name     = "Ejemplo defunciones",
    
    #Agrupa los resultados además por estado de diabetes y sexo
    .grouping_vars = c("DIABETES", "SEXO"))

Puedes ver la base generada así:

datos_covid$`Ejemplo defunciones` |> head()
#> # A tibble: 6 × 14
#>   FECHA_INGRESO       DIABETES  SEXO EDAD_…¹ ENTID…² CLASI…³ TIPO_…⁴   UCI     n
#>   <dttm>                 <int> <int> <fct>   <chr>     <dbl>   <dbl> <dbl> <int>
#> 1 2021-07-01 00:00:00        2     2 [20,40] 03            3       2     2     1
#> 2 2021-07-03 00:00:00        2     1 [20,40] 03            3       2     2     1
#> 3 2021-07-03 00:00:00        2     2 [20,40] 02            7       2     1     1
#> 4 2021-07-03 00:00:00        2     2 (40,60] 03            3       2     2     1
#> 5 2021-07-03 00:00:00        2     2 (40,60] 26            3       2     2     1
#> 6 2021-07-03 00:00:00       98     2 (40,60] 03            3       2     2     1
#> # … with 5 more variables: ENTIDAD_FEDERATIVA <chr>, ABREVIATURA <chr>,
#> #   `CLASIFICACI\032N` <chr>, DESCRIPCION_TIPO_PACIENTE <chr>,
#> #   DESCRIPCION_TIPO_UCI <chr>, and abbreviated variable names ¹​EDAD_CAT,
#> #   ²​ENTIDAD_NAC, ³​CLASIFICACION_FINAL, ⁴​TIPO_PACIENTE

Número de pruebas

Para calcular el número de pruebas los argumentos son los mismos que la función de casos con el agregado de que tipo_prueba es un vector donde se seleccionan las pruebas a considerar (Antígeno o PCR) y group_by_tipo_prueba agrupa los resultados por tipo de prueba

datos_covid <- datos_covid |> 
  numero_pruebas(entidades = c("BAJA CALIFORNIA","BAJA CALIFORNIA SUR"),
                 tipo_prueba = c("Antigeno", "PCR"),
                 group_by_tipo_prueba = TRUE)

datos_covid$numero_pruebas |> head()
#> # A tibble: 6 × 6
#>   FECHA_SINTOMAS      ENTIDAD_UM TIPO_PRUEBA     n ENTIDAD_FEDERATIVA  ABREVIA…¹
#>   <dttm>              <chr>      <chr>       <int> <chr>               <chr>    
#> 1 2021-07-01 00:00:00 02         ANTIGENO      125 BAJA CALIFORNIA     BC       
#> 2 2021-07-01 00:00:00 02         PCR            21 BAJA CALIFORNIA     BC       
#> 3 2021-07-01 00:00:00 03         ANTIGENO      479 BAJA CALIFORNIA SUR BS       
#> 4 2021-07-01 00:00:00 03         PCR            69 BAJA CALIFORNIA SUR BS       
#> 5 2021-07-02 00:00:00 02         ANTIGENO      143 BAJA CALIFORNIA     BC       
#> 6 2021-07-02 00:00:00 02         PCR            36 BAJA CALIFORNIA     BC       
#> # … with abbreviated variable name ¹​ABREVIATURA
datos_covid$numero_pruebas |> 
  plot_covid(facet_ncol = 2, date_break_format = "1 month")
#> ! `df_variable` no fue especificada. Usaremos la columna n
#> ! `df_covariates` no fue especificada. Usaremos `TIPO_PRUEBA and ENTIDAD_FEDERATIVA`

Positividad

Para calcular la positividad la única forma actual es con un tibble. Los argumentos son los mismos que la función de casos con el agregado de que tipo_prueba es un vector donde se seleccionan las pruebas a considerar (Antígeno o PCR) y group_by_tipo_prueba agrupa los resultados por tipo de prueba. La variable remove_inconclusive es una booleana (default TRUE) que elimina del denominador de la positividad las pruebas sin resultado o con resultado no concluyente.

Nota Positividad es la variable más lenta de calcular por ahora. Ten paciencia

datos_covid <- datos_covid |> 
  positividad(entidades = c("BAJA CALIFORNIA","BAJA CALIFORNIA SUR"),
                 tipo_prueba = c("Antigeno", "PCR"),
                 group_by_tipo_prueba = TRUE)

datos_covid$positividad |> head()
#> # A tibble: 6 × 8
#>   Positivi…¹ FECHA_SINTOMAS      ENTID…² TIPO_…³ ENTID…⁴ ABREV…⁵ n_pru…⁶ n_pos…⁷
#>        <dbl> <dttm>              <chr>   <chr>   <chr>   <chr>     <int>   <int>
#> 1      0.5   2021-07-01 00:00:00 02      PCR     BAJA C… BC           20      10
#> 2      0.594 2021-07-01 00:00:00 03      PCR     BAJA C… BS           64      38
#> 3      0.5   2021-07-02 00:00:00 02      PCR     BAJA C… BC           34      17
#> 4      0.519 2021-07-02 00:00:00 03      PCR     BAJA C… BS           52      27
#> 5      0.517 2021-07-03 00:00:00 02      PCR     BAJA C… BC           29      15
#> 6      0.755 2021-07-03 00:00:00 03      PCR     BAJA C… BS           53      40
#> # … with abbreviated variable names ¹​Positividad, ²​ENTIDAD_UM, ³​TIPO_PRUEBA,
#> #   ⁴​ENTIDAD_FEDERATIVA, ⁵​ABREVIATURA, ⁶​n_pruebas, ⁷​n_positivos
datos_covid$positividad |> 
  plot_covid(facet_ncol = 2, 
             facet_scale = "fixed",
             type = "spline",
             df_variable = "Positividad",
             date_break_format = "7 days",
             date_labels_format = "%d/%m/%Y",
             df_covariates = c("TIPO_PRUEBA", "ENTIDAD_FEDERATIVA"))

Case Hospitalization Rate

El chr se define como el total de casos confirmados que terminaron hospitalizados entre el total de confirmados: \[ \textrm{CHR} = \frac{\text{Hospitalizados Confirmados}}{\text{Todos los confirmados}} \] lo puedes calcular con chr:

datos_covid <- datos_covid |> chr()
#> # A tibble: 6 × 5
#>   FECHA_SINTOMAS      ENTIDAD_UM ENTIDAD_FEDERATIVA  ABREVIATURA CASE HOSPITAL…¹
#>   <dttm>              <chr>      <chr>               <chr>                 <dbl>
#> 1 2021-07-01 00:00:00 02         BAJA CALIFORNIA     BC                   0.25  
#> 2 2021-07-01 00:00:00 03         BAJA CALIFORNIA SUR BS                   0.183 
#> 3 2021-07-02 00:00:00 02         BAJA CALIFORNIA     BC                   0.355 
#> 4 2021-07-02 00:00:00 03         BAJA CALIFORNIA SUR BS                   0.0787
#> 5 2021-07-03 00:00:00 02         BAJA CALIFORNIA     BC                   0.0882
#> 6 2021-07-03 00:00:00 03         BAJA CALIFORNIA SUR BS                   0.122 
#> # … with abbreviated variable name ¹​`CASE HOSPITALIZATION RATE`

Las variables para agrupar son casi las mismas que en casos. Por ejemplo si queremos agrupar el chr en distintas categorías de edad a nivel nacional:

datos_covid <- datos_covid |> 
  chr(
    group_by_entidad = FALSE,
    edad_cut  = c(0, 20, 50, Inf),
    list_name = "CHR_edad_nacional"
  ) 

datos_covid |>
  plot_covid(type = "line", 
             facet_ncol = 4, 
             date_break_format = "7 days",
             date_labels_format = "%d/%m/%Y",
             df_name = "CHR_edad_nacional")

Case Fatality Rate

El cfr se define como el total de casos confirmados que terminaron muertos: \[ \textrm{CFR} = \frac{\text{Defunciones Confirmadas}}{\text{Todos los confirmados}} \] lo puedes calcular con cfr:

datos_covid <- datos_covid |> cfr()
#> # A tibble: 6 × 5
#>   FECHA_SINTOMAS      ENTIDAD_UM ENTIDAD_FEDERATIVA  ABREVIATURA CASE FATALITY…¹
#>   <dttm>              <chr>      <chr>               <chr>                 <dbl>
#> 1 2021-07-01 00:00:00 02         BAJA CALIFORNIA     BC                   0.125 
#> 2 2021-07-01 00:00:00 03         BAJA CALIFORNIA SUR BS                   0.0935
#> 3 2021-07-02 00:00:00 02         BAJA CALIFORNIA     BC                   0.0645
#> 4 2021-07-02 00:00:00 03         BAJA CALIFORNIA SUR BS                   0.0281
#> 5 2021-07-03 00:00:00 02         BAJA CALIFORNIA     BC                   0.0588
#> 6 2021-07-03 00:00:00 03         BAJA CALIFORNIA SUR BS                   0.0699
#> # … with abbreviated variable name ¹​`CASE FATALITY RATE`

Las variables para agrupar son casi las mismas que en casos. Por ejemplo si queremos agrupar el cfr en distintas categorías de edad a nivel nacional:

datos_covid <- datos_covid |> 
  cfr(entidades = c("BAJA CALIFORNIA", "BAJA CALIFORNIA SUR"),
    group_by_entidad = TRUE,
    list_name = "CFR_BC"
  ) 

datos_covid$CFR_BC |>
  plot_covid(type = "line", 
             facet_ncol = 2,
             date_break_format = "7 days",
             date_labels_format = "%d/%m/%Y")

Podemos también calcular la mortalidad dentro de los hospitalizados y ambulatorios:

datos_covid <- datos_covid |> 
  cfr(
    tipo_paciente = "HOSPITALIZADO",
    group_by_entidad       = FALSE,
    list_name = "CFR_HOSPITALIZADOS"
  ) 

datos_covid |>
  plot_covid(df_name = "CFR_HOSPITALIZADOS", 
             type = "line", 
             facet_ncol = 2,
             date_break_format = "7 days",
             date_labels_format = "%d/%m/%Y",
             df_variable = "CASE FATALITY RATE")

Número efectivo de reproducción

El número efectivo de reproducción se estima mediante la función EpiEstim::estimate_R para la cual es necesario especificar el método y el intervalo serial como en este ejemplo.

Podemos estimar el número a nivel nacional a partir de 2022:

datos_covid <- datos_covid |> 
  estima_rt(entidades = "BAJA CALIFORNIA",
            min_date  = as.Date("2021/07/01", format = "%Y/%m/%d"))
#> Warning: Returning more (or less) than 1 row per `summarise()` group was deprecated in
#> dplyr 1.1.0.
#>  Please use `reframe()` instead.
#>  When switching from `summarise()` to `reframe()`, remember that `reframe()`
#>   always returns an ungrouped data frame and adjust accordingly.
#>  The deprecated feature was likely used in the covidmx package.
#>   Please report the issue at <
#> # A tibble: 6 × 17
#>   ENTIDA…¹ ENTID…² ABREV…³ t_start t_end Mean(…⁴ Std(R…⁵ Quant…⁶ Quant…⁷ Quant…⁸
#>   <chr>    <chr>   <chr>     <dbl> <dbl>   <dbl>   <dbl>   <dbl>   <dbl>   <dbl>
#> 1 02       BAJA C… BC            2     8    1.29  0.0359   1.22    1.23     1.27
#> 2 02       BAJA C… BC            3     9    1.16  0.0320   1.10    1.11     1.14
#> 3 02       BAJA C… BC            4    10    1.10  0.0300   1.04    1.05     1.08
#> 4 02       BAJA C… BC            5    11    1.07  0.0289   1.01    1.02     1.05
#> 5 02       BAJA C… BC            6    12    1.05  0.0283   0.994   1.00     1.03
#> 6 02       BAJA C… BC            7    13    1.04  0.0279   0.989   0.997    1.02
#> # … with 7 more variables: `Median(R)` <dbl>, `Quantile.0.75(R)` <dbl>,
#> #   `Quantile.0.95(R)` <dbl>, `Quantile.0.975(R)` <dbl>,
#> #   FECHA_SINTOMAS_start <dttm>, FECHA_SINTOMAS_end <dttm>,
#> #   FECHA_SINTOMAS <dttm>, and abbreviated variable names ¹​ENTIDAD_UM,
#> #   ²​ENTIDAD_FEDERATIVA, ³​ABREVIATURA, ⁴​`Mean(R)`, ⁵​`Std(R)`,
#> #   ⁶​`Quantile.0.025(R)`, ⁷​`Quantile.0.05(R)`, ⁸​`Quantile.0.25(R)`

O bien por entidad sólo con los confirmados covid:

datos_covid <- datos_covid |> 
  estima_rt(tipo_clasificacion = "Confirmados COVID",
     list_name = "RT_confirmados_COVID",
     min_date  = as.Date("2021/07/01", format = "%Y/%m/%d"))
#> Warning: There were 23 warnings in `dplyr::summarise()`.
#> The first warning was:
#>  In argument: `...$R`.
#>  In group 1: `ENTIDAD_UM = "01"`, `ENTIDAD_FEDERATIVA = "AGUASCALIENTES"`,
#>   `ABREVIATURA = "AS"`.
#> Caused by warning in `estimate_R_func()`:
#> ! You're estimating R too early in the epidemic to get the desired
#>             posterior CV.
#>  Run `dplyr::last_dplyr_warnings()` to see the 22 remaining warnings.

datos_covid$RT_confirmados_COVID |>
  plot_covid(df_date_index = "FECHA_SINTOMAS", 
             df_variable = "Mean(R)",
             df_covariates = "ENTIDAD_FEDERATIVA",
             date_break_format = "7 days",
             date_labels_format = "%d/%m/%Y")

Desconexión de duckdb

Una vez que terminaste de trabajar con la base original en duckdb deconecta el pointer haciendo:

datos_covid$disconnect()
#>  Desconectado

Datos de variantes (GISAID)

Para descargar las variantes reportadas por la publicación diaria en Github del reporte nacional en RodrigoZepeda/VariantesCovid a partir de las variantes de GISAID puedes hacer:

variantes_covid <- descarga_datos_variantes_GISAID()

Los datos se ven así:

variantes_covid |> head()
#> # A tibble: 6 × 7
#>   variant     semana   ano     n  freq Actualizacion       Fuente               
#>   <chr>        <int> <int> <int> <dbl> <dttm>              <chr>                
#> 1 VOI Epsilon     28  2020     1     1 2022-12-23 03:07:16 GISAID: https://www.…
#> 2 VOI Epsilon     38  2020     1     1 2022-12-23 03:07:16 GISAID: https://www.…
#> 3 VOC Delta       39  2020     1     1 2022-12-23 03:07:16 GISAID: https://www.…
#> 4 VOI Epsilon     46  2020     1     1 2022-12-23 03:07:16 GISAID: https://www.…
#> 5 VOI Epsilon     47  2020     2     1 2022-12-23 03:07:16 GISAID: https://www.…
#> 6 VOI Epsilon     48  2020     5     1 2022-12-23 03:07:16 GISAID: https://www.…

Por default baja nacional pero también puedes usar “cdmx”:

variantes_covid <- descarga_datos_variantes_GISAID("cdmx")

En este caso, la descarga también es inteligente y necesitas poner force_download = TRUE si ha pasado menos de un día de tu última descarga (almacenada mediante pins en cache) y quieres volver a bajar los datos.

Puedes graficarlos con geom_stream dentro de la librería ggstream:

library(ggplot2)

#Pasamos año y semana epidemiológica a fecha
variantes_covid <- variantes_covid |>
  left_join(
    data.frame(fecha = seq(as.Date("2020/01/03", format = "%Y/%m/%d"), as.Date(Sys.time()),
                           by = "7 days")) |>
      mutate(ano    = lubridate::epiyear(fecha)) |>
      mutate(semana = lubridate::epiweek(fecha))
    )
#> Joining with `by = join_by(semana, ano)`

#Graficamos
nvariantes <- length(unique(variantes_covid$variant))

ggplot(variantes_covid) + 
  ggstream::geom_stream(aes(x = fecha, y = n, fill = variant)) +
  theme_void() +
  theme(
    legend.position = "bottom",
    axis.text.x     = element_text(angle = 90, hjust = 1),
    axis.line.x     = element_line(),
    axis.ticks.x    = element_line()
  ) +
  scale_x_date(date_breaks = "3 months", date_labels = "%b/%Y") +
  scale_fill_manual("Variante", values = MetBrewer::met.brewer("Cross", n =  nvariantes)) +
  ggtitle("Variantes de COVID-19 en México")

No olvides citar a GISAID así como a la publicación diaria en RodrigoZepeda/VariantesCovid si las usas.

Datos de ocupación hospitalaria (Red IRAG)

Puedes descargar los datos de la Red IRAG de ocupación hospitalaria a nivel estatal o a nivel unidad médica mediante descarga_datos_red_irag. Estos se obtienen de la publicación diaria en RodrigoZepeda/CapacidadHospitalariaMX.

Los cuales se ven así:

estatales |> plot_covid(df_covariates = "Estado")
#> ! `df_variable` no fue especificada. Usaremos la columna Hospitalizados (%)

O bien por unidad médica:

unidad_medica <- descarga_datos_red_irag(nivel = "Unidad Médica")

que se ven así:

unidad_medica |> head()
#> # A tibble: 6 × 9
#>   `Unidad médica`        Estado Insti…¹ CLUES Hospi…² Venti…³ UCI y…⁴ Fecha     
#>   <chr>                  <chr>  <chr>   <chr>   <dbl>   <dbl>   <dbl> <date>    
#> 1 Hospital Regional de … México SSA/CC  MCSS…     100      17      33 2020-04-01
#> 2 Hospital Juárez de Mé… Ciuda… SSA/CC  DFSS…     100      89      89 2020-04-01
#> 3 Instituto Nacional de… Ciuda… SSA/CC  DFSS…     100       0       0 2020-04-01
#> 4 Instituto Nacional de… Ciuda… SSA/CC  DFSS…     100      94      94 2020-04-01
#> 5 Instituto Nacional de… Ciuda… SSA/CC  DFSS…     100      50      50 2020-04-01
#> 6 Instituto Nacional de… Ciuda… SSA/CC  DFSS…     100      10      10 2020-04-01
#> # … with 1 more variable: Actualizacion <dttm>, and abbreviated variable names
#> #   ¹​Institución, ²​`Hospitalizados (%)`, ³​`Ventilación (%)`,
#> #   ⁴​`UCI y Ventilación (%)`

En este caso, la descarga también es inteligente y necesitas poner force_download = TRUE si ha pasado menos de un día de tu última descarga (almacenada mediante pins en cache) y quieres volver a bajar los datos.

No olvides citar a RED IRAG así como a la publicación diaria en RodrigoZepeda/CapacidadHospitalariaMX si las usas.

Gráficas

Para graficar puedes usar la función plot_covid por default grafica lo que està en datos_covid$casos y establecer cada cuándo hacer los cortes de fechas con date_break_format

datos_covid |> plot_covid(date_break_format = "1 week")
#> ! `df_variable` no fue especificada. Usaremos la columna n
#> ! `df_covariates` no fue especificada. Usaremos `ENTIDAD_FEDERATIVA`

pero puedes pedir otra con el eje x más limpio:

datos_covid |> plot_covid("Todos (nacional)", 
                           date_break_format = "1 week",
                           date_labels_format = "%m/%y")
#> ! `df_variable` no fue especificada. Usaremos la columna n
#> ! `df_covariates` no fue especificada. Usaremos ``

Para visualizar un suavizamiento con splines cambia el type y dale las opciones que darías a geom_spline:

datos_covid |> 
  plot_covid("Todos (nacional)", type = "spline", spar = 0.5, date_break_format = "1 week")
#> ! `df_variable` no fue especificada. Usaremos la columna n
#> ! `df_covariates` no fue especificada. Usaremos ``

Puedes visualizar hasta dos covariables a la vez con df_covariates y decirle cuál graficar con df_variable:

datos_covid |> 
  plot_covid("Ejemplo defunciones", 
             df_variable = "n", 
             df_covariates = c("SEXO","ENTIDAD_FEDERATIVA"),
             date_break_format = "3 weeks",
             type = "area") 

Desconexión

No olvides, cuando termines de usar duckdb desconectarte:

datos_covid$disconnect()
#>  Desconectado

Información adicional

sessioninfo::session_info()
#> ─ Session info ───────────────────────────────────────────────────────────────
#>  setting  value
#>  version  R version 4.2.2 (2022-10-31)
#>  os       macOS Big Sur ... 10.16
#>  system   x86_64, darwin17.0
#>  ui       X11
#>  language es
#>  collate  en_US.UTF-8
#>  ctype    en_US.UTF-8
#>  tz       America/Mexico_City
#>  date     2023-02-15
#>  pandoc   2.19.2 @ /Applications/RStudio.app/Contents/Resources/app/quarto/bin/tools/ (via rmarkdown)
#> 
#> ─ Packages ───────────────────────────────────────────────────────────────────
#>  package         * version   date (UTC) lib source
#>  assertthat        0.2.1     2019-03-21 [2] CRAN (R 4.2.0)
#>  bit               4.0.5     2022-11-15 [2] CRAN (R 4.2.1)
#>  bit64             4.0.5     2020-08-30 [2] CRAN (R 4.2.0)
#>  bitops            1.0-7     2021-04-24 [2] CRAN (R 4.2.0)
#>  blob              1.2.3     2022-04-10 [2] CRAN (R 4.2.0)
#>  bslib             0.4.2     2022-12-16 [2] CRAN (R 4.2.0)
#>  cachem            1.0.6     2021-08-19 [2] CRAN (R 4.2.0)
#>  cellranger        1.1.0     2016-07-27 [2] CRAN (R 4.2.0)
#>  cli               3.6.0     2023-01-09 [2] CRAN (R 4.2.2)
#>  coarseDataTools   0.6-6     2021-12-09 [2] CRAN (R 4.2.0)
#>  coda              0.19-4    2020-09-30 [2] CRAN (R 4.2.0)
#>  colorspace        2.1-0     2023-01-23 [2] CRAN (R 4.2.2)
#>  covidmx         * 0.7.6     2023-02-15 [1] local
#>  crayon            1.5.2     2022-09-29 [2] CRAN (R 4.2.0)
#>  curl              5.0.0     2023-01-12 [2] CRAN (R 4.2.2)
#>  DBI               1.1.3     2022-06-18 [2] CRAN (R 4.2.0)
#>  dbplyr            2.3.0     2023-01-16 [2] CRAN (R 4.2.2)
#>  desc              1.4.2     2022-09-08 [2] CRAN (R 4.2.0)
#>  digest            0.6.31    2022-12-11 [2] CRAN (R 4.2.1)
#>  dplyr           * 1.1.0     2023-01-29 [2] CRAN (R 4.2.2)
#>  duckdb            0.7.0     2023-02-14 [2] CRAN (R 4.2.2)
#>  ellipsis          0.3.2     2021-04-29 [2] CRAN (R 4.2.0)
#>  EpiEstim          2.2-4     2021-01-07 [2] CRAN (R 4.2.0)
#>  evaluate          0.20      2023-01-17 [2] CRAN (R 4.2.2)
#>  fansi             1.0.4     2023-01-22 [2] CRAN (R 4.2.2)
#>  farver            2.1.1     2022-07-06 [2] CRAN (R 4.2.0)
#>  fastmap           1.1.0     2021-01-25 [2] CRAN (R 4.2.0)
#>  fitdistrplus      1.1-8     2022-03-10 [2] CRAN (R 4.2.0)
#>  forcats           1.0.0     2023-01-29 [2] CRAN (R 4.2.2)
#>  fs                1.6.1     2023-02-06 [2] CRAN (R 4.2.2)
#>  generics          0.1.3     2022-07-05 [2] CRAN (R 4.2.0)
#>  ggforce           0.4.1     2022-10-04 [2] CRAN (R 4.2.1)
#>  ggformula         0.10.2    2022-09-01 [2] CRAN (R 4.2.0)
#>  ggplot2         * 3.4.1     2023-02-10 [2] CRAN (R 4.2.0)
#>  ggridges          0.5.4     2022-09-26 [2] CRAN (R 4.2.0)
#>  ggstance          0.3.6     2022-11-16 [2] CRAN (R 4.2.1)
#>  ggstream          0.1.0     2021-05-06 [2] CRAN (R 4.2.0)
#>  glue              1.6.2     2022-02-24 [2] CRAN (R 4.2.0)
#>  gridExtra         2.3       2017-09-09 [2] CRAN (R 4.2.0)
#>  gtable            0.3.1     2022-09-01 [2] CRAN (R 4.2.0)
#>  haven             2.5.1     2022-08-22 [2] CRAN (R 4.2.0)
#>  highr             0.10      2022-12-22 [2] CRAN (R 4.2.1)
#>  hms               1.1.2     2022-08-19 [2] CRAN (R 4.2.0)
#>  htmltools         0.5.4     2022-12-07 [2] CRAN (R 4.2.1)
#>  httr              1.4.4     2022-08-17 [2] CRAN (R 4.2.0)
#>  incidence         1.7.3     2020-11-04 [2] CRAN (R 4.2.0)
#>  jquerylib         0.1.4     2021-04-26 [2] CRAN (R 4.2.0)
#>  jsonlite          1.8.4     2022-12-06 [2] CRAN (R 4.2.0)
#>  knitr             1.42      2023-01-25 [2] CRAN (R 4.2.2)
#>  labeling          0.4.2     2020-10-20 [2] CRAN (R 4.2.0)
#>  labelled          2.10.0    2022-09-14 [2] CRAN (R 4.2.0)
#>  lattice           0.20-45   2021-09-22 [2] CRAN (R 4.2.2)
#>  lifecycle         1.0.3     2022-10-07 [2] CRAN (R 4.2.1)
#>  lubridate         1.9.2     2023-02-10 [2] CRAN (R 4.2.0)
#>  magrittr          2.0.3     2022-03-30 [2] CRAN (R 4.2.0)
#>  MASS              7.3-58.2  2023-01-23 [2] CRAN (R 4.2.2)
#>  Matrix            1.5-3     2022-11-11 [2] CRAN (R 4.2.0)
#>  MatrixModels      0.5-1     2022-09-11 [2] CRAN (R 4.2.0)
#>  mcmc              0.9-7     2020-03-21 [2] CRAN (R 4.2.0)
#>  MCMCpack          1.6-3     2022-04-13 [2] CRAN (R 4.2.0)
#>  memoise           2.0.1     2021-11-26 [2] CRAN (R 4.2.0)
#>  MetBrewer         0.2.0     2022-03-21 [2] CRAN (R 4.2.0)
#>  mosaicCore        0.9.2.1   2022-09-22 [2] CRAN (R 4.2.0)
#>  munsell           0.5.0     2018-06-12 [2] CRAN (R 4.2.0)
#>  pillar            1.8.1     2022-08-19 [2] CRAN (R 4.2.0)
#>  pins              1.1.0     2023-01-21 [2] CRAN (R 4.2.2)
#>  pkgconfig         2.0.3     2019-09-22 [2] CRAN (R 4.2.0)
#>  pkgdown           2.0.7     2022-12-14 [2] CRAN (R 4.2.0)
#>  plyr              1.8.8     2022-11-11 [2] CRAN (R 4.2.0)
#>  polyclip          1.10-4    2022-10-20 [2] CRAN (R 4.2.0)
#>  purrr             1.0.1     2023-01-10 [2] CRAN (R 4.2.2)
#>  quantreg          5.94      2022-07-20 [2] CRAN (R 4.2.0)
#>  R6                2.5.1     2021-08-19 [2] CRAN (R 4.2.0)
#>  ragg              1.2.5     2023-01-12 [2] CRAN (R 4.2.2)
#>  rappdirs          0.3.3     2021-01-31 [2] CRAN (R 4.2.0)
#>  Rcpp              1.0.10    2023-01-22 [2] CRAN (R 4.2.2)
#>  RCurl             1.98-1.10 2023-01-27 [2] CRAN (R 4.2.0)
#>  readr             2.1.4     2023-02-10 [2] CRAN (R 4.2.0)
#>  readxl            1.4.2     2023-02-09 [2] CRAN (R 4.2.2)
#>  reshape2          1.4.4     2020-04-09 [2] CRAN (R 4.2.0)
#>  rlang             1.0.6     2022-09-24 [2] CRAN (R 4.2.0)
#>  rmarkdown         2.20      2023-01-19 [2] CRAN (R 4.2.2)
#>  rprojroot         2.0.3     2022-04-02 [2] CRAN (R 4.2.0)
#>  rstudioapi        0.14      2022-08-22 [2] CRAN (R 4.2.0)
#>  sass              0.4.5     2023-01-24 [2] CRAN (R 4.2.0)
#>  scales            1.2.1     2022-08-20 [2] CRAN (R 4.2.0)
#>  sessioninfo       1.2.2     2021-12-06 [2] CRAN (R 4.2.0)
#>  SparseM           1.81      2021-02-18 [2] CRAN (R 4.2.0)
#>  stringi           1.7.12    2023-01-11 [2] CRAN (R 4.2.2)
#>  stringr           1.5.0     2022-12-02 [2] CRAN (R 4.2.1)
#>  survival          3.5-3     2023-02-12 [2] CRAN (R 4.2.0)
#>  systemfonts       1.0.4     2022-02-11 [2] CRAN (R 4.2.0)
#>  textshaping       0.3.6     2021-10-13 [2] CRAN (R 4.2.0)
#>  tibble            3.1.8     2022-07-22 [2] CRAN (R 4.2.0)
#>  tidyr             1.3.0     2023-01-24 [2] CRAN (R 4.2.2)
#>  tidyselect        1.2.0     2022-10-10 [2] CRAN (R 4.2.0)
#>  timechange        0.2.0     2023-01-11 [2] CRAN (R 4.2.2)
#>  tweenr            2.0.2     2022-09-06 [2] CRAN (R 4.2.0)
#>  tzdb              0.3.0     2022-03-28 [2] CRAN (R 4.2.0)
#>  utf8              1.2.3     2023-01-31 [2] CRAN (R 4.2.2)
#>  vctrs             0.5.2     2023-01-23 [2] CRAN (R 4.2.2)
#>  vroom             1.6.1     2023-01-22 [2] CRAN (R 4.2.2)
#>  withr             2.5.0     2022-03-03 [2] CRAN (R 4.2.0)
#>  xfun              0.37      2023-01-31 [2] CRAN (R 4.2.2)
#>  yaml              2.3.7     2023-01-23 [2] CRAN (R 4.2.2)
#> 
#>  [1] /private/var/folders/42/2kdf45dd1qz5n7kf9lm8ld9r0000gn/T/RtmpQeTePG/temp_libpath141b01031a31c
#>  [2] /Library/Frameworks/R.framework/Versions/4.2/Resources/library
#> 
#> ──────────────────────────────────────────────────────────────────────────────