View in NBViewer Open in binder Download notebook View source


10.4. Modelos individuais

using LinearAlgebra
using Random
using StatsBase
using Plots

Cenário

Atributos

Parâmetros epidemiológicos globais

# Cenário

N = 10_000 # população
estado = zeros(Int,N)
infectividade = 0.5 .+ rand(N)
suscetibilidade = 0.5 .+ rand(N)
recuperacao = 1 ./ (1 .+ 9 * rand(N)) # distribuição uniforme entre 1 e 10 dias de recuperação
recuperacao = 1 ./ (1 .+ 6 * rand(N) .* suscetibilidade) # distribuição entre 1 e 9, correlacionada com a suscetibilidade
nothing
τ = 0.02 # taxa de contágio por contato próximo
κ = 20 # número médio de contatos por indivíduo
nothing

Dinâmica da epidemia

Força de infecção

\[ \lambda = \tau * \sum_{\textrm{contatos com infectados j}} \mathrm{infectividade}[j]. \] \[ S(t + \Delta t) = S(t) e^{-\lambda \Delta t}. \] \[ e^{-\lambda \Delta t} \]

Recuperação

\[ I(t + \Delta t) = I(t) e^{-\gamma \Delta t}. \] \[ e^{-\gamma_i \Delta t}. \]

Contatos

Quantidades de interesse

Simulação

# Evolução
num_dias = 180 # número (inteiro) de dias
passos_dias = 4 # número (inteiro) de passos por dia
dt = 1/passos_dias # tamanho do passo
len_tempos = passos_dias * num_dias + 1 # tamanho malha temporal
tempos = range(0.0, num_dias, length = len_tempos) # malha temporal, começando com tempos[1] = 0 e terminando em tempos[end] = float(num_dias)

# inicialização
ninf0 = 5 # número inicial de infectados
inf0 = sample(1:N, ninf0) # seleção aleatória dos infectados
estado = zeros(Int, N) # inicialização da população como todos suscetíveis
estado[inf0] .= 1 # infectados iniciais

# compartimentos
suscetiveis = zeros(Int, len_tempos)
infectados = zeros(Int, len_tempos)
recuperados = zeros(Int, len_tempos)
suscetiveis[1] = count(estado .== 0)
infectados[1] = count(estado .== 1)
recuperados[1] = count(estado .== 2)

# força de infecção
λ = zeros(N)

# contatos
contatos = collect(1:N)

# evolução
for n in 2:len_tempos
    λ .= 0.0
    if rem(n, passos_dias) == 0 # shuffle once a day
        shuffle!(contatos)
    end
    i = 1
    while i ≤ N
        ip = min(i + rand(div(κ, 2):2κ), N)
        if any(==(1), estado[contatos[i:ip]])
            λ[contatos[i:ip]] .= τ * sum(infectividade[contatos[j]] for j in i:ip if estado[contatos[j]] == 1)
        end
        i = ip + 1
    end
    for i in 1:N
        if estado[i] == 0 && rand() > exp(-λ[i] * dt)
            estado[i] = 1
        elseif estado[i] == 1 && rand() > exp(-recuperacao[i] * dt)
            estado[i] = 2
        end        
    end
    suscetiveis[n] = count(estado .== 0) # contabiliza compartimento suscetíveis
    infectados[n] = count(estado .== 1) # contabiliza compartimento infectados
    recuperados[n] = count(estado .== 2) # contabiliza compartimento recuperados
end
plot(title = "Evolução epidemiológica", titlefont = 12, xaxis = "dia", yaxis = "número de indivíduos")
plot!(tempos, suscetiveis, label = "suscetíveis")
plot!(tempos, infectados, label = "infectados")
plot!(tempos, recuperados, label = "recuperados")
plot(title = "Evolução epidemiológica", titlefont = 12, xaxis = "dia", yaxis = "número de indivíduos")
plot!(tempos, infectados, ylim = (0.0, min(1.5 * maximum(infectados), N)), label = "infectados", color = 2)

Exercícios

  1. Implemente uma versão SEIR do modelo individual discreto estocástico descrito acima.

Referências