Model implementation¶
En esta sección se describe la implementación del modelo numérico para hacer la integración de las variables.
Implementación del diagrama de flujo¶
El diagrama de flujo de las variables:
Se puede plantear como un grafo bidireccional dirigido, donde los nodos contienen los valores de las variables a medida que se hace evolucionar el sistema y las aristas contienen diferentes valores, por ejemplo las probabilidades de transición o los tiempos de retardo.
Este tipo de objeto se construye instanciando la clase
cv19.Graph
.
Ejemplo de uso:
from cv19 import Graph
g = Graph()
for i, inode in enumerate(['A','B','C','D']):
print(i)
g.add_node(inode, 0)
nms = ['x', 'y']
g.add_edge('A', 'B', nms, [1, 100])
g.add_edge('A', 'C', nms, [2, 200])
g.add_edge('B', 'D', nms, [3, 300])
g.add_edge('D', 'B', nms, [4, 400])
g.add_edge('D', 'C', nms, [5, 500])
g.add_edge('C', 'C', nms, [6, 600])
g.add_edge('B', 'D', nms, [333, 333])
g.show()
Modelo de contagios con grafos¶
Con la clase cv19.Graph
se puede crear un grafo y agragar un
estado en cada nodo, con valor inicial cero para todos los estados
menos para el estado I, que comienza con un valor de por lo menos uno:
g = Graph()
for node in ['I','C','R','H','B','U','D',]:
g.add_node(node, 0)
g.set_node('I', p.N_init)
Ahora podemos agregar en las aristas las cosas que necesitamos. Para cada arista vamos a agregar un lag y una probabilidad de transición. Para el estado I el lag es cero y la probabilidad es la tasa de transmisión. El contador del estado I disminuye cuando hay transferencias del estado I al R.
g.add_edge('I', 'I', nms, [p.R, 0])
Esto nos va a permitir actualizar el valor de I según:
En esta versión I siempre crece, asi que habría que restarle los casos que se recuperan o fallecen. Es decir, hay que incorporar la trnasición \(I \rightarrow C\).
En general, dada una variable \(V\), su variación se incrementa por todas las variables \(U\) que tienen transiciones \(U \rightarrow V\) y disminuye por todas las variables \(W\) que tienen transiciones \(I \rightarrow W\).
Por ejemplo, si tenemos un grafo como este:
La variacion del nodo V está dada por:
Aquí por ejemplo \(P(V|U_1, q)\) significa probabilidad de que haya una transición del estado \(U_1\) al estado \(V\).
Teniendo en cuenta que:
- los parámetros parseados del archivo .ini están en la lista de parámetros p,
- los tiempos de lag están en unidades de días (si no, hay que pasarlos)
- todos los infectados acusan síntomas al día p.t_incubation
resulta el código para llevar la cuenta de I así:
g = Graph()
for node in ['I','C','R','H','B','U','D',]:
g.add_node(node, 0)
nms = ['prob','lag']
g.set_node('I', p.N_init)
g.add_edge('I', 'I', nms, [p.R, 0])
g.add_edge('I', 'C', nms, [1. p.t_incubation])
t = 0.
time_steps = 0
while t < p.t_max:
time_steps = time_steps + 1
t_prev = t
t = t + p.dt
ts.append(t)
prob_II = g.get_edge('I', 'I', 'prob')
lag_II = g.get_edge('I', 'I', 'lag')
prob_IC = g.get_edge('I', 'C', 'prob')
lag_IC = g.get_edge('I', 'C', 'lag')
n_I = I[-1] + I[-lag_II] * prob_II * p.dt - \
C[-lag_IC] * prob_IC * p.dt
I.append(n_I)
Implementación de un modelo¶
Para el modelo de la figura
Las transiciones son:
estado | suma | resta |
---|---|---|
I | I | C |
C | I | B, H, U |
H | C, B, U | R, B, U |
B | C, H, U | H, U |
U | C, B, H | D, B, H |
R | H | |
D | U |
Para este modelo, la actualización de un paso temporal para I es:
donde \(\tau_{II}\) es el time lag para la transición \(I \rightarrow I\), y \(\tau_{IC}\) es el time lag para la transición \(I \rightarrow C\). Los valores P son las probabilidades de transición, es decir, \(P(C(t)|I(t-\tau_{IC}))\) es la probabilidad de que un individuo pase al estado C en el tiempo t si estaba en el estado I en el tiempo \(t-\tau_{IC}\). Por supuesto, \(P(I(t)|I(t-\tau_{II}))\) es la probabilidad de permanecer en el estado I durante el tiempo \(\tau_{II}\).
Para el contador de “confirmados”, C, tenemos que:
porque sólo se puede llegar al estado C desde el estado I, y se puede pasar desde el estado C a los estados H, B o U con diferentes probabilidades. Los tiempos de retardo desde C son cero, porque se pueden pensar a los estados H, B y U como subestados de C, es decir,
De la misma forma, para las transiciones \(B \rightarrow H\), \(B \rightarrow U\), \(H \rightarrow R\), \(H \rightarrow B\), \(H \rightarrow U\), \(U \rightarrow H\), \(U \rightarrow B\) y \(U \rightarrow D\), tenemos las siguientes relaciones:
y análogamente para los otros nodos. Como se puede ver, hay una estructura que persiste en todos los casos, y se puede escribir de manera general. Para un nodo V, la variación en un paso temporal está dada por:
Versión probabilística¶
En la version probabilística, los cambios en los valores de los estados dependen de las características de la población en esos estados. Por ejemplo, las transiciones \(B \rightarrow U\) dependen de la edad de los pacientes. El modelo anterior se puede extender para una versión probabilística de la siguiente forma: