martes, 31 de marzo de 2020

Datos de la serie temporal COVID-19 de la Universidad Johns Hopkins.


Chuck Huber, Director Asociado de Alcance Estadístico.

En mi última publicación, aprendimos cómo importar los datos COVID-19 sin procesar del repositorio GitHub de Johns Hopkins. Esta publicación demostrará cómo convertir los datos sin procesar en datos de series temporales. También crearemos algunas tablas y gráficos a lo largo del camino.

Veamos los datos sin procesar de COVID-19 que guardamos anteriormente.


Nuestro conjunto de datos contiene 11,341 observaciones en 12 variables. Hagamos una lista de las primeras cinco observaciones para lastupdate.


lastupdate es la fecha y hora de actualización para cada observación en el conjunto de datos. Los datos incluyen la fecha seguida de un espacio seguido por la hora.

Veamos también las últimas cinco observaciones en el conjunto de datos.



Las últimas cinco observaciones contienen información similar, pero en un formato diferente. Desafortunadamente, los datos para lastupdate no se almacenaron de manera consistente en los archivos de datos sin procesar. Podríamos examinar las diferentes formas en que las fechas se guardaron en lastupdate en los diferentes archivos y desarrollar una estrategia para extraer las fechas. Pero sabemos la fecha de cada archivo porque es parte del nombre de cada archivo de datos sin procesar

En mis publicaciones anteriores, creamos una fecha con formato consistente cuando importamos los datos sin procesar. Una solución simple sería guardar esa fecha como una variable cuando importamos los archivos de datos sin procesar. Generemos una variable denominada tempdate en cada archivo de datos sin formato.


Podemos verificar nuestro trabajo enumerando las observaciones. A continuación, he enumerado las primeras cinco observaciones y las últimas cinco observaciones en nuestro conjunto de datos sin procesar combinados.


Los datos de fecha guardados en tempdate se almacenan consistentemente, pero los datos aún se almacenan como una cadena alfanumérica. Podemos usar la función date() para convertir tempdate a un número. La función de date(s1,s2) devuelve un número basado en dos argumentos, s1 y s2. El argumento s1 es la cadena sobre la que deseamos actuar y el argumento s2 es el orden del día, mes y año en s1. Nuestra variable tempdate se almacena primero con el mes, en segundo el día y en tercero el año. 

Entonces podemos escribir s2 como MDY, lo que indica que el mes es seguido por el día, que es seguido por el año. Podemos usar la función date() a continuación para convertir la fecha de la cadena 23-03-2020 en un número.



La función date() devolvió el número 21997. Eso no parece una fecha para usted y para mí, pero indica el número de días desde el 1 de enero de 1960. El siguiente ejemplo muestra que 01-01-1960 es el 0 para nuestros datos de tiempo.


Podemos cambiar la forma en que se muestra el número aplicando un formato de fecha al número.





Usemos date() para generar una nueva variable llamada date.





A continuación, podemos usar format para mostrar los números en date de una manera que nos resulte familiar a usted y a mí.



Ahora, tenemos una variable de fecha en nuestro conjunto de datos que se puede usar con las funciones de serie temporal de Stata y para otros cálculos.

Guardemos este conjunto de datos para que no tengamos que descargar los datos en bruto para cada uno de los siguientes ejemplos.




Crear datos de series de tiempo

Conservemos los datos de los Estados Unidos y enumeremos los datos del 26 de enero de 2020.


Hubo cuatro observaciones para los Estados Unidos el 26 de enero de 2020 y cinco casos confirmados de COVID-19. Nos gustaría que nuestros datos de series temporales contengan los cinco casos confirmados en una sola observación para una sola fecha. Podemos usar collapse para agregar los datos por date.



Usemos los datos de todos los países y reduzcamos el conjunto de datos por fecha.




Podemos describir nuestro nuevo conjunto de datos y ver que contiene las variables date, confirmed, deaths y recovered. Las etiquetas de las variables nos dicen que confirmed, deaths y recovered son la suma de cada variable para cada valor de date.


Podemos enlistar las primeras cinco observaciones para verificar que tenemos un valor de cada variable para cada fecha.




Los recuentos son grandes y probablemente crecerán más. Podemos hacer que nuestros datos sean más fáciles de leer usando format para agregar comas.



Ahora, podemos usar tsset para especificar la estructura de nuestros datos de series de tiempo, lo que nos permitirá usar las características de series de tiempo de Stata.


A continuación, me gustaría calcular la cantidad de casos nuevos reportados cada día. Esto es fácil usando operadores de series temporales. El operador de series temporales D.varname calcula la diferencia entre una observación y la observación anterior en varname. Consideremos el valor de confirmed para la observación 2, que es 653. 

El valor anterior de confirmed, la observación 1, es 555. Entonces, D.confirmed para la observación 2 es 653 - 555, lo que equivale a 98. El dato para la observación 1 de newcases es faltante porque no hay datos anteriores a la observación 1.


Creemos un gráfico de series de tiempo para el número de casos confirmados para todos los países combinados.
tsline confirmed, title(Global Confirmed COVID-19 Cases)

Figura 1: Casos confirmados globalmente de COVID-19


Crear datos de series de tiempo para múltiples países

Es posible que en algún momento deseemos comparar los datos de diferentes países. Hay varias formas en que podríamos hacer esto. Podríamos crear un conjunto de datos separado para cada país y fusionar los conjuntos de datos. También podríamos crear múltiples marcos de datos y usar frlink para vincular los marcos. Voy a mostrarles cómo hacer esto usando collapse y reshape. Comencemos abriendo nuestros datos de tiempo sin procesar y countryregion. Hay 210 países en la tabla, por lo que he eliminado muchas filas para acortar la tabla.


Dos categorías incluyen China: "China" y "Mainland China". Una inspección más detallada de los datos en bruto muestra que el nombre fue cambiado de "Mainland China" a "China" después del 12 de marzo de 2020. Voy a combinar los datos cambiando el nombre de la categoría "Mainland China".




A continuación, voy a mantener las observaciones de China, Italia y Estados Unidos usando inlist().




Ahora, podemos colapsar los datos por date y countryregion.



Nuestro nuevo conjunto de datos contiene una observación para cada fecha para cada país. La variable countryregion se almacena como una variable de cadena, y sé que necesitaremos una variable numérica para algunos de los comandos que usaremos en breve. Omitiré los detalles de mis pruebas y errores y simplemente les mostraré cómo usar encode para crear una variable numérica etiquetada llamada país. Puede escribir label list para observar las categorías de country.



Nuestros datos están en formato long ahora, porque las series temporales de los tres países se apilan unas encima de otras. Podríamos usar tsset para decirle a Stata que tenemos datos de series temporales con paneles (países).


Es posible que desee guardar esta versión del conjunto de datos si planea usar las funciones de Stata para el análisis de series temporales con datos panel.


Use reshape para crear datos de series de tiempo wide para varios países
Es posible que prefiera tener sus datos en formato ancho (wide) para que los datos de cada país estén al lado del otro. Podemos usar reshape para hacer esto. Conservemos solo los datos que usaremos antes de usar reshape.




El resultado nos dice que reshape cambió el número de observaciones de 177 en nuestro conjunto de datos original a 62 en nuestro nuevo conjunto de datos. Teníamos 5 variables en nuestro conjunto de datos original, y tenemos 10 variables en nuestro nuevo conjunto de datos. La variable country en nuestro antiguo conjunto de datos se ha eliminado de nuestro nuevo conjunto de datos. La variable confirmed en nuestro conjunto de datos original se ha asignado a las variables confirmed1, confirmed2 y confirmed3 en nuestro nuevo conjunto de datos. Las variables deaths y recovered fueron tratadas de la misma manera. Describamos nuestro nuevo y amplio conjunto de datos.


Los datos para casos confirmados en China, Italia y los Estados Unidos en nuestro conjunto de datos original que se colocaron, respectivamente, en las variables confirmed1, confirmed2 y confirmed3 en nuestro nuevo conjunto de datos. ¿Cómo sé esto?

Recuerde que los datos del país se almacenaron en una variable numérica etiquetada. China se guardó como 1, Italia se guardó como 2 y Estados Unidos se almacenó como 3.




Los números nos dicen qué nueva variable va con qué país. Hagamos una lista de los datos anchos para verificar este patrón.



Estos nombres de variables pueden ser confusos, así que cambiemos el nombre y etiquetemos nuestras variables para evitar confusiones. Usaré el sufijo _c para indicar "casos confirmados", _d para indicar "muertes" y _r para "indicar recuperados". Las etiquetas de variables harán explícita esta convención de nomenclatura.



Describamos y hagamos una lista de nuestros datos para verificar nuestros resultados.


Podemos graficar nuestros datos para comparar el número de casos confirmados en China, Italia y los Estados Unidos.



Figura 2: Casos confirmados de COVID-19 en China, Italia, y los EE.UU.





Mucha gente prefiere graficar sus datos en escala logarítmica. Esto es fácil de hacer usado la opción yscale(log) en nuestro comando twoway.



Figura 3: Casos confirmados de COVID-19 en China, Italia, y los EE.UU. en escala logarítmica



El uso de recuentos sin procesar puede ser engañoso porque las poblaciones de China, Italia y Estados Unidos son bastante diferentes. Creemos nuevas variables que contengan la cantidad de casos confirmados por millón de habitantes. Los datos de la población provienen del Reloj de Población de la Oficina del Censo de los Estados Unidos.



