Calibrando Modelos Matemáticos – Parte 2 – Exemplo de um Modelo Epidemiológico

Continuação do post anterior que comecei a escrever como um tutorial para os meus alunos que iniciam projetos de iniciação científica e ainda não estão familiarizados com esse processo de calibrar os parâmetros de modelos matemáticos. Caso não tenha lido volte uma casa (leia o post anterior aqui) e depois continue.

Para dar continuidade, vamos pegar um exemplo simples de problema considerando apenas a variação no tempo. Vamos supor que existe um determinado fenômeno que temos interesse em estudar. O primeiro passo é identificar se já existe um modelo matemático na literatura que represente esse fenômeno.

Um exemplo interessante e suficientemente simples é o modelo matemático utilizado para representar epidemias que foi proposto por Kermack e MacEndrick chamado SIR (talvez você tenha visto uma variação dele sendo usada para previsões durante a pandemia Covid-19). As letras S, I e R significam respectivamente:

Suscetíveis

Infectados

Recuperados

Esse modelo representa, portanto, três populações de indivíduos e suas dinâmicas variando com relação ao tempo. Para entender o modelo, vamos pensar que inicialmente, quando não existe ainda a epidemia e surge um novo agente, todas as pessoas podem ser suscetíveis a se contaminar. As pessoas se tornam infectadas ao entrarem em contato com esse determinado agente. Com o passar do tempo, vamos supor que os indivíduos infectados se recuperam. (Existem variações desse modelo para considerar outros tipos de epidemias em que a pessoa possa ter um tempo de incubação, pode não se recuperar etc. Mas vamos considerar apenas essa 3 populações para simplificar o exemplo).

Para chegar nas equações do modelo, vamos precisar de um termo que representa a taxa em que os indivíduos se tornam infectados: um parâmetro (beta) multiplicado a variável S que representa a velocidade em que um individuo deixa de ser suscetível e passa a ser infectado e essa taxa é proporcional ao valor da população S em determinado momento. E com isso a população S depende do tempo, o que representamos como S(t).

beta * S(t)

Como esta quantidade de indivíduos está “saindo” de uma população e “aparecendo” em outra, esse termo aparece com um sinal negativo (subtraindo) na equação dos Suscetíveis e o mesmo termo aparece com sinal positivo (somando) na equação dos Infectados. A notação dX/dt é adotada para representar equações diferenciais em que uma variável X(t) depende do tempo.

dS/dt = – beta * S(t) // equação dos Suscetíveis

dI/dt = + beta * S(t) // equação dos Infectados

Considerando apenas essas duas equações, se escolhemos valores para S(0) e I(0), que significa escolher as condições iniciais no tempo igual a zero, podemos resolver esse sistema. Simplificando bastante, da pra imaginar que a população de Suscetíveis vai sempre diminuir e a população de Infectados vai sempre aumentar, certo? Consegue imaginar isso? Olha o gráfico abaixo:

Bom, mas o indivíduo infectado pode se recuperar também né? Isso ocorre em uma determinada velocidade e é representado por outro termo em que um parâmetro diferente (gamma) é multiplicado a variável I (infectados) e aparece com sinal negativo na equação de Infectados e sinal positivo na equação R (recuperados), representando que a taxa de recuperação é proporcional, ou depende da quantidade de pessoas infectadas. Aí finalmente chegamos ao modelo SIR:

dS/dt = – beta * S(t)// equação dos Suscetíveis
dI/dt = + beta * S(t) – gamma * I(t)// equação dos Infectados
dR/dt = + gamma * I(t)// equação dos Recuperados
Modelo Epidemiologico – SIR

Esse é o modelo epidemiológico mais simplificado e usaremos esse para fins didáticos. Consideraremos apenas as três variáveis (S, I e R) e apenas dois parâmetros (beta e gamma).

Para utilizar esse modelo para representar uma epidemia precisamos saber qual a população inicial de indivíduos suscetíveis, infectados e recuperados, o que chamamos de “condição inicial”. E precisamos saber também quais são as taxas de infecção e recuperação.

Vamos supor que temos as seguintes condições iniciais (valor das variáveis no início da simulação, no tempo igual a zero) para cada variável do modelo:

S(0) = 10000 // população de 10000 indivíduos que podem se contaminar

I(0) = 0 // ninguém foi infectado

R(0) = 0 // como não tem ninguém infectado, também não tem ninguém recuperado ainda

E vamos supor também os seguintes valores para os parâmetros:

beta = 0.1 (taxa de infecção)

gamma = 0.01 (taxa de recuperação)

Com isso, precisamos ainda definir qual o algoritmo numérico que será utilizado para resolver o sistema de 3 equações, qual o passo de tempo que utilizaremos e quanto tempo de simulação desejamos representar. Algumas horas? 1 semana? 1 mês? 6 meses? etc.

Aqui vou assumir que quem está lendo já entende alguma coisa sobre algoritmos numéricos e vamos utilizar a função de integração solve_ivp() da biblioteca scipy.integrate (lembrando que estamos usando a linguagem de programação Python).

Uma observação antes de continuar é que passos de tempo menores permitem uma melhor aproximação do resultado. Imagine que estamos avançando em direção a uma solução. Se dermos passos muito grandes e por algum motivo erramos um pouco a direção, fica difícil retomar o caminho sem dar um salto grande para corrigir. Mas se estamos caminhando dando passos bem pequenos, podemos fazer ajustes na trajetória sem precisar dar grandes saltos de forma que quem esta olhando de fora talvez nem perceba que chegamos a sair ligeiramente da rota correta. No caso da função solve_ivp() ela utiliza como padrão o método Runge-Kutta e o passo de tempo é determinado de acordo com o método.

Vamos supor que simularemos o que acontece no período de 100 dias, e que queremos dar passos de um dia. Nesse caso, calcularemos um valor para cada dia a partir da resolução do sistema considerando as condições iniciais acima (link para o código-fonte no final da postagem). O gráfico fica assim:

Talvez tenha visto gráficos parecidos com esse durante a pandemia… a linha laranja está representando os infectados e durante a pandemia modelos matemáticos semelhantes a esse foram bastante utilizados para prever os picos e propor soluções para diminuir ou “achatar” essa curva. Mais a frente vou deixar um link para o código no Google Colab para que possa criar uma copia e alterar os parâmetros e fazer novas simulações. Que mudanças no modelo fazem achatar a curva?

Nesse post vimos um exemplo de sistema de equações diferenciais e um exemplo de resolução desse sistema. Esse modelo representa as dinâmicas de como uma doença infecciosa se espalha. Mas como sabemos quais valores de parâmetros devemos utilizar no modelo? Esse é o assunto do próximo post.

Acesse aqui o código-fonte utilizado nesse exemplo.

Caso tenha dúvidas ou sugestões pode deixar um comentário!

Até o próximo post! 🙂

Calibrando modelos matemáticos de equações diferenciais – Parte 1 – motivação

Comecei a escrever esse post pensando em fazer um tutorial para os meus alunos que iniciam projetos de iniciação científica e ainda não estão familiarizados com esse processo de calibrar os parâmetros de modelos matemáticos. Mas daí pensei em deixar público aqui no blog pois não encontrei outro semelhante em português. Então fica um resumo para qualquer pessoa que começa a trabalhar com modelos matemáticos de equações diferenciais e precisa calibrar o modelo para representar dados experimentais.

Esse primeiro post faz uma introdução ao uso de modelos matemáticos e a um exemplo de problema a ser resolvido. Se quiser ir direto para a parte de calibrar, pule para o post (ainda não postei atualizo em breve).

A linguagem de programação escolhida para o tutorial é o Python 3 por ser a que tenho mais utilizado com meus alunos no momento por ter curva de aprendizado suave e oferecer bibliotecas que simplificam o processo.

Dito isso, vamos começar pelo começo. Vamos supor que temos um determinado experimento ou fenômeno observado durante uma semana que gerou um conjunto de dados que foram medidos uma vez ao dia. Daí temos por exemplo o seguinte conjunto (array/vetor) com um valor representando cada dia:

Conjunto tempo (dias):

dias = [0 1 2 3 4 5 6]

Conjunto com os resultados (em uma determinada unidade qualquer) para cada dia:

valores = [1.0 1.1 1.2 1.3 1.4 1.5 1.6]

Observando esses dados podemos pensar em uma função simples que representa esses valores que estão crescendo monotonicamente. Uma equação da reta seria suficiente para representar esse conjunto de dados. No gráfico abaixo estamos plotando os pontos gerados para cada dia (eixo horizontal) e cada valor obtido (eixo vertical). E também uma reta que passa por todos esses pontos.

Considerando o primeiro e o segundo ponto podemos calcular o coeficiente angular dessa reta:

m = y1 – y0 / x1 – x0

= 1.1 – 1 / 1 – 0

= 0.1

Feito isso, escolhemos por exemplo o primeiro ponto e substituímos na equação:

y – y0 = m (x – x0)

y – 1.0 = 0.1 (x – 0)

y = 0.1 x + 1 <— essa é a equação para calcular os valores de y (na unidade desejada) a partir dos valores de x (o tempo em dias nesse exemplo). Se quisermos prever o que vai acontecer no dia 30 basta substituir o x por 30 nessa equação:

y = 0.1 (30) + 1

y = 4

Visualmente, se aplicarmos a equação para os pontos entre 0 e 30 temos a seguinte reta:

Esse exemplo serve apenas para demonstrar que é possível encontrar uma equação que represente um conjunto de dados e nos permita fazer previsões. Caso tudo se mantenha da mesma forma podemos prever os resultados dos experimentos para quaisquer dias.

Seria maravilhoso se todos os resultados de experimentos se comportassem como uma simples reta. Mas, frequentemente, estamos interessados em fenômenos mais complexos em que equações da reta ou polinômios não são suficientes para representar. Podemos precisar de outros tipos de modelos matemáticos para representar, por exemplo, as dinâmicas de interações entre células e moléculas do sistema imunológico (que é minha area de maior interesse e experiência nos últimos anos) ou como uma doença se espalha entre as pessoas? Ou como prever quando um osso vai quebrar? Para estudar esses comportamentos precisamos representar as concentrações dessas células, moléculas ou indivíduos ao longo do tempo e em alguns casos, podemos estudar também dinâmicas em mais de uma dimensão, quando precisamos também identificar como as células (ou as pessoas) se espalham pelo espaço.

Esse será o assunto do próximo post! Veremos um exemplo de uso de equações diferenciais para representar uma epidemia.

Material de apoio: acesse aqui o colab com exemplos de como gerar os gráficos do post usando Python.