"# Epidemiólogos por un dia: simulando un brote de COVID-19 en una población\n",
"\n",
"El propósito de esta práctica es demostrar cómo podemos modelar la evolución de una epidemia infecciosa utilizando datos disponibles para COVID-19 en una población susceptible utilizando modelos epidemiológicos estándar. Los parámetros del modelo se toman de una literatura científica en rápida evolución que documenta el brote mundial de COVID-19.\n",
"\n",
"*Este notebook está basado en [CBE30338](https://jckantor.github.io/CBE30338);\n",
"que puede encontrarse en [Github](https://github.com/jckantor/CBE30338.git). El material ha sido traducido y adaptado para esta práctica*\n"
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "N_FYDo5uoBza",
"nbpages": {
"level": 2,
"link": "[3.9.2 Model 1. SIR model for an infectious disease](https://jckantor.github.io/CBE30338/03.09-COVID-19.html#3.9.2-Model-1.-SIR-model-for-an-infectious-disease)",
"section": "3.9.2 Model 1. SIR model for an infectious disease"
}
},
"source": [
"## Modelo SIR para una enfermedad infecciosa"
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "gbqgQH-toBzb",
"nbpages": {
"level": 3,
"link": "[3.9.2.2 Introduction to SIR models](https://jckantor.github.io/CBE30338/03.09-COVID-19.html#3.9.2.2-Introduction-to-SIR-models)",
"section": "3.9.2.2 Introduction to SIR models"
}
},
"source": [
"El modelo SIR es un modelo compartimentado determinista para la propagación de una enfermedad infecciosa que describe fenómenos clave encontrados en epidemiología. En el modelo SIR, una población se divide en tres grupos que no se solapan y que corresponden a las fases de la enfermedad:\n",
"\n",
"* **Susceptible.** La subpoblación susceptible de adquirir la enfermedad. En el caso del SARS-CoV-2, se supone que todas las personas que no han adquirido previamente la enfermedad son susceptibles de infectarse.\n",
"* **Infectada** La subpoblación que se ha vuelto infecciosa.\n",
"* **Recuperada** La subpoblación que se ha recuperado de la infección y que se supone que ya no es susceptible de contraer la enfermedad.\n",
"\n",
"Sin tener en cuenta los procesos demográficos de nacimiento y muerte por otras causas, y suponiendo una tasa de mortalidad insignificante debida a la enfermedad infecciosa en cuestión, la progresión de una epidemia puede modelarse mediante procesos de tasal\n",
"\n",
"$$\\text{Susceptible}\n",
"\\xrightarrow{\\frac{\\beta S I}{N}} \n",
"\\text{Infectada} \n",
"\\xrightarrow{\\gamma I} \n",
"\\text{Recuperada}$$\n",
"\n",
"Los procesos se modelan de la siguiente manera.\n",
"\n",
"\n",
"* $\\frac{\\beta S I}{N}$ es la velocidad con la que la población susceptible se encuentra con la población infectada, dando lugar a la transmisión de la enfermedad. $S$ es el tamaño de la población susceptible. $\\beta$ es un parámetro del modelo con unidades de 1/día. \n",
"* $\\gamma I$ es la velocidad a la que la población infectada se recupera y se hace resistente a nuevas infecciones. $I$ es el tamaño de la población infectada.\n",
"\n",
"Un modelo de propagación de una enfermedad infecciosa en una población uniforme viene dado por las ecuaciones deterministas SIR\n",
"\n",
"\n",
"\\begin{align*}\n",
"\\frac{dS}{dt} & = -\\frac{\\beta S I}{N} \\\\\n",
"\\frac{dI}{dt} & = \\frac{\\beta S I}{N} - \\gamma I \\\\\n",
"\\frac{dR}{dt} & = \\gamma I\n",
"\\end{align*} \n",
"\n",
"El modelo se vuelve más genérico al trabajar con fracciones de población en lugar de con recuentos brutos de población. Para ello, definimos\n",
"\n",
"\\begin{align}\n",
"s = \\frac{S}{N} \\qquad\n",
"i = \\frac{I}{N} \\qquad\n",
"r = \\frac{R}{N}\n",
"\\end{align} \n",
"\n",
"Tras la sustitución, se obtiene un sistema de cuatro ecuaciones.\n",
"\n",
"\\begin{align*}\n",
"\\frac{ds}{dt} & = -\\beta s i \\\\\n",
"\\frac{di}{dt} & = \\beta s i - \\gamma i \\\\\n",
"\\frac{dr}{dt} & = \\gamma i\n",
"\\end{align*} \n",
"\n",
"donde $s + i + r = 1$ es invariante."
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "ekx_Zj4AoBzc",
"nbpages": {
"level": 3,
"link": "[3.9.2.3 Key Properties of the SIR Model](https://jckantor.github.io/CBE30338/03.09-COVID-19.html#3.9.2.3-Key-Properties-of-the-SIR-Model)",
"section": "3.9.2.3 Key Properties of the SIR Model"
}
},
"source": [
"### Propiedades clave del modelo SIR\n",
"\n",
"\n",
"* Los parámetros $\\beta$ y $\\gamma$ tienen unidades de tiempo inverso. \n",
"* $\\beta$ es la constante de velocidad asociada a la transmisión de la infección. La constante temporal correspondiente $\\tau_{infect} = \\frac{1}{\\beta}$ corresponde al crecimiento exponencial de nuevas infecciones en una población inicialmente susceptible donde $s=1$. \n",
"* $\\gamma$ es la tasa de recuperación de las infecciones. La constante de tiempo asociada $\\tau_{recovery}=\\frac{1}{\\gamma}$ es el tiempo medio para recuperarse de una infección.\n",
"* La población infecciosa puede crecer sólo si $\\beta s > \\gamma$, es decir, la tasa de infección es mayor que la tasa de recuperación.\n",
"* La relación $R_0 = \\frac{\\beta}{\\gamma}$ es el \"Número Básico de Reproducción\" que describe la transmisibilidad o contagio de una enfermedad infecciosa. \n",
"* $R_0$ es el número medio de personas infectadas por un caso de índice 0 en una población completamente susceptible. \n",
"* La población infecciosa sólo puede crecer si $R_0 s > 1$. Si $s=1$, entonces $R_0 > 1$ es suficiente para el crecimiento de la población infecciosa.\n",
"* La población infecciosa disminuye si $s R_0 < 1$ o, lo que es lo mismo, $s < \\frac{1}{R_0}$.\n",
"* La población tiene \"inmunidad de rebaño\" cuando la fracción de susceptibles es inferior a $\\frac{1}{R_0}$."
"El siguiente código Python implementa una simulación del modelo SIR. Los valores de los parámetros se seleccionaron a partir del reciente estudio de Boldog, et al. (2020).\n",
"Los parámetros principales de nuestro modelo son el número básico de reproducción $R0$ y los dias en los cuales una persona es infecciosa $\\tau_{infectividad}$. En el mundo real estos valores tiene su incertidumbre y un modelo realista debe incorporarlas. \n"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### Incertidumbre en número básico de reproducción $R0$\n",
"\n",
"Podemos usar una distribución log-normal como la PDF que modela nuestro $R0$*\n",
", en este caso usaremos los siguientes parametros escogidos ad-hoc para este ejercicio:\n",
"\n",
"* [un artículo al respecto](https://storage.googleapis.com/plos-corpus-prod/10.1371/journal.pone.0238090/1/pone.0238090.pdf?X-Goog-Algorithm=GOOG4-RSA-SHA256&X-Goog-Credential=wombat-sa%40plos-prod.iam.gserviceaccount.com%2F20210312%2Fauto%2Fstorage%2Fgoog4_request&X-Goog-Date=20210312T124607Z&X-Goog-Expires=3600&X-Goog-SignedHeaders=host&X-Goog-Signature=462a1c0824f481effcd20a16384ba40e09281fe08a0c7b8dac72b11b17a14767fdecb9802b3c6132cf2168e09cbcaff2043cf82a2693bcb589ad9d24c3c46176be55aaa2b7ad434d9a63d3fc85a6bfb055063ebd58243c4fc3a7cb63a7a02b75c0563dd1396837e6e9eecadd4d0362b28457e62fef02c91a5e5f4cffb82e60d1932a17d50c0948fba32d7728c3821a6fa3df9307a66852f75672a4300364982c0c67fdc1bab4be874df97f194af527fa98385fd9704a2c82aa7c8f1dcec16d7e41625cfc9be3fad3e9c138c7147096a2268572e687e834263b4f58b12a7b82b9236f5f8e6b75df62efe2b6e5ad90fa9198f295b41425e9f7499fceb4162227f1)"
"### Incertidumbre en los dias de infectividad.\n",
"\n",
"Supongamos que lo dias que un individuo es contagioso está en el orden de 8.7 +/- 3 dias. Mas detalles sobre estudios en este tema [aqui](https://www.bdi.ox.ac.uk/news/the-timing-of-covid-19-transmission).\n",
"\n",
"Por simplicidad, modelaremos esta incertidumbre con una distribución normal que refleje el rango de 8.7 +/- 3 dias.\n"
"- Uncluir incertidumbres en el modelo, correr 1000 escenarios. \n",
"- En el dia 120, cuantas personas se han contagiado? Incluir intervalos de confianza del 95%\n",
"- Grafico con incertidumbres (algo por el estilo de https://medium.com/data-for-science/epidemic-modeling-103-adding-confidence-intervals-and-stochastic-effects-to-your-covid-19-models-be618b995d6b)\n"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"# Ejericio 2.\n",
"\n",
"- El gobierno está evaluando 2 escenarios:\n",
" \n",
" - Un lockdown severo que reduzca R0 a cerca de 1 (usar esta distribución np.random.lognormal(-0.1, 0.15, 1000)).\n",
" - Una campaña de seguimiento y localización que reduzca los dias en los que un individuo está en la calle contagioso a 3 +/- 1 dias. \n",
" \n",
"Simular ambos escenarios y dar un consejo al gobierno. "
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": []
}
],
"metadata": {
"colab": {
"name": "03.09-COVID-19.ipynb",
"provenance": []
},
"kernelspec": {
"display_name": "clase13datos",
"language": "python",
"name": "clase13datos"
},
"language_info": {
"codemirror_mode": {
"name": "ipython",
"version": 3
},
"file_extension": ".py",
"mimetype": "text/x-python",
"name": "python",
"nbconvert_exporter": "python",
"pygments_lexer": "ipython3",
"version": "3.7.10"
}
},
"nbformat": 4,
"nbformat_minor": 4
}
%% Cell type:markdown id: tags:
# Epidemiólogos por un dia: simulando un brote de COVID-19 en una población
El propósito de esta práctica es demostrar cómo podemos modelar la evolución de una epidemia infecciosa utilizando datos disponibles para COVID-19 en una población susceptible utilizando modelos epidemiológicos estándar. Los parámetros del modelo se toman de una literatura científica en rápida evolución que documenta el brote mundial de COVID-19.
*Este notebook está basado en [CBE30338](https://jckantor.github.io/CBE30338);
que puede encontrarse en [Github](https://github.com/jckantor/CBE30338.git). El material ha sido traducido y adaptado para esta práctica*
%% Cell type:markdown id: tags:
## Modelo SIR para una enfermedad infecciosa
%% Cell type:markdown id: tags:
El modelo SIR es un modelo compartimentado determinista para la propagación de una enfermedad infecciosa que describe fenómenos clave encontrados en epidemiología. En el modelo SIR, una población se divide en tres grupos que no se solapan y que corresponden a las fases de la enfermedad:
***Susceptible.** La subpoblación susceptible de adquirir la enfermedad. En el caso del SARS-CoV-2, se supone que todas las personas que no han adquirido previamente la enfermedad son susceptibles de infectarse.
***Infectada** La subpoblación que se ha vuelto infecciosa.
***Recuperada** La subpoblación que se ha recuperado de la infección y que se supone que ya no es susceptible de contraer la enfermedad.
Sin tener en cuenta los procesos demográficos de nacimiento y muerte por otras causas, y suponiendo una tasa de mortalidad insignificante debida a la enfermedad infecciosa en cuestión, la progresión de una epidemia puede modelarse mediante procesos de tasal
$$\text{Susceptible}
\xrightarrow{\frac{\beta S I}{N}}
\text{Infectada}
\xrightarrow{\gamma I}
\text{Recuperada}$$
Los procesos se modelan de la siguiente manera.
* $\frac{\beta S I}{N}$ es la velocidad con la que la población susceptible se encuentra con la población infectada, dando lugar a la transmisión de la enfermedad. $S$ es el tamaño de la población susceptible. $\beta$ es un parámetro del modelo con unidades de 1/día.
* $\gamma I$ es la velocidad a la que la población infectada se recupera y se hace resistente a nuevas infecciones. $I$ es el tamaño de la población infectada.
Un modelo de propagación de una enfermedad infecciosa en una población uniforme viene dado por las ecuaciones deterministas SIR
\begin{align*}
\frac{dS}{dt} & = -\frac{\beta S I}{N} \\
\frac{dI}{dt} & = \frac{\beta S I}{N} - \gamma I \\
\frac{dR}{dt} & = \gamma I
\end{align*}
El modelo se vuelve más genérico al trabajar con fracciones de población en lugar de con recuentos brutos de población. Para ello, definimos
\begin{align}
s = \frac{S}{N} \qquad
i = \frac{I}{N} \qquad
r = \frac{R}{N}
\end{align}
Tras la sustitución, se obtiene un sistema de cuatro ecuaciones.
\begin{align*}
\frac{ds}{dt} & = -\beta s i \\
\frac{di}{dt} & = \beta s i - \gamma i \\
\frac{dr}{dt} & = \gamma i
\end{align*}
donde $s + i + r = 1$ es invariante.
%% Cell type:markdown id: tags:
### Propiedades clave del modelo SIR
* Los parámetros $\beta$ y $\gamma$ tienen unidades de tiempo inverso.
* $\beta$ es la constante de velocidad asociada a la transmisión de la infección. La constante temporal correspondiente $\tau_{infect} = \frac{1}{\beta}$ corresponde al crecimiento exponencial de nuevas infecciones en una población inicialmente susceptible donde $s=1$.
* $\gamma$ es la tasa de recuperación de las infecciones. La constante de tiempo asociada $\tau_{recovery}=\frac{1}{\gamma}$ es el tiempo medio para recuperarse de una infección.
* La población infecciosa puede crecer sólo si $\beta s > \gamma$, es decir, la tasa de infección es mayor que la tasa de recuperación.
* La relación $R_0 = \frac{\beta}{\gamma}$ es el "Número Básico de Reproducción" que describe la transmisibilidad o contagio de una enfermedad infecciosa.
* $R_0$ es el número medio de personas infectadas por un caso de índice 0 en una población completamente susceptible.
* La población infecciosa sólo puede crecer si $R_0 s > 1$. Si $s=1$, entonces $R_0 > 1$ es suficiente para el crecimiento de la población infecciosa.
* La población infecciosa disminuye si $s R_0 < 1$ o, lo que es lo mismo, $s < \frac{1}{R_0}$.
* La población tiene "inmunidad de rebaño" cuando la fracción de susceptibles es inferior a $\frac{1}{R_0}$.
%% Cell type:markdown id: tags:
### Simulation
El siguiente código Python implementa una simulación del modelo SIR. Los valores de los parámetros se seleccionaron a partir del reciente estudio de Boldog, et al. (2020).
Los parámetros principales de nuestro modelo son el número básico de reproducción $R0$ y los dias en los cuales una persona es infecciosa $\tau_{infectividad}$. En el mundo real estos valores tiene su incertidumbre y un modelo realista debe incorporarlas.
%% Cell type:markdown id: tags:
### Incertidumbre en número básico de reproducción $R0$
Podemos usar una distribución log-normal como la PDF que modela nuestro $R0$*
, en este caso usaremos los siguientes parametros escogidos ad-hoc para este ejercicio:
*[un artículo al respecto](https://storage.googleapis.com/plos-corpus-prod/10.1371/journal.pone.0238090/1/pone.0238090.pdf?X-Goog-Algorithm=GOOG4-RSA-SHA256&X-Goog-Credential=wombat-sa%40plos-prod.iam.gserviceaccount.com%2F20210312%2Fauto%2Fstorage%2Fgoog4_request&X-Goog-Date=20210312T124607Z&X-Goog-Expires=3600&X-Goog-SignedHeaders=host&X-Goog-Signature=462a1c0824f481effcd20a16384ba40e09281fe08a0c7b8dac72b11b17a14767fdecb9802b3c6132cf2168e09cbcaff2043cf82a2693bcb589ad9d24c3c46176be55aaa2b7ad434d9a63d3fc85a6bfb055063ebd58243c4fc3a7cb63a7a02b75c0563dd1396837e6e9eecadd4d0362b28457e62fef02c91a5e5f4cffb82e60d1932a17d50c0948fba32d7728c3821a6fa3df9307a66852f75672a4300364982c0c67fdc1bab4be874df97f194af527fa98385fd9704a2c82aa7c8f1dcec16d7e41625cfc9be3fad3e9c138c7147096a2268572e687e834263b4f58b12a7b82b9236f5f8e6b75df62efe2b6e5ad90fa9198f295b41425e9f7499fceb4162227f1)
%% Cell type:code id: tags:
``` python
s=np.random.lognormal(1.1,0.21,1000)
plt.hist(s,density=True,bins=100)
plt.ylabel('Probabilidad')
plt.xlabel('R0');
```
%% Output
%% Cell type:markdown id: tags:
### Incertidumbre en los dias de infectividad.
Supongamos que lo dias que un individuo es contagioso está en el orden de 8.7 +/- 3 dias. Mas detalles sobre estudios en este tema [aqui](https://www.bdi.ox.ac.uk/news/the-timing-of-covid-19-transmission).
Por simplicidad, modelaremos esta incertidumbre con una distribución normal que refleje el rango de 8.7 +/- 3 dias.
%% Cell type:code id: tags:
``` python
s=np.random.normal(8.7,3,1000)
plt.hist(s,density=True,bins=100)
plt.ylabel('Probabilidad')
plt.xlabel('Dias contagioso');
```
%% Output
%% Cell type:markdown id: tags:
# Ejercicio 1.
- Uncluir incertidumbres en el modelo, correr 1000 escenarios.
- En el dia 120, cuantas personas se han contagiado? Incluir intervalos de confianza del 95%
- Grafico con incertidumbres (algo por el estilo de https://medium.com/data-for-science/epidemic-modeling-103-adding-confidence-intervals-and-stochastic-effects-to-your-covid-19-models-be618b995d6b)
%% Cell type:markdown id: tags:
# Ejericio 2.
- El gobierno está evaluando 2 escenarios:
- Un lockdown severo que reduzca R0 a cerca de 1 (usar esta distribución np.random.lognormal(-0.1, 0.15, 1000)).
- Una campaña de seguimiento y localización que reduzca los dias en los que un individuo está en la calle contagioso a 3 +/- 1 dias.
Simular ambos escenarios y dar un consejo al gobierno.