El gráfico ajustado por población luce muy diferente del gráfico no ajustado.


Figura 4: Casos confirmados de COVID-19 en China, Italia, y los EE.UU. ajustados por tamaño de población



Podemos agregar notas a nuestro conjunto de datos para documentar los cálculos de los datos ajustados por la población y la fuente de los datos de la población.



Podemos observar las notas al escribir notes.



Podemos etiquetar nuestro conjunto de datos y agregar notas para la base de datos en general.



Por último, configuremos y guardemos nuestra base de datos.



Conclusiones y comandos combinados

¡Lo hicimos! Descargamos con éxito los archivos de datos sin procesar, los fusionamos, formateamos y creamos dos conjuntos de datos que podemos usar para hacer tablas y gráficos. Hubiera sido más fácil si los datos se formatearan consistentemente con el tiempo, pero esa es la naturaleza de los datos reales. Afortunadamente, tenemos las herramientas y habilidades que necesitamos para manejar este tipo de tareas. He recopilado los comandos de Stata a continuación para que pueda ejecutarlos todos a la vez si lo desea. Los datos sin procesar pueden cambiar nuevamente en el futuro, y es posible que deba modificar el código siguiente para manejar esos cambios.

Me gustaría enfatizar nuevamente que no hemos verificado ni limpiado estos datos. El código y los datos resultantes deben usarse solo con fines educativos.

Código Stata para descargar datos COVID-19 de la Universidad Johns Hopkins a partir del 23 de marzo de 2020

local URL = "https://raw.githubusercontent.com/CSSEGISandData/COVID-19/master/csse_covid_19_data/csse_covid_19_daily_reports/"
forvalues month = 1/12 {
   forvalues day = 1/31 {
      local month = string(`month', "%02.0f")
      local day = string(`day', "%02.0f")
      local year = "2020"
      local today = "`month'-`day'-`year'"
      local FileName = "`URL'`today'.csv"
      clear
      capture import delimited "`FileName'"
capture confirm variable ïprovincestate
      if _rc == 0 {
         rename ïprovincestate provincestate
         label variable provincestate "Province/State"
      }
      capture rename province_state provincestate
      capture rename country_region countryregion
      capture rename last_update lastupdate
      capture rename lat latitude
      capture rename long longitude
      generate tempdate = "`today'"
      capture save "`today'", replace
   }
}
clear
forvalues month = 1/12 {
   forvalues day = 1/31 {
      local month = string(`month', "%02.0f")
      local day = string(`day', "%02.0f")
      local year = "2020"
      local today = "`month'-`day'-`year'"
      capture append using "`today'"
   }
}
generate date = date(tempdate, "MDY")
format date %tdNN/DD/CCYY
replace countryregion = "China" if countryregion=="Mainland China"
keep if inlist(countryregion, "China", "US", "Italy")
collapse (sum) confirmed deaths recovered, by(date countryregion)
encode countryregion, gen(country)
tsset country date, daily
save covid19_long, replace

keep date country confirmed deaths recovered
reshape wide confirmed deaths recovered, i(date) j(country)
rename confirmed1 china_c
rename deaths1 china_d
rename recovered1 china_r
label var china_c "China cases"
label var china_d "China deaths"
label var china_r "China recovered"
rename confirmed2 italy_c
rename deaths2 italy_d
rename recovered2 italy_r
label var italy_c "Italy cases"
label var italy_d "Italy deaths"
label var italy_r "Italy recovered"
rename confirmed3 usa_c
rename deaths3 usa_d
rename recovered3 usa_r
label var usa_c "USA cases"
label var usa_d "USA deaths"
label var usa_r "USA recovered"
generate china_ca = china_c / 1389.6
generate italy_ca = italy_c / 62.3
generate usa_ca = usa_c / 331.8
label var china_ca "China cases adj."
label var italy_ca "Italy cases adj."
label var usa_ca "USA cases adj."
format %9.0f china_ca italy_ca usa_ca
notes china_ca: china_ca = china_c / 1389.6
notes china_ca: Population data source: https://www.census.gov/popclock/
notes italy_ca: italy_ca = italy_c / 62.3
notes italy_ca: Population data source: https://www.census.gov/popclock/
notes usa_ca: usa_ca = usa_c / 331.8
notes usa_ca: Population data source: https://www.census.gov/popclock/
label data "COVID-19 Data assembled for the Stata Blog"
notes _dta: Raw data course: https://github.com/CSSEGISandData/COVID-19/tree/master/csse_covid_19_data/csse_covid_19_daily_reports
notes _dta: These data are for instructional purposes only
tsset date, daily
save covid19_wide, replace


Eso es todo por hoy. ¡Gracias por leernos!