R/mod_focus_20200331.R

Defines functions mod_0331_server mod_0331_ui

#' focus_20200331 UI Function
#'
#' @description A shiny Module.
#'
#' @param id,input,output,session Internal parameters for {shiny}.
#'
#' @noRd
#'
#' @importFrom shiny NS tagList
mod_0331_ui <- function(id) {
  ns <- NS(id)

  # User interface: WEB side
  fluidPage(
    fluidRow(
      box(
        width = 12,

        p("
          Sono stati analizzati i dati relativi al numero di casi
          positivi, al numero di tamponi effettuati, al numero di
          ospedalizzazioni, al numero di casi di terapia intensiva e al
          numero di decessi compresi nell'arco temporale dal 28 febbraio
          2020 al 30 marzo 2020 nelle regioni Piemonte e Veneto.
        "),

        p("
          Le due regioni hanno adottato approcci diversi nell'utilizzo
          del tampone naso-faringeo; il Piemonte ha applicato da subito
          le direttive del Consiglio Superiore di Sanit\u00E0  e nelle prime
          fasi dell'epidemia ha sottoposto a tampone solamente le
          persone che presentavano segni clinici da covid-19, ma che al
          contempo avessero i criteri epidemiologici (contatto con
          soggetto proveniente dalle zone a rischio); la regione Veneto,
          di sua iniziativa, ha ritenuto di sottoporre al tampone tutti
          i pazienti che presentavano sintomi da covid-19 e,
          probabilmente, i relativi contatti. Questo differente modus
          operandi ha portato nelle prime fasi dell'epidemia (dal 28
          febbraio al 8 marzo 2020) a evidenziare maggiori casi nella
          Regione Veneto (Figura 1).
        "),

        p("
          In data 8 marzo 2020 \u00E8  stata dichiarata la zona rossa estesa a
          tutta Italia con conseguente lock-down (progressivo) della
          circolazione e delle attivit\u00E0.
        "),

        p("
          Sebbene in una prima fase (circa una settimana) si sia
          continuato a vedere un numero inferiore di casi in Piemonte,
          le curve del numero di ospedalizzazioni delle due regioni,
          prese in esame, hanno subito una netta biforcazione a carico
          della Regione Piemonte, in cui si \u00E8  osservato un aumento
          significativo dei pazienti ospedalizzati (Figura 2), e
          parimenti anche le curve relative al ricorso alle terapie
          intensive (Figura 3) e il numero di decessi si sono
          distanziate nelle due realt\u00E0  (Figura 4).
        "),

        p("
          La separazione delle curve di ospedalizzazione delle due
          regioni attorno al 12 marzo (quando il Piemonte ha cominciato
          a crescere pi\u00F9  rapidamente del Veneto, pur avendo
          apparentemente meno casi) potrebbe essere l'effetto di un
          ridotto numero di tamponi che ha reso il numero delle persone
          individuate molto pi\u00F9  basso rispetto a quello reale,
          sovrastimando il dato di letalit\u00E0  (morti per la
          malattia/numero totale di affetti dalla malattia). La politica
          del Veneto di fare subito pi\u00F9  tamponi, probabilmente
          stimolata dalla individuazione del primo focolaio di Vo'
          Euganeo, ha incrementato, per lo meno nella fase iniziale,
          la possibilit\u00E0  di isolare i positivi, andando cos\u00EC  a
          proteggere le fasce di et\u00E0  pi\u00F9  a rischio e riducendo la
          circolazione del virus ancora prima del lock-down
          dell'8 marzo. Questa dinamica di separazione delle curve di
          crescita delle due regioni si \u00E8  riprodotta sui decessi con uno
          shift temporale di 5/6 giorni.
        "),

        p(HTML("
          Nella fase attuale dell'epidemia questo molto probabilmente
          comporta che:
          <br>
          <ol>
            <li> anche pazienti con sintomi, ma non risultanti positivi
                 vengono lasciati a casa e non avviano precocemente
                 alcuna terapia;
            <li> quando la situazione peggiora i pazienti si recano in
                 PS dove, se positivi, vengono ricoverati e possono
                 finalmente iniziare una terapia;
            <li> tuttavia iniziano la terapia pi\u00F9  tardivamente di quanto
                 forse necessario per prevenire la progressione verso la
                 ARDS e, probabilmente, l'uso tardivo del tocilizumab ha
                 meno possibilit\u00E0  di successo;
            <li> con conseguente aumento dei decessi.
          </ol>
        ")),

        p("
          La nostra analisi suggerisce che per modificare questa
          sequenza di eventi e ridurre la necessit\u00E0  di ricovero e
          soprattutto ottimizzare il ricorso alla terapia intensiva, \u00E8
          necessario implementare il numero delle diagnosi domiciliari,
          estendendo l'indicazione all'esecuzione del tampone ai
          pazienti pauci-sintomatici. Questo consentirebbe non solo di
          ridurre i contagi ma anche di avviare una terapia
          antiinfiammatoria e/o antivirale a domicilio sotto il
          controllo di equipe di medici dedicati, con l'intento di
          prevenire o almeno di attenuare e ritardare la progressione
          della malattia, ridimensionando la letalit\u00E0  di covid-19. A
          nostro avviso la gestione integrata tra ospedale e territorio
          potrebbe essere un approccio vincente.
        "),

        p("
          *Hanno contribuito all'Interpretazione dei dati Carmen Fava,
          Giuseppe Saglio (Dipartimento di Scienze Cliniche e
          Biologiche, Universit\u00E0  di Torino) e Andrea Ricotti
          (Dipartimento di Scienze della Sanit\u00E0  Pubblica e Pediatriche,
          Universit\u00E0  di Torino
        ")
      )
    ),

    fluidRow(
      ## qui i nomi dei plot vanno inclusi dentro `ns(<id>)`,
      ## lato server invece saranno messi solo come `output$<id>`
      box(
        width = 12, plotlyOutput(ns("fig1")),
        footer = "Figure 1. Andamento del totale casi con la sovrapposizione del numero di tamponi giornaliero (linea tratteggiata) in Piemonte ed in Veneto."
      )
    ),
    fluidRow(
      box(
        width = 12, plotlyOutput(ns("fig2")),
        footer = "Figure 2. Andamento del numero di ospedalizzati (totale ospedalizzati) in Piemonte ed in Veneto."
      )
    ),
    fluidRow(
      box(
        width = 12, plotlyOutput(ns("fig3")),
        footer = "Figure 3. Andamento del numero dei ricoveri in terapia intensiva in Piemonte ed in Veneto."
      )
    ),
    fluidRow(
      box(
        width = 12, plotlyOutput(ns("fig4")),
        footer = "Figure 4. Andamento del totale decessi in Piemonte ed in Veneto."
      )
    )
  )
}

#' focus_20200331 Server Function
#'
#' @importFrom plotly ggplotly config
#' @noRd
mod_0331_server <- function(id) {
  ## non interactive codes


  # data preparation ------------------------------------------------

  db <- dpc_covid19_ita_regioni %>%
    dplyr::filter(
      .data$denominazione_regione %in% c("Piemonte", "Veneto")
    ) %>%
    dplyr::mutate(
      day = lubridate::ymd_hms(.data$data),
      days = seq_along(.data$data)
    ) %>%
    # region_population is an internal data (see `data-raw/covid_ita.R`)
    # NOTE: replaced every `pop` w/ `residenti` accordingly
    dplyr::left_join(region_population) %>%
    dplyr::group_by(.data$denominazione_regione) %>%
    dplyr::arrange(.data$day) %>%
    dplyr::mutate(
      tamponi_day = .data$tamponi -
        dplyr::lag(.data$tamponi, default = 0),
      casi_day = .data$totale_casi -
        dplyr::lag(.data$totale_casi, default = 0)
    ) %>%
    # DRY: Do not Repeat yourself function `regional_poiss()` added to
    #      the internal (not exported, nor tested) functions,
    #      in `R/utils_regional_poiss.R`
    tidyr::nest() %>%
    ## all in a single nest call to save CPU time :-)
    dplyr::mutate(
      # hospitalization
      hosp_poiss = .data$data %>%
        purrr::map(regional_poiss, response = "totale_ospedalizzati"),
      hosp_cases = .data$hosp_poiss %>%
        purrr::map(stats::predict, type = "response"),

      # ICU
      icu_poiss = .data$data %>%
        purrr::map(regional_poiss, response = "terapia_intensiva"),
      icu_cases = .data$icu_poiss %>%
        purrr::map(stats::predict, type = "response"),

      # Death
      death_poiss = .data$data %>%
        purrr::map(regional_poiss, response = "deceduti"),
      death_cases = .data$death_poiss %>%
        purrr::map(stats::predict, type = "response")
    ) %>%
    ## non mi pare servano, inutile lasciarli ridondanti
    dplyr::select(-dplyr::ends_with("poiss")) %>%
    tidyr::unnest(
      cols = c(.data$data, dplyr::ends_with("cases"))
    )

  global_theme <- theme_bw() +
    theme(
      legend.title = element_blank(),
      panel.border = element_blank(),
      panel.grid.major = element_blank(),
      panel.grid.minor = element_blank(),
      axis.text.x = element_text(angle = 60, vjust = 0.5),
      axis.line = element_line(colour = "black")
    )


  #---- totale casi con tamponi ----
  gg_fig_1 <- db %>%
    ggplot(aes(
      x = .data$day,
      y = .data$totale_casi,
      col = .data$denominazione_regione
    )) +
    geom_point() +
    geom_smooth() +
    geom_line(
      aes(y = .data$tamponi_day),
      linetype = "dashed"
    ) +
    labs(y = "Totale casi") +
    global_theme



  #----- totale ospedalizzati ----
  gg_fig_2 <- db %>%
    ggplot(aes(
      x = .data$day,
      y = .data$totale_ospedalizzati,
      colour = .data$denominazione_regione
    )) +
    geom_point() +
    geom_line(aes(y = .data$hosp_cases)) +
    labs(x = "Giorno", y = "Totale ospedalizzati") +
    global_theme


  #-------- terapia intensiva----------
  gg_fig_3 <- db %>%
    ggplot(aes(
      x = .data$day,
      y = .data$terapia_intensiva,
      colour = .data$denominazione_regione
    )) +
    geom_point() +
    geom_line(aes(y = .data$icu_cases)) +
    labs(x = "Giorno", y = "Totale ricoveri in terapia intensiva") +
    global_theme


  #----  decessi ------
  gg_fig_4 <- db %>%
    ggplot(aes(
      x = .data$day,
      y = .data$deceduti,
      colour = .data$denominazione_regione
    )) +
    geom_point() +
    geom_line(aes(y = .data$death_cases)) +
    labs(x = "Giorno", y = "Totale decessi") +
    global_theme




  callModule(id = id, function(input, output, session) {
    ns <- session$ns
    ## interactive code

    ## The only interactive code here are the plots

    output$fig1 <- renderPlotly({
      ggplotly(gg_fig_1) %>%
        config(modeBarButtonsToRemove = c(
          "zoomIn2d", "zoomOut2d", "pan2d", "select2d", "lasso2d"
        )) %>%
        config(displaylogo = FALSE)
    })

    output$fig2 <- renderPlotly({
      ggplotly(gg_fig_2) %>%
        config(modeBarButtonsToRemove = c(
          "zoomIn2d", "zoomOut2d", "pan2d", "select2d", "lasso2d"
        )) %>%
        config(displaylogo = FALSE)
    })

    output$fig3 <- renderPlotly({
      ggplotly(gg_fig_3) %>%
        config(modeBarButtonsToRemove = c(
          "zoomIn2d", "zoomOut2d", "pan2d", "select2d", "lasso2d"
        )) %>%
        config(displaylogo = FALSE)
    })

    output$fig4 <- renderPlotly({
      ggplotly(gg_fig_4) %>%
        config(modeBarButtonsToRemove = c(
          "zoomIn2d", "zoomOut2d", "pan2d", "select2d", "lasso2d"
        )) %>%
        config(displaylogo = FALSE)
    })
  })
}

## To be copied in the UI
#> mod_0331_ui("focus_20200331_ui_1")

## To be copied in the server
#> callModule(mod_0331_server, "focus_20200331_ui_1")
UBESP-DCTV/covid19ita documentation built on May 15, 2024, 10:40 a.m.