Uma componente importante em epidemiologia é a característica heterogênea dos parâmetros epidemiológicos e sociais. Os indivíduos têm, naturalmente, diferentes comportamentos e diferentes capacidades de serem infectados e de se recuperarem de uma doença. Os modelos compartimentais são homogêneos por princípio e não são capazes de capturar essa heterogeneidade.
Modelos mais realistas devem levar esse heterogeneidade em consideração. Num caso extremo, podemos modelar cada indivíduo separadamente. Isso é custoso, tanto no aspecto da simulação computacional (imagine modelar milhões de indivíduos em uma cidade grande ou em estado ou país) como no de ajuste e escolha dos parâmetros apropriados.
Uma modelagem intermediária é dividir a população em grupos e assumir a homogeneidade apenas dentro desse grupos. A divisão pode ser feita em termos geográficos (e.g. diferentes bairros em uma cidade), comportamentais (e.g. diferentes grupos sociais ou de trabalho), sociais (e.g. diferentes condições de vida), de saúde (e.g. diferentes grupos de risco), etc.
Nesses casos, os grupos podem ser vistos como vértices de um grafo e a interação entre os diferentes grupos pode ser vista como sendo as arestas do grafo. Tais modelos são classificados como modelos em rede. Em cima dessa estrutura de grafo/rede, podemos considerar uma dinâmica determinística ou estocástica. E a evolução pode ser discreta ou contínua, no tempo. Além disso, a natureza da epidemia também pode ser variada (se há reinfecção ou não, se leva expostos em consideração ou não, etc.)
Aqui, vamos construir um modelo do tipo SIR, considerando os estados epidemiológicos suscetíveis, infectados e recuperados, em cada grupo. No que se segue, podemos pensar nas regiões como sendo diferentes áreas residenciais, mas vale ressaltar que, em termos do sistema de equações, é indiferente o que cada grupo representa. Isso é relevante, apenas, na definição e na interpretação dos diferentes parâmetros que aparecem no modelo.
Vamos, então, imaginar que a população está estruturada em diferentes regiões geográficas e que os parâmetros epidemiológicos (taxas de contágio e de recuperação) variam de região para região. Vamos imaginar que, ao longo de cada unidade de tempo (e.g. um dia), parte da população de uma região passe parte do tempo em uma das outras regiões. E vamos assumir que esse deslocamento não seja sempre o mesmo, todos os dias, permitindo que ele varie estocásticamente ao longo do tempo.
Vamos começar com o modelo em rede determinístico. Em seguida, adicionamos os termos estocásticos.
Nas simulações, vamos usar o ambiente SciML, da linguagem Julia. Como vamos simular tanto sistema determinísticos como estocásticos, carregamos o SciML/OrdinaryDiffEq e o SciML/StochasticDiffEq.
using OrdinaryDiffEq
using StochasticDiffEq
using Plots
Agora, passamos para o modelo SIR em rede, no caso determinístico. Vamos assumir três sítios, denotados por e
Nesse caso, consideramos
sítios.
Em cada sítio, uma população total com um número de suscetíveis, de infectados e de recuperados,
Sem vitalidade, de forma que é constante, para cada
Denominamos por um ciclo cada unidade de tempo, digamos um dia.
O ciclo possui uma fase ativa, onde a infeção pode ocorrer, e uma fase inativa, onde não há transmissão da infecção.
Na fase ativa de cada ciclo, uma fração da população migra do sítio para o sítio , voltando ao sítio na fase inativa.
Naturalmente, para cada e para cada
Em cada sítio os indivíduos suscetíveis que lá se encontram podem se tornar infectados ao encontrar um indivíduo infectado no mesmo sítio, com um fator de transmissão característico do sítio em que se encontram.
Os indivíduos infectados de cada sítio, podem se recuperar com um fator de recuperação característico do ambiente e dos indivíduos que habitam o sítio.
Temos o sistema
onde
é a população existente no sítio durante a fase ativa do ciclo.
Podemos verificar, como esperado da modelagem, que a população total originária de cada sítio permanece constante:
Assim,
Como consequência, também temos que a população em cada sítio durante a fase ativa do ciclo também é constante:
Como no caso do modelo SIR clássico, podemos reduzir o sistema a um subsistema envolvendo apenas suscetíveis e infectados, considerando que a população total é constante.
Temos
e basta consideramos
onde
são constantes.
Considerando os estados na forma de vetores,
podemos escrever as equações na forma vetorial
onde
é a matriz diagonal
é a matriz
é a matriz diagonal formada pelo vetor obtido da aplicação da matriz ao vetor
A key component of the network model is the flux matrix, defining the fraction of the population and of the time that the residents of a given site spend in another site.
We denote this matrix by
More precisely, each individual in site may spend a time in site during a specified unit of time. In this case,
We then define Notice
Population in each site:
N = 100_000
pop = [0.1; 0.7; 0.2] * N
Flux (commuting) matrix
phi = [
0.6 0.1 0.3
0.3 0.4 0.3
0.2 0.3 0.5
]
Infectivity and recovery rates in each site
sites_beta = [
0.2
0.4
0.3
]
sites_gamma = [
0.3
0.1
0.2
]
function SIR_network!(du, u, p, t)
S, I = eachrow(u)
M = length(S)
Nd, phi, beta, gamma = p
for i in 1:M
infections_i = sum(
[beta[j] * phi[i,j] * phi[k,j] * S[i] * I[k] / Nd[j] for k=1:M, j=1:M]
)
du[1,i] = dS = - infections_i
du[2,i] = dI = infections_i - gamma[i] * I[i]
end
end
Collecting the parameters
Nd = transpose(phi) * pop # population in each site "during the day"
parm_network = (Nd, phi, sites_beta, sites_gamma)
Initial conditions
inf0 = 10
popinf0 = [0.8, 0.2, 0.0] * inf0
pop0 = [pop' - popinf0'; popinf0']
t0 = 0.0
tf = 360.0
tspan = (t0, tf)
SIR_network_prob = ODEProblem(SIR_network!, pop0, tspan, parm_network)
SIR_network_sol = solve(SIR_network_prob, Tsit5()) SIR_network_sol.retcode
plot(xlabel = "time (days)", ylabel = "population fraction", ylims = (0.0, 1.0))
for (j, s) in zip(1:3, 'A':'C')
plot!(getindex.(SIR_network_sol.u, 1, j)/pop[j], label = "Site $s")
end
plot!(title = "Fraction of susceptible individuals in each site", titlefont = 10)
plot(xlabel = "time (days)", ylabel = "population fraction")
for (j, s) in zip(1:3, 'A':'C')
plot!(getindex.(SIR_network_sol.u, 2, j)/pop[j], label = "Site $s")
end
plot!(title = "Fraction of infected individuals in each site", titlefont = 10)