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

Updating text

parent 5fa01f96
No related branches found
No related tags found
No related merge requests found
%% Cell type:markdown id: tags: %% Cell type:markdown id: tags:
# Epidemiólogos por un dia: simulando un brote de COVID-19 en una población # 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. 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); *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* 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: %% Cell type:markdown id: tags:
## Modelo SIR para una enfermedad infecciosa ## Modelo SIR para una enfermedad infecciosa
%% Cell type:markdown id: tags: %% 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: 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. * **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. * **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. * **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 tasal
$$\text{Susceptible} $$\text{Susceptible}
\xrightarrow{\frac{\beta S I}{N}} \xrightarrow{\frac{\beta S I}{N}}
\text{Infectada} \text{Infectada}
\xrightarrow{\gamma I} \xrightarrow{\gamma I}
\text{Recuperada}$$ \text{Recuperada}$$
Los procesos se modelan de la siguiente manera. 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. * $\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. * $\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 Un modelo de propagación de una enfermedad infecciosa en una población uniforme viene dado por las ecuaciones deterministas SIR
\begin{align*} \begin{align*}
\frac{dS}{dt} & = -\frac{\beta S I}{N} \\ \frac{dS}{dt} & = -\frac{\beta S I}{N} \\
\frac{dI}{dt} & = \frac{\beta S I}{N} - \gamma I \\ \frac{dI}{dt} & = \frac{\beta S I}{N} - \gamma I \\
\frac{dR}{dt} & = \gamma I \frac{dR}{dt} & = \gamma I
\end{align*} \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 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} \begin{align}
s = \frac{S}{N} \qquad s = \frac{S}{N} \qquad
i = \frac{I}{N} \qquad i = \frac{I}{N} \qquad
r = \frac{R}{N} r = \frac{R}{N}
\end{align} \end{align}
Tras la sustitución, se obtiene un sistema de cuatro ecuaciones. Tras la sustitución, se obtiene un sistema de cuatro ecuaciones.
\begin{align*} \begin{align*}
\frac{ds}{dt} & = -\beta s i \\ \frac{ds}{dt} & = -\beta s i \\
\frac{di}{dt} & = \beta s i - \gamma i \\ \frac{di}{dt} & = \beta s i - \gamma i \\
\frac{dr}{dt} & = \gamma i \frac{dr}{dt} & = \gamma i
\end{align*} \end{align*}
donde $s + i + r = 1$ es invariante. donde $s + i + r = 1$ es invariante.
%% Cell type:markdown id: tags: %% Cell type:markdown id: tags:
### Propiedades clave del modelo SIR ### Propiedades clave del modelo SIR
* Los parámetros $\beta$ y $\gamma$ tienen unidades de tiempo inverso. * 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$. * $\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. * $\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 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. * 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. * $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 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 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}$. * 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: %% Cell type:markdown id: tags:
### Simulation ### 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). 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. * $\tau_{infectividad} = \frac{1}{\gamma} = 8.4$ days.
* $R_0 = \frac{\beta}{\gamma} = 2.4$ * $R_0 = \frac{\beta}{\gamma} = 2.4$
%% Cell type:code id: tags: %% Cell type:code id: tags:
``` python ``` python
import numpy as np import numpy as np
from scipy.integrate import odeint from scipy.integrate import odeint
import matplotlib.pyplot as plt import matplotlib.pyplot as plt
# parametros # parametros
R0 = 2.4 R0 = 2.4
t_infectividad = 8.4 t_infectividad = 8.4
# initial number of infected and recovered individuals # initial number of infected and recovered individuals
i_inicial = (1/20000) i_inicial = (1/20000)
r_inicial = 0.00 r_inicial = 0.00
s_inicial = (1 - i_inicial - r_inicial) s_inicial = (1 - i_inicial - r_inicial)
gamma = 1/t_infectividad gamma = 1/t_infectividad
beta = R0*gamma beta = R0*gamma
# SIR model equaciones diferenciales. # SIR model equaciones diferenciales.
def deriv(x, t, beta, gamma): def deriv(x, t, beta, gamma):
s, i, r = x s, i, r = x
dsdt = -beta * s * i dsdt = -beta * s * i
didt = beta * s * i - gamma * i didt = beta * s * i - gamma * i
drdt = gamma * i drdt = gamma * i
return [dsdt, didt, drdt] return [dsdt, didt, drdt]
# definir el periodo de tiempo # definir el periodo de tiempo
t = np.linspace(0, 180, 180) t = np.linspace(0, 180, 180)
#condiciones iniciales #condiciones iniciales
x_inicial = s_inicial, i_inicial, r_inicial x_inicial = s_inicial, i_inicial, r_inicial
# usamos la funcion odeint de scipy para resolver numericamente ecuaciones diferenciales # usamos la funcion odeint de scipy para resolver numericamente ecuaciones diferenciales
soln = odeint(deriv, x_inicial, t, args=(beta, gamma)) soln = odeint(deriv, x_inicial, t, args=(beta, gamma))
s, i, r = soln.T s, i, r = soln.T
#e = None #e = None
print("en el dia 0:") print("en el dia 0:")
print("suseptibles: ", round(s[0],2), ", infectados: ",round(i[0],2),", recuperados: ", round(r[0],2)) print("suseptibles: ", round(s[0],2), ", infectados: ",round(i[0],2),", recuperados: ", round(r[0],2))
print("en el dia 180:") print("en el dia 180:")
print("suseptibles: ", round(s[179],2), ", infectados: ",round(i[179],2),", recuperados: ", round(r[179],2)) print("suseptibles: ", round(s[179],2), ", infectados: ",round(i[179],2),", recuperados: ", round(r[179],2))
``` ```
%% Output %% Output
en el dia 0: en el dia 0:
suseptibles: 1.0 , infectados: 0.0 , recuperados: 0.0 suseptibles: 1.0 , infectados: 0.0 , recuperados: 0.0
en el dia 180: en el dia 180:
suseptibles: 0.12 , infectados: 0.0 , recuperados: 0.88 suseptibles: 0.12 , infectados: 0.0 , recuperados: 0.88
%% Cell type:code id: tags: %% Cell type:code id: tags:
``` python ``` python
def plotdata(t, s, i, e=None): def plotdata(t, s, i, e=None):
# plot the data # plot the data
fig = plt.figure(figsize=(12,6)) fig = plt.figure(figsize=(12,6))
ax = [fig.add_subplot(221, axisbelow=True), ax = [fig.add_subplot(221, axisbelow=True),
fig.add_subplot(223), fig.add_subplot(223),
fig.add_subplot(122)] fig.add_subplot(122)]
ax[0].plot(t, s, lw=3, label='Fracción Susceptible') 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, i, lw=3, label='Fraction Infectada')
ax[0].plot(t, r, lw=3, label='Recuperadas') ax[0].plot(t, r, lw=3, label='Recuperadas')
ax[0].set_title('Poblaciones Susceptibles y Recuperadas') ax[0].set_title('Poblaciones Susceptibles y Recuperadas')
ax[0].set_xlabel('Dias') ax[0].set_xlabel('Dias')
ax[0].set_ylabel('Fracción') ax[0].set_ylabel('Fracción')
ax[1].plot(t, i, lw=3, label='Infección') ax[1].plot(t, i, lw=3, label='Infección')
ax[1].set_title('Población infecciosa') ax[1].set_title('Población infecciosa')
if e is not None: ax[1].plot(t, e, lw=3, label='Expuesta') if e is not None: ax[1].plot(t, e, lw=3, label='Expuesta')
#ax[1].set_ylim(0, 0.3) #ax[1].set_ylim(0, 0.3)
ax[1].set_xlabel('Dias') ax[1].set_xlabel('Dias')
ax[1].set_ylabel('Fracción') ax[1].set_ylabel('Fracción')
ax[2].plot(s, i, lw=3, label='trayectoria de s vs i') 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([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[0], i[0], '.', ms=20, label='Condición Inicial')
ax[2].plot(s[-1], i[-1], '.', ms=20, label='Condición Final') ax[2].plot(s[-1], i[-1], '.', ms=20, label='Condición Final')
ax[2].set_title('Estado de la epidemia') ax[2].set_title('Estado de la epidemia')
ax[2].set_aspect('equal') ax[2].set_aspect('equal')
ax[2].set_ylim(0, 1.05) ax[2].set_ylim(0, 1.05)
ax[2].set_xlim(0, 1.05) ax[2].set_xlim(0, 1.05)
ax[2].set_xlabel('Susceptible') ax[2].set_xlabel('Susceptible')
ax[2].set_ylabel('Infecciosos') ax[2].set_ylabel('Infecciosos')
for a in ax: for a in ax:
a.grid(True) a.grid(True)
a.legend() a.legend()
plt.tight_layout() plt.tight_layout()
plotdata(t, s, i) plotdata(t, s, i)
``` ```
%% Output %% Output
%% Cell type:markdown id: tags: %% Cell type:markdown id: tags:
## Añadiendo incertidumbre al modelo ## 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 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: %% Cell type:markdown id: tags:
### Incertidumbre en número básico de reproducción $R0$ ### Incertidumbre en número básico de reproducción $R0$
Podemos usar una distribución log-normal como la PDF que modela nuestro $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: , 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) * [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: %% Cell type:code id: tags:
``` python ``` python
s = np.random.lognormal(1.1, 0.21, 1000) s = np.random.lognormal(1.1, 0.21, 1000)
plt.hist(s, density=True, bins=100) plt.hist(s, density=True, bins=100)
plt.ylabel('Probabilidad') plt.ylabel('Probabilidad')
plt.xlabel('R0'); plt.xlabel('R0');
``` ```
%% Output %% Output
%% Cell type:markdown id: tags: %% Cell type:markdown id: tags:
### Incertidumbre en los dias de infectividad. ### 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). 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. Por simplicidad, modelaremos esta incertidumbre con una distribución normal que refleje el rango de 8.7 +/- 3 dias.
%% Cell type:code id: tags: %% Cell type:code id: tags:
``` python ``` python
s = np.random.normal(8.7, 3, 1000) s = np.random.normal(8.7, 3, 1000)
plt.hist(s, density=True, bins=100) plt.hist(s, density=True, bins=100)
plt.ylabel('Probabilidad') plt.ylabel('Probabilidad')
plt.xlabel('Dias contagioso'); plt.xlabel('Dias contagioso');
``` ```
%% Output %% Output
%% Cell type:markdown id: tags: %% Cell type:markdown id: tags:
# Ejercicio 1. # Ejercicio 1.
- Uncluir incertidumbres en el modelo, correr 1000 escenarios. - Incluir incertidumbres en el modelo, simular 1000 escenarios.
- En el dia 120, cuantas personas se han contagiado? Incluir intervalos de confianza del 95% - 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.
- 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) - 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: %% Cell type:markdown id: tags:
# Ejericio 2. # Ejericio 2.
- El gobierno está evaluando 2 escenarios: - Ustedes son asesores cientificos de un gobierno que esta manejando la crisis del Covid19. El gobierno está evaluando implementar uno de estos dos escenarios:
- Un lockdown severo que reduzca R0 a cerca de 1 (usar esta 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 que reduzca los dias en los que un individuo está en la calle contagioso a 3 +/- 1 dias. - 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 y dar un consejo al gobierno. Simular ambos escenarios con sus debidas incertidumbres y basado en los resultados aconsejar al gobierno qué hacer.
%% Cell type:code id: tags: %% Cell type:code id: tags:
``` python ``` 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