Resultados

library(raster)
library(sf)
library(ggplot2)
library(DT)
library(ggrepel)
library(geobr)
library(leaflet)
library(leaflet.extras)
library(RColorBrewer)
#remotes::install_github("liibre/coronabr", force=T)
library(coronabr)
library(magrittr)
library(tidyverse)



muni <- read_municipality(code_muni= "BA", year=2017, showProgress = F)
sede <- read_municipal_seat(year= 2010, showProgress = F)

sede$longitude <- as.numeric(gsub(".*?([-]*[0-9]+[.][0-9]+).*", "\\1", sede$geom))
sede$latitude <- as.numeric(gsub(".* ([-]*[0-9]+[.][0-9]+).*", "\\1", sede$geom))


sede <- subset(sede, abbrev_state=="BA")



baz <- as.data.frame(sede[,c(2,4,9:10)])
baz <- baz[-5]

mapba <- merge(muni,baz) 


options(DT.options = list(scrollY="100vh"))



dad <-get_corona_br()
ba <- subset(dad, state=="BA" & place_type == "city" & is_last == "True")
ba$city <- iconv(ba$city, "UTF-8")
ba <- subset(ba, city != "Importados/Indefinidos")




bahia.all <- ba %>%  mutate(ranking = dense_rank(desc(confirmed)))


k <- 10
top.citys <- bahia.all %>% filter(ranking <= k) %>%
  arrange(ranking) %>% pull(city) %>% as.character()


top.citys %<>% c('Outras')
data.bahia <- bahia.all %>% filter(!is.na(city)) %>%
  mutate(city=ifelse(ranking <= k, as.character(city), 'Outras')) 

top10 <- subset(data.bahia, city != "Outras")

top10$deaths[top10$deaths == 0] <- NA

max.date <- top10$date[1]

idx <- order(top10$confirmed, decreasing = T)
levels <- top10$city[idx]
top10$city <- factor(top10$city, levels=levels, ordered=TRUE)


top.10.long <- top10 %>% select(city,
                                confirmed,
                                confirmed_per_100k_inhabitants,
                                death_rate,
                                deaths) %>%  mutate(death_rate = death_rate * 100) %>% 
                                             gather(key = type, value = count,-city)


top.10.long %<>% mutate(type=recode_factor(type,
                                           confirmed='Casos Confirmados',
                                           confirmed_per_100k_inhabitants='Por 100 mil habitantes',
                                           deaths='Óbitos',
                                           death_rate='Letalidade (%)'))


top.10.long %>% ggplot(aes(x=city, y=count, fill=city, group=city, label=count)) +
  geom_bar(stat='identity') +
  #geom_text(aes(label=count, y=count), size=21, vjust=-1) +
  xlab('') + ylab('') +
  geom_text(aes(label= round(count,1)),
            vjust = -0.2,
            angle=0,
            color="black",
            position = position_dodge(1),
            size =2.5)+
  labs(title=paste0('Top 10 municípios da Bahia em casos de COVID-19 - ', max.date),
       caption = "Cid Póvoas / Fonte: Secretaria de Saúde da Bahia") +
  scale_fill_discrete(name='', labels=aes(count)) +
  theme_minimal()+
  theme(legend.title=element_blank(),
        legend.position='none',
        plot.title=element_text(size=11),
        axis.text=element_text(size=9),
        axis.text.x=element_text(angle=45, hjust=1)) +
  facet_wrap(~type, ncol=2, scales='free_y')

BAm <- as(mapba, "sf")
names(ba)[9] <- "code_muni"



bacorona = merge(BAm, ba, by = "code_muni")
bacorona <- st_transform(bacorona, 4326)





darkcols <- brewer.pal(8, "YlOrRd")
darkcols <- darkcols[2:8]

bins <- c(0, 2, 5, 15, 20, 30, 50, 100, 200)
pal_fun <- colorBin(darkcols, domain = bacorona$confirmed_per_100k_inhabitants, bins = bins)

bins2 <- c(1, 5, 10 ,20, 50, 100, 200, 500)
pal_fun2 <- colorBin(darkcols, domain = bacorona$confirmed, bins = bins2)


p_popup <-  paste0("Casos/100mil hab. em ", bacorona$city, "<strong>: </strong>"  , round(bacorona$confirmed_per_100k_inhabitants,1))

p_popup2 <-  paste0("Número de casos em ", bacorona$city, "<strong>: </strong>"  , round(bacorona$confirmed,0))

Mapa de concentração de casos por 100 mil habitantes

Heatmap

leaflet(bacorona) %>%
  addHeatmap(lng = ~as.numeric(bacorona$longitude), lat = ~as.numeric(bacorona$latitude), intensity = ~bacorona$confirmed_per_100k_inhabitants,
             blur = 20, max = 10, radius = 15) %>% addTiles() 

Mapa de número de casos por 100 mil habitantes

leaflet(bacorona) %>%
  addPolygons(
    stroke = FALSE,
    fillColor = ~ pal_fun(confirmed_per_100k_inhabitants),
    fillOpacity = 5,
    smoothFactor = 0.1,
    popup = p_popup
  ) %>%
  addTiles() %>%
  addLegend("bottomright",
            pal = pal_fun,
            values =  ~ confirmed_per_100k_inhabitants,
            title = 'Casos/100mil hab.')

Mapa de número de casos

leaflet(bacorona) %>%
  addPolygons(
    stroke = FALSE,
    fillColor = ~ pal_fun2(confirmed),
    fillOpacity = 5,
    smoothFactor = 0.1,
    popup = p_popup2
  ) %>%
  addTiles() %>%
  addLegend("bottomright",
            pal = pal_fun2,
            values =  ~ confirmed,
            title = 'Número de casos')

Tabela

ba[c(-1:-2, -4, -7,-9)] %>%  mutate(confirmed_per_100k_inhabitants = 
                                        confirmed_per_100k_inhabitants %>% 
                                        round(1),
                                        death_rate = death_rate*100  %>% round(1)) %>%
  datatable(
    .,
    rownames = FALSE,
    filter = "top",
    extensions = c('Buttons', 'Scroller'),
    options = list(
      dom = 'Blfrtip',
      bPaginate = TRUE,
      buttons =  'excel',
      deferRender = T,
      scroller = TRUE
    ),
    colnames = c('Cidade' = 1, 'Confirmados' = 2, 'Por 100k' = 5, 'Letalidade (%)' = 6, 'Óbitos' = 3, 'População' = 4 )
  )
ba2 <- subset(dad, state == "BA" &  place_type == "city")
ba2$city <- iconv(ba2$city, "UTF-8")
ba2 <- subset(ba2, city != "Importados/Indefinidos")

ba2 %<>% group_by(city) %>% mutate(cum_cases = cumsum(confirmed))

ba2.long <- ba2 %>%
  select(c(city, date, confirmed_per_100k_inhabitants)) %>%
  gather(key=type, value=count, -c(city, date))

ba2.long
## # A tibble: 1,100 x 4
## # Groups:   city [84]
##    city           date       type                            count
##    <chr>          <date>     <chr>                           <dbl>
##  1 Abaíra         2020-04-15 confirmed_per_100k_inhabitants 11.4  
##  2 Adustina       2020-04-15 confirmed_per_100k_inhabitants  5.87 
##  3 Alagoinhas     2020-04-15 confirmed_per_100k_inhabitants  3.30 
##  4 Araci          2020-04-15 confirmed_per_100k_inhabitants  1.84 
##  5 Aurelino Leal  2020-04-15 confirmed_per_100k_inhabitants  8.67 
##  6 Barra          2020-04-15 confirmed_per_100k_inhabitants  3.73 
##  7 Barra do Choça 2020-04-15 confirmed_per_100k_inhabitants  3.16 
##  8 Barra do Rocha 2020-04-15 confirmed_per_100k_inhabitants 52.5  
##  9 Barreiras      2020-04-15 confirmed_per_100k_inhabitants  0.643
## 10 Belmonte       2020-04-15 confirmed_per_100k_inhabitants  8.57 
## # ... with 1,090 more rows
ba2.long %<>% mutate(type=recode_factor(type,
                                         confirmed_per_100k_inhabitants='Casos confirmados popr 100 mil habitantes',
                                         deaths='Óbitos'))


gg_color_hue <- function(n) {
  hues = seq(15, 375, length = n + 1)
  hcl(h = hues, l = 65, c = 100)[1:n]
}


cgroup_cols = gg_color_hue(10)


ba2.long$city <- as.character(ba2.long$city)

focus_cn <- c("Salvador", "Ilhéus", "Itabuna", "Uruçuca", "Ipiaú")



ba2.long %>% filter(count > 1) %>%
  mutate(days_elapsed = (date) - min(date),
         end_label = ifelse(date == max(date), city, NA),
         end_label = case_when(city %in% focus_cn ~ end_label,
                               TRUE ~ NA_character_),
         cgroup = case_when(city %in% focus_cn ~ city,
                            F ~ "ZZOTHER")) %>%  
  ggplot(mapping = aes(x = days_elapsed, y = count,
                       color = cgroup, label = end_label,
                       group = city)) +
  geom_line(size = 0.7) +
  geom_text_repel(nudge_x = 0.75,
                  segment.color = NA) +
  guides(color = FALSE) +
  scale_color_manual(values = cgroup_cols) +
  scale_y_continuous(labels = scales::comma_format(accuracy = 1),
                     breaks = 2^seq(1, 19, 1),
                     trans = "log2") +
  labs(x = "Dias desde o primeiro caso confirmado",
       y = "Número acumulado de casos relatados (log2)",
       title = "Número acumulado de casos relatados de COVID-19 por 100 mil habitantes",
       subtitle = paste("Secretaria de Saúde do Estado", format(max(ba2.long$date), "%A, %B %e, %Y")),
       caption = "Cid Póvoas @cidedson / Data: Secretaria de Saúde da Bahia") +
  theme_classic()

SIR Model

ios <-  ba2 %>% filter(city == "Ilhéus") %>%
  select(c(city, date, confirmed)) %>% arrange(date) %>%
  gather(key=type, value=count, -c(city, date))


Infectados <- c(ios$count)

inicio <- min(ios$date)
dia <- 1:(length(Infectados))
Day <- inicio+dia
N <- 162327 # população de Ilhéus


old <- par(mfrow = c(1, 2))
plot(Day, Infectados, type = "b")
plot(Day, Infectados, log = "y")
abline(lm(log10(Infectados) ~ Day))
title("Confirmed Cases 2019-nCoV Ilhéus",
      outer = TRUE,
      line = -2)

par(mfrow = c(1, 2))

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


library(deSolve)

init <- c(S = N - Infectados[1],
          I = Infectados[1],
          R = 0)

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

Opt <-
  optim(
    c(0.5, 0.5),
    RSS,
    method = "L-BFGS-B",
    lower = c(0, 0),
    upper = c(1, 1)
  )
#Opt$message

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


t <- 1:120


fit <-
  data.frame(ode(
    y = init,
    times = t,
    func = SIR,
    parms = Opt_par
  ))
col <- 1:3

matplot(
  fit$time,
  fit[, 2:4],
  type = "l",
  xlab = "Day",
  ylab = "Number of subjects",
  lwd = 2,
  lty = 1,
  col = col
)
matplot(
  fit$time,
  fit[, 2:4],
  type = "l",
  xlab = "Day",
  ylab = "Number of subjects",
  lwd = 2,
  lty = 1,
  col = col,
  log = "y"
)

points(dia, (Infectados))

legend(
  "bottomright",
  c("Susceptibles", "Infecteds", "Recovereds"),
  lty = 1,
  lwd = 2,
  col = col,
  inset = 0.05
)

title("SIR Model 2019-nCoV Ilhéus",
      outer = TRUE,
      line = -2)

par(old)
library(benford.analysis)

R0 <- setNames(Opt_par["beta"] / Opt_par["gamma"], "R0")


print(paste("R0 = ",round(as.numeric(R0),1)))
## [1] "R0 =  1.5"
print(paste("Número de infectados = ",(round(fit[fit$I == max(fit$I), "I", drop = FALSE]$I,0))))
## [1] "Número de infectados =  9741"
print(paste("Data do pico = ",(as.Date(inicio+as.numeric(rownames(fit[fit$I == max(fit$I), "I", drop = FALSE]))) %>% format('%d %B %Y') )))
## [1] "Data do pico =  20 maio 2020"
print(paste("Letalidade em Ilhéus = ",paste(round((2/max(ios$count)*100),2), "%")))
## [1] "Letalidade em Ilhéus =  4.08 %"
print(paste("Estimativa de mortos com atual letalidade = ",(round((max(fit$I) * (2/max(ios$count))),0))))
## [1] "Estimativa de mortos com atual letalidade =  398"