Skip to content
Snippets Groups Projects
Commit e11e9003 authored by Camila Rangel Smith's avatar Camila Rangel Smith
Browse files

minor updates

parent e98ba409
No related branches found
No related tags found
No related merge requests found
......@@ -7,7 +7,7 @@ Estos ejercicios consisten en notebooks que podran correr localmente o en jupyte
## Instruciones para correr los notebooks localmente.
Estos ejercicios requieren tener intalado [conda](https://docs.conda.io/projects/conda/en/latest/index.html) y una version de Python 3.7 or mayor.
Estos ejercicios requieren tener instalado [conda](https://docs.conda.io/projects/conda/en/latest/index.html) y una version de Python 3.7 or mayor.
Empecemos creando un nuevo entorno computacional conda de la forma:
......@@ -28,7 +28,7 @@ tu fork. Esta opción es para preferida para que puedas guardar tu trabajo.
Entra al repositorio y asegúrate estar en la rama "master"
```
cd ejercicios-clase-13-datos
cd ejercicios-clase-17-datos
git checkout master
```
Ahora instala las librarias que usaremos con:
......
%% Cell type:markdown id: tags:
# Epidemiólogos por un dia: simulando un brote de COVID-19 en una población
# Epidemiólogos por un día: simulando la evolución de una epidemia infecciosa
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
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 tasa
$$\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).
* $\tau_{infectividad} = \frac{1}{\gamma} = 8.4$ days.
* $R_0 = \frac{\beta}{\gamma} = 2.4$
%% Cell type:code id: tags:
``` python
import numpy as np
from scipy.integrate import odeint
import matplotlib.pyplot as plt
# parametros
R0 = 2.4
t_infectividad = 8.4
# initial number of infected and recovered individuals
i_inicial = (1/20000)
r_inicial = 0.00
s_inicial = (1 - i_inicial - r_inicial)
gamma = 1/t_infectividad
beta = R0*gamma
# SIR model equaciones diferenciales.
def deriv(x, t, beta, gamma):
s, i, r = x
dsdt = -beta * s * i
didt = beta * s * i - gamma * i
drdt = gamma * i
return [dsdt, didt, drdt]
# definir el periodo de tiempo
t = np.linspace(0, 180, 180)
#condiciones iniciales
x_inicial = s_inicial, i_inicial, r_inicial
# usamos la funcion odeint de scipy para resolver numericamente ecuaciones diferenciales
soln = odeint(deriv, x_inicial, t, args=(beta, gamma))
s, i, r = soln.T
#e = None
print("en el dia 0:")
print("suseptibles: ", round(s[0],2), ", infectados: ",round(i[0],2),", recuperados: ", round(r[0],2))
print("en el dia 50:")
print("suseptibles: ", round(s[49],2), ", infectados: ",round(i[49],2),", recuperados: ", round(r[49],2))
print("en el dia 180:")
print("suseptibles: ", round(s[179],2), ", infectados: ",round(i[179],2),", recuperados: ", round(r[179],2))
```
%% Output
en el dia 0:
suseptibles: 1.0 , infectados: 0.0 , recuperados: 0.0
en el dia 180:
suseptibles: 0.12 , infectados: 0.0 , recuperados: 0.88
%% Cell type:code id: tags:
``` python
def plotdata(t, s, i, e=None):
# plot the data
fig = plt.figure(figsize=(12,6))
ax = [fig.add_subplot(221, axisbelow=True),
fig.add_subplot(223),
fig.add_subplot(122)]
ax[0].plot(t, s, lw=3, label='Fracción Susceptible')
ax[0].plot(t, i, lw=3, label='Fraction Infectada')
ax[0].plot(t, r, lw=3, label='Recuperadas')
ax[0].set_title('Poblaciones Susceptibles y Recuperadas')
ax[0].set_xlabel('Dias')
ax[0].set_ylabel('Fracción')
ax[1].plot(t, i, lw=3, label='Infección')
ax[1].set_title('Población infecciosa')
if e is not None: ax[1].plot(t, e, lw=3, label='Expuesta')
#ax[1].set_ylim(0, 0.3)
ax[1].set_xlabel('Dias')
ax[1].set_ylabel('Fracción')
ax[2].plot(s, i, lw=3, label='trayectoria de s vs i')
ax[2].plot([1/R0, 1/R0], [0, 1], '--', lw=3, label='di/dt = 0')
ax[2].plot(s[0], i[0], '.', ms=20, label='Condición Inicial')
ax[2].plot(s[-1], i[-1], '.', ms=20, label='Condición Final')
ax[2].set_title('Estado de la epidemia')
ax[2].set_aspect('equal')
ax[2].set_ylim(0, 1.05)
ax[2].set_xlim(0, 1.05)
ax[2].set_xlabel('Susceptible')
ax[2].set_ylabel('Infecciosos')
for a in ax:
a.grid(True)
a.legend()
plt.tight_layout()
plotdata(t, s, i)
```
%% Output
%% Cell type:markdown id: tags:
## Añadiendo incertidumbre al modelo
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.
Los parámetros principales de nuestro modelo son el número básico de reproducción $R0$ y los días en los cuales una persona es infecciosa $\tau_{infectividad}$. En el mundo real estos valores tienen su incertidumbre y en un modelo realista deben incorporarse.
%% 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)
Podemos usar una distribución log-normal como la PDF que modela nuestro $R0$ ([leer aquí más 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)), en este caso usaremos los siguientes parámetros escogidos ad-hoc para este ejercicio:
%% 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.
### Incertidumbre en los días 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).
Supongamos que lo días que un individuo es contagioso está en el orden de 8.7 +/- 3 días. Mas detalles sobre estudios en este tema [aquí](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.
Por simplicidad, modelaremos esta incertidumbre con una distribución normal que refleje el rango de 8.7 +/- 3 días.
%% 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.
# Ejercicio 1
- Incluir incertidumbres en el modelo, simular 1000 escenarios.
- Según este modelo: ¿cuantas personas estiman que se hayan contagiado en el dia 120 de la epidemia? Incluir intervalos de confianza del 95% en el resultado.
- Producir una figura del numero de personas infectadas como funcion de tiempo, la figura debe incluir intervalos de confianza (ejemplo de la figura esperada:https://medium.com/data-for-science/epidemic-modeling-103-adding-confidence-intervals-and-stochastic-effects-to-your-covid-19-models-be618b995d6b)
- Producir una figura del numero de personas infectadas como funcion de tiempo, la figura debe incluir intervalos de confianza ([ejemplo de la figura esperada](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.
# Ejercicio 2
Ustedes son asesores científicos de un gobierno que está manejando la crisis del Covid19. El gobierno está evaluando implementar uno de estos dos escenarios:
1. Un confinamiento que reduzca R0 a cerca de 1.
2. Una campaña de seguimiento y localización de casos que reduzca los días en los que un individuo está en la calle contagioso a 3 +/- 1 días.
- Ustedes son asesores cientificos de un gobierno que esta manejando la crisis del Covid19. El gobierno está evaluando implementar uno de estos dos escenarios:
- Simular ambos escenarios con sus debidas incertidumbres y basado en los resultados hacer una recomendación.
- *Nota*: El comportamiento del R0 resultante del escenario 1. se puede modelar con la distribución ```np.random.lognormal(-0.1, 0.15, 1000)```)
- Un confinamiento que reduzca R0 a cerca de 1 (el comportamiento del R0 resultante se puede modelar con la distribución np.random.lognormal(-0.1, 0.15, 1000)).
- Una campaña de seguimiento y localización de casos que reduzca los dias en los que un individuo está en la calle contagioso a 3 +/- 1 dias.
Simular ambos escenarios con sus debidas incertidumbres y basado en los resultados aconsejar al gobierno qué hacer.
- Discutir las limitaciones de sus modelos, y qué tanta confianza tienen en la recomendación que han dado al gobierno.
%% Cell type:code id: tags:
``` python
```
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment