35  Análise de Combinações

Essa análise gera um gráfico de frequência de diferentes combinações de valores e respostas. Nesse exemplo, geramos o gráfico da frequência casos exibiram várias combinações de sintomas.

Esse tipo de análise também é chamada de:

No gráfico de exemplo acima são mostrados cinco sintomas. Abaixo de cada barra vertical há uma linha e pontos indicando a combinação de sintomas refletidos pela barra de cima.

O primeiro método que mostraremos utiliza o pacote ggupset, e o segundo utiliza o pacote UpSetR.

35.1 Preparação

Carregue os pacotes R

O código abaixo realiza o carregamento dos pacotes necessários para a análise dos dados. Neste manual, enfatizamos o uso da função p_load(), do pacman, que instala os pacotes, caso não estejam instalados, e os carrega no R para utilização. Também é possível carregar pacotes instalados utilizando a função library(), do R base. Para mais informações sobre os pacotes do R, veja a página Introdução ao R.

pacman::p_load(
  tidyverse,     # manupulação de dados e visualização
  UpSetR,        # pacote especial para gráficos de combinção 
  ggupset,       # pacote especial para gráficos de combinção 
  appliedepidata) # dados de exemplo utilizados neste manual

Importe os dados

Para iniciar, importaremos a linelist dos casos de uma epidemia simulada do Ebola. Carregue diretamente com appliedepidata::get_data(name = "linelist_cleaned_rds") (consulte a página Baixar manual e dados para mais detalhes).

# importe a linelit de casos 
linelist_sym <- appliedepidata::get_data(name = "linelist_cleaned_rds")

Essa linelist inclui cinco variáveis do tipo “sim/não” (“sim/no”) a respeito dos sintomas relatados. Nós vamos precisar transformar essas variáveis um pouco para poder utilizar o pacote ggupset para fazer nosso gráfico. Confira os dados (role para a direita para ver as variáveis dos sintomas).

Reformate os valores

Para estarmos alinhados com o formato esperado pelo pacote ggupset vamos converter os “sim” e “não” para o real nome do sintoma utilizando a função case_when() do pacote dplyr. Caso seja “não”, definiremos o valor como vazio, então os valores serão NA ou o nome do sintoma.

# criar uma coluna com todos os sintomas separados por ponto-vírgula 
linelist_sym_1 <- linelist_sym %>% 

  # convert the "yes" and "no" values into the symptom name itself
  # if old value is "yes", new value is "fever", otherwise set to missing (NA)
mutate(fever = ifelse(fever == "yes", "fever", NA), 
       chills = ifelse(chills == "yes", "chills", NA),
       cough = ifelse(cough == "yes", "cough", NA),
       aches = ifelse(aches == "yes", "aches", NA),
       vomit = ifelse(vomit == "yes", "vomit", NA))

Agora nós geramos duas colunas finais:

  1. Concatenando (unindo) todos os sintomas do paciente (uma coluna de caracteres)
  2. Convertendo a coluna acima para a classe list, para que ela possa ser passada ao pacote ggupset para fazer o gráfico.

Veja a página de Caracteres e strings para aprender mais sobre a função unite() do pacote stringr

linelist_sym_1 <- linelist_sym_1 %>% 
  unite(col = "all_symptoms",
        c(fever, chills, cough, aches, vomit), 
        sep = "; ",
        remove = TRUE,
        na.rm = TRUE) %>% 
  mutate(
    # faz uma cópia de da coluna all_symptoms, mas na classe lista (que é requisito do ggupset() no próximo passo)
    all_symptoms_list = as.list(strsplit(all_symptoms, "; "))
    )

Veja a nova tabela. Note as duas colunas na extremidade da direta - os valores combinados, e a lista

35.2 ggupset

Carregue o pacote

pacman::p_load(ggupset)

Crie o gráfico. Vamos começar com um ggplot() e a função geom_bar(), mas depois vamos adicionar a função scale_x_upset() do pacote ggupset.

# manter as 10 combinações mais frequentes, as que n_intersections = 10 mostra
top_combinations <- linelist_sym_1 %>% 
  count(all_symptoms, sort = TRUE) %>% 
  slice_head(n = 10) %>% 
  pull(all_symptoms)

ggplot(
  data = filter(linelist_sym_1, all_symptoms %in% top_combinations),
  mapping = aes(x = all_symptoms_list)) +
geom_bar() +
scale_x_upset(
  reverse = FALSE,
  n_intersections = 10,
  sets = c("fever", "chills", "cough", "aches", "vomit"))+
labs(
  title = "Signs & symptoms",
  subtitle = "10 most frequent combinations of signs and symptoms",
  caption = "Caption here.",
  x = "Symptom combination",
  y = "Frequency in dataset")

Mais informações sobre ggupset podem ser vistas online ou offline na documentação do pacote na aba de Ajuda do seu RStudio após digitar ?ggupset no console.

35.3 UpSetR

O pacote UpSetR permite mais personalizações do gráfico, mas pode ser mais difícil de executar.

Carregue o pacote

pacman::p_load(UpSetR)

Limpando os dados

Precisamos converter os valores dos sintomas da linelist para 1 / 0.

linelist_sym_2 <- linelist_sym %>% 
  # converte os valores de "sim" e "não" nos nomes dos sintomas
     mutate(fever = ifelse(fever == "yes", 1, 0), 
            chills = ifelse(chills == "yes", 1, 0),
            cough = ifelse(cough == "yes", 1, 0),
            aches = ifelse(aches == "yes", 1, 0),
            vomit = ifelse(vomit == "yes", 1, 0))

Se você tiver interesse em um comando mais eficiente, pode aproveitar a função +(), que converte para 1s e 0s a partir de uma declaração lógica. Este comando utiliza a função across() para alterar múltiplas colunas de uma só vez (leia mais em Limpeza de dados e funções essenciais).

# Efficiently convert "yes" to 1 and 0
linelist_sym_2 <- linelist_sym %>% 
  
  # convert the "yes" and "no" values into 1s and 0s
  mutate(across(c(fever, chills, cough, aches, vomit), .fns = ~+(.x == "yes")))

Agora vamos fazer o gráfico utilizando a função upset() - utilizando apenas as colunas de sintomas. Você deve definir quais “conjuntos” serão comparados (passe os nomes das colunas de sintomas). Ou então, utilize nsets = e order.by = "freq" para mostrar apenas as maiores X combinações.

# Make the plot
linelist_sym_2 %>% 
  drop_na(fever, chills, cough, aches, vomit) %>% 
  UpSetR::upset(
       sets = c("fever", "chills", "cough", "aches", "vomit"),
       order.by = "freq",
       sets.bar.color = c("blue", "red", "yellow", "darkgreen", "orange"), # optional colors
       empty.intersections = "on",
  # nsets = 3,
       number.angles = 0,
       point.size = 3.5,
       line.size = 2, 
       mainbar.y.label = "Symptoms Combinations",
       sets.x.label = "Patients with Symptom")

35.4 Recursos

Página do github do UpSetR

Uma versão em Shiny App - você pode fazer upload de seus próprios dados

*documentação - difícil de interpretar