Ciência de Dados em Saúde

Tratamento e Apresentação de dados

Prof. Marcelo Ferreira

DE/UFPB – PPGMDS/UFPB

Tópicos abordados

  • Conceitos básicos;

  • Encadeamento com o operador pipe;

  • Tratamento de dados com dplyr;

  • Tabelas com gtsummary;

  • Vizualização gráfica com ggplot2.

Conceitos básicos

  • Tratamento, apresentação e pré-processamento de dados são tarefas obrigatórias em Ciência de Dados;

  • Quanto mais conhecimento obtivermos sobre os dados, maior a chance de sucesso nas etapas posteriores;

  • Contudo, precisamos fazer isso de maneira eficiente, o que requer

    • Conhecer as etapas do processo;
    • Dominar as tecnologias que se prestam a esse fim.
  • Além de R e Python, existem diversas outras plataformas computacionais que possuem funções para essas tarefas;

  • Neste curso, manteremos nosso foco na linguagem R, por ser gratuita e de código aberto e possuir uma vasta comunidade composta por profissionais, cientistas e entusiastas, dentre outros;

  • Também focaremos na abordagem tidyverse.

Conceitos básicos

  • tidyverse é uma reimplementação e extensão de funcionalidades básicas da linguagem R para tratamento e apresentação de dados;
  • É composta por oito bibliotecas que foram concebidas para trabalhar em harmonia;

  • As bibliotecas que compõem a tidyverse compartilham características filosofia, gramática, organização e estrutura de dados;

  • Existem outras bibliotecas que se acoplam ao tidyverse;

  • Facilita o desenvolvimento e a portabilidade de código.

Bibliotecas que compõem o tidyverse

Conceitos básicos

  • A estrutura tabular é o formato básico em Ciência de Dados, em que cada linha representa uma observação e cada coluna representa uma variável;

  • Dados tabulares são armazenados em R (e em outras linguagens) como Data Frames;

  • A biblioteca tibble implementa Data Frames otimizados para trabalhar com a tidyverse;

  • A leitura de dados como “tibbles” pode ser feita através das funções da biblioteca readr:

    • read_csv() lê arquivos delimitados por vírgulas;
    • read_csv2() lê arquivos delimitados por ponto e vírgula;
    • read_tsv() lê arquivos delimitados por tabulações;
    • read_delim() lê arquivos com qualquer delimitador de campo. read_csv(), read_csv2() e read_tsv() são casos especiais de read_delim().

Conceitos básicos

  • Você deve estar se perguntando o porquê de se usar as funções de readr em detrimento das funções nativas equivalentes de R;

  • Um boa razão é a velocidade. As funções de readr são muito rápidas e isso faz diferença se você estiver trabalhando com conjuntos de dados muito grandes;

  • A biblioteca readr também tem funções para escrever dados: write_csv() e write_tsv();

  • A sintaxe dessas funções é similar à sintaxe das outras funções de readr;

  • Além de readr, há funções da biblioteca haven para ler arquivos SPSS, Stata e SAS;

  • Já a biblioteca readxl possui funções para ler arquivos com as extensões .xls e .xlsx.

Conceitos básicos

Vamos considerar o conjunto de dados de um estudo com o objetivo de investigar um grupo de 341 pacientes com câncer de mama e que passaram por intervenção cirúrgica. Esse conjunto de dados pode ser baixado aqui. O objetivo é prever a sobrevivência dos pacientes após a cirurgia. Em meu computador, estes dados estão armazenados no arquivo BRCA.csv.

# Chamando a biblioteca tidyverse
library(tidyverse)
# Definindo o diretório de trabalho
setwd("/Users/marceloferreira/Dropbox/DE-UFPB/disciplinas/PPGMDS/2024-3/data/")
# Carregando o arquivo de dados
df <- read_delim("BRCA.csv", delim = ",", na = "")
# Visualizando as primeiras 6 linhas
head(df)
# A tibble: 6 × 16
  Patient_ID     Age Gender Protein1 Protein2 Protein3 Protein4 Tumour_Stage
  <chr>        <dbl> <chr>     <dbl>    <dbl>    <dbl>    <dbl> <chr>       
1 TCGA-D8-A1XD    36 FEMALE   0.0804    0.426   0.547    0.274  III         
2 TCGA-EW-A1OX    43 FEMALE  -0.420     0.578   0.614   -0.0315 II          
3 TCGA-A8-A079    69 FEMALE   0.214     1.31   -0.327   -0.234  III         
4 TCGA-D8-A1XR    56 FEMALE   0.345    -0.211  -0.193    0.124  II          
5 TCGA-BH-A0BF    56 FEMALE   0.222     1.91    0.520   -0.312  II          
6 TCGA-AO-A1KQ    84 MALE    -0.0819    1.72   -0.0573   0.0430 III         
# ℹ 8 more variables: Histology <chr>, `ER status` <chr>, `PR status` <chr>,
#   `HER2 status` <chr>, Surgery_type <chr>, Date_of_Surgery <chr>,
#   Date_of_Last_Visit <chr>, Patient_Status <chr>

Conceitos básicos

  • Abaixo, temos uma visão geral do conjunto de dados:
glimpse(df)
Rows: 341
Columns: 16
$ Patient_ID         <chr> "TCGA-D8-A1XD", "TCGA-EW-A1OX", "TCGA-A8-A079", "TC…
$ Age                <dbl> 36, 43, 69, 56, 56, 84, 53, 50, 77, 40, 71, 72, 75,…
$ Gender             <chr> "FEMALE", "FEMALE", "FEMALE", "FEMALE", "FEMALE", "…
$ Protein1           <dbl> 0.080353, -0.420320, 0.213980, 0.345090, 0.221550, …
$ Protein2           <dbl> 0.426380, 0.578070, 1.311400, -0.211470, 1.906800, …
$ Protein3           <dbl> 0.547150, 0.614470, -0.327470, -0.193040, 0.520450,…
$ Protein4           <dbl> 0.273680, -0.031505, -0.234260, 0.124270, -0.311990…
$ Tumour_Stage       <chr> "III", "II", "III", "II", "II", "III", "II", "III",…
$ Histology          <chr> "Infiltrating Ductal Carcinoma", "Mucinous Carcinom…
$ `ER status`        <chr> "Positive", "Positive", "Positive", "Positive", "Po…
$ `PR status`        <chr> "Positive", "Positive", "Positive", "Positive", "Po…
$ `HER2 status`      <chr> "Negative", "Negative", "Negative", "Negative", "Ne…
$ Surgery_type       <chr> "Modified Radical Mastectomy", "Lumpectomy", "Other…
$ Date_of_Surgery    <chr> "15-Jan-17", "26-Apr-17", "08-Sep-17", "25-Jan-17",…
$ Date_of_Last_Visit <chr> "19-Jun-17", "09-Nov-18", "09-Jun-18", "12-Jul-17",…
$ Patient_Status     <chr> "Alive", "Dead", "Alive", "Alive", "Dead", "Alive",…
  • Vamor codificar as variáveis nominais como do tipo factor de R.
df <- df %>%
  mutate_if(where(is.character), as.factor)

Conceitos básicos

  • Novamente, temos abaixo uma visão geral do conjunto de dados:
glimpse(df)
Rows: 341
Columns: 16
$ Patient_ID         <fct> TCGA-D8-A1XD, TCGA-EW-A1OX, TCGA-A8-A079, TCGA-D8-A…
$ Age                <dbl> 36, 43, 69, 56, 56, 84, 53, 50, 77, 40, 71, 72, 75,…
$ Gender             <fct> FEMALE, FEMALE, FEMALE, FEMALE, FEMALE, MALE, FEMAL…
$ Protein1           <dbl> 0.080353, -0.420320, 0.213980, 0.345090, 0.221550, …
$ Protein2           <dbl> 0.426380, 0.578070, 1.311400, -0.211470, 1.906800, …
$ Protein3           <dbl> 0.547150, 0.614470, -0.327470, -0.193040, 0.520450,…
$ Protein4           <dbl> 0.273680, -0.031505, -0.234260, 0.124270, -0.311990…
$ Tumour_Stage       <fct> III, II, III, II, II, III, II, III, II, II, II, II,…
$ Histology          <fct> Infiltrating Ductal Carcinoma, Mucinous Carcinoma, …
$ `ER status`        <fct> Positive, Positive, Positive, Positive, Positive, P…
$ `PR status`        <fct> Positive, Positive, Positive, Positive, Positive, P…
$ `HER2 status`      <fct> Negative, Negative, Negative, Negative, Negative, N…
$ Surgery_type       <fct> Modified Radical Mastectomy, Lumpectomy, Other, Mod…
$ Date_of_Surgery    <fct> 15-Jan-17, 26-Apr-17, 08-Sep-17, 25-Jan-17, 06-May-…
$ Date_of_Last_Visit <fct> 19-Jun-17, 09-Nov-18, 09-Jun-18, 12-Jul-17, 27-Jun-…
$ Patient_Status     <fct> Alive, Dead, Alive, Alive, Dead, Alive, Alive, NA, …

Conceitos básicos

Há um total de 16 variáveis, sendo uma variável identificadora dos pacientes, 14 variáveis independentes (covariáveis ou variáveis explicativas) e uma variável dependente (variável resposta, alvo ou desfecho):

  • Patient_ID: Identificador único dos pacientes;
  • Age: Idade no diagnóstico em anos;
  • Gender: Male/Female;
  • Protein1, Protein2, Protein3, Protein4: nível de expressão;
  • Tumour_Stage: I, II, III;
  • Histology: Infiltrating Ductal Carcinoma, Infiltrating Lobular Carcinoma, Mucinous Carcinoma;
  • ER status: Positive/Negative;
  • PR status: Positive/Negative;
  • HER2 status: Positive/Negative;
  • Surgery_type: Lumpectomy, Simple Mastectomy, Modified Radical Mastectomy, Other;
  • Date_of_Surgery: Data da cirurgia;
  • Date_of_Last_Visit: Data da última visita;
  • Patient_Status: Alive/Dead.

Encadeamento com o operador pipe

  • Pipes são ferramentas poderosas para lidar com sequências de múltiplas operações;

  • O operador pipe %>% vem do pacote magrittr, enquanto que o operador pipe |> é nativo da linguagem R a partir da versão 4.1, lançada em maio de 2021;

  • A biblioteca magrittr é automaticamente carregada quando carregamos a biblioteca tidyverse ou alguma biblioteca do tidyverse.

Pipe do pacote magrittr e Pipe do artista surrealista belga René Magritte

Encadeamento com o operador pipe

  • A função desse operador é permitir o encadeamento de funções sem a necessidade de se criarem variáveis intermediárias ou de se utilizarem muitos parênteses;

  • Ou seja, a ideia do pipe é ajudá-lo a escrever código de uma maneira que seja mais fácil de ler e entender;

  • De modo geral, uma função f(x) pode ser reescrita com pipe como x %>% f. Por exemplo, log(x) fica reescrita como x %>% log;

  • Para tarefas simples, pode parecer não haver vantagem no uso de pipes;

  • Para ilustrar de forma lúdica, vamos usar código para descrever uma tarefa simples: preparar ovos mexidos;

  • Por simplicidade, assuma que essa tarefa é composta por: quebrar os ovos na frigideira, colocar sal, misturar e esperar até que fiquem prontos;

  • Utilizaremos uma função para cada verbo: quebrar(), colocar_sal(), misturar() e esperar().

Encadeamento com o operador pipe

  • Vamos iniciar criando um objeto para representar os ovos:
ovos = c()
  • A abordagem mais simples é salvar cada passo como um novo objeto:
ovos_quebrados = quebrar(ovos, onde = "frigideira")
ovos_com_sal = colocar_sal(ovos_quebrados, quanto = "uma pitada")
ovos_mexidos = misturar(ovos_com_sal, como = "bem")
ovos_prontos = esperar(ovos_mexidos, quanto = "até ficar pronto")
  • Outra possível abordagem é a composição de funções:
ovos_prontos = esperar(
  misturar(
    colcocar_sal(
      quebrar(ovos, onde = "frigideira"),
      quanto = "uma pitada"
    ),
    como = "bem"
  ),
  quanto = "até ficar pronto"
)

Encadeamento com o operador pipe

  • A utilização de pipes torna a sequência de ações mais fácil de ler e entender:
ovos_prontos = ovos %>%
  quebrar(onde = "na frigideira") %>%
  colocar_sal(quanto = "uma pitada") %>%
  misturar(como = "bem") %>%
  esperar(quanto = "até ficar pronto")
  • Exemplos:
library(magrittr)

df %>%
  .$Age %>%
  na.exclude %>%
  mean
[1] 58.88623
df %>%
  .$Age %>%
  summary
   Min. 1st Qu.  Median    Mean 3rd Qu.    Max.    NA's 
  29.00   49.00   58.00   58.89   68.00   90.00       7 
  • A utilização de %>% em conjunto com as funções da biblioteca dplyr constituem uma ferramenta poderosa para o tratamento de dados.

Encadeamento com o operador pipe

Outras funções da biblioteca magrittr:

  • %$%: Selecionar a variável de interesse diretamente. Exemplo:
df %$% mean(Age, na.rm = TRUE)
[1] 58.88623
  • %<>%: Atribuir diretamente o resultado de uma função ao objeto passado para o operador. Exemplo:
is.factor(df$Gender)
[1] TRUE
df$Gender %<>% as.factor

is.factor(df$Gender)
[1] TRUE
  • %T>%: Abrir um “braço” no fluxo de encadeamento.
df %>%
  .$Age %T>%
  hist(main = "Histograma da Idade dos Pacientes") %>%
  summary()

Encadeamento com o operador pipe

   Min. 1st Qu.  Median    Mean 3rd Qu.    Max.    NA's 
  29.00   49.00   58.00   58.89   68.00   90.00       7 

Tratamento de dados com dplyr

  • O tratamento (manipulação, processamento, etc.) de dados é uma etapa importante no fluxo de trabalho de análise de dados;
  • Tratamento de dados envolve tarefas como:
    • Seleção de colunas;
    • Ordenação;
    • Filtragem de linhas;
    • Criação e/ou modificação de colunas;
    • Agrupamentos;
    • Sumarizações.

Tratamento de dados com dplyr

  • A biblioteca dplyr possui funções que tornam essas tarefas fáceis e intuitivas:
    • Seleção de colunas: select();
    • Ordenação: arrange();
    • Filtragem de linhas: filter();
    • Criação e/ou modificação de colunas: mutate();
    • Agrupamentos: group_by();
    • Sumarizações: summarize().
  • Algumas funções de dplyr possuem variações gramaticais utilizando sufixos:
    • _all: Aplicam uma função a todas as variáveis de um data frame;
    • _at: Aplicam uma função às variáveis selecionadas e especificadas pelo argumento vars();
    • _if: Aplicam uma função às variáveis desde que determinada condição seja satisfeita.

Tratamento de dados com dplyr

  • Algumas funções de dplyr também podem ser utilizadas em conjunto com funções auxiliares:
    • vars(...): Incluir ou excluir variáveis pelo nome ou posição;
    • starts_with(match, ...): Selecionar variáveis cujos nomes começam com …;
    • ends_with(match, ...): Selecionar variáveis cujos nomes terminam com …;
    • contains(match, ...): Selecionar variáveis cujos nomes contenham …;
    • matches(match, ...): Selecionar variáveis cujos nomes correspondam à expressão …;
    • num_range(prefix, range, ...): Selecionar variáveis que correspondam a um intervalo numérico.
  • Muito mais pode ser encontrado no cartão de referência e na documentação da biblioteca dplyr.

Tratamento de dados com dplyr: a função select()

  • É comum encontrar conjuntos de dados com dezenas, centenas ou até milhares de variáveis. Em tais situações, uma das primeiras tarefas é selecionar as variáveis que realmente importam para a análise;

  • A função select() permite que um subconjunto de variáveis seja selecionado com base em operações com os nomes das variáveis. Exemplo:

df %>% select(Patient_ID,Age,Gender,Patient_Status)
# A tibble: 341 × 4
   Patient_ID     Age Gender Patient_Status
   <fct>        <dbl> <fct>  <fct>         
 1 TCGA-D8-A1XD    36 FEMALE Alive         
 2 TCGA-EW-A1OX    43 FEMALE Dead          
 3 TCGA-A8-A079    69 FEMALE Alive         
 4 TCGA-D8-A1XR    56 FEMALE Alive         
 5 TCGA-BH-A0BF    56 FEMALE Dead          
 6 TCGA-AO-A1KQ    84 MALE   Alive         
 7 TCGA-D8-A73X    53 FEMALE Alive         
 8 TCGA-A7-A426    50 FEMALE <NA>          
 9 TCGA-EW-A1P5    77 FEMALE Alive         
10 TCGA-A8-A09A    40 FEMALE Alive         
# ℹ 331 more rows

Tratamento de dados com dplyr: a função select()

  • Exemplo:
df %>% select(-Histology,-starts_with("Pro"),-ends_with("status"),-contains("Date"))
# A tibble: 341 × 5
   Patient_ID     Age Gender Tumour_Stage Surgery_type               
   <fct>        <dbl> <fct>  <fct>        <fct>                      
 1 TCGA-D8-A1XD    36 FEMALE III          Modified Radical Mastectomy
 2 TCGA-EW-A1OX    43 FEMALE II           Lumpectomy                 
 3 TCGA-A8-A079    69 FEMALE III          Other                      
 4 TCGA-D8-A1XR    56 FEMALE II           Modified Radical Mastectomy
 5 TCGA-BH-A0BF    56 FEMALE II           Other                      
 6 TCGA-AO-A1KQ    84 MALE   III          Modified Radical Mastectomy
 7 TCGA-D8-A73X    53 FEMALE II           Simple Mastectomy          
 8 TCGA-A7-A426    50 FEMALE III          Simple Mastectomy          
 9 TCGA-EW-A1P5    77 FEMALE II           Modified Radical Mastectomy
10 TCGA-A8-A09A    40 FEMALE II           Other                      
# ℹ 331 more rows

Tratamento de dados com dplyr: a função select()

  • Exemplo:
df %>% select_if(is.numeric)
# A tibble: 341 × 5
     Age Protein1 Protein2 Protein3 Protein4
   <dbl>    <dbl>    <dbl>    <dbl>    <dbl>
 1    36   0.0804    0.426   0.547    0.274 
 2    43  -0.420     0.578   0.614   -0.0315
 3    69   0.214     1.31   -0.327   -0.234 
 4    56   0.345    -0.211  -0.193    0.124 
 5    56   0.222     1.91    0.520   -0.312 
 6    84  -0.0819    1.72   -0.0573   0.0430
 7    53  -0.0695    1.42   -0.361    0.392 
 8    50   0.672     1.28   -0.321   -0.112 
 9    77  -0.152    -0.663   1.19     0.217 
10    40  -0.566     1.27   -0.293    0.194 
# ℹ 331 more rows
  • Exemplo:
df %>% select_at(vars(contains("Pro")), toupper)
# A tibble: 341 × 4
   PROTEIN1 PROTEIN2 PROTEIN3 PROTEIN4
      <dbl>    <dbl>    <dbl>    <dbl>
 1   0.0804    0.426   0.547    0.274 
 2  -0.420     0.578   0.614   -0.0315
 3   0.214     1.31   -0.327   -0.234 
 4   0.345    -0.211  -0.193    0.124 
 5   0.222     1.91    0.520   -0.312 
 6  -0.0819    1.72   -0.0573   0.0430
 7  -0.0695    1.42   -0.361    0.392 
 8   0.672     1.28   -0.321   -0.112 
 9  -0.152    -0.663   1.19     0.217 
10  -0.566     1.27   -0.293    0.194 
# ℹ 331 more rows

Tratamento de dados com dplyr: a função filter()

  • A função filter() permite que você crie um subconjunto de observações com base em seus valores. Exemplo:
df %>% filter(Age >= 50)
# A tibble: 248 × 16
   Patient_ID     Age Gender Protein1 Protein2 Protein3 Protein4 Tumour_Stage
   <fct>        <dbl> <fct>     <dbl>    <dbl>    <dbl>    <dbl> <fct>       
 1 TCGA-A8-A079    69 FEMALE   0.214    1.31    -0.327   -0.234  III         
 2 TCGA-D8-A1XR    56 FEMALE   0.345   -0.211   -0.193    0.124  II          
 3 TCGA-BH-A0BF    56 FEMALE   0.222    1.91     0.520   -0.312  II          
 4 TCGA-AO-A1KQ    84 MALE    -0.0819   1.72    -0.0573   0.0430 III         
 5 TCGA-D8-A73X    53 FEMALE  -0.0695   1.42    -0.361    0.392  II          
 6 TCGA-A7-A426    50 FEMALE   0.672    1.28    -0.321   -0.112  III         
 7 TCGA-EW-A1P5    77 FEMALE  -0.152   -0.663    1.19     0.217  II          
 8 TCGA-S3-A6ZG    71 FEMALE  -0.223    0.506   -0.349   -0.835  II          
 9 TCGA-BH-A0EA    72 FEMALE  -0.373    0.555   -0.668   -0.351  II          
10 TCGA-AC-A8OR    75 FEMALE   0.172    0.0297  -0.159    0.675  I           
# ℹ 238 more rows
# ℹ 8 more variables: Histology <fct>, `ER status` <fct>, `PR status` <fct>,
#   `HER2 status` <fct>, Surgery_type <fct>, Date_of_Surgery <fct>,
#   Date_of_Last_Visit <fct>, Patient_Status <fct>

Tratamento de dados com dplyr: a função filter()

Exemplo:

df %>% filter(Age >= 68 | Age <= 49)
# A tibble: 171 × 16
   Patient_ID     Age Gender Protein1 Protein2 Protein3 Protein4 Tumour_Stage
   <fct>        <dbl> <fct>     <dbl>    <dbl>    <dbl>    <dbl> <fct>       
 1 TCGA-D8-A1XD    36 FEMALE   0.0804   0.426    0.547    0.274  III         
 2 TCGA-EW-A1OX    43 FEMALE  -0.420    0.578    0.614   -0.0315 II          
 3 TCGA-A8-A079    69 FEMALE   0.214    1.31    -0.327   -0.234  III         
 4 TCGA-AO-A1KQ    84 MALE    -0.0819   1.72    -0.0573   0.0430 III         
 5 TCGA-EW-A1P5    77 FEMALE  -0.152   -0.663    1.19     0.217  II          
 6 TCGA-A8-A09A    40 FEMALE  -0.566    1.27    -0.293    0.194  II          
 7 TCGA-S3-A6ZG    71 FEMALE  -0.223    0.506   -0.349   -0.835  II          
 8 TCGA-BH-A0EA    72 FEMALE  -0.373    0.555   -0.668   -0.351  II          
 9 TCGA-AC-A8OR    75 FEMALE   0.172    0.0297  -0.159    0.675  I           
10 TCGA-AO-A03V    41 FEMALE   0.143    1.08     0.211    0.974  I           
# ℹ 161 more rows
# ℹ 8 more variables: Histology <fct>, `ER status` <fct>, `PR status` <fct>,
#   `HER2 status` <fct>, Surgery_type <fct>, Date_of_Surgery <fct>,
#   Date_of_Last_Visit <fct>, Patient_Status <fct>

Tratamento de dados com dplyr: a função filter()

  • Exemplo:
df %>% filter(Age >= 50, Gender == "FEMALE")
# A tibble: 245 × 16
   Patient_ID     Age Gender Protein1 Protein2 Protein3 Protein4 Tumour_Stage
   <fct>        <dbl> <fct>     <dbl>    <dbl>    <dbl>    <dbl> <fct>       
 1 TCGA-A8-A079    69 FEMALE   0.214    1.31    -0.327    -0.234 III         
 2 TCGA-D8-A1XR    56 FEMALE   0.345   -0.211   -0.193     0.124 II          
 3 TCGA-BH-A0BF    56 FEMALE   0.222    1.91     0.520    -0.312 II          
 4 TCGA-D8-A73X    53 FEMALE  -0.0695   1.42    -0.361     0.392 II          
 5 TCGA-A7-A426    50 FEMALE   0.672    1.28    -0.321    -0.112 III         
 6 TCGA-EW-A1P5    77 FEMALE  -0.152   -0.663    1.19      0.217 II          
 7 TCGA-S3-A6ZG    71 FEMALE  -0.223    0.506   -0.349    -0.835 II          
 8 TCGA-BH-A0EA    72 FEMALE  -0.373    0.555   -0.668    -0.351 II          
 9 TCGA-AC-A8OR    75 FEMALE   0.172    0.0297  -0.159     0.675 I           
10 TCGA-A2-A0ES    52 FEMALE  -1.68     0.727    0.0568   -1.24  II          
# ℹ 235 more rows
# ℹ 8 more variables: Histology <fct>, `ER status` <fct>, `PR status` <fct>,
#   `HER2 status` <fct>, Surgery_type <fct>, Date_of_Surgery <fct>,
#   Date_of_Last_Visit <fct>, Patient_Status <fct>

Tratamento de dados com dplyr: a função arrange()

  • A função arrange() permite que ordene um data frame de acordo com uma ou mais variáveis. Exemplo:
df %>% arrange(Age)
# A tibble: 341 × 16
   Patient_ID     Age Gender Protein1 Protein2 Protein3 Protein4 Tumour_Stage
   <fct>        <dbl> <fct>     <dbl>    <dbl>    <dbl>    <dbl> <fct>       
 1 TCGA-AO-A03M    29 FEMALE -0.106      0.937   -0.622   0.186  I           
 2 TCGA-C8-A273    29 FEMALE  0.00181    0.893   -0.679  -0.178  II          
 3 TCGA-AN-A0FF    32 FEMALE  0.125      1.46    -0.680  -0.0104 I           
 4 TCGA-A8-A07J    35 FEMALE -0.818      1.79    -1.04    0.0385 II          
 5 TCGA-D8-A1XD    36 FEMALE  0.0804     0.426    0.547   0.274  III         
 6 TCGA-AO-A0JA    36 FEMALE  0.469      1.55    -0.165  -0.276  III         
 7 TCGA-AN-A04A    36 FEMALE  0.232      0.618   -0.558  -0.517  III         
 8 TCGA-A2-A0D4    37 FEMALE  0.295      1.36     0.692   0.410  II          
 9 TCGA-A2-A0CL    37 FEMALE -1.15       0.961    0.276   0.246  III         
10 TCGA-EW-A1J1    38 FEMALE -0.630      2.30     0.113  -1.04   II          
# ℹ 331 more rows
# ℹ 8 more variables: Histology <fct>, `ER status` <fct>, `PR status` <fct>,
#   `HER2 status` <fct>, Surgery_type <fct>, Date_of_Surgery <fct>,
#   Date_of_Last_Visit <fct>, Patient_Status <fct>

Tratamento de dados com dplyr: a função arrange()

  • Por padrão, a função arrange() utiliza a ordem crescente. Para ordenação em ordem decrescente, podemos utilizar a função desc(). Exemplo:
df %>% arrange(desc(Age),Protein1)
# A tibble: 341 × 16
   Patient_ID     Age Gender Protein1 Protein2 Protein3 Protein4 Tumour_Stage
   <fct>        <dbl> <fct>     <dbl>    <dbl>    <dbl>    <dbl> <fct>       
 1 TCGA-AC-A3W6    90 FEMALE  -1.39      0.775   0.291    -0.924 III         
 2 TCGA-A8-A08A    89 FEMALE  -0.250    -0.351  -0.0996    0.758 I           
 3 TCGA-AC-A5EI    88 FEMALE  -2.34      0.372   0.208    -1.64  I           
 4 TCGA-BH-A18N    88 FEMALE  -0.603     1.38    0.404     0.269 II          
 5 TCGA-D8-A73U    88 FEMALE   0.204     0.525  -0.845    -0.706 II          
 6 TCGA-AC-A3HN    87 FEMALE  -0.0875    1.11   -0.567     1.22  II          
 7 TCGA-BH-A8FY    87 FEMALE   0.709     2.17   -0.440    -0.393 I           
 8 TCGA-D8-A1XC    85 FEMALE   0.404     0.488   0.841     0.616 III         
 9 TCGA-A8-A07Z    85 FEMALE   0.406     0.331  -0.257    -0.655 II          
10 TCGA-E9-A54X    85 FEMALE   0.538     0.281  -0.106     0.240 I           
# ℹ 331 more rows
# ℹ 8 more variables: Histology <fct>, `ER status` <fct>, `PR status` <fct>,
#   `HER2 status` <fct>, Surgery_type <fct>, Date_of_Surgery <fct>,
#   Date_of_Last_Visit <fct>, Patient_Status <fct>

Tratamento de dados com dplyr: a função mutate()

  • A função mutate() permite a criação de novas variáveis ou a modificação de variáveis existentes. Exemplo:
df <- df %>%
  mutate(Date_of_Surgery = as.Date(Date_of_Surgery, "%d-%b-%y"),
         Date_of_Last_Visit = as.Date(Date_of_Last_Visit, "%d-%b-%y"))

df
# A tibble: 341 × 16
   Patient_ID     Age Gender Protein1 Protein2 Protein3 Protein4 Tumour_Stage
   <fct>        <dbl> <fct>     <dbl>    <dbl>    <dbl>    <dbl> <fct>       
 1 TCGA-D8-A1XD    36 FEMALE   0.0804    0.426   0.547    0.274  III         
 2 TCGA-EW-A1OX    43 FEMALE  -0.420     0.578   0.614   -0.0315 II          
 3 TCGA-A8-A079    69 FEMALE   0.214     1.31   -0.327   -0.234  III         
 4 TCGA-D8-A1XR    56 FEMALE   0.345    -0.211  -0.193    0.124  II          
 5 TCGA-BH-A0BF    56 FEMALE   0.222     1.91    0.520   -0.312  II          
 6 TCGA-AO-A1KQ    84 MALE    -0.0819    1.72   -0.0573   0.0430 III         
 7 TCGA-D8-A73X    53 FEMALE  -0.0695    1.42   -0.361    0.392  II          
 8 TCGA-A7-A426    50 FEMALE   0.672     1.28   -0.321   -0.112  III         
 9 TCGA-EW-A1P5    77 FEMALE  -0.152    -0.663   1.19     0.217  II          
10 TCGA-A8-A09A    40 FEMALE  -0.566     1.27   -0.293    0.194  II          
# ℹ 331 more rows
# ℹ 8 more variables: Histology <fct>, `ER status` <fct>, `PR status` <fct>,
#   `HER2 status` <fct>, Surgery_type <fct>, Date_of_Surgery <date>,
#   Date_of_Last_Visit <date>, Patient_Status <fct>

Tratamento de dados com dplyr: a função mutate()

  • Exemplo:
df <- df %>%
  mutate(Time = Date_of_Last_Visit - Date_of_Surgery)

df %$%
  as.numeric(Time) %>%
  summary
   Min. 1st Qu.  Median    Mean 3rd Qu.    Max.    NA's 
    0.0   189.0   372.0   447.8   595.0  3019.0      24 
df %$%
  as.numeric(Time) %>%
  hist

Tratamento de dados com dplyr: a função summarise

  • A função summarise() é utilizada para sumarizar variáveis de um data frame. Exemplos:
df %>%
  summarise(avg_protein1 = mean(Protein1, na.rm = TRUE),
            avg_protein2 = mean(Protein2, na.rm = TRUE),
            avg_protein3 = mean(Protein3, na.rm = TRUE),
            avg_protein4 = mean(Protein4, na.rm = TRUE))
# A tibble: 1 × 4
  avg_protein1 avg_protein2 avg_protein3 avg_protein4
         <dbl>        <dbl>        <dbl>        <dbl>
1      -0.0300        0.947      -0.0902      0.00982
df %>%
  summarise(med_protein1 = median(Protein1, na.rm = TRUE),
            med_protein2 = median(Protein2, na.rm = TRUE),
            med_protein3 = median(Protein3, na.rm = TRUE),
            med_protein4 = median(Protein4, na.rm = TRUE))
# A tibble: 1 × 4
  med_protein1 med_protein2 med_protein3 med_protein4
         <dbl>        <dbl>        <dbl>        <dbl>
1      0.00613        0.993       -0.173       0.0418

Tratamento de dados com dplyr: a função group_by()

  • group_by() é uma função silenciosa que separa as observações de um data frame em grupos ou categorias. Tipicamente, é utilizada em conjunto com outras funções de dplyr, especialmente com summarise() e mutate().

  • Exemplo:

df %>% group_by(Histology) %>%
  summarise(avg_Age = mean(Age),
            med_Age = median(Age),
            sd_Age = sd(Age))
# A tibble: 4 × 4
  Histology                      avg_Age med_Age sd_Age
  <fct>                            <dbl>   <dbl>  <dbl>
1 Infiltrating Ductal Carcinoma     59.9    59     12.9
2 Infiltrating Lobular Carcinoma    56.7    55     12.8
3 Mucinous Carcinoma                56.5    54.5   13.9
4 <NA>                              NA      NA     NA  

Tratamento de dados com dplyr: a função group_by()

  • Exemplo:
df <- df %>%
  group_by(Histology) %>%
  mutate(freq_histology = n())

df
# A tibble: 341 × 18
# Groups:   Histology [4]
   Patient_ID     Age Gender Protein1 Protein2 Protein3 Protein4 Tumour_Stage
   <fct>        <dbl> <fct>     <dbl>    <dbl>    <dbl>    <dbl> <fct>       
 1 TCGA-D8-A1XD    36 FEMALE   0.0804    0.426   0.547    0.274  III         
 2 TCGA-EW-A1OX    43 FEMALE  -0.420     0.578   0.614   -0.0315 II          
 3 TCGA-A8-A079    69 FEMALE   0.214     1.31   -0.327   -0.234  III         
 4 TCGA-D8-A1XR    56 FEMALE   0.345    -0.211  -0.193    0.124  II          
 5 TCGA-BH-A0BF    56 FEMALE   0.222     1.91    0.520   -0.312  II          
 6 TCGA-AO-A1KQ    84 MALE    -0.0819    1.72   -0.0573   0.0430 III         
 7 TCGA-D8-A73X    53 FEMALE  -0.0695    1.42   -0.361    0.392  II          
 8 TCGA-A7-A426    50 FEMALE   0.672     1.28   -0.321   -0.112  III         
 9 TCGA-EW-A1P5    77 FEMALE  -0.152    -0.663   1.19     0.217  II          
10 TCGA-A8-A09A    40 FEMALE  -0.566     1.27   -0.293    0.194  II          
# ℹ 331 more rows
# ℹ 10 more variables: Histology <fct>, `ER status` <fct>, `PR status` <fct>,
#   `HER2 status` <fct>, Surgery_type <fct>, Date_of_Surgery <date>,
#   Date_of_Last_Visit <date>, Patient_Status <fct>, Time <drtn>,
#   freq_histology <int>

Tratamento de dados com dplyr: a função group_by()

table(df$Histology)

 Infiltrating Ductal Carcinoma Infiltrating Lobular Carcinoma 
                           233                             89 
            Mucinous Carcinoma 
                            12 
df$Histology[1:20]
 [1] Infiltrating Ductal Carcinoma  Mucinous Carcinoma            
 [3] Infiltrating Ductal Carcinoma  Infiltrating Ductal Carcinoma 
 [5] Infiltrating Ductal Carcinoma  Infiltrating Ductal Carcinoma 
 [7] Infiltrating Ductal Carcinoma  Infiltrating Ductal Carcinoma 
 [9] Infiltrating Ductal Carcinoma  Infiltrating Lobular Carcinoma
[11] Infiltrating Ductal Carcinoma  Infiltrating Ductal Carcinoma 
[13] Infiltrating Lobular Carcinoma Infiltrating Ductal Carcinoma 
[15] Mucinous Carcinoma             Infiltrating Lobular Carcinoma
[17] Mucinous Carcinoma             Infiltrating Ductal Carcinoma 
[19] Infiltrating Ductal Carcinoma  Infiltrating Ductal Carcinoma 
3 Levels: Infiltrating Ductal Carcinoma ... Mucinous Carcinoma
df$freq_histology[1:20]
 [1] 233  12 233 233 233 233 233 233 233  89 233 233  89 233  12  89  12 233 233
[20] 233

Tratamento de dados com dplyr: a função group_by()

  • O agrupamento pode ser feito de acordo com as categorias de uma ou mais variáveis nominais.

  • Exemplo:

df %>% group_by(Histology,Tumour_Stage) %>%
  summarise(avg_Age = mean(Age),
            med_Age = median(Age),
            sd_Age = sd(Age))
# A tibble: 9 × 5
# Groups:   Histology [4]
  Histology                      Tumour_Stage avg_Age med_Age sd_Age
  <fct>                          <fct>          <dbl>   <dbl>  <dbl>
1 Infiltrating Ductal Carcinoma  I               63.0    62.5  14.0 
2 Infiltrating Ductal Carcinoma  II              60.1    59    12.1 
3 Infiltrating Ductal Carcinoma  III             56.6    54    13.1 
4 Infiltrating Lobular Carcinoma I               57.8    59    15.3 
5 Infiltrating Lobular Carcinoma II              57.7    56    13.5 
6 Infiltrating Lobular Carcinoma III             53.5    53     9.21
7 Mucinous Carcinoma             I               67.7    62    15.3 
8 Mucinous Carcinoma             II              52.8    51    12.0 
9 <NA>                           <NA>            NA      NA    NA   
df <- df %>% ungroup()

Tabelas com gtsummary

  • A biblioteca gtsummary fornece funções para criação de tabelas elegantes e flexíveis prontas para serem utilizadas em artigos científicos, relatórios, livros e etc.

  • É comum (e recomendável) a utilização das funções de gtsummary em conjunto com “motores de impressão” de outras bibliotecas como flextable, huxtable, kable, kableExtra, entre outras, para impressão em formatos como html, pdf, docx e rtf.

  • Por exemplo, para utilizar as funções da biblioteca gtsummary com a definição do idioma em português e em conjunto com a biblioteca flextable, faça:

library(gtsummary)
library(flextable)

theme_gtsummary_language(
  language = "pt"
)

Tabelas com gtsummary

  • A função tbl_summary() produz tabelas descritivas completas.
  • Exemplo:
df %>%
  select(Age,Gender,Patient_Status) %>%
  tbl_summary() %>%
  as_flex_table()

Características

N = 3411

Age

58 (49, 68)

Desconhecido

7

Gender

FEMALE

330 (99%)

MALE

4 (1.2%)

Desconhecido

7

Patient_Status

Alive

255 (79%)

Dead

66 (21%)

Desconhecido

20

1Mediana (AIQ); n (%)

  • Exemplo:
df %>%
  select(Age,Gender,Patient_Status) %>%
  tbl_summary(
    by = Patient_Status
  ) %>%
  as_flex_table()

Características

Alive, N = 2551

Dead, N = 661

Age

58 (49, 67)

59 (48, 68)

Gender

FEMALE

252 (99%)

65 (98%)

MALE

3 (1.2%)

1 (1.5%)

1Mediana (AIQ); n (%)

Tabelas com gtsummary

  • A função tbl_summary() pode ser personalizada através de diversas modificações. Exemplo:
df %>%
  select(Age,Gender,Tumour_Stage,Patient_Status) %>%
  tbl_summary(
    by = Patient_Status,
    # Formatação dos nomes das variáveis na tabela
    label = list(Age ~ "Idade",
                 Gender ~ "Sexo",
                 Tumour_Stage ~ "Estágio do Tumor"),
    # Definindo pré-formatação para as variáveis quantitativas
    type = all_continuous() ~ "continuous2",
    # Definindo as estatísticas desejadas
    statistic = all_continuous() ~ c("{mean} ({sd})","{median} ({p25},{p75})","{min}","{max}")
  ) %>%
  # Adiciona coluna com estatísticas gerais
  add_overall() %>%
  # Adiciona p-valores de testes estatísticos
  add_p() %>%
  # Modificando o título da tabela
  modify_caption("Estatísticas descritivas") %>%
  # Modifica título da coluna das variáveis
  modify_header(label = "**Variável**") %>%
  # Níveis das variáveis qualitativas ou estatísticas em itálico
  italicize_levels() %>%
  # Nomes das variáveis em negrito
  bold_labels() %>%
  as_flex_table()

Tabelas com gtsummary

Estatísticas descritivas

Variável

Total, N = 3211

Alive, N = 2551

Dead, N = 661

Valor p2

Idade

0.7

Média (Desvio Padrão)

59 (13)

59 (13)

59 (13)

Mediana (25%,75%)

58 (49,68)

58 (49,67)

59 (48,68)

Mínimo

29

29

29

Máximo

90

90

88

Sexo

>0.9

FEMALE

317 (99%)

252 (99%)

65 (98%)

MALE

4 (1.2%)

3 (1.2%)

1 (1.5%)

Estágio do Tumor

0.6

I

61 (19%)

51 (20%)

10 (15%)

II

182 (57%)

144 (56%)

38 (58%)

III

78 (24%)

60 (24%)

18 (27%)

1n (%)

2Teste de soma de postos de Wilcoxon; Teste exato de Fisher; Teste qui-quadrado de independência

Vizualização gráfica com ggplot2

  • O estatístico estadunidense Leland Wilkilson publicou, em 2005, o livro The Grammar od Graphics (em português, “A Gramática dos Gráficos”), descrevendo as ideias fundamentais da construção de gráficos estatísticos;

  • Baseado nesse trabalho, o neozelandês Hadley Wickham desenvolveu a biblioteca ggplot2 como fruto de sua tese de doutorado, A Layered Grammar of Graphics (em português, “Uma Gramática dos Gráficos em Camadas”), introduzindo a ideia de que os elementos de um gráfico (dados, sistemas de coordenadas, rótulos, anotações, dentre outros) são as suas camadas e que sua construção se dá pela sobreposição dessas camadas;

  • A ideia central de ggplot2, portanto, é a de construir um gráfico definindo e sobrescrevendo suas camadas. Essa ideia se baseia numa filosofia bem fundamentada e apresenta diversas vantagens sobre o sistema nativo de R para construção de gráficos: beleza, fácil personalização e estrutura padronizada;

  • A biblioteca ggplot2 faz parte do core do tidyverse e é automaticamente carregada junto com ela.

Vizualização gráfica com ggplot2

  • A primeira camada de um gráfico ggplot2 é criada através da função ggplot(). Essa função recebe um data frame ou tibble e cria a camada base do gráfico, sobre a qual adicionaremos as outras camadas;

  • Por exemplo, obtemos um painel vazio, a camada base, fazendo:

df %>%
  na.omit() %>% 
  ggplot()

Vizualização gráfica com ggplot2

  • Podemos obter um gráfico de dispersão (ou gráfico de pontos) utilizando a função ggplot() em conjunto com a função geom_point();

  • Por exemplo, vamos construir um gráfico de dispersão entre as variáveis Protein1 e Protein2.

df %>%
  na.omit() %>% 
  ggplot() +
  geom_point(mapping = aes(x = Protein1, y = Protein2))

Vizualização gráfica com ggplot2

No exemplo anterior, note que:

  • A camada base é obtida com ggplot(), que recebe o conjunto de dados através do argumento data = df;
  • As camadas são adicionadas através do sinal +;
  • A segunda camada é criada através da função geom_point(), que especifica a forma geométrica que será utilizada no gráfico (pontos);
  • O mapeamento é feito através do argumento mapping em geom_point(), que recebe a função aes(), responsável por descrever quais variáveis do conjunto de dados serão mapeadas e como serão mapeadas no gráfico;
  • Pode haver uma mensagem de alerta (warning) informando que há valores ausentes nas variáveis especificadas em aes() e que as observações que contém valores ausentes foram omitidas no gráfico.

Vizualização gráfica com ggplot2

  • Além de mapear as variáveis aos eixos, podemos mapear a cor dos pontos de acordo com outra variável. Por exemplo, vamos considerar a distribuição das observações também de acordo com a variável Patient_Status.
df %>%
  na.omit() %>% 
  ggplot() +
  geom_point(mapping = aes(x = Protein1, y = Protein2, color = Patient_Status))

Vizualização gráfica com ggplot2

  • Um terceira camada com um ajuste de regressão apropriado entre as variáveis pode ser adicionada com a função geom_smooth(). Se o número de observações for menor do que 1000, um ajuste de regressão polinomial local será utilizado (loess). Se o número de observações for maior do que 1000, um ajuste de um modelo aditivo generalizado com suavização por splines cúbicas é utilizado (Note, no exemplo, a mensagem de alerta retornada indicando esse ajuste).

  • geom_smooth() admite outros métodos de ajuste, como lm() (regressão linear), glm() (modelos lineares generalizados), gam() (modelos generalizados aditivos), loess() (regressão polinomial local) ou outra função, por exemplo, MASS::rlm() (regressão robusta). Observe que o intervalo de confiança para o ajuste é também adicionado.

Vizualização gráfica com ggplot2

df %>%
  na.omit() %>% 
  ggplot() +
  geom_point(mapping = aes(x = Protein1, y = Protein2, color = Patient_Status)) +
  geom_smooth(mapping = aes(x = Protein1, y = Protein2))

Vizualização gráfica com ggplot2

  • Como, no gráfico anterior, as camadas obtidas com geom_point() e com geom_smooth() utilizam o mesmo mapeamento, este pode ser definido em ggplot():
df %>%
  na.omit() %>% 
  ggplot(mapping = aes(x = Protein1, y = Protein2)) +
  geom_point(mapping = aes(color = Patient_Status)) +
  geom_smooth()

Vizualização gráfica com ggplot2

  • Gráficos de linhas podem ser construídos utilizando geom_line(). Gráficos de linhas são muito úteis para representação de séries de tempo, mas são também utilizados para avaliar o comportamento de uma variável de acordo com os níveis de outra variável qualitativa.
  • Para ilustrar, vamos simular um conjunto de dados com duas variáveis x, o tempo, e y, uma variável quantitativa arbitrária.
exemplo = tibble(x = 1:100, y = rnorm(100))
head(exemplo)
# A tibble: 6 × 2
      x      y
  <int>  <dbl>
1     1  0.429
2     2 -0.600
3     3  1.10 
4     4 -0.986
5     5 -0.195
6     6  1.63 
  • Podemos visualizar a relação entre x e y através de um gráfico de linha:
exemplo %>% ggplot() +
  geom_line(aes(x = x, y = y))

Vizualização gráfica com ggplot2

  • Opcionalmente, podemos incluir os pontos no gráfico e mudar o tipo de linha através do argumento linetype:
exemplo %>% ggplot(aes(x = x, y = y)) +
  geom_line(linetype = 2) +
  geom_point()
  • linetype pode receber um inteiro entre 0 e 6 correpondentes, respectivamente, a blank, solid, dashed, dotted, dotdash, longdash e twodash.

Vizualização gráfica com ggplot2

  • Podemos usar gráficos de linhas para representar o comportamento de uma variável quantitativa de acordo com os níveis de uma variável qualitativa.
tbl1 = df %>% na.omit() %>% group_by(Tumour_Stage) %>%
  summarize(avg_protein = mean(Protein1, na.rm = TRUE))
tbl2 = df %>% na.omit() %>% group_by(Tumour_Stage) %>%
  summarize(avg_protein = mean(Protein2, na.rm = TRUE))
tbl3 = df %>% na.omit() %>% group_by(Tumour_Stage) %>%
  summarize(avg_protein = mean(Protein3, na.rm = TRUE))
tbl4 = df %>% na.omit() %>% group_by(Tumour_Stage) %>%
  summarize(avg_protein = mean(Protein4, na.rm = TRUE))
tbl = bind_rows(tbl1,tbl2,tbl3,tbl4)
tbl = tbl %>%
  mutate(protein = rep(paste0("Protein",1:4),
                       each = length(unique(Tumour_Stage))))
tbl
# A tibble: 12 × 3
   Tumour_Stage avg_protein protein 
   <fct>              <dbl> <chr>   
 1 I               -0.00707 Protein1
 2 II              -0.00844 Protein1
 3 III             -0.0869  Protein1
 4 I                0.994   Protein2
 5 II               0.972   Protein2
 6 III              0.862   Protein2
 7 I               -0.144   Protein3
 8 II              -0.0762  Protein3
 9 III             -0.102   Protein3
10 I                0.0634  Protein4
11 II               0.00526 Protein4
12 III             -0.0340  Protein4

Vizualização gráfica com ggplot2

tbl %>%
  mutate(avg_protein = round(avg_protein, 3)) %>%
  ggplot(aes(x = Tumour_Stage, y = avg_protein, group = protein)) +
  geom_line(aes(linetype = protein)) +
  geom_label(aes(label = avg_protein))

Vizualização gráfica com ggplot2

  • Para construir gráficos de barras, utilizamos geom_col().
df %>%
  na.omit() %>%
  count(Tumour_Stage) %>%
  ggplot() +
  geom_col(aes(x = Tumour_Stage, y = n))

Vizualização gráfica com ggplot2

  • Podemos inverter a orientação do gráfico simplesmente trocando a ordem das variáveis nos eixos:
df %>%
  na.omit() %>%
  count(Tumour_Stage) %>%
  ggplot() +
  geom_col(aes(x = n, y = Tumour_Stage))

Vizualização gráfica com ggplot2

  • Para alterar a ordem dos níveis de um fator de acordo com suas frequências, utilizamos a função fct_reorder() da biblioteca forcats. Por exemplo:
df %>%
  na.omit() %>%
  count(Tumour_Stage) %>%
  mutate(Tumour_Stage = forcats::fct_reorder(Tumour_Stage, n)) %>%
  ggplot() +
  geom_col(aes(x = n, y = Tumour_Stage))

Vizualização gráfica com ggplot2

  • Para alterar as cores das barras, utilizamos o argumento fill em aes():
df %>%
  na.omit() %>%
  count(Tumour_Stage) %>%
  mutate(Tumour_Stage = forcats::fct_reorder(Tumour_Stage, n)) %>%
  ggplot() +
  geom_col(aes(x = n, y = Tumour_Stage, fill = Tumour_Stage),
           show.legend = FALSE)

Vizualização gráfica com ggplot2

  • Podemos também incluir um rótulo com a frequência de cada classe com geom_label():
df %>%
  na.omit() %>%
  count(Tumour_Stage) %>%
  mutate(Tumour_Stage = forcats::fct_reorder(Tumour_Stage, n)) %>%
  ggplot() +
  geom_col(aes(x = n, y = Tumour_Stage, fill = Tumour_Stage),
           show.legend = FALSE) +
  geom_label(aes(x = n, y = Tumour_Stage, label = n))

Vizualização gráfica com ggplot2

  • Histogramas são importantes para o estudo da distribuição de uma variável quantitativa. Para construir histogramas, utilizamos geom_histogram(). Esta função precisa apenas do atributo x. Por exemplo:
df %>%
  ggplot() +
  geom_histogram(aes(x = Age), fill = "red")

Vizualização gráfica com ggplot2

  • Podemos ajustar a quantidade de intervalos definindo o tamanho destes através do argumento binwidth.
df %>%
  ggplot() +
  geom_histogram(aes(x = Age), binwidth = 5, fill = "red")

Vizualização gráfica com ggplot2

  • Podemos comparar a distribuição de uma variável quantitativa de acordo com as classes de uma variável nominal.
df %>%
  na.omit() %>%
  ggplot() +
  geom_histogram(aes(x = Age, fill = Patient_Status), binwidth = 5)

Vizualização gráfica com ggplot2

  • Assim como os histogramas, curvas de densidade também são importantes para o estudo da distribuição de uma variável quantitativa. Para construir essas curvas, utilizamos geom_density(). Esta função precisa apenas do atributo x. Por exemplo:
df %>%
  na.omit() %>%
  ggplot() +
  geom_density(aes(x = Age), fill = "red")

Vizualização gráfica com ggplot2

  • Também podemos comparar a distribuição de uma variável quantitativa de acordo com as classes de uma variável nominal.
df %>%
  na.omit() %>%
  ggplot() +
  geom_density(aes(x = Age, fill = Patient_Status))

Vizualização gráfica com ggplot2

  • Para construir boxplots, utilizamos a função geom_boxplot(). Por exemplo:
df %>%
  na.omit() %>%
  ggplot() +
  geom_boxplot(aes(y = Age)) +
  scale_x_discrete()

Vizualização gráfica com ggplot2

  • Podemos construir boxplots para uma variável quantitativa de acordo com os níveis de uma variável qualitativa. Por exemplo:
df %>%
  na.omit() %>%
  ggplot() +
  geom_boxplot(aes(x = Patient_Status, y = Age))

Vizualização gráfica com ggplot2

  • Além disso, podemos construir boxplots de acordo com os níveis de uma terceira variável qualitativa, através do argumento fill. Por exemplo:
df %>%
  na.omit() %>%
  ggplot() +
  geom_boxplot(aes(x = Patient_Status, y = Age, fill = Tumour_Stage))

Vizualização gráfica com ggplot2

  • Os títulos e rótulos de eixos também são camadas do gráfico e são criados ou modificados utilizando a função labs(). Por exemplo:
df %>%
  na.omit() %>%
  ggplot() +
  geom_boxplot(aes(x = Patient_Status, y = Age, fill = Tumour_Stage)) +
  labs(
    x = "Patient Status",
    y = "Age",
    fill = "Tumour Stage",
    title = "Boxplots",
    subtitle = "Age according to patient status and tumour stage")

Vizualização gráfica com ggplot2

  • A posição da legenda também pode ser modificada através da função theme() com o argumento legend.position, que recebe os valores right (direita), left (esquerda), top (acima), bottom (abaixo), none (remove a legenda) ou um vetor c(x,y), onde o par \((x,y)\) representa a posição no sistema de coordenadas. Por exemplo:
df %>%
  na.omit() %>%
  ggplot() +
  geom_boxplot(aes(x = Patient_Status,
                   y = Age,
                   fill = Tumour_Stage)) +
  labs(
    x = "Patient Status",
    y = "Age",
    fill = "Tumour Stage",
    title = "Boxplots",
    subtitle = "Distribution of Age") +
  theme(legend.position = "bottom")

Vizualização gráfica com ggplot2

  • Até aqui vimos como construir gráficos básicos com ggplot2, e que servirão como ponto de partida para nossas análises;

  • Existem bibliotecas que estendem as funcionalidades de ggplot2. Algumas delas são: GGally, gganimate, ggfortify, ggcorrplot, ggsurvfit, etc.;

  • Todas essas extensões seguem os mesmos princípios que nortearam o desenvolvimento de ggplot2;

  • Uma lista com as extensões registradas de ggplot2 pode ser encontrada em: https://exts.ggplot2.tidyverse.org/gallery/;

  • Exemplos criativos de gráficos utilizando ggplot2 e outras bibliotecas de R podem ser encontrados em: https://r-graph-gallery.com/;

  • Uma seleção de 12 extensões úteis de ggplot2 é apresentada aqui: https://mode.com/blog/r-ggplot-extension-packages.

Vizualização gráfica com ggplot2: Temas

Até agora, utilizamos em todos os gráficos o tema padrão de ggplot2, theme_gray(). Existem outros temas prontos que podem ser utilizados. Esses temas estão implementados na família de funções theme_. Considere o gráfico a seguir.

df %>%
  na.omit() %>%
  ggplot() +
  geom_boxplot(aes(x = Patient_Status, y = Age, fill = Tumour_Stage))

Vizualização gráfica com ggplot2: Temas

theme_minimal():

df %>%
  na.omit() %>%
  ggplot() +
  geom_boxplot(aes(x = Patient_Status,
                   y = Age,
                   fill = Tumour_Stage)) +
  theme_minimal()

theme_classic():

df %>%
  na.omit() %>%
  ggplot() +
  geom_boxplot(aes(x = Patient_Status,
                   y = Age,
                   fill = Tumour_Stage)) +
  theme_classic()

Vizualização gráfica com ggplot2: Temas

theme_bw():

df %>%
  na.omit() %>%
  ggplot() +
  geom_boxplot(aes(x = Patient_Status,
                   y = Age,
                   fill = Tumour_Stage)) +
  theme_bw()

theme_dark():

df %>%
  na.omit() %>%
  ggplot() +
  geom_boxplot(aes(x = Patient_Status,
                   y = Age,
                   fill = Tumour_Stage)) +
  theme_dark()

Vizualização gráfica com ggplot2: Juntar Gráficos

  • Para replicar um gráfico de acordo com os níveis de uma variável qualitativa podemos utilizar a função facet_wrap(). Por exemplo:
df %>%
  na.omit() %>% 
  ggplot(mapping = aes(x = Protein1, y = Protein2)) +
  geom_point(mapping = aes(color = Patient_Status)) +
  geom_smooth() +
  facet_wrap(~Tumour_Stage)

Vizualização gráfica com ggplot2: Juntar Gráficos

  • Por padrão, facet_wrap() organiza os gráficos em colunas. Se quisermos os gráficos organizados em linhas, utilizamos o argumento nrow. Por exemplo:
df %>%
  na.omit() %>% 
  ggplot(mapping = aes(x = Protein1, y = Protein2)) +
  geom_point(mapping = aes(color = Patient_Status)) +
  geom_smooth() +
  facet_wrap(~Tumour_Stage, nrow = 3)

Vizualização gráfica com ggplot2: Juntar Gráficos

  • Para juntar gráficos diferentes, podemos usar, dentre outras, a biblioteca patchwork. A ideia é atribuir gráficos criados com ggplot2 a objetos e juntá-los com os sinais +, -, | e \ . Por exemplo:
p1 <- df %>%
  na.omit() %>% 
  ggplot(mapping = aes(x = Protein1, y = Protein2)) +
  geom_point(mapping = aes(color = Patient_Status)) +
  geom_smooth() +
  facet_wrap(~Tumour_Stage)

p2 <- df %>%
  na.omit() %>%
  ggplot() +
  geom_boxplot(aes(x = Patient_Status,
                   y = Age,
                   fill = Tumour_Stage)) +
  labs(
    x = "Patient Status",
    y = "Age",
    fill = "Tumour Stage",
    title = "Boxplots",
    subtitle = "Distribution of Age")

Vizualização gráfica com ggplot2: Juntar Gráficos

library(patchwork)

p1 + p2

p1 + p2 + theme_bw()

Vizualização gráfica com ggplot2: Juntar Gráficos

p3 <- df %>%
  na.omit() %>%
  ggplot() +
  geom_density(aes(x = Age, fill = Patient_Status))

p4 <- df %>%
  na.omit() %>%
  count(Tumour_Stage) %>%
  mutate(Tumour_Stage = forcats::fct_reorder(Tumour_Stage, n)) %>%
  ggplot() +
  geom_col(aes(x = n, y = Tumour_Stage, fill = Tumour_Stage),
           show.legend = FALSE) +
  geom_label(aes(x = n, y = Tumour_Stage, label = n))

Vizualização gráfica com ggplot2: Juntar Gráficos

(p1 + p2) / (p3 + p4)

Vizualização gráfica com ggplot2: Juntar Gráficos

(p1 + p3) / p4

Vizualização gráfica com ggplot2: Juntar Gráficos

p1 / (p3 + p4)

Vizualização gráfica com ggplot2: Juntar Gráficos

p1 / (p3 + p4) / p2

Sugestões de atividades

  • Revise os tópicos e replique o conteúdo desta aula;
  • Explore outras funções da biblioteca gtsummary;
  • Pesquise a função geom_violin();
  • Dê um passeio pelas galerias The R Graph Gallery e ggplot2 extensions.

Fim