Aulas do Curso de Modelagem matemática IV da FGV-EMAp
License: GPL3
Image: default
Modelando Doenças Infecciosas
Entendendo Epidemias como uma Reação Química
A modelagem do espalhamento de doenças infecciosas ou epidemias começou clássicamente como extensão dos princípios empregados na modelagem de reações químicas. Assumindo uma população "bem misturada", ou seja, em que a probabilidade de encontro entre qualquer par de indivíduos é igual.
Tais populações são então divididas em classes imunológicas, e a partir da interação entre indivíduos pertencentes a estas classes, a dinâmica se origina.
O modelo SI
No modelo SI temos apenas duas classes de indivíduos, os saudáveis, mas suscetíveis a contrair uma doença, e os que já foram infectados pela doença e pode portanto, espalhá-la por meio do contato direto. Note que nem todas as doenças se transmitem desta forma, mas neste modelo inicial vamos considerar que sim. O indivíduos transitam entre estes dois estados por meio de eventos de infecção () e recuperação ()
em termos de "reações" temos:
Escrevendo as Equações
Novamente lançaremos mão da lei de ação de massas e do fato de que o sistema é fechado, ou seja o número de indivíduos não varia.
Utilizamos ps parâmetros e para representar as taxas de infecção e recuperação, respectivamente.
Exercícios:
Mostre que a população total é conservada no modelo SI.
O Modelo SI apresentado acima poderia ser simplificado para uma única equação diferencial? Se sim, escreva esta equação.
Aplicando Análise Dimensional ao Modelo
Vamos adotar as unidades de tempo em dias. Logo, o lado esquerdo das equações terá unidades de [número de pessoas]/[dias]. Logo, concluímos que possui unidades dias enquanto tem unidades de pessoas dias, ou seja, é uma taxa de infecção per capita.
Exercício 3:
Dada a análise dimensional acima, que parâmetros (ou combinação de parâmetros) carrega a informação sobre a estala de tempo? e qual seria uma escala de tempo adequada para descrever os eventos descritos pelo modelo?
Adimensionalizando o modelo
Seja a fração da população no estado infeccioso e a fração da população total suscetível no tempo . Vamos assumir que estas variáveis adimensionais somam , ou seja, . temos então:
se então:
Agora podemos substituir as novas variáveis adimensionais no modelo e obter:
Cancelando os fatores comuns e em ambos os lados das duas equações, chegamos a:
Agora podemos notar que restou uma razão de parâmetros que vamos denotar por . Este novo parâmetro é muito importante e controla completamente o comportamento qualitativo do modelo, como veremos mais adiante. Por ora, vamos re-escrever o modelo em trmos do e deixar de lado as :
Se repetirmos o processo de adimensionalização para o modelo reduzido a uma única equação, derivado no exercício 2, acima, chegamos à seguinte equação:
ou, em termos do R_0:
Exercício 4:
Considere que é o tempo típico de recuperação, o que significa o tempo em que a pessoa está doente e pode transmitir a doença para outros. Suponha que inicialmente tenhamos uma única pessoa infectada em uma população de indivíduos suscetíveis (para grande ). Explique o significado de R_0 para a dinâmica da epidemia.
Analisando o Modelo
Agora que temos o modelo construído e devidamente simplificado, pessemos à sua análise aplicando as ferramentas que já conhecemos.
Encontrando os Equilíbrios
Vamos partir do modelo reduzido a uma equação, expresso em tremo do . Lembre-se que os equilíbrios devem satisfazer .
Exercício 5
Encontre os equilíbrios, se estes existirem, e interprete os resultados.
O equilíbrio em que , nosso número de infectados é 0, é chamado de equilíbrio livre de doença, e neste caso .
Exercício 6:
No caso em que , qual o valor de ?
É importante notar também que o "equilíbrio endêmico" só faz sentido, biologicamente falando, se , logo também precisa ser maior que 1. O que nos leva ao seguinte teorema:
Teorema:
Em um modelo SI, uma doença só pode tornar-se endêmica, se , onde é o numero reprodutivo básico da doença, .
Comportamento Qualitativo
Para aplicar nosso inspeção gráfica dos equilíbrios do sistema, precisamos plotar
Simulações
Bifurcações
Com vimos acima, o valor de parece ser um ponto de bifurcação para este modelo dada a alteração na natureza dos seus equilíbrios. Vamos construir um diagrama de bifurcações em função de :
Exercício 7:
Interprete a bifurcação acima e diga que tipo de bifurcação dentre as estudadas nós observamos acima
O Modelo SIR
Se extendermos o cenário epidemico que deu origem ao modelo SI, com a introdução da possibilidade dos indíviduos acometidos pela doença tornarem-se imunes à doença, obtemos outro modelo epidemiológico clássico, o modelo SIR., que pode ser descrito por meio do seguinte sistema de EDOs:
Exercício 8:
Interprete as equações acima e esboçe um diagrama de blocos para o modelo SIR
Exercício 9:
Explique porque o modelo acima pode ser estudado como um sistema de apenas duas variáveis. Qual variável não encontra-se acoplada às outras duas?
Exercício 9.5:
Analise o modelo SIR com apenas as duas primeiras equações de forma similar ao que foi feito como o modelo SI. Encontre a expressão do para este modelo, e os valores de e no equilíbnrio endêmico.
Exercício 10:
Divida por e simplifique a equação para obter uma EDO para I em função de S. Resolva a equação, obtendo a seguinte solução: , plote a solução e interprete.
Agora podemos resolver facilmente a equação simplificada:
E, após atribuir valores a e podemos plotar a solução e interpretá-la
A partir desta função, podemos encontrar o número máximo de infectados, em uma epidemia. Ele ocorre quando .
A partir de um exame rápido da orbita obtida pelo gráfico implícito acima, vemos que ela nunca alcança o eixo do , ou seja, sempre será positivo. Isto significa que uma fração da população sempre escapará da epidemia.
Exercício 11:
Fazer a Análise dimensional da Solução encontrando a dimensão da constante e sua interpretação epidemiológica.
Simulando o Modelo SIR
Podemos também explorar o modelo por meio de simulações noméricas
Analisando o final da Epidemia
Será que os suscetíveis são necessáriamente consumidos completamente durante uma epidemia?
Para tentar responder a esta pergunta, podemos dividir a 1ª equação do modelo SIR pela 3ª.
A partir de agora vamos interpretar os nossas variáveis , , como Frações de N, ou seja, , , , Isto faz com que a nossa expressão para se reduza a , assumindo .
Podemos então reescrever a equação obtida acima como
Onde é
---------------------------------------------------------------------------
ValueError Traceback (most recent call last)
~/Downloads/SageMath/local/lib/python3.9/site-packages/sage/ext/fast_callable.pyx in sage.ext.fast_callable.ExpressionTreeBuilder.var (build/cythonized/sage/ext/fast_callable.c:6739)()
687 try:
--> 688 ind = self._vars.index(var_name)
689 except ValueError:
ValueError: 'mu' is not in list
During handling of the above exception, another exception occurred:
ValueError Traceback (most recent call last)
<ipython-input-40-bff2ed881582> in <module>
4 s0 = Integer(100)
5 pretty_print(html("$R_0={}$".format(beta*s0/mu)))
----> 6 plot(s0*exp(-beta*s0*S/mu), (S, Integer(0),Integer(10)),axes_labels=["R","S"])
~/Downloads/SageMath/local/lib/python3.9/site-packages/sage/misc/decorators.py in wrapper(*args, **kwds)
489 options['__original_opts'] = kwds
490 options.update(kwds)
--> 491 return func(*args, **options)
492
493 #Add the options specified by @options to the signature of the wrapped
~/Downloads/SageMath/local/lib/python3.9/site-packages/sage/plot/plot.py in plot(funcs, *args, **kwds)
1955
1956 if hasattr(funcs, 'plot'):
-> 1957 G = funcs.plot(*args, **original_opts)
1958
1959 # If we have extra keywords already set, then update them
~/Downloads/SageMath/local/lib/python3.9/site-packages/sage/symbolic/expression.pyx in sage.symbolic.expression.Expression.plot (build/cythonized/sage/symbolic/expression.cpp:65691)()
12298 param = A[0]
12299 try:
> 12300 f = self._plot_fast_callable(param)
12301 except NotImplementedError:
12302 return self.function(param)
~/Downloads/SageMath/local/lib/python3.9/site-packages/sage/symbolic/expression.pyx in sage.symbolic.expression.Expression._plot_fast_callable (build/cythonized/sage/symbolic/expression.cpp:66073)()
12344 """
12345 from sage.ext.fast_callable import fast_callable
> 12346 return fast_callable(self, vars=vars, expect_one_var=True)
12347
12348 ############
~/Downloads/SageMath/local/lib/python3.9/site-packages/sage/ext/fast_callable.pyx in sage.ext.fast_callable.fast_callable (build/cythonized/sage/ext/fast_callable.c:4707)()
455
456 etb = ExpressionTreeBuilder(vars=vars, domain=domain)
--> 457 et = x._fast_callable_(etb)
458
459 if isinstance(domain, RealField_class):
~/Downloads/SageMath/local/lib/python3.9/site-packages/sage/symbolic/expression.pyx in sage.symbolic.expression.Expression._fast_callable_ (build/cythonized/sage/symbolic/expression.cpp:64918)()
12181 """
12182 from sage.symbolic.expression_conversions import fast_callable
> 12183 return fast_callable(self, etb)
12184
12185 def show(self):
~/Downloads/SageMath/local/lib/python3.9/site-packages/sage/symbolic/expression_conversions.py in fast_callable(ex, etb)
1967
1968 """
-> 1969 return FastCallableConverter(ex, etb)()
1970
1971 class RingConverter(Converter):
~/Downloads/SageMath/local/lib/python3.9/site-packages/sage/symbolic/expression_conversions.py in __call__(self, ex)
215 if getattr(self, 'use_fake_div', False) and (operator is _operator.mul or operator is mul_vararg):
216 div = self.get_fake_div(ex)
--> 217 return self.arithmetic(div, div.operator())
218 return self.arithmetic(ex, operator)
219 elif operator in relation_operators:
~/Downloads/SageMath/local/lib/python3.9/site-packages/sage/symbolic/expression_conversions.py in arithmetic(self, ex, operator)
1895 elif operator == mul_vararg:
1896 operator = _operator.mul
-> 1897 return reduce(lambda x,y: self.etb.call(operator, x,y), operands)
1898
1899 def symbol(self, ex):
~/Downloads/SageMath/local/lib/python3.9/site-packages/sage/symbolic/expression_conversions.py in <lambda>(x, y)
1895 elif operator == mul_vararg:
1896 operator = _operator.mul
-> 1897 return reduce(lambda x,y: self.etb.call(operator, x,y), operands)
1898
1899 def symbol(self, ex):
~/Downloads/SageMath/local/lib/python3.9/site-packages/sage/ext/fast_callable.pyx in sage.ext.fast_callable.ExpressionTreeBuilder.call (build/cythonized/sage/ext/fast_callable.c:7204)()
742 return self(base)**exponent
743 else:
--> 744 return ExpressionCall(self, fn, [self(a) for a in args])
745
746 def choice(self, cond, iftrue, iffalse):
~/Downloads/SageMath/local/lib/python3.9/site-packages/sage/ext/fast_callable.pyx in sage.ext.fast_callable.ExpressionTreeBuilder.__call__ (build/cythonized/sage/ext/fast_callable.c:6320)()
616 return self.constant(x)
617
--> 618 return fc(self)
619
620 def _clean_var(self, v):
~/Downloads/SageMath/local/lib/python3.9/site-packages/sage/symbolic/expression.pyx in sage.symbolic.expression.Expression._fast_callable_ (build/cythonized/sage/symbolic/expression.cpp:64918)()
12181 """
12182 from sage.symbolic.expression_conversions import fast_callable
> 12183 return fast_callable(self, etb)
12184
12185 def show(self):
~/Downloads/SageMath/local/lib/python3.9/site-packages/sage/symbolic/expression_conversions.py in fast_callable(ex, etb)
1967
1968 """
-> 1969 return FastCallableConverter(ex, etb)()
1970
1971 class RingConverter(Converter):
~/Downloads/SageMath/local/lib/python3.9/site-packages/sage/symbolic/expression_conversions.py in __call__(self, ex)
224 return self.tuple(ex)
225 else:
--> 226 return self.composition(ex, operator)
227
228 def get_fake_div(self, ex):
~/Downloads/SageMath/local/lib/python3.9/site-packages/sage/symbolic/expression_conversions.py in composition(self, ex, function)
1933 {arctan2}(v_0, v_1)
1934 """
-> 1935 return self.etb.call(function, *ex.operands())
1936
1937 def tuple(self, ex):
~/Downloads/SageMath/local/lib/python3.9/site-packages/sage/ext/fast_callable.pyx in sage.ext.fast_callable.ExpressionTreeBuilder.call (build/cythonized/sage/ext/fast_callable.c:7204)()
742 return self(base)**exponent
743 else:
--> 744 return ExpressionCall(self, fn, [self(a) for a in args])
745
746 def choice(self, cond, iftrue, iffalse):
~/Downloads/SageMath/local/lib/python3.9/site-packages/sage/ext/fast_callable.pyx in sage.ext.fast_callable.ExpressionTreeBuilder.__call__ (build/cythonized/sage/ext/fast_callable.c:6320)()
616 return self.constant(x)
617
--> 618 return fc(self)
619
620 def _clean_var(self, v):
~/Downloads/SageMath/local/lib/python3.9/site-packages/sage/symbolic/expression.pyx in sage.symbolic.expression.Expression._fast_callable_ (build/cythonized/sage/symbolic/expression.cpp:64918)()
12181 """
12182 from sage.symbolic.expression_conversions import fast_callable
> 12183 return fast_callable(self, etb)
12184
12185 def show(self):
~/Downloads/SageMath/local/lib/python3.9/site-packages/sage/symbolic/expression_conversions.py in fast_callable(ex, etb)
1967
1968 """
-> 1969 return FastCallableConverter(ex, etb)()
1970
1971 class RingConverter(Converter):
~/Downloads/SageMath/local/lib/python3.9/site-packages/sage/symbolic/expression_conversions.py in __call__(self, ex)
215 if getattr(self, 'use_fake_div', False) and (operator is _operator.mul or operator is mul_vararg):
216 div = self.get_fake_div(ex)
--> 217 return self.arithmetic(div, div.operator())
218 return self.arithmetic(ex, operator)
219 elif operator in relation_operators:
~/Downloads/SageMath/local/lib/python3.9/site-packages/sage/symbolic/expression_conversions.py in arithmetic(self, ex, operator)
1895 elif operator == mul_vararg:
1896 operator = _operator.mul
-> 1897 return reduce(lambda x,y: self.etb.call(operator, x,y), operands)
1898
1899 def symbol(self, ex):
~/Downloads/SageMath/local/lib/python3.9/site-packages/sage/symbolic/expression_conversions.py in <lambda>(x, y)
1895 elif operator == mul_vararg:
1896 operator = _operator.mul
-> 1897 return reduce(lambda x,y: self.etb.call(operator, x,y), operands)
1898
1899 def symbol(self, ex):
~/Downloads/SageMath/local/lib/python3.9/site-packages/sage/ext/fast_callable.pyx in sage.ext.fast_callable.ExpressionTreeBuilder.call (build/cythonized/sage/ext/fast_callable.c:7204)()
742 return self(base)**exponent
743 else:
--> 744 return ExpressionCall(self, fn, [self(a) for a in args])
745
746 def choice(self, cond, iftrue, iffalse):
~/Downloads/SageMath/local/lib/python3.9/site-packages/sage/ext/fast_callable.pyx in sage.ext.fast_callable.ExpressionTreeBuilder.__call__ (build/cythonized/sage/ext/fast_callable.c:6320)()
616 return self.constant(x)
617
--> 618 return fc(self)
619
620 def _clean_var(self, v):
~/Downloads/SageMath/local/lib/python3.9/site-packages/sage/symbolic/expression.pyx in sage.symbolic.expression.Expression._fast_callable_ (build/cythonized/sage/symbolic/expression.cpp:64918)()
12181 """
12182 from sage.symbolic.expression_conversions import fast_callable
> 12183 return fast_callable(self, etb)
12184
12185 def show(self):
~/Downloads/SageMath/local/lib/python3.9/site-packages/sage/symbolic/expression_conversions.py in fast_callable(ex, etb)
1967
1968 """
-> 1969 return FastCallableConverter(ex, etb)()
1970
1971 class RingConverter(Converter):
~/Downloads/SageMath/local/lib/python3.9/site-packages/sage/symbolic/expression_conversions.py in __call__(self, ex)
210 operator = ex.operator()
211 if operator is None:
--> 212 return self.symbol(ex)
213
214 if operator in arithmetic_operators:
~/Downloads/SageMath/local/lib/python3.9/site-packages/sage/symbolic/expression_conversions.py in symbol(self, ex)
1916 ValueError: Variable 'z' not found
1917 """
-> 1918 return self.etb.var(SR(ex))
1919
1920 def composition(self, ex, function):
~/Downloads/SageMath/local/lib/python3.9/site-packages/sage/ext/fast_callable.pyx in sage.ext.fast_callable.ExpressionTreeBuilder.var (build/cythonized/sage/ext/fast_callable.c:6791)()
688 ind = self._vars.index(var_name)
689 except ValueError:
--> 690 raise ValueError("Variable '%s' not found" % var_name)
691 return ExpressionVariable(self, ind)
692
ValueError: Variable 'mu' not found
Examinando a estabilidade do ELD no modelo SIR
O Modelo SEIS
Vamos considerar uma extensão do Modelo SI, no qual os indivíduos infectados não se tornam imediatamente infecciosos, mas passam por um período de incubação
, logo
O modelo SEIR
Outra variação onde adicionamos a imunidade permanente ao SEIS: