Esta aplicación esta desarrollada para informar sobre la posible evolución de la pandemia COVID-19 usando datos colectados y curados por la Universidad John Hopkins. Dicha información esta estructurada como tres series temporales colectadas por país y que muestran el número de infectados, defunciones y recuperados. Nuestro objetivo es predecir a partir de estos datos, la posible evolución de los mismos para los próximos días e informar a las autoridades sobre estas dinámicas y apoyar decisiones respecto al manejo de la emergencia (e.g. sistema de semáforo planificación del cambio de fase).
La Universidad John Hopkins (UJH) dispone de un repositorio en: https://github.com/CSSEGISandData/COVID-19/tree/master/csse_covid_19_data, el cual se actualiza automaticamente cada día. En este app, estos datos son cargados desde su fuente y estructurados para construir una base de datos única que se usa para filtrar sus contenidos por país. Con estos se realizan las predicciones tomando en cuenta todos los registros por cada serie temporal. A continuación, se muestran algunas estadísticas globales de la base de infectados (la base esta fecha 26-04-2020) despues de aplicar el preprocesamiento:
#librerias necesarias
library(reshape2)
library(ggplot2)
## Warning: package 'ggplot2' was built under R version 3.6.3
#fuente
infectados <- "https://raw.githubusercontent.com/CSSEGISandData/COVID-19/master/csse_covid_19_data/csse_covid_19_time_series/time_series_covid19_confirmed_global.csv"
#funcion filtro
filter.events <- function(x,country){
x.df <- read.csv(x)
x.df <- x.df[x.df$Country.Region==country,]
x.df$Province.State <- as.character(x.df$Province.State)
if(length(unique(x.df$Province.State))>=2){
x.df <- cbind(x.df[1,1:4],as.data.frame(t(apply(x.df[,5:ncol(x.df)],2,sum))))
}
x.ts <- melt(x.df,c("Province.State","Country.Region","Lat","Long"),na.rm = TRUE)
x.ts$variable <- gsub("X","",x.ts$variable)
x.ts$variable <- base::as.Date(x.ts$variable, format = "%m.%d.%y")
return(x.ts)
}
#filtrado de la base
infectados.Ecuador <- filter.events(infectados,"Ecuador")
#listar para Ecuador
print(head(infectados.Ecuador,2))
## Province.State Country.Region Lat Long variable value
## 1 Ecuador -1.8312 -78.1834 2020-01-22 0
## 2 Ecuador -1.8312 -78.1834 2020-01-23 0
#resumen estadistico de infectados
print(summary(infectados.Ecuador$value))
## Min. 1st Qu. Median Mean 3rd Qu. Max.
## 0 0 15 2505 3214 22719
ggplot(infectados.Ecuador,aes(x=variable,y=value)) +
geom_bar(stat="identity") +
labs(x="Días",y="Casos")
Las series temporales constituyen colecciones de datos en un período de tiempo. Para su análisis, se observan los patrones o la tendencias de los datos para predecir algunos valores futuros. Existen varias métodos para esto (ver: https://corporatefinanceinstitute.com/resources/knowledge/modeling/forecasting-methods/) pero de ellos es de particular interés el modelo autorregresivo integrado de media móvil (o Autoregressive Integrated Moving Average), más conocido por su acrónimo del inglés como ARIMA. Estos términos se refieren: AR (autoregressive) a los desfases de las series diferenciadas; MA (moving average) al promedio Móvil y los desfases de los errores; y I es el número de diferencia utilizado para hacer que la serie temporal sea estacionaria. Su escencia es la predicción con datos del pasado y no con variables independientes. Por ello, solo se require una serie temporal unidimensional para realizar la predicción. En el app, utilizamos la librería forecast (Rob J. Hyndman & Yeasmin Khandakar, 2008) que optimiza la calibración de ARIMA (recuerdese que este depende de algunos componentes que son necesarios definirse), ejecutando varios modelos y calificándolos en base a criterios estadísticos (e.g. AIC, BIC) y entregar el mejor resultado. En el siguiente fragmento mostrados la ejecucion de la funcion auto.arima que permite esta calibración automática.
#libreria para construir ARIMA
library(forecast)
## Warning: package 'forecast' was built under R version 3.6.3
## Registered S3 method overwritten by 'quantmod':
## method from
## as.zoo.data.frame zoo
#modelo
autoArimaFit <- auto.arima(infectados.Ecuador$value,stepwise=F,approximation=F)
print(autoArimaFit)
## Series: infectados.Ecuador$value
## ARIMA(0,2,1)
##
## Coefficients:
## ma1
## -0.9227
## s.e. 0.0424
##
## sigma^2 estimated as 1431708: log likelihood=-800.03
## AIC=1604.05 AICc=1604.18 BIC=1609.14
Ahora definimos el número de pasos (o días en nuestro caso) para realizar las predicciones. Aquí se define en 10 (h=10) ya que más pasos, incrementan la incertidumbre.
#prediccion y gráfico
pred.val <- forecast(autoArimaFit, h=10,fan=T)
head(pred.val,2)
## $method
## [1] "ARIMA(0,2,1)"
##
## $model
## Series: infectados.Ecuador$value
## ARIMA(0,2,1)
##
## Coefficients:
## ma1
## -0.9227
## s.e. 0.0424
##
## sigma^2 estimated as 1431708: log likelihood=-800.03
## AIC=1604.05 AICc=1604.18 BIC=1609.14
forecast::autoplot(pred.val,xlab="Days",ylab="Cases",main="",fcol="#596dd5")
Este algoritmo fue adecuado para funcionar con la tecnología R Shiny que hace posible la publicacion de herramientas con una interfase en la que el usuario ejecuta el análisis de los datos de acuerdo a sus consultas. Por ello, usando la rutina que se ha mostrado previamente y combinandola con el diseño de una interfase en R Shiny; es posible hacer consultas a la base de la UJH, filtrarla, aplicar el algoritmo de predicción y graficar los resultados de acuerdo a los países. Esto puede ser visto en el siguiente link: https://covidarima.shinyapps.io/corona/
Si bien con esta herramienta no se podría a nivel local diseñar estrategias para combatir la pandemia, si nos permite por otro lado tener una idea a nivel nacional de la posible evolución de la curva de contagios y poder comparar estos resultados con otros países para evaluar y anticipar acciones. Asimismo el desarrollo de esta herramienta deja claro el valor de la información, la falta de estructura y manejo en el país; y la urgente necesidad de que en Ecuador se transparenten más los datos (se evaluaron varias fuentes sobre COVID-19 Ecuador y ninguna mostró consistencia y libre acceso) para que la comunidad científica pueda contribuir efectivamente en situaciones de emergencia.
Rob J. Hyndman, & Yeasmin Khandakar. (2008). Automatic Time Series Forecasting: The forecast Package for R. Journal of Statistical Software, 27(3), 22. Retrieved from http://www.jstatsoft.org/v27/i03/paper
Se agradece a Lucia Toasa por revisar y colaborar en el diseño de esta herramienta.