Modelo SIR e Previsão do Caso Brasileiro

Introdução

O avanço da Pandemia causada pelo vírus COVID-19 trouxe o interesse de pesquisadores de distintas áreas em mensurar o avanço e impactos da doença. Nosso interesse neste momento é conhecer um modelo epidemiológico simples que nos permita inferir a trajetória de crescimento da epidemia, bem como a necessidade de leitos que essa venha a apresentar para o país.

Isso posto, vamos utilizar o pacote, recém lançado no R, chamado nCov2019 para a obtenção da série histórica. Além desse, utilizaremos os pacotes dplyr, deSolve, xts e highcharter. O primeiro será utilizado para organizar os dados, o segundo para resolver equações diferenciais e o terceiro para criar séries temporais descontínuas e o último para plotar os gráficos.

library(nCov2019)
library(dplyr)
library(deSolve)
library(xts)
library(highcharter)
library(widgetframe)

### Obtenção dos Dados

Dados         <- load_nCov2019()
Dados_Brasil  <- Dados$global %>%
                 filter(country == 'Brazil')

Infectados   <- Dados_Brasil$cum_confirm
Dias         <- seq(1,length(Infectados),by =1)
N            <- 211305000 # População do Brasil segundo IBGE em 2020.

tail(Dados_Brasil)
##          time country cum_confirm cum_heal cum_dead
## 28 2020-03-24  Brazil        1965      150       34
## 29 2020-03-25  Brazil        2271      150       47
## 30 2020-03-26  Brazil        2587      150       61
## 31 2020-03-27  Brazil        2988      150       77
## 32 2020-03-28  Brazil        3477      150       93
## 33 2020-03-29  Brazil        3904      150      114

Na parte acima do Script, carregamos os pacotes que serão utilizados, utilizamos a função load_nCov2019() para baixar os dados mais recentes sobre reports de COVID-19 nos países. Observamos as últimas observações da série brasileira através da função tail, bastante conhecida.

O Modelo SIR (Susceptible, Infectious and Recovered)

O modelo SIR é composto por três EDOs, que representam: (a) Pessoas suscetíveis a infecção; (b) Pessoas Infectadas; (c) Pessoas recuperadas (imunizadas). Matematicamente, podem ser expressas pelo seguinte sistema: \[\begin{array}{l} \partial S(t)/\partial t=-(\beta/N).S(t).I(t)\\ \partial I(t)/\partial t=(\beta/N).I(t).S(t)-\gamma.I(t)\\ \partial R(t)/\partial t=\gamma.I(t) \end{array}\] Onde \(S(t)\) são os suscetíveis, \(I(t)\) População infectada, \(R(t)\) é o número de Recuperados (imunizados) do Modelo.

Na sequência definimos no R o sistema através da seguinte função:

### Utilizando o modelo SIR

SIR <- function(time, state, parameters) {
  with(as.list(c(state, parameters)),
  {
    dS <- -beta * I * S/N
    dI <- beta/N * I * S - gamma * I
    dR <- gamma * I
    return(list(c(dS, dI, dR)))
  })
}

### Valores para as variáveis estado
Inicial <- c(S = N-Infectados[1], I = Infectados[1], R = 0)

Iremos então resolver o sistema de EDOs (integrá-las) e estimar os parâmetros com base nos dados observados de infectados acumulados no Brasil. Para essa estimação, iremos fazer uso do algoritmo simplex de otimização com restrições para valores máximos e mínimos dos parâmetros. Na primeira parte, desenhamos uma função que gera a Soma dos Quadrados dos Resíduos e essa função é otimizada para obtenção dos parâmetros estimados.

SQR <- function(parameters) {
  names(parameters) <- c("beta", "gamma")
  out <- ode(y = Inicial, times = Dias, func = SIR, parms = parameters)
  fit <- out[,3]
  sum((Infectados - fit)^2)
}

Opt <- optim(c(0.5, 0.5), SQR,
             method = "L-BFGS-B",
             lower = c(0, 0), 
             upper = c(1, 1))

Opt_par <- setNames(Opt$par, c("beta", "gamma"))

Na sequência, fazemos a projeção da curva estimada tendo como base os parâmetros obtidos anteriormente.

t <- 1:120 # time in days
fit <- data.frame(ode(y = Inicial, times = t,
                      func = SIR, parms = Opt_par))

Datas = seq(Dados_Brasil$time[1], 
            length.out = length(t), 
            by='1 days')

Previsao_IF <- xts(fit$I, order.by = Datas)
Previsao_S  <- xts(fit$S, order.by = Datas)
Previsao_R  <- xts(fit$R, order.by = Datas)
Observado   <- xts(Dados_Brasil$cum_confirm, order.by = Dados_Brasil$time)


# Plot Highcharter
frameWidget(hchart(Previsao_IF, type = "line", color = "red", name = "Série Prevista") %>%
      hc_title(text = "Contaminados por COVID-19 e Previsão (Modelo SIR Estimado)") %>%
      hc_add_series(Observado, type = "scatter", color = "black", name = "Casos Confirmados") %>%
      hc_subtitle(text = "Dados Diários - Pacote nCovid19") %>%
      hc_tooltip(pointFormat = '({point.x: %Y-%m-%d}) 
                                 {point.y:.0f} Casos') %>%
      hc_xAxis(plotBands = list(
      list(label = list(text = "Previsão"),
      color = 'lightgrey',
      from = datetime_to_timestamp(Datas[length(Dias)]+1),
      to = datetime_to_timestamp(Datas[length(Dias)]+length(t))))))
frameWidget(hchart(Previsao_S, type = "line", color = "magenta", name = "Previsão Suscetíveis") %>%
  hc_title(text = "Dinâmica SIR entre Variáveis Suscetíveis e Recuperados") %>%
  hc_add_series(Previsao_R, type = "line", color = "blue", name = "Previsão Recuperados") %>%
  hc_tooltip(pointFormat = '({point.x: %Y-%m-%d}) 
                                 {point.y:.0f} Casos'))

A figura anterior, relacionda a curva de infectados, aponta uma informação importante. O pico da curva se dá em 30/04. Neste momento, levando em consideração que temos 20% dos casos necessitando internação hospitalar, teríamos a necessidade de cerca de 1 milhão e 600 mil leitos no dia. Certamente, nesse número sofreremos da escassez de leitos e o sistema não dá vazão a sua demanda. Por conta disso, a paralização é um instrumento utilizado no sentido de deixar a curva mais plana. Somente assim, o sistema daria conta de atender a demanda que surge.

Júlio Fernando Costa Santos
Júlio Fernando Costa Santos
Professor of Economics

My research interests include Finance, Macroeconomics and Econometric techniques.

Related