jueves, 26 de marzo de 2020

Importar datos COVID-19 de la Universidad Johns Hopkins


Chuck Huber, Director Asociado de Alcance Estadístico.

Como muchos de ustedes, estoy trabajando desde casa y revisando las últimas noticias sobre COVID-19 con frecuencia. Veo muchos números y gráficos, así que busqué los "datos oficiales". Una de las mejores fuentes de datos que he encontrado está en el sitio web de GitHub para el Centro de Ciencias e Ingeniería de Sistemas de la Escuela de Ingeniería Johns Hopkins Whiting. Los datos para cada día se almacenan en un archivo separado, así que escribí un pequeño comando Stata llamado covid19 para descargar, combinar, guardar y graficar estos datos.

El comando crea una tabla que contiene la fecha, el número de casos confirmados, el número de muertes y el número de recuperados. Agregué una variable calculada llamada newcases, que es la diferencia entre casos confirmados durante dos días contiguos.
Los datos originales incluyen todos los países que informan, por lo que agregué una opción country() que me permite ver la tabla de un país en particular.




Agregué una opción graph() que grafica el número de casos confirmados.

Figura 1. Casos confirmados de COVID-19 en Estados Unidos



La opción saving() guarda loa datos en un archivo llamado covid19_usa.dta.



Me gusta mi comando covid19, pero no tengo planes de distribuirlo. No lo he probado a fondo, y podría volverse inútil si Johns Hopkins cambia sus datos. Así que le mostraré los pasos para descargar y procesar los datos para que pueda hacerlo usted mismo. Si los datos cambian, tendrá las herramientas para modificar su código y descargar datos futuros.Escribir X=J(3,4,5) en el símbolo de dos puntos, Mata compila y ejecuta este codigo. J(r,c,v) es la función de Mata que crea una matriz rxc, dobde cada uno de sus elemntos es v. La expresión en el lado derecho del operador = se asigna al simbolo del lado izquierdo.

Datos de GitHub de la Universidad Johns Hopkins
GitHub es un sitio web/plataforma popular para el desarrollo y distribución de software. El Centro de Ciencias e Ingeniería de Sistemas de la Escuela de Ingeniería Johns Hopkins Whiting tiene un repositorio GitHub que incluye datos COVID-19 actualizados regularmente de todo el mundo. Los datos en bruto están disponibles aquí: datos de Johns Hopkins GitHub.

Figura 2. Datos de GitHub de Johns Hopkins para COVID-19





Los datos se almacenan en archivos .csv separados para cada día. Hagamos clic en el archivo llamado 29-01-2020.csv para ver su contenido. Este archivo contiene datos para la Provincia/Estado, el País/Región, la fecha y hora de la Última Actualización, el número de casos confirmados, el número de muertes y el número de recuperados.

Figura 3: Contenido de 01-29-2020.csv


Puede ver los datos sin procesar, delimitados por comas haciendo clic en el botón "Sin procesar" junto a la flecha roja. Tenga en cuenta que agregué la flecha roja; no aparece en el sitio web.


Figura 4: Datos sin procesar delimitados por comas en 01-29-2020.csv




Puede importar estos datos sin procesar desde el sitio web a Stata utilizando import delimited
El nombre del archivo es la URL en la barra de direcciones de su navegador web.

Es probable que su navegador web ajuste la URL a una segunda línea. Tenga en cuenta que este es un comando de una línea en Stata. Luego puedo describir (describe) y enumerar (list) los datos en Stata.


¡Lo hicimos! ¡Importamos con éxito los datos en bruto para el 29 de enero de 2020, desde el repositorio Johns Hopkins de GitHub a Stata! Es solo un archivo y hay al menos un problema obvio con los datos (la variable denominada ïprovincestate), pero es un buen lugar para comenzar.

Usando confirm e if para arreglar nombres de variables

Aprendí a través de prueba y error que la variable provincestate se importa como ïprovincestate en algunos archivos y provincestate en otros. Queremos importar muchos archivos, y no queremos tener que revisar cada archivo manualmente. Así que usemos confirm para verificar en cada archivo una variable llamada ïprovincestate.




Si la variable ïprovincestate existe, el comando guardará un valor de cero en _rc. Podemos usar este resultado en una sentencia if que renombre (rename) y etiquete (label) correctamente la variable.




Esta base de datos contiene la variable ïprovincestate, así que los comandos dentro del bloque if son ejecutados. Podemos checar esto usando describe.




Nuestra base de datos ahora contiene una variable llamada provincestate. Escribamos confirm variable otra vez para ver qué sucede si la variable ïprovincestate no está en nuestra base.


Esta base de datos no contiene ninguna variable llamada ïprovincestate, por lo que confirm variable produce un mensaje de error. Si ejecutamos confirm variable dentro de un archivo do, el archivo do se detendrá. Podemos usar capture para permitir que nuestro do continúe ejecutándose incluso si confirm variable produce un error.



Tenga en cuenta que _rc es igual a 111, que no es igual a 0. Por lo tanto, el siguiente código importará los datos sin procesar y "arreglará" ïprovincestate si es necesario.



Usar macros para importar archivos distintos

A continuación, veamos cómo las macros pueden ayudarnos a importar diferentes archivos del sitio web. Podemos almacenar palabras o números temporalmente en la memoria usando macros. Las macros pueden ser locales o globales. Las macros globales, una vez definidas, están disponibles en cualquier lugar de Stata. Las macros locales existen únicamente dentro del programa o do-file en el que están definidas. Puede definir una macro local como esta:





Puede hacer referencia a la macro escribiendo una comilla simple a la izquierda del nombre de la macro y una apostrofe simple a la derecha del nombre de la macro.



Podemos crear macros al combinar otras macros, como esta:



Deseamos importar archivos con nombres como 29-01-2020.csv. Tenga en cuenta que el mes incluye un "cero a la izquierda". Los meses 1–9 se especifican como “01”, “02”, etc. Los meses 10–12 se especifican como “10”, “11” y “12”. Necesitamos una forma de asignar valores a las macros locales que incluya un cero inicial cuando sea apropiado. La función string() es una forma de hacer esto.



La función string() para la macro month almacenó el número 3 en una cadena de dos caracteres con un cero a la izquierda. La función string() para la macro day almacenó el número 19 en una cadena de dos caracteres con un cero inicial, pero el cero inicial no es necesario. Esto nos permitirá especificar fechas arbitrarias con el formato correcto para los archivos que deseamos importar.

A continuación, consideremos el nombre de archivo completo. La mayor parte del nombre de archivo largo es el mismo para cada archivo. Almacenemos la URL de los nombres de archivo en una macro local.




Esto nos permite especificar un nombre de archivo como este:


Usar bucles para importar múltiples archivos
Podemos repetir un comando o una colección de comandos colocándolos en un bucle. Una forma de hacerlo es con forvalues.


forvalues month = 1/12 {
   display "month = `month'"

Note que month está guardada como una macro local, y podemos referirla como `month' dentro del bucle. Así, los resultados de nuestro bucle lucen así:


También podemos crear un bucle dentro de un bucle. Por ejemplo, podemos crear un bucle de días dentro de los meses, como esto:

Los resultados de este ciclo son bastante largos, por lo que he omitido la mayor parte de la salida.



Usemos nuestro bucle para crear nombres para los archivos que deseamos descargar.



Este ciclo también devuelve una gran cantidad de salida, por lo que he omitido la mayor parte por brevedad. Tenga en cuenta que la función string() agrega ceros iniciales para mes y día cuando sea necesario.





Podemos usar la macro URL junto con import delimited para importar los datos sin procesar de todos los días en 2020. Tendremos que borrar (clear) la memoria de Stata antes de importar cada archivo de datos sin procesar. Luego, podemos guardar (save) una copia de cada archivo como un conjunto de datos Stata.




Estoy seguro de que ya ha anticipado la falla con el código anterior. Se repite todos los días de cada mes de 2020. Pero los archivos de datos comienzan el 21 de enero de 2020, por lo que no hay archivos de datos para el 1 de enero. Nuestro programa devuelve un mensaje de error.




También se agregarán nuevos datos todos los días, y me gustaría importar datos futuros una vez que se publiquen. Hay muchas formas inteligentes de manejar esta situación. Una forma es simplemente preceder import delimited y save con la capture. Los archivos de datos se importarán si existen. Si el archivo de datos no existe, el programa continuará. Es un método lento y crudo, pero funcionará para nuestros propósitos.



Nuestro truco con capture funcionó, y puedo ver una lista de archivos de datos Stata en mi directorio local.



Vamos a abrir el archivo 01-22-2020.dta y a describir los datos.




Este es uno de esos archivos que contienen la variable ïprovincestate. Aprendimos cómo solucionar esto antes usando confirm e if, así que vamos a poner nuestro "arreglo" en nuestro código y volver a ejecutarlo. Tenga en cuenta que he agregado la opción ,replace a los comandos de guardar porque los archivos ya existen en nuestro directorio.



Ahora podemos describir la base de datos 01-22-2020.dta y verificar que la variable ïprovincestate ha sido cambiada a provincestate.




Nuestro directorio local ahora contiene una colección de bases de datos Stata que queremos combinar en un solo archivo. Podemos hacer esto usando append. Podemos agregar dos bases de datos manualmente de esta forma:




Pero eso sería tedioso y tendríamos que actualizar continuamente nuestro código. Otro ciclo nos permitiría automatizar este proceso. Tenga en cuenta que he usado el truco de capture antes de append porque no tenemos un archivo para todos los días de 2020.



Describí nuestros datos y noté que hay dos nuevas variables. Algunos de los archivos de datos sin procesar contienen las variables latitude y longitude, y se han agregado a nuestro conjunto de datos completo.


Un listado de las últimas 10 observaciones confirma que la base de datos incluye algunos datos para latitud y longitud.


Conclusión y objetivos para la próxima vez

Detengámonos aquí y pensemos en lo que hemos logrado. Hemos descargado con éxito todos los datos en bruto disponibles para COVID-19 del repositorio GitHub de Johns Hopkins y los hemos combinado en un único conjunto de datos utilizando el siguiente código:





Muchos de ustedes notarán que podríamos realizar esta tarea con un solo bucle (pista: ¡use frames!). Pero quería mantener las cosas lo más simples que sea posible en esta publicación. Guardemos este conjunto de datos para poder usarlo más tarde.





Hay muchas cosas que podríamos hacer con este conjunto de datos en bruto. Podríamos crear datos de series temporales para examinar patrones a lo largo del tiempo. Podríamos hacer esto por país o incluso provincias o estados dentro de los países. Y tenemos información sobre la latitud y la longitud de algunos de los datos, por lo que podríamos explorar patrones por hora y ubicación. Discutiré esto en futuras publicaciones.

Tenga en cuenta que no hemos verificado ni limpiado estos datos. El código anterior y los datos resultantes deben usarse solo con fines educativos.

Eso es todo por hoy. ¡Gracias por leernos!














2 comentarios: