+ - 0:00:00
Notes for current slide
Notes for next slide

Oficina de análise de dados NIR em ambiente R

Partes 1—3 - Manejo de dados com dplyr, preparação de dados, e PCA

Ricardo Perdiz (Luz da Floresta) | 2021/06/30

COVID19
1 / 101
COVID19

Análise de dados NIR em R

Sumário

Uma breve introdução

3 / 101
COVID19

Análise de dados NIR em R

Sumário

Uma breve introdução

Manipulação de dados com o pacote dplyr

3 / 101
COVID19

Análise de dados NIR em R

Sumário

Uma breve introdução

Manipulação de dados com o pacote dplyr

Preparação dos dados para análise

3 / 101
COVID19

Análise de dados NIR em R

Sumário

Uma breve introdução

Manipulação de dados com o pacote dplyr

Preparação dos dados para análise

Análise de componentes principais (PCA)

3 / 101
COVID19

Análise de dados NIR em R

"There should be one – and preferably only one – obvious way to do it." (The Zen of Python)1

4 / 101
COVID19

Análise de dados NIR em R

"There should be one – and preferably only one – obvious way to do it." (The Zen of Python)1

Paradigma em linguagens de programação.

4 / 101
COVID19

Análise de dados NIR em R

"There should be one – and preferably only one – obvious way to do it." (The Zen of Python)1

Paradigma em linguagens de programação.

"There’s more than one way to do it" (Perl, R)

4 / 101
COVID19

Análise de dados NIR em R

Há mais de uma maneira de se fazer uma determinada ação no R

plot(mtcars$hp, mtcars$mpg)
plot(mpg ~ hp, data = mtcars)
library(lattice)
xyplot(mpg ~ hp, data = mtcars)
library(ggplot2)
ggplot(mtcars, aes(x = hp, y = mpg)) + geom_point()
5 / 101

Várias maneiras de se fazer algo em R, todas com vantagens e desvantagens. O guia de desenvolvedor do Python afirma: R é muito diferente de Python nesse aspecto. Uma vantagem da diversidade de interfaces do R é que ela pode se desenvolver com o tempo e se ajustar às diferentes necessidades dos usuários.

COVID19

Análise de dados NIR em R

Por que ensinar ferramentas do tidyverse, caret e tidymodels?

6 / 101
COVID19

Análise de dados NIR em R

Por que ensinar ferramentas do tidyverse, caret e tidymodels?

Enraizar a idéia de ter UM conjunto de ferramentas para trabalhar e analisar os dados

6 / 101
COVID19

Análise de dados NIR em R

Instruções gerais

data.frame(a = 1:10, b = 1:10)
7 / 101
COVID19

Análise de dados NIR em R

Instruções gerais

data.frame(a = 1:10, b = 1:10)

Um código por linha!

data.frame(
a = 1:10,
b = 1:10)
7 / 101
COVID19

Análise de dados NIR em R

Instruções gerais

Dúvidas?

8 / 101
COVID19

Análise de dados NIR em R

Instruções gerais

Dúvidas?

Dúvidas de R básico, eu vou apontar onde descobrir a solução, mas não vou focar em resolver nesta oficina.

8 / 101
COVID19

Análise de dados NIR em R

Instruções gerais

Dúvidas?

Dúvidas de R básico, eu vou apontar onde descobrir a solução, mas não vou focar em resolver nesta oficina.

Podem parar e perguntar!

8 / 101
COVID19

Análise de dados NIR em R

Dados para a oficina

9 / 101
COVID19

Análise de dados NIR em R

Dados para a oficina

1. Conjunto de dados nir_data1, que acompanha o pacote NIRtools2.

9 / 101
COVID19

Análise de dados NIR em R

Dados para a oficina

1. Conjunto de dados nir_data1, que acompanha o pacote NIRtools2.

2. Próprios dados

  1. Perdiz (2020) Delimitação específica e filogeografia do complexo Protium aracouchini (Aubl.) Marchand (Burseraceae). Tese de doutorado. Programa de pós-graduação em Ciências Biológicas, INPA, Manaus, Amazonas, Brasil. https://repositorio.inpa.gov.br/handle/1/36948

  2. Perdiz (2021) https://github.com/ricoperdiz/NIRtools

9 / 101

Vou utilizar o conjunto de dados nir_data, um subconjunto proveniente de minha tese de doutorado (Perdiz 2020), e que acompanha o pacote NIRtools (Perdiz 2021) para servir como exemplo para as análises neste tutorial. Vale ressaltar que esse conjunto de dados é extremamente pequeno, por isso desconsidere os resultados das análises. Ele servirá apenas de guia para abordar os procedimentos aqui abordados.

COVID19

Análise de dados NIR em R

Importação dos dados nir_data1

Para ler o conjunto de dados que utilizarei nesta oficina, basta rodar o comando abaixo:

dados <-
read.table("https://raw.githubusercontent.com/ricoperdiz/NIRtools/master/inst/extdata/nir_data.csv", sep = "\t", header = TRUE, as.is = TRUE)
10 / 101
COVID19

Análise de dados NIR em R

Importação dos dados nir_data1

Para ler o conjunto de dados que utilizarei nesta oficina, basta rodar o comando abaixo:

dados <-
read.table("https://raw.githubusercontent.com/ricoperdiz/NIRtools/master/inst/extdata/nir_data.csv", sep = "\t", header = TRUE, as.is = TRUE)

De maneira alternativa, você pode ler estes dados utilizando a função fread() do pacote data.table:

library("data.table")
dados <-
fread("https://raw.githubusercontent.com/ricoperdiz/NIRtools/master/inst/extdata/nir_data.csv")
10 / 101
COVID19

Análise de dados NIR em R

Importação de dados próprios

De maneira alternativa, como no exemplo anterior, você pode utilizar a função fread() do pacote data.table. Esta função não exige a especificação do separador, pois é automaticamente descoberto:

library("data.table")
dados <- fread("MEUSDADOS.csv")
11 / 101
COVID19

Análise de dados NIR em R

Transformação do data.frame em um tibble1

library("tibble")
dados <- as_tibble(dados)
head(dados)
## # A tibble: 6 × 1,562
## especimenid SP1 face coletor number X10001.03 X3999.64 X4003.497
## <int> <chr> <chr> <chr> <int> <dbl> <dbl> <dbl>
## 1 10194 P. aracou… abax… Perdiz… 2856 0.278 0.596 0.596
## 2 10194 P. aracou… adax… Perdiz… 2856 0.254 0.567 0.567
## 3 10194 P. aracou… abax… Perdiz… 2856 0.273 0.581 0.582
## 4 10194 P. aracou… adax… Perdiz… 2856 0.258 0.576 0.577
## 5 10194 P. aracou… abax… Perdiz… 2856 0.278 0.596 0.596
## 6 10194 P. aracou… adax… Perdiz… 2856 0.254 0.567 0.567
## # … with 1,554 more variables: X4007.354 <dbl>, X4011.211 <dbl>,
## # X4015.068 <dbl>, X4018.925 <dbl>, X4022.781 <dbl>, X4026.638 <dbl>,
## # X4030.495 <dbl>, X4034.352 <dbl>, X4038.209 <dbl>, X4042.066 <dbl>,
## # X4045.923 <dbl>, X4049.78 <dbl>, X4053.637 <dbl>, X4057.494 <dbl>,
## # X4061.351 <dbl>, X4065.208 <dbl>, X4069.065 <dbl>, X4072.922 <dbl>,
## # X4076.779 <dbl>, X4080.635 <dbl>, X4084.492 <dbl>, X4088.349 <dbl>,
## # X4092.206 <dbl>, X4096.063 <dbl>, X4099.92 <dbl>, X4103.777 <dbl>, …
  1. Este passo NÃO É NECESSÁRIO. Ele facilita apenas a visualização dos dados no console, e indica o tipo de cada variável em seu conjunto de dados. Saiba mais sobre um tibble em https://r4ds.had.co.nz/tibbles.html.
12 / 101
COVID19

Análise de dados NIR em R

Checagem básica

Primeiras 10 linhas e 5 colunas

dados[1:10, 1:5]
## # A tibble: 10 × 5
## especimenid SP1 face coletor number
## <int> <chr> <chr> <chr> <int>
## 1 10194 P. aracouchini abaxial Perdiz, R.O. 2856
## 2 10194 P. aracouchini adaxial Perdiz, R.O. 2856
## 3 10194 P. aracouchini abaxial Perdiz, R.O. 2856
## 4 10194 P. aracouchini adaxial Perdiz, R.O. 2856
## 5 10194 P. aracouchini abaxial Perdiz, R.O. 2856
## 6 10194 P. aracouchini adaxial Perdiz, R.O. 2856
## 7 10194 P. aracouchini abaxial Perdiz, R.O. 2856
## 8 10194 P. aracouchini adaxial Perdiz, R.O. 2856
## 9 10196 P. aracouchini abaxial Perdiz, R.O. 2858
## 10 10196 P. aracouchini adaxial Perdiz, R.O. 2858
13 / 101
COVID19

Análise de dados NIR em R

Estrutura dos dados

str(dados[, 1:15])
## tibble [48 × 15] (S3: tbl_df/tbl/data.frame)
## $ especimenid: int [1:48] 10194 10194 10194 10194 10194 10194 10194 10194 10196 10196 ...
## $ SP1 : chr [1:48] "P. aracouchini" "P. aracouchini" "P. aracouchini" "P. aracouchini" ...
## $ face : chr [1:48] "abaxial" "adaxial" "abaxial" "adaxial" ...
## $ coletor : chr [1:48] "Perdiz, R.O." "Perdiz, R.O." "Perdiz, R.O." "Perdiz, R.O." ...
## $ number : int [1:48] 2856 2856 2856 2856 2856 2856 2856 2856 2858 2858 ...
## $ X10001.03 : num [1:48] 0.278 0.254 0.273 0.258 0.278 ...
## $ X3999.64 : num [1:48] 0.596 0.567 0.581 0.576 0.596 ...
## $ X4003.497 : num [1:48] 0.596 0.567 0.582 0.577 0.596 ...
## $ X4007.354 : num [1:48] 0.596 0.567 0.582 0.577 0.596 ...
## $ X4011.211 : num [1:48] 0.596 0.567 0.582 0.577 0.596 ...
## $ X4015.068 : num [1:48] 0.596 0.567 0.581 0.576 0.596 ...
## $ X4018.925 : num [1:48] 0.595 0.566 0.58 0.575 0.595 ...
## $ X4022.781 : num [1:48] 0.593 0.565 0.579 0.574 0.593 ...
## $ X4026.638 : num [1:48] 0.592 0.563 0.578 0.573 0.592 ...
## $ X4030.495 : num [1:48] 0.59 0.562 0.576 0.571 0.59 ...
## - attr(*, ".internal.selfref")=<externalptr>
14 / 101
COVID19

Análise de dados NIR em R

Contagem de número de amostras por determinada categoria

SP1 é a variável que contem nome de espécie em meu conjunto de dados:

table(dados$SP1)
##
## P. aracouchini P. calanense
## 24 24
15 / 101
COVID19

Análise de dados NIR em R

Plot - NIRtools1

Função nirdf()2,3 converte um objeto com dados NIR em um objeto de classe nirdf, o que permite então utilizar u método próprio para plotar em R usando a função plot().

nirdad <-
NIRtools::nirdf(
dados,
category = "SP1",
measure_columns = grep("^X", names(dados), value = TRUE),
measure_columns_prefix = "X"
)
plot(nirdad, "SP1",
cex_pt = .7,
cex_leg = 2,
text_font = 3)

  1. Perdiz (2021). https://github.com/ricoperdiz/NIRtools.
  2. Ver tutorial em https://github.com/ricoperdiz/NIRtools para aprender a usar a função nirdad.

  3. Outra alternativa é utilizar os passos contidos em http://botanicaamazonica.wiki.br/labotam/doku.php?id=analises:nir:ver_spectra, de autoria do Dr. Alberto Vicentini (INPA).

16 / 101
COVID19

Análise de dados NIR em R

Manipulação de dados com o pacote dplyr

17 / 101
COVID19

Análise de dados NIR em R

O que é o dplyr?

18 / 101
COVID19

Análise de dados NIR em R

O que é o dplyr?

Funções ou verbos para manipular e sumarizar dados tabulados.

Não é um pacote de ações rápidas.

Nomes de funções facilitam a memorização.

Nomes sem aspas dentro das funções!

18 / 101

Este pacote possui uma série de funções/verbos para manipular e sumarizar dados tabulados.
Não é o pacote mais rápido ou eficiente para fazer tais ações.
Porém, o uso de funções cujos nomes nos remetem às ações que efetuamos rotineiramente com dados facilita a memorização.
Somado a isso, não temos a necessidade de usar aspas nos nomes das variáveis, o que acelera a digitação.

COVID19

Análise de dados NIR em R

Principais funções do pacote dplyr

  • Seleção de colunas - select()
19 / 101
COVID19

Análise de dados NIR em R

Principais funções do pacote dplyr

  • Seleção de colunas - select()

  • Ordenar linhas - arrange()

19 / 101
COVID19

Análise de dados NIR em R

Principais funções do pacote dplyr

  • Seleção de colunas - select()

  • Ordenar linhas - arrange()

  • Filtrar linhas - filter()

19 / 101
COVID19

Análise de dados NIR em R

Principais funções do pacote dplyr

  • Seleção de colunas - select()

  • Ordenar linhas - arrange()

  • Filtrar linhas - filter()

  • Criar novas colunas - mutate()

19 / 101
COVID19

Análise de dados NIR em R

Principais funções do pacote dplyr

  • Seleção de colunas - select()

  • Ordenar linhas - arrange()

  • Filtrar linhas - filter()

  • Criar novas colunas - mutate()

  • Sumarizar resultados - summarise()

19 / 101
COVID19

Análise de dados NIR em R

Principais funções do pacote dplyr

  • Seleção de colunas - select()

  • Ordenar linhas - arrange()

  • Filtrar linhas - filter()

  • Criar novas colunas - mutate()

  • Sumarizar resultados - summarise()

  • Função especial para agrupamentos - group_by()

19 / 101
COVID19

Análise de dados NIR em R

Carregando o pacote

library("dplyr")
20 / 101
COVID19

Análise de dados NIR em R

Atenção na hora de carregar os pacotes

21 / 101
COVID19

Análise de dados NIR em R

Atenção na hora de carregar os pacotes

Ordem de carregar pacotes é IMPORTANTE!

library("MASS")
library("dplyr")

21 / 101
COVID19

Análise de dados NIR em R

select() do dplyr funciona!

select(mtcars, mpg)

22 / 101
COVID19

Análise de dados NIR em R

Conflito com funções de mesmo nome!

library("dplyr")
library("MASS")

23 / 101
COVID19

Análise de dados NIR em R

Erro em select() do dplyr!

select(mtcars, mpg)

24 / 101
COVID19

Análise de dados NIR em R

Selecionando colunas com select()

Podemos selecionar quantas colunas desejarmos.

25 / 101
COVID19

Análise de dados NIR em R

Selecionando colunas com select()

Podemos selecionar quantas colunas desejarmos.

Uma coluna

select(dados, especimenid)
## # A tibble: 48 × 1
## especimenid
## <int>
## 1 10194
## 2 10194
## 3 10194
## 4 10194
## 5 10194
## 6 10194
## 7 10194
## 8 10194
## 9 10196
## 10 10196
## # … with 38 more rows
25 / 101

Para selecionar uma coluna, usamos a função select(). O primeiro argumento é o nome do data.frame, dados; a partir do segundo argumento, colocamos os nomes das colunas sem aspas.

COVID19

Análise de dados NIR em R

Selecionando colunas com select()

Duas colunas

select(dados, especimenid, SP1)
## # A tibble: 48 × 2
## especimenid SP1
## <int> <chr>
## 1 10194 P. aracouchini
## 2 10194 P. aracouchini
## 3 10194 P. aracouchini
## 4 10194 P. aracouchini
## 5 10194 P. aracouchini
## 6 10194 P. aracouchini
## 7 10194 P. aracouchini
## 8 10194 P. aracouchini
## 9 10196 P. aracouchini
## 10 10196 P. aracouchini
## # … with 38 more rows
26 / 101
COVID19

Análise de dados NIR em R

Selecionando colunas com select()

Múltiplas colunas

select(dados, especimenid, SP1, coletor, number)
## # A tibble: 48 × 4
## especimenid SP1 coletor number
## <int> <chr> <chr> <int>
## 1 10194 P. aracouchini Perdiz, R.O. 2856
## 2 10194 P. aracouchini Perdiz, R.O. 2856
## 3 10194 P. aracouchini Perdiz, R.O. 2856
## 4 10194 P. aracouchini Perdiz, R.O. 2856
## 5 10194 P. aracouchini Perdiz, R.O. 2856
## 6 10194 P. aracouchini Perdiz, R.O. 2856
## 7 10194 P. aracouchini Perdiz, R.O. 2856
## 8 10194 P. aracouchini Perdiz, R.O. 2856
## 9 10196 P. aracouchini Perdiz, R.O. 2858
## 10 10196 P. aracouchini Perdiz, R.O. 2858
## # … with 38 more rows
27 / 101
COVID19

Análise de dados NIR em R

Remoção de colunas

Uma coluna

dados_1colunaremovida <- select(dados, -especimenid)
head(dados_1colunaremovida)
## # A tibble: 6 × 1,561
## SP1 face coletor number X10001.03 X3999.64 X4003.497 X4007.354
## <chr> <chr> <chr> <int> <dbl> <dbl> <dbl> <dbl>
## 1 P. aracouch… abax… Perdiz… 2856 0.278 0.596 0.596 0.596
## 2 P. aracouch… adax… Perdiz… 2856 0.254 0.567 0.567 0.567
## 3 P. aracouch… abax… Perdiz… 2856 0.273 0.581 0.582 0.582
## 4 P. aracouch… adax… Perdiz… 2856 0.258 0.576 0.577 0.577
## 5 P. aracouch… abax… Perdiz… 2856 0.278 0.596 0.596 0.596
## 6 P. aracouch… adax… Perdiz… 2856 0.254 0.567 0.567 0.567
## # … with 1,553 more variables: X4011.211 <dbl>, X4015.068 <dbl>,
## # X4018.925 <dbl>, X4022.781 <dbl>, X4026.638 <dbl>, X4030.495 <dbl>,
## # X4034.352 <dbl>, X4038.209 <dbl>, X4042.066 <dbl>, X4045.923 <dbl>,
## # X4049.78 <dbl>, X4053.637 <dbl>, X4057.494 <dbl>, X4061.351 <dbl>,
## # X4065.208 <dbl>, X4069.065 <dbl>, X4072.922 <dbl>, X4076.779 <dbl>,
## # X4080.635 <dbl>, X4084.492 <dbl>, X4088.349 <dbl>, X4092.206 <dbl>,
## # X4096.063 <dbl>, X4099.92 <dbl>, X4103.777 <dbl>, X4107.634 <dbl>, …
28 / 101
COVID19

Análise de dados NIR em R

Remoção de colunas

Duas colunas

dados_2colunasremovidas <- select(dados, -especimenid, -SP1)
head(dados_2colunasremovidas)
## # A tibble: 6 × 1,560
## face coletor number X10001.03 X3999.64 X4003.497 X4007.354 X4011.211
## <chr> <chr> <int> <dbl> <dbl> <dbl> <dbl> <dbl>
## 1 abaxial Perdiz,… 2856 0.278 0.596 0.596 0.596 0.596
## 2 adaxial Perdiz,… 2856 0.254 0.567 0.567 0.567 0.567
## 3 abaxial Perdiz,… 2856 0.273 0.581 0.582 0.582 0.582
## 4 adaxial Perdiz,… 2856 0.258 0.576 0.577 0.577 0.577
## 5 abaxial Perdiz,… 2856 0.278 0.596 0.596 0.596 0.596
## 6 adaxial Perdiz,… 2856 0.254 0.567 0.567 0.567 0.567
## # … with 1,552 more variables: X4015.068 <dbl>, X4018.925 <dbl>,
## # X4022.781 <dbl>, X4026.638 <dbl>, X4030.495 <dbl>, X4034.352 <dbl>,
## # X4038.209 <dbl>, X4042.066 <dbl>, X4045.923 <dbl>, X4049.78 <dbl>,
## # X4053.637 <dbl>, X4057.494 <dbl>, X4061.351 <dbl>, X4065.208 <dbl>,
## # X4069.065 <dbl>, X4072.922 <dbl>, X4076.779 <dbl>, X4080.635 <dbl>,
## # X4084.492 <dbl>, X4088.349 <dbl>, X4092.206 <dbl>, X4096.063 <dbl>,
## # X4099.92 <dbl>, X4103.777 <dbl>, X4107.634 <dbl>, X4111.491 <dbl>, …
29 / 101
COVID19

Análise de dados NIR em R

Remoção de colunas

Múltiplas colunas

multiplas_colunas_removidas <- select(dados, -one_of(c("especimenid", "SP1", "face")))
head(multiplas_colunas_removidas)
## # A tibble: 6 × 1,559
## coletor number X10001.03 X3999.64 X4003.497 X4007.354 X4011.211
## <chr> <int> <dbl> <dbl> <dbl> <dbl> <dbl>
## 1 Perdiz, R.O. 2856 0.278 0.596 0.596 0.596 0.596
## 2 Perdiz, R.O. 2856 0.254 0.567 0.567 0.567 0.567
## 3 Perdiz, R.O. 2856 0.273 0.581 0.582 0.582 0.582
## 4 Perdiz, R.O. 2856 0.258 0.576 0.577 0.577 0.577
## 5 Perdiz, R.O. 2856 0.278 0.596 0.596 0.596 0.596
## 6 Perdiz, R.O. 2856 0.254 0.567 0.567 0.567 0.567
## # … with 1,552 more variables: X4015.068 <dbl>, X4018.925 <dbl>,
## # X4022.781 <dbl>, X4026.638 <dbl>, X4030.495 <dbl>, X4034.352 <dbl>,
## # X4038.209 <dbl>, X4042.066 <dbl>, X4045.923 <dbl>, X4049.78 <dbl>,
## # X4053.637 <dbl>, X4057.494 <dbl>, X4061.351 <dbl>, X4065.208 <dbl>,
## # X4069.065 <dbl>, X4072.922 <dbl>, X4076.779 <dbl>, X4080.635 <dbl>,
## # X4084.492 <dbl>, X4088.349 <dbl>, X4092.206 <dbl>, X4096.063 <dbl>,
## # X4099.92 <dbl>, X4103.777 <dbl>, X4107.634 <dbl>, X4111.491 <dbl>, …
30 / 101
COVID19

Análise de dados NIR em R

Reordenar colunas

select(dados, SP1, number, coletor)
## # A tibble: 48 × 3
## SP1 number coletor
## <chr> <int> <chr>
## 1 P. aracouchini 2856 Perdiz, R.O.
## 2 P. aracouchini 2856 Perdiz, R.O.
## 3 P. aracouchini 2856 Perdiz, R.O.
## 4 P. aracouchini 2856 Perdiz, R.O.
## 5 P. aracouchini 2856 Perdiz, R.O.
## 6 P. aracouchini 2856 Perdiz, R.O.
## 7 P. aracouchini 2856 Perdiz, R.O.
## 8 P. aracouchini 2856 Perdiz, R.O.
## 9 P. aracouchini 2858 Perdiz, R.O.
## 10 P. aracouchini 2858 Perdiz, R.O.
## # … with 38 more rows
31 / 101
COVID19

Análise de dados NIR em R

Reordenar colunas com everything()

select(dados, coletor, number, everything())
## # A tibble: 48 × 1,562
## coletor number especimenid SP1 face X10001.03 X3999.64 X4003.497
## <chr> <int> <int> <chr> <chr> <dbl> <dbl> <dbl>
## 1 Perdiz, R.… 2856 10194 P. a… abax… 0.278 0.596 0.596
## 2 Perdiz, R.… 2856 10194 P. a… adax… 0.254 0.567 0.567
## 3 Perdiz, R.… 2856 10194 P. a… abax… 0.273 0.581 0.582
## 4 Perdiz, R.… 2856 10194 P. a… adax… 0.258 0.576 0.577
## 5 Perdiz, R.… 2856 10194 P. a… abax… 0.278 0.596 0.596
## 6 Perdiz, R.… 2856 10194 P. a… adax… 0.254 0.567 0.567
## 7 Perdiz, R.… 2856 10194 P. a… abax… 0.273 0.581 0.582
## 8 Perdiz, R.… 2856 10194 P. a… adax… 0.258 0.576 0.577
## 9 Perdiz, R.… 2858 10196 P. a… abax… 0.274 0.681 0.681
## 10 Perdiz, R.… 2858 10196 P. a… adax… 0.278 0.673 0.672
## # … with 38 more rows, and 1,554 more variables: X4007.354 <dbl>,
## # X4011.211 <dbl>, X4015.068 <dbl>, X4018.925 <dbl>, X4022.781 <dbl>,
## # X4026.638 <dbl>, X4030.495 <dbl>, X4034.352 <dbl>, X4038.209 <dbl>,
## # X4042.066 <dbl>, X4045.923 <dbl>, X4049.78 <dbl>, X4053.637 <dbl>,
## # X4057.494 <dbl>, X4061.351 <dbl>, X4065.208 <dbl>, X4069.065 <dbl>,
## # X4072.922 <dbl>, X4076.779 <dbl>, X4080.635 <dbl>, X4084.492 <dbl>,
## # X4088.349 <dbl>, X4092.206 <dbl>, X4096.063 <dbl>, X4099.92 <dbl>, …
32 / 101
COVID19

Análise de dados NIR em R

Funções auxiliares de select()

Há verbos que auxiliam a busca das colunas desejadas. São eles:

33 / 101
COVID19

Análise de dados NIR em R

Funções auxiliares de select()

Há verbos que auxiliam a busca das colunas desejadas. São eles:

  • starts_with(): Coluna começa com um prefixo X;
  • ends_with(): Termina com um sufixo X;
  • contains(): Contem uma determinada palavra;
  • matches(): Busca uma expressão regular (veja ?regex);
  • num_range(): Busca uma amplitude numérica.
33 / 101
COVID19

Análise de dados NIR em R

starts_with()

select(dados, starts_with("col"))
## # A tibble: 48 × 1
## coletor
## <chr>
## 1 Perdiz, R.O.
## 2 Perdiz, R.O.
## 3 Perdiz, R.O.
## 4 Perdiz, R.O.
## 5 Perdiz, R.O.
## 6 Perdiz, R.O.
## 7 Perdiz, R.O.
## 8 Perdiz, R.O.
## 9 Perdiz, R.O.
## 10 Perdiz, R.O.
## # … with 38 more rows
34 / 101
COVID19

Análise de dados NIR em R

ends_with()

select(dados, ends_with("r"))
## # A tibble: 48 × 2
## coletor number
## <chr> <int>
## 1 Perdiz, R.O. 2856
## 2 Perdiz, R.O. 2856
## 3 Perdiz, R.O. 2856
## 4 Perdiz, R.O. 2856
## 5 Perdiz, R.O. 2856
## 6 Perdiz, R.O. 2856
## 7 Perdiz, R.O. 2856
## 8 Perdiz, R.O. 2856
## 9 Perdiz, R.O. 2858
## 10 Perdiz, R.O. 2858
## # … with 38 more rows
35 / 101
COVID19

Análise de dados NIR em R

contains()

select(dados, contains("ol"))
## # A tibble: 48 × 1
## coletor
## <chr>
## 1 Perdiz, R.O.
## 2 Perdiz, R.O.
## 3 Perdiz, R.O.
## 4 Perdiz, R.O.
## 5 Perdiz, R.O.
## 6 Perdiz, R.O.
## 7 Perdiz, R.O.
## 8 Perdiz, R.O.
## 9 Perdiz, R.O.
## 10 Perdiz, R.O.
## # … with 38 more rows
36 / 101
COVID19

Análise de dados NIR em R

matches()

select(dados, matches("^X[0-9]+\\.97$"))
## # A tibble: 48 × 1
## X8438.97
## <dbl>
## 1 0.294
## 2 0.271
## 3 0.290
## 4 0.275
## 5 0.294
## 6 0.271
## 7 0.290
## 8 0.275
## 9 0.285
## 10 0.290
## # … with 38 more rows
37 / 101
COVID19

Análise de dados NIR em R

num_range()

select(dados, num_range("X", seq(from = 3999.64, to = 4007.354, by = 3.857)))
## # A tibble: 48 × 3
## X3999.64 X4003.497 X4007.354
## <dbl> <dbl> <dbl>
## 1 0.596 0.596 0.596
## 2 0.567 0.567 0.567
## 3 0.581 0.582 0.582
## 4 0.576 0.577 0.577
## 5 0.596 0.596 0.596
## 6 0.567 0.567 0.567
## 7 0.581 0.582 0.582
## 8 0.576 0.577 0.577
## 9 0.681 0.681 0.681
## 10 0.673 0.672 0.672
## # … with 38 more rows
38 / 101
COVID19

Análise de dados NIR em R

Combinações de linhas distintas - distinct()

Ao selecionar diversas colunas, podemos querer ver combinações distintas de linhas.

39 / 101
COVID19

Análise de dados NIR em R

Combinações de linhas distintas - distinct()

Ao selecionar diversas colunas, podemos querer ver combinações distintas de linhas.

Usamos então a função distinct() para obter essas combinações:

distinct(dados, coletor, number, SP1)
## # A tibble: 6 × 3
## SP1 coletor number
## <chr> <chr> <int>
## 1 P. aracouchini Perdiz, R.O. 2856
## 2 P. aracouchini Perdiz, R.O. 2858
## 3 P. aracouchini Perdiz, R.O. 2859
## 4 P. calanense Perdiz, R.O. 3236
## 5 P. calanense Perdiz, R.O. 3237
## 6 P. calanense Perdiz, R.O. 3239
39 / 101
COVID19

Análise de dados NIR em R

Ordenar linhas - arrange()

arrange(dados, number)
## # A tibble: 48 × 1,562
## especimenid SP1 face coletor number X10001.03 X3999.64 X4003.497
## <int> <chr> <chr> <chr> <int> <dbl> <dbl> <dbl>
## 1 10194 P. araco… abax… Perdiz… 2856 0.278 0.596 0.596
## 2 10194 P. araco… adax… Perdiz… 2856 0.254 0.567 0.567
## 3 10194 P. araco… abax… Perdiz… 2856 0.273 0.581 0.582
## 4 10194 P. araco… adax… Perdiz… 2856 0.258 0.576 0.577
## 5 10194 P. araco… abax… Perdiz… 2856 0.278 0.596 0.596
## 6 10194 P. araco… adax… Perdiz… 2856 0.254 0.567 0.567
## 7 10194 P. araco… abax… Perdiz… 2856 0.273 0.581 0.582
## 8 10194 P. araco… adax… Perdiz… 2856 0.258 0.576 0.577
## 9 10196 P. araco… abax… Perdiz… 2858 0.274 0.681 0.681
## 10 10196 P. araco… adax… Perdiz… 2858 0.278 0.673 0.672
## # … with 38 more rows, and 1,554 more variables: X4007.354 <dbl>,
## # X4011.211 <dbl>, X4015.068 <dbl>, X4018.925 <dbl>, X4022.781 <dbl>,
## # X4026.638 <dbl>, X4030.495 <dbl>, X4034.352 <dbl>, X4038.209 <dbl>,
## # X4042.066 <dbl>, X4045.923 <dbl>, X4049.78 <dbl>, X4053.637 <dbl>,
## # X4057.494 <dbl>, X4061.351 <dbl>, X4065.208 <dbl>, X4069.065 <dbl>,
## # X4072.922 <dbl>, X4076.779 <dbl>, X4080.635 <dbl>, X4084.492 <dbl>,
## # X4088.349 <dbl>, X4092.206 <dbl>, X4096.063 <dbl>, X4099.92 <dbl>, …
40 / 101
COVID19

Análise de dados NIR em R

Ordenar linhas - arrange()

arrange(dados, desc(number))
## # A tibble: 48 × 1,562
## especimenid SP1 face coletor number X10001.03 X3999.64 X4003.497
## <int> <chr> <chr> <chr> <int> <dbl> <dbl> <dbl>
## 1 12650 P. calan… abax… Perdiz… 3239 0.349 0.733 0.733
## 2 12650 P. calan… adax… Perdiz… 3239 0.342 0.744 0.744
## 3 12650 P. calan… abax… Perdiz… 3239 0.342 0.713 0.714
## 4 12650 P. calan… adax… Perdiz… 3239 0.355 0.773 0.773
## 5 12650 P. calan… abax… Perdiz… 3239 0.349 0.733 0.733
## 6 12650 P. calan… adax… Perdiz… 3239 0.342 0.744 0.744
## 7 12650 P. calan… abax… Perdiz… 3239 0.342 0.713 0.714
## 8 12650 P. calan… adax… Perdiz… 3239 0.355 0.773 0.773
## 9 12648 P. calan… abax… Perdiz… 3237 0.402 0.745 0.746
## 10 12648 P. calan… adax… Perdiz… 3237 0.389 0.757 0.757
## # … with 38 more rows, and 1,554 more variables: X4007.354 <dbl>,
## # X4011.211 <dbl>, X4015.068 <dbl>, X4018.925 <dbl>, X4022.781 <dbl>,
## # X4026.638 <dbl>, X4030.495 <dbl>, X4034.352 <dbl>, X4038.209 <dbl>,
## # X4042.066 <dbl>, X4045.923 <dbl>, X4049.78 <dbl>, X4053.637 <dbl>,
## # X4057.494 <dbl>, X4061.351 <dbl>, X4065.208 <dbl>, X4069.065 <dbl>,
## # X4072.922 <dbl>, X4076.779 <dbl>, X4080.635 <dbl>, X4084.492 <dbl>,
## # X4088.349 <dbl>, X4092.206 <dbl>, X4096.063 <dbl>, X4099.92 <dbl>, …
41 / 101
COVID19

Análise de dados NIR em R

Filtragem de linhas - filter()

filter(dados, SP1 == "P. calanense")
## # A tibble: 24 × 1,562
## especimenid SP1 face coletor number X10001.03 X3999.64 X4003.497
## <int> <chr> <chr> <chr> <int> <dbl> <dbl> <dbl>
## 1 12647 P. calan… abax… Perdiz… 3236 0.322 0.717 0.717
## 2 12647 P. calan… adax… Perdiz… 3236 0.329 0.714 0.715
## 3 12647 P. calan… abax… Perdiz… 3236 0.340 0.724 0.724
## 4 12647 P. calan… adax… Perdiz… 3236 0.320 0.735 0.736
## 5 12647 P. calan… abax… Perdiz… 3236 0.322 0.717 0.717
## 6 12647 P. calan… adax… Perdiz… 3236 0.329 0.714 0.715
## 7 12647 P. calan… abax… Perdiz… 3236 0.340 0.724 0.724
## 8 12647 P. calan… adax… Perdiz… 3236 0.320 0.735 0.736
## 9 12648 P. calan… abax… Perdiz… 3237 0.402 0.745 0.746
## 10 12648 P. calan… adax… Perdiz… 3237 0.389 0.757 0.757
## # … with 14 more rows, and 1,554 more variables: X4007.354 <dbl>,
## # X4011.211 <dbl>, X4015.068 <dbl>, X4018.925 <dbl>, X4022.781 <dbl>,
## # X4026.638 <dbl>, X4030.495 <dbl>, X4034.352 <dbl>, X4038.209 <dbl>,
## # X4042.066 <dbl>, X4045.923 <dbl>, X4049.78 <dbl>, X4053.637 <dbl>,
## # X4057.494 <dbl>, X4061.351 <dbl>, X4065.208 <dbl>, X4069.065 <dbl>,
## # X4072.922 <dbl>, X4076.779 <dbl>, X4080.635 <dbl>, X4084.492 <dbl>,
## # X4088.349 <dbl>, X4092.206 <dbl>, X4096.063 <dbl>, X4099.92 <dbl>, …
42 / 101
COVID19

Análise de dados NIR em R

Filtragem composta

filter(dados, SP1 == "P. calanense", number == 3237)
## # A tibble: 8 × 1,562
## especimenid SP1 face coletor number X10001.03 X3999.64 X4003.497
## <int> <chr> <chr> <chr> <int> <dbl> <dbl> <dbl>
## 1 12648 P. calane… abax… Perdiz… 3237 0.402 0.745 0.746
## 2 12648 P. calane… adax… Perdiz… 3237 0.389 0.757 0.757
## 3 12648 P. calane… abax… Perdiz… 3237 0.418 0.748 0.749
## 4 12648 P. calane… adax… Perdiz… 3237 0.363 0.725 0.725
## 5 12648 P. calane… abax… Perdiz… 3237 0.402 0.745 0.746
## 6 12648 P. calane… adax… Perdiz… 3237 0.389 0.757 0.757
## 7 12648 P. calane… abax… Perdiz… 3237 0.418 0.748 0.749
## 8 12648 P. calane… adax… Perdiz… 3237 0.363 0.725 0.725
## # … with 1,554 more variables: X4007.354 <dbl>, X4011.211 <dbl>,
## # X4015.068 <dbl>, X4018.925 <dbl>, X4022.781 <dbl>, X4026.638 <dbl>,
## # X4030.495 <dbl>, X4034.352 <dbl>, X4038.209 <dbl>, X4042.066 <dbl>,
## # X4045.923 <dbl>, X4049.78 <dbl>, X4053.637 <dbl>, X4057.494 <dbl>,
## # X4061.351 <dbl>, X4065.208 <dbl>, X4069.065 <dbl>, X4072.922 <dbl>,
## # X4076.779 <dbl>, X4080.635 <dbl>, X4084.492 <dbl>, X4088.349 <dbl>,
## # X4092.206 <dbl>, X4096.063 <dbl>, X4099.92 <dbl>, X4103.777 <dbl>, …
43 / 101
COVID19

Análise de dados NIR em R

Filtragem composta

> filter(dados, SP1 == "P. calanense", number == 3237)

44 / 101
COVID19

Análise de dados NIR em R

Filtragem composta

> filter(dados, SP1 == "P. calanense", number == 3237)

É o mesmo que

44 / 101
COVID19

Análise de dados NIR em R

Filtragem composta

> filter(dados, SP1 == "P. calanense", number == 3237)

É o mesmo que

> filter(dados, SP1 == "P. calanense" & number == 3237)

44 / 101
COVID19

Análise de dados NIR em R

Filtragem composta

> filter(dados, SP1 == "P. calanense", number == 3237)

É o mesmo que

> filter(dados, SP1 == "P. calanense" & number == 3237)

Vírgula , em filter() equivale a &

44 / 101
COVID19

Análise de dados NIR em R

Criar novas colunas - mutate()

nova_coluna <- mutate(dados, calanense = ifelse(SP1 == "P. calanense", 1, 0))
select(nova_coluna, SP1, calanense)
## # A tibble: 48 × 2
## SP1 calanense
## <chr> <dbl>
## 1 P. aracouchini 0
## 2 P. aracouchini 0
## 3 P. aracouchini 0
## 4 P. aracouchini 0
## 5 P. aracouchini 0
## 6 P. aracouchini 0
## 7 P. aracouchini 0
## 8 P. aracouchini 0
## 9 P. aracouchini 0
## 10 P. aracouchini 0
## # … with 38 more rows
45 / 101
COVID19

Análise de dados NIR em R

Sumarizar resultados - summarise()

summarise(dados, media_X8438.97 = mean(X8438.97))
## # A tibble: 1 × 1
## media_X8438.97
## <dbl>
## 1 0.327
46 / 101

A função summarise() colapsa um data.frame em uma única linha. No entanto, a verdadeira utilidade dessa função se manifesta ao utilizarmos a função group_by para destacar os agrupamentos que desejamos fazer dentro dos dados.

COVID19

Análise de dados NIR em R

Agrupamentos - group_by

dados_agrupados <- group_by(dados, SP1)
dados_agrupados[1:5, 1:10]
## # A tibble: 5 × 10
## # Groups: SP1 [1]
## especimenid SP1 face coletor number X10001.03 X3999.64 X4003.497
## <int> <chr> <chr> <chr> <int> <dbl> <dbl> <dbl>
## 1 10194 P. aracou… abax… Perdiz… 2856 0.278 0.596 0.596
## 2 10194 P. aracou… adax… Perdiz… 2856 0.254 0.567 0.567
## 3 10194 P. aracou… abax… Perdiz… 2856 0.273 0.581 0.582
## 4 10194 P. aracou… adax… Perdiz… 2856 0.258 0.576 0.577
## 5 10194 P. aracou… abax… Perdiz… 2856 0.278 0.596 0.596
## # … with 2 more variables: X4007.354 <dbl>, X4011.211 <dbl>
47 / 101
COVID19

Análise de dados NIR em R

Agrupamentos - group_by

dados_agrupados <- group_by(dados, SP1)
dados_agrupados[1:5, 1:10]
## # A tibble: 5 × 10
## # Groups: SP1 [1]
## especimenid SP1 face coletor number X10001.03 X3999.64 X4003.497
## <int> <chr> <chr> <chr> <int> <dbl> <dbl> <dbl>
## 1 10194 P. aracou… abax… Perdiz… 2856 0.278 0.596 0.596
## 2 10194 P. aracou… adax… Perdiz… 2856 0.254 0.567 0.567
## 3 10194 P. aracou… abax… Perdiz… 2856 0.273 0.581 0.582
## 4 10194 P. aracou… adax… Perdiz… 2856 0.258 0.576 0.577
## 5 10194 P. aracou… abax… Perdiz… 2856 0.278 0.596 0.596
## # … with 2 more variables: X4007.354 <dbl>, X4011.211 <dbl>

Os dados estão agrupados?

is_grouped_df(dados_agrupados)
## [1] TRUE
47 / 101

Suponhemos que eu queira ver médias de determinada variável para as espécies de meu conjunto de dados. Usamos a função group_by para agrupar os dados em torno da variável SP1. À primeira vista, não há resultado aparente.

Porém, ao usarmos essa função is_grouped_df(), temos a certeza de que os dados estão agrupados. Não se preocupem em aprender essa função. Foquem na lição a seguir.

COVID19

Análise de dados NIR em R

Agrupa e sumariza!

summarise(dados_agrupados, media_X8438.97 = mean(X8438.97))
## # A tibble: 2 × 2
## SP1 media_X8438.97
## <chr> <dbl>
## 1 P. aracouchini 0.285
## 2 P. calanense 0.369
48 / 101

Vamos sumarizar os dados para a variável X8438.97.

COVID19

Análise de dados NIR em R

Sumarizar várias colunas

dados_agrupados2 <-
group_by(
select(dados, SP1, ends_with("7")),
SP1
)
summarise_all(dados_agrupados2, .funs = mean)
## # A tibble: 2 × 172
## SP1 X4003.497 X4053.637 X4103.777 X4153.917 X4204.057 X4238.77
## <chr> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>
## 1 P. aracouchi… 0.651 0.626 0.576 0.547 0.544 0.546
## 2 P. calanense 0.736 0.709 0.653 0.622 0.620 0.625
## # … with 165 more variables: X4254.197 <dbl>, X4292.767 <dbl>,
## # X4304.337 <dbl>, X4342.907 <dbl>, X4393.047 <dbl>, X4443.187 <dbl>,
## # X4489.47 <dbl>, X4493.327 <dbl>, X4543.467 <dbl>, X4582.037 <dbl>,
## # X4593.607 <dbl>, X4632.177 <dbl>, X4682.317 <dbl>, X4732.457 <dbl>,
## # X4782.597 <dbl>, X4821.167 <dbl>, X4832.737 <dbl>, X4871.307 <dbl>,
## # X4882.877 <dbl>, X4921.447 <dbl>, X4971.587 <dbl>, X5017.87 <dbl>,
## # X5021.727 <dbl>, X5071.867 <dbl>, X5110.437 <dbl>, X5122.007 <dbl>, …
49 / 101
COVID19

Análise de dados NIR em R

Combinando operações com o pipe (cano!)

50 / 101
COVID19

Análise de dados NIR em R

Combinando operações com o pipe (cano!)

Ferramenta existente em outras linguagens (bash, F#).

50 / 101
COVID19

Análise de dados NIR em R

Combinando operações com o pipe (cano!)

Ferramenta existente em outras linguagens (bash, F#).

Simplifica códigos.

50 / 101
COVID19

Análise de dados NIR em R

Combinando operações com o pipe (cano!)

Ferramenta existente em outras linguagens (bash, F#).

Simplifica códigos.

Facilita a leitura.

50 / 101
COVID19

Análise de dados NIR em R

Combinando operações com o pipe (cano!)

Ferramenta existente em outras linguagens (bash, F#).

Simplifica códigos.

Facilita a leitura.

Reduz a quantidade de objetos na área de trabalho ls().

50 / 101
COVID19

Análise de dados NIR em R

Combinando operações com o pipe (cano!)

Ferramenta existente em outras linguagens (bash, F#).

Simplifica códigos.

Facilita a leitura.

Reduz a quantidade de objetos na área de trabalho ls().

Duas opções:

  • %>% (pacote magrittr)
  • |> (a partir do R 4.1).
50 / 101
COVID19

Análise de dados NIR em R

Código sem encadeamento

summarise_all(group_by(filter(select(dados, SP1, ends_with("7")), SP1 == "P. calanense"), SP1), .funs = mean)
## # A tibble: 1 × 172
## SP1 X4003.497 X4053.637 X4103.777 X4153.917 X4204.057 X4238.77
## <chr> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>
## 1 P. calanense 0.736 0.709 0.653 0.622 0.620 0.625
## # … with 165 more variables: X4254.197 <dbl>, X4292.767 <dbl>,
## # X4304.337 <dbl>, X4342.907 <dbl>, X4393.047 <dbl>, X4443.187 <dbl>,
## # X4489.47 <dbl>, X4493.327 <dbl>, X4543.467 <dbl>, X4582.037 <dbl>,
## # X4593.607 <dbl>, X4632.177 <dbl>, X4682.317 <dbl>, X4732.457 <dbl>,
## # X4782.597 <dbl>, X4821.167 <dbl>, X4832.737 <dbl>, X4871.307 <dbl>,
## # X4882.877 <dbl>, X4921.447 <dbl>, X4971.587 <dbl>, X5017.87 <dbl>,
## # X5021.727 <dbl>, X5071.867 <dbl>, X5110.437 <dbl>, X5122.007 <dbl>, …
51 / 101
COVID19

Análise de dados NIR em R

Possível solução - criação de objetos intermediários

dados_selecionados <- select(dados, SP1, ends_with("7"))
dados_filtrados <- filter(dados_selecionados, SP1 == "P. calanense")
dados_agrupados3 <- group_by(dados_filtrados, SP1)
summarise_all(dados_agrupados3, .funs = mean)
## # A tibble: 1 × 172
## SP1 X4003.497 X4053.637 X4103.777 X4153.917 X4204.057 X4238.77
## <chr> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>
## 1 P. calanense 0.736 0.709 0.653 0.622 0.620 0.625
## # … with 165 more variables: X4254.197 <dbl>, X4292.767 <dbl>,
## # X4304.337 <dbl>, X4342.907 <dbl>, X4393.047 <dbl>, X4443.187 <dbl>,
## # X4489.47 <dbl>, X4493.327 <dbl>, X4543.467 <dbl>, X4582.037 <dbl>,
## # X4593.607 <dbl>, X4632.177 <dbl>, X4682.317 <dbl>, X4732.457 <dbl>,
## # X4782.597 <dbl>, X4821.167 <dbl>, X4832.737 <dbl>, X4871.307 <dbl>,
## # X4882.877 <dbl>, X4921.447 <dbl>, X4971.587 <dbl>, X5017.87 <dbl>,
## # X5021.727 <dbl>, X5071.867 <dbl>, X5110.437 <dbl>, X5122.007 <dbl>, …
52 / 101

Porém, a criação de objetos intermediários "suja" a área de trabalho com objetos que, muitas vezes, não chegarão a serem utilizados novamente

COVID19

Análise de dados NIR em R

Vamos encadear com %>%

select(dados, SP1, ends_with("7")) %>%
filter(., SP1 == "P. calanense") %>%
group_by(., SP1) %>%
summarise_all(., .funs = mean)
## # A tibble: 1 × 172
## SP1 X4003.497 X4053.637 X4103.777 X4153.917 X4204.057 X4238.77
## <chr> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>
## 1 P. calanense 0.736 0.709 0.653 0.622 0.620 0.625
## # … with 165 more variables: X4254.197 <dbl>, X4292.767 <dbl>,
## # X4304.337 <dbl>, X4342.907 <dbl>, X4393.047 <dbl>, X4443.187 <dbl>,
## # X4489.47 <dbl>, X4493.327 <dbl>, X4543.467 <dbl>, X4582.037 <dbl>,
## # X4593.607 <dbl>, X4632.177 <dbl>, X4682.317 <dbl>, X4732.457 <dbl>,
## # X4782.597 <dbl>, X4821.167 <dbl>, X4832.737 <dbl>, X4871.307 <dbl>,
## # X4882.877 <dbl>, X4921.447 <dbl>, X4971.587 <dbl>, X5017.87 <dbl>,
## # X5021.727 <dbl>, X5071.867 <dbl>, X5110.437 <dbl>, X5122.007 <dbl>, …
53 / 101
COVID19

Análise de dados NIR em R

Aplicações de agrupamentos em dados NIR

54 / 101
COVID19

Análise de dados NIR em R

Aplicações de agrupamentos em dados NIR

Suponha que você deseja obter valores de média de cada variável NIR por indivíduo.

54 / 101
COVID19

Análise de dados NIR em R

Aplicações de agrupamentos em dados NIR

Suponha que você deseja obter valores de média de cada variável NIR por indivíduo.

No conjunto de dados exemplo desta oficina, dados, indivíduos são reconhecidos pela variável especimenid.

54 / 101
COVID19

Análise de dados NIR em R

Aplicações de agrupamentos em dados NIR

Suponha que você deseja obter valores de média de cada variável NIR por indivíduo.

No conjunto de dados exemplo desta oficina, dados, indivíduos são reconhecidos pela variável especimenid.

Logo, esta variável, especimenid, será nosso agrupamento.

54 / 101
COVID19

Análise de dados NIR em R

Média por indivíduo

Sem encadeamento (sem uso do operador %>%)

summarise_all(
group_by(select(dados, especimenid, SP1, starts_with("X")), especimenid, SP1),
.funs = mean)
## # A tibble: 6 × 1,559
## # Groups: especimenid [6]
## especimenid SP1 X10001.03 X3999.64 X4003.497 X4007.354 X4011.211
## <int> <chr> <dbl> <dbl> <dbl> <dbl> <dbl>
## 1 10194 P. aracouc… 0.266 0.580 0.581 0.580 0.580
## 2 10196 P. aracouc… 0.274 0.692 0.692 0.692 0.691
## 3 10197 P. aracouc… 0.274 0.680 0.680 0.680 0.680
## 4 12647 P. calanen… 0.328 0.723 0.723 0.723 0.723
## 5 12648 P. calanen… 0.393 0.744 0.744 0.744 0.744
## 6 12650 P. calanen… 0.347 0.741 0.741 0.741 0.741
## # … with 1,552 more variables: X4015.068 <dbl>, X4018.925 <dbl>,
## # X4022.781 <dbl>, X4026.638 <dbl>, X4030.495 <dbl>, X4034.352 <dbl>,
## # X4038.209 <dbl>, X4042.066 <dbl>, X4045.923 <dbl>, X4049.78 <dbl>,
## # X4053.637 <dbl>, X4057.494 <dbl>, X4061.351 <dbl>, X4065.208 <dbl>,
## # X4069.065 <dbl>, X4072.922 <dbl>, X4076.779 <dbl>, X4080.635 <dbl>,
## # X4084.492 <dbl>, X4088.349 <dbl>, X4092.206 <dbl>, X4096.063 <dbl>,
## # X4099.92 <dbl>, X4103.777 <dbl>, X4107.634 <dbl>, X4111.491 <dbl>, …
55 / 101
COVID19

Análise de dados NIR em R

Média por indivíduo

Com encadeamento, utilizando o operador %>%

Mesmo cálculo do slide anterior

dados %>%
select(., especimenid, SP1, starts_with("X")) %>%
group_by(., especimenid, SP1) %>%
summarise_all(., .funs = mean)
## # A tibble: 6 × 1,559
## # Groups: especimenid [6]
## especimenid SP1 X10001.03 X3999.64 X4003.497 X4007.354 X4011.211
## <int> <chr> <dbl> <dbl> <dbl> <dbl> <dbl>
## 1 10194 P. aracouc… 0.266 0.580 0.581 0.580 0.580
## 2 10196 P. aracouc… 0.274 0.692 0.692 0.692 0.691
## 3 10197 P. aracouc… 0.274 0.680 0.680 0.680 0.680
## 4 12647 P. calanen… 0.328 0.723 0.723 0.723 0.723
## 5 12648 P. calanen… 0.393 0.744 0.744 0.744 0.744
## 6 12650 P. calanen… 0.347 0.741 0.741 0.741 0.741
## # … with 1,552 more variables: X4015.068 <dbl>, X4018.925 <dbl>,
## # X4022.781 <dbl>, X4026.638 <dbl>, X4030.495 <dbl>, X4034.352 <dbl>,
## # X4038.209 <dbl>, X4042.066 <dbl>, X4045.923 <dbl>, X4049.78 <dbl>,
## # X4053.637 <dbl>, X4057.494 <dbl>, X4061.351 <dbl>, X4065.208 <dbl>,
## # X4069.065 <dbl>, X4072.922 <dbl>, X4076.779 <dbl>, X4080.635 <dbl>,
## # X4084.492 <dbl>, X4088.349 <dbl>, X4092.206 <dbl>, X4096.063 <dbl>,
## # X4099.92 <dbl>, X4103.777 <dbl>, X4107.634 <dbl>, X4111.491 <dbl>, …
56 / 101
COVID19

Análise de dados NIR em R

Média por indíviduo + face do folíolo

Sem encadeamento (sem uso do operador %>%)

summarise_all(
group_by(select(dados, especimenid, SP1, face, starts_with("X")), especimenid, SP1, face),
.funs = mean)
## # A tibble: 12 × 1,560
## # Groups: especimenid, SP1 [6]
## especimenid SP1 face X10001.03 X3999.64 X4003.497 X4007.354
## <int> <chr> <chr> <dbl> <dbl> <dbl> <dbl>
## 1 10194 P. aracouchini abax… 0.275 0.589 0.589 0.589
## 2 10194 P. aracouchini adax… 0.256 0.572 0.572 0.572
## 3 10196 P. aracouchini abax… 0.275 0.692 0.692 0.692
## 4 10196 P. aracouchini adax… 0.272 0.692 0.692 0.692
## 5 10197 P. aracouchini abax… 0.273 0.675 0.675 0.675
## 6 10197 P. aracouchini adax… 0.274 0.686 0.686 0.685
## 7 12647 P. calanense abax… 0.331 0.720 0.721 0.720
## 8 12647 P. calanense adax… 0.324 0.725 0.725 0.725
## 9 12648 P. calanense abax… 0.410 0.747 0.747 0.747
## 10 12648 P. calanense adax… 0.376 0.741 0.741 0.741
## 11 12650 P. calanense abax… 0.346 0.723 0.723 0.724
## 12 12650 P. calanense adax… 0.349 0.758 0.759 0.759
## # … with 1,553 more variables: X4011.211 <dbl>, X4015.068 <dbl>,
## # X4018.925 <dbl>, X4022.781 <dbl>, X4026.638 <dbl>, X4030.495 <dbl>,
## # X4034.352 <dbl>, X4038.209 <dbl>, X4042.066 <dbl>, X4045.923 <dbl>,
## # X4049.78 <dbl>, X4053.637 <dbl>, X4057.494 <dbl>, X4061.351 <dbl>,
## # X4065.208 <dbl>, X4069.065 <dbl>, X4072.922 <dbl>, X4076.779 <dbl>,
## # X4080.635 <dbl>, X4084.492 <dbl>, X4088.349 <dbl>, X4092.206 <dbl>,
## # X4096.063 <dbl>, X4099.92 <dbl>, X4103.777 <dbl>, X4107.634 <dbl>, …
57 / 101
COVID19

Análise de dados NIR em R

Média por indíviduo + face do folíolo

Com encadeamento, utilizando o operador %>%

Mesmo cálculo do slide anterior

dados %>%
select(., especimenid, SP1, face, starts_with("X")) %>%
group_by(., especimenid, SP1, face) %>%
summarise_all(., .funs = mean)
## # A tibble: 12 × 1,560
## # Groups: especimenid, SP1 [6]
## especimenid SP1 face X10001.03 X3999.64 X4003.497 X4007.354
## <int> <chr> <chr> <dbl> <dbl> <dbl> <dbl>
## 1 10194 P. aracouchini abax… 0.275 0.589 0.589 0.589
## 2 10194 P. aracouchini adax… 0.256 0.572 0.572 0.572
## 3 10196 P. aracouchini abax… 0.275 0.692 0.692 0.692
## 4 10196 P. aracouchini adax… 0.272 0.692 0.692 0.692
## 5 10197 P. aracouchini abax… 0.273 0.675 0.675 0.675
## 6 10197 P. aracouchini adax… 0.274 0.686 0.686 0.685
## 7 12647 P. calanense abax… 0.331 0.720 0.721 0.720
## 8 12647 P. calanense adax… 0.324 0.725 0.725 0.725
## 9 12648 P. calanense abax… 0.410 0.747 0.747 0.747
## 10 12648 P. calanense adax… 0.376 0.741 0.741 0.741
## 11 12650 P. calanense abax… 0.346 0.723 0.723 0.724
## 12 12650 P. calanense adax… 0.349 0.758 0.759 0.759
## # … with 1,553 more variables: X4011.211 <dbl>, X4015.068 <dbl>,
## # X4018.925 <dbl>, X4022.781 <dbl>, X4026.638 <dbl>, X4030.495 <dbl>,
## # X4034.352 <dbl>, X4038.209 <dbl>, X4042.066 <dbl>, X4045.923 <dbl>,
## # X4049.78 <dbl>, X4053.637 <dbl>, X4057.494 <dbl>, X4061.351 <dbl>,
## # X4065.208 <dbl>, X4069.065 <dbl>, X4072.922 <dbl>, X4076.779 <dbl>,
## # X4080.635 <dbl>, X4084.492 <dbl>, X4088.349 <dbl>, X4092.206 <dbl>,
## # X4096.063 <dbl>, X4099.92 <dbl>, X4103.777 <dbl>, X4107.634 <dbl>, …
58 / 101
COVID19

Análise de dados NIR em R

Preparação dos dados para análise

60 / 101
COVID19

Análise de dados NIR em R

Pré-análise

61 / 101
COVID19

Análise de dados NIR em R

Pré-análise

Divisão de dados em conjuntos treino e teste

61 / 101
COVID19

Análise de dados NIR em R

Pré-análise

Divisão de dados em conjuntos treino e teste

Criação de receitas de dados para pré-processamento dos dados

61 / 101
COVID19

Análise de dados NIR em R

Divisão de dados em conjuntos treino e teste

62 / 101

Vamos utilizar aqui as funcionalidades dos pacotes dentro da interface tidymodels (Kuhn et al. 2020).

COVID19

Análise de dados NIR em R

rsample::initial_split() (Silge et al. 2021)

63 / 101
COVID19

Análise de dados NIR em R

rsample::initial_split() (Silge et al. 2021)

library("rsample") # initial_split
dados_split <- initial_split(dados, prop = 3/4)
dados_split
## <Analysis/Assess/Total>
## <36/12/48>
63 / 101

rsample::initial_split(), que é carregado automaticamente ao se chamar o pacote tidymodels - esta função cria índices para separar o conjunto de dados em treino e teste. Por padrão, a função divide o conjunto de dados em 75% para treino e 25% para teste. Caso você queira outra proporção, altere o argumento prop. Em caso de dúvida, veja o ? desta função executando o comando ?initial_split.

COVID19

Análise de dados NIR em R

Divisão de dados proporcionalmente em relação a uma variável

64 / 101
COVID19

Análise de dados NIR em R

Divisão de dados proporcionalmente em relação a uma variável

dados_split <- initial_split(dados, prop = 3/4, strata = "SP1")
64 / 101
COVID19

Análise de dados NIR em R

Conjunto treino rsample::training() vs. teste rsample::testing()

65 / 101
COVID19

Análise de dados NIR em R

Conjunto treino rsample::training() vs. teste rsample::testing()

Conjunto treino
treino <- training(dados_split)
table(treino$SP1)
##
## P. aracouchini P. calanense
## 18 18
65 / 101

ambas do mesmo pacote rsample - ambas recebem o objeto criado com a função initial_split(), dados_split, e dividem o treino em conjuntos treino e teste, respectivamente:

COVID19

Análise de dados NIR em R

Conjunto treino rsample::training() vs. teste rsample::testing()

Conjunto teste
teste <- testing(dados_split)
table(teste$SP1)
##
## P. aracouchini P. calanense
## 6 6
66 / 101
COVID19

Análise de dados NIR em R

Reprodutibilidade na aleatorização

set.seed()

67 / 101
COVID19

Análise de dados NIR em R

Reprodutibilidade na aleatorização

set.seed()

set.seed(221015)
iris_split <- initial_split(iris, prop = 3/4, strata = "Species")
iris_split
## <Analysis/Assess/Total>
## <111/39/150>
67 / 101

Vamos estabelecer uma seed para que vocês cheguem ao mesmo resultado, caso utilizem estas "receitas" durante o aprendizado do tutorial.

Recomendo que vocês executem esses comandos juntamente comigo para que vocês tenham ciência de que a quebra dos dados será igual para todos.

COVID19

Análise de dados NIR em R

Reprodutibilidade na aleatorização

head(training(iris_split), 20)
## Sepal.Length Sepal.Width Petal.Length Petal.Width Species
## 1 5.1 3.5 1.4 0.2 setosa
## 2 4.9 3.0 1.4 0.2 setosa
## 3 4.7 3.2 1.3 0.2 setosa
## 5 5.0 3.6 1.4 0.2 setosa
## 8 5.0 3.4 1.5 0.2 setosa
## 9 4.4 2.9 1.4 0.2 setosa
## 10 4.9 3.1 1.5 0.1 setosa
## 12 4.8 3.4 1.6 0.2 setosa
## 13 4.8 3.0 1.4 0.1 setosa
## 14 4.3 3.0 1.1 0.1 setosa
## 15 5.8 4.0 1.2 0.2 setosa
## 16 5.7 4.4 1.5 0.4 setosa
## 18 5.1 3.5 1.4 0.3 setosa
## 19 5.7 3.8 1.7 0.3 setosa
## 20 5.1 3.8 1.5 0.3 setosa
## 23 4.6 3.6 1.0 0.2 setosa
## 25 4.8 3.4 1.9 0.2 setosa
## 26 5.0 3.0 1.6 0.2 setosa
## 27 5.0 3.4 1.6 0.4 setosa
## 28 5.2 3.5 1.5 0.2 setosa
68 / 101
COVID19

Análise de dados NIR em R

Criação de receitas de dados para pré-processamento dos dados

69 / 101
COVID19

Análise de dados NIR em R

Ambiente de pré-processamento do pacote recipes (Kuhn e Wickham 2021).

70 / 101
COVID19

Análise de dados NIR em R

Ambiente de pré-processamento do pacote recipes (Kuhn e Wickham 2021).

  • Seleção de variáveis
70 / 101
COVID19

Análise de dados NIR em R

Ambiente de pré-processamento do pacote recipes (Kuhn e Wickham 2021).

  • Seleção de variáveis

  • Remoção de valores ausentes

70 / 101
COVID19

Análise de dados NIR em R

Ambiente de pré-processamento do pacote recipes (Kuhn e Wickham 2021).

  • Seleção de variáveis

  • Remoção de valores ausentes

  • Transformar valores

70 / 101
COVID19

Análise de dados NIR em R

Ambiente de pré-processamento do pacote recipes (Kuhn e Wickham 2021).

70 / 101
COVID19

Análise de dados NIR em R

Como funciona?

recipes::recipe(FORMULA, data = NomeDoDataFrame)
71 / 101

Ele facilita a criação de "receitas" que permitem a criação e documentação de conjuntos de dados para serem utilizados posteriormente em análises do tidymodels, permitindo ao usuário um fluxo contínuo de análise de dados e a facilidade na reutilização do mesmo conjunto de dados para diversas análises. Recomendo o aprendizado destas novas (algumas não tão novas, como é o caso do pacote caret ferramentas de pré-processamento e análise de dados em R.

A primeira função desta abordagem é a função recipe(), em que usamos uma fórmula SP1 ~ . para dizer que SP1 é nossa variável resposta e as demais são as variáveis preditoras, representadas pelo . na fórmula. Porém, sabemos que nosso conjunto de dados dados possui outras variáveis que não são preditoras, como face e coletor.

COVID19

Análise de dados NIR em R

Uso básico

library("recipes")
72 / 101
COVID19

Análise de dados NIR em R

Uso básico

library("recipes")
recipes::recipe(SP1 ~ ., data = dados)
## Recipe
##
## Inputs:
##
## role #variables
## outcome 1
## predictor 1561
72 / 101

Aí entra o papel da função update_role() em que informamos o papel de cada variável extra em nosso conjunto de dados. Por exemplo, as variáveis coletore number são identificadores da coleta. Então, iniciamos a função com o objeto contendo a receita, dados_receita, e colocamos estas duas variáveis, sem aspas, em seguida, seguido do argumento new_role, em que colocamos um texto informando que papel é esse. Ao utilizarmos esta receita nos passos de análises, essas variáveis não serão analisadas pois terão a informação desses papéis que elas têm no conjunto de dados.

COVID19

Análise de dados NIR em R

Atualizando o papel de variáveis extras

73 / 101
COVID19

Análise de dados NIR em R

Atualizando o papel de variáveis extras

Dados do espécime

recipes::recipe(SP1 ~ ., data = dados) %>%
update_role(., coletor, number, new_role = "dados do espécime")
## Recipe
##
## Inputs:
##
## role #variables
## dados do espécime 2
## outcome 1
## predictor 1559
73 / 101
COVID19

Análise de dados NIR em R

Face do folíolo

recipes::recipe(SP1 ~ ., data = dados) %>%
update_role(., coletor, number, new_role = "dados do espécime") %>%
update_role(., face, new_role = "identificador da face do foliolo")
## Recipe
##
## Inputs:
##
## role #variables
## dados do espécime 2
## identificador da face do foliolo 1
## outcome 1
## predictor 1558
74 / 101
COVID19

Análise de dados NIR em R

Identificador do espécime

recipes::recipe(SP1 ~ ., data = treino) %>%
update_role(., coletor, number, new_role = "dados do espécime") %>%
update_role(., face, new_role = "identificador da face do foliolo") %>%
update_role(., especimenid, new_role = "id")
## Recipe
##
## Inputs:
##
## role #variables
## dados do espécime 2
## id 1
## identificador da face do foliolo 1
## outcome 1
## predictor 1557
75 / 101
COVID19

Análise de dados NIR em R

Receita completa

dados_receita <-
recipes::recipe(SP1 ~ ., data = treino) %>%
update_role(., especimenid, new_role = "id") %>%
update_role(., coletor, number, new_role = "dados do espécime") %>%
update_role(., face, new_role = "identificador da face do foliolo")
dados_receita
## Recipe
##
## Inputs:
##
## role #variables
## dados do espécime 2
## id 1
## identificador da face do foliolo 1
## outcome 1
## predictor 1557
76 / 101
COVID19

Análise de dados NIR em R

Preparo da receita com prep()

dados_receita_prep <- prep(dados_receita)
dados_receita_prep
## Recipe
##
## Inputs:
##
## role #variables
## dados do espécime 2
## id 1
## identificador da face do foliolo 1
## outcome 1
## predictor 1557
##
## Training data contained 36 data points and no missing data.
77 / 101
COVID19

Análise de dados NIR em R

Assando o conjunto teste pós-receita

bake()

78 / 101
COVID19

Análise de dados NIR em R

Assando o conjunto teste pós-receita

bake()

teste_processado <- bake(dados_receita_prep, new_data = teste)
teste_processado
## # A tibble: 12 × 1,562
## especimenid face coletor number X10001.03 X3999.64 X4003.497 X4007.354
## <int> <fct> <fct> <int> <dbl> <dbl> <dbl> <dbl>
## 1 10194 adax… Perdiz… 2856 0.258 0.576 0.577 0.577
## 2 10194 abax… Perdiz… 2856 0.278 0.596 0.596 0.596
## 3 10194 abax… Perdiz… 2856 0.273 0.581 0.582 0.582
## 4 10196 abax… Perdiz… 2858 0.276 0.703 0.703 0.703
## 5 10196 adax… Perdiz… 2858 0.267 0.712 0.712 0.711
## 6 10197 abax… Perdiz… 2859 0.276 0.668 0.668 0.668
## 7 12647 adax… Perdiz… 3236 0.320 0.735 0.736 0.736
## 8 12647 adax… Perdiz… 3236 0.320 0.735 0.736 0.736
## 9 12648 adax… Perdiz… 3237 0.389 0.757 0.757 0.757
## 10 12650 abax… Perdiz… 3239 0.349 0.733 0.733 0.733
## 11 12650 adax… Perdiz… 3239 0.342 0.744 0.744 0.744
## 12 12650 adax… Perdiz… 3239 0.355 0.773 0.773 0.773
## # … with 1,554 more variables: X4011.211 <dbl>, X4015.068 <dbl>,
## # X4018.925 <dbl>, X4022.781 <dbl>, X4026.638 <dbl>, X4030.495 <dbl>,
## # X4034.352 <dbl>, X4038.209 <dbl>, X4042.066 <dbl>, X4045.923 <dbl>,
## # X4049.78 <dbl>, X4053.637 <dbl>, X4057.494 <dbl>, X4061.351 <dbl>,
## # X4065.208 <dbl>, X4069.065 <dbl>, X4072.922 <dbl>, X4076.779 <dbl>,
## # X4080.635 <dbl>, X4084.492 <dbl>, X4088.349 <dbl>, X4092.206 <dbl>,
## # X4096.063 <dbl>, X4099.92 <dbl>, X4103.777 <dbl>, X4107.634 <dbl>, …
78 / 101
COVID19

Análise de dados NIR em R

Espremendo os dados treino

juice()

79 / 101
COVID19

Análise de dados NIR em R

Espremendo os dados treino

juice()

juice(dados_receita_prep)
## # A tibble: 36 × 1,562
## especimenid face coletor number X10001.03 X3999.64 X4003.497 X4007.354
## <int> <fct> <fct> <int> <dbl> <dbl> <dbl> <dbl>
## 1 10194 abax… Perdiz… 2856 0.278 0.596 0.596 0.596
## 2 10194 adax… Perdiz… 2856 0.254 0.567 0.567 0.567
## 3 10194 abax… Perdiz… 2856 0.273 0.581 0.582 0.582
## 4 10194 adax… Perdiz… 2856 0.254 0.567 0.567 0.567
## 5 10194 adax… Perdiz… 2856 0.258 0.576 0.577 0.577
## 6 10196 abax… Perdiz… 2858 0.274 0.681 0.681 0.681
## 7 10196 adax… Perdiz… 2858 0.278 0.673 0.672 0.672
## 8 10196 adax… Perdiz… 2858 0.267 0.712 0.712 0.711
## 9 10196 abax… Perdiz… 2858 0.274 0.681 0.681 0.681
## 10 10196 adax… Perdiz… 2858 0.278 0.673 0.672 0.672
## # … with 26 more rows, and 1,554 more variables: X4011.211 <dbl>,
## # X4015.068 <dbl>, X4018.925 <dbl>, X4022.781 <dbl>, X4026.638 <dbl>,
## # X4030.495 <dbl>, X4034.352 <dbl>, X4038.209 <dbl>, X4042.066 <dbl>,
## # X4045.923 <dbl>, X4049.78 <dbl>, X4053.637 <dbl>, X4057.494 <dbl>,
## # X4061.351 <dbl>, X4065.208 <dbl>, X4069.065 <dbl>, X4072.922 <dbl>,
## # X4076.779 <dbl>, X4080.635 <dbl>, X4084.492 <dbl>, X4088.349 <dbl>,
## # X4092.206 <dbl>, X4096.063 <dbl>, X4099.92 <dbl>, X4103.777 <dbl>, …
79 / 101
COVID19

Análise de dados NIR em R

Receitas em etapas? Também pode!

# receita para analise
dados_receita <- recipes::recipe(SP1 ~ ., data = treino)
dados_receita <- update_role(dados_receita, especimenid, new_role = "id")
dados_receita <- update_role(dados_receita, coletor, number, new_role = "dados do espécime")
dados_receita <- update_role(dados_receita, face, new_role = "identificador da face do foliolo")
dados_receita_prep <- prep(dados_receita)
dados_receita_prep
80 / 101
COVID19

Análise de dados NIR em R

Receitas em etapas? Também pode!

# receita para analise
dados_receita <- recipes::recipe(SP1 ~ ., data = treino)
dados_receita <- update_role(dados_receita, especimenid, new_role = "id")
dados_receita <- update_role(dados_receita, coletor, number, new_role = "dados do espécime")
dados_receita <- update_role(dados_receita, face, new_role = "identificador da face do foliolo")
dados_receita_prep <- prep(dados_receita)
dados_receita_prep

Base R vs. Tidyverse de nosso Curso básico de Introdução ao R para entender o encadeamento (pipeline) do %>%

80 / 101

Vejam que os comandos acima ficaram muito repetitivos, pois a receita dados_receita aparece múltiplas vezes. Caso utilizássemos o encadeamento de ações proporcionado pelo operador %>% do pacote magrittr (Bache e Wickham 2020), o texto ficaria mais limpo. Porém, devo admitir que isto é uma questão de preferência.

COVID19

Análise de dados NIR em R

Pré-processamento em recipes

Funções step_*()

81 / 101
COVID19

Análise de dados NIR em R

Normalizar variáveis numéricas
dados_receita_normal <-
dados_receita %>%
step_normalize(all_predictors())
dados_receita_normal
## Recipe
##
## Inputs:
##
## role #variables
## dados do espécime 2
## id 1
## identificador da face do foliolo 1
## outcome 1
## predictor 1557
##
## Operations:
##
## Centering and scaling for all_predictors()
82 / 101
COVID19

Análise de dados NIR em R

Há várias possibilidades de transformação de dados com as funções step_*()

83 / 101
COVID19

Análise de dados NIR em R

Há várias possibilidades de transformação de dados com as funções step_*()

https://recipes.tidymodels.org/reference/index.html

83 / 101
COVID19

Análise de dados NIR em R

Análise de componentes principais (PCA)

85 / 101
COVID19

Análise de dados NIR em R

PCA é um algoritmo matemático que reduz as dimensões dos dados ao mesmo tempo em que mantem a maior parte da variação do conjunto de dados. Ele cumpre essa redução ao identificar direções, chamadas de componentes principais, ao longo das quais a variação dos dados é máxima. Ao utilizar menos componentes, cada amostra pode ser representada por poucas variáveis em oposição à enormidade de variáveis presentes no conjunto de dados brutos. Amostras podem então ser plotadas, permitindo a inferência visual de similaridades e diferenças entre as amostras, e também determinar se as amostras podem ou não ser agrupadas1.

86 / 101
COVID19

Análise de dados NIR em R

PCA dentro da receita

dados_receita_pca <-
dados_receita %>%
step_pca(all_predictors())
dados_receita_pca
## Recipe
##
## Inputs:
##
## role #variables
## dados do espécime 2
## id 1
## identificador da face do foliolo 1
## outcome 1
## predictor 1557
##
## Operations:
##
## No PCA components were extracted.
87 / 101
COVID19

Análise de dados NIR em R

Preparando a PCA

dados_receita_pca_prep <-
dados_receita_pca %>%
prep()
dados_receita_pca_prep
## Recipe
##
## Inputs:
##
## role #variables
## dados do espécime 2
## id 1
## identificador da face do foliolo 1
## outcome 1
## predictor 1557
##
## Training data contained 36 data points and no missing data.
##
## Operations:
##
## PCA extraction with X10001.03, X3999.64, X4003.497, X4007.354,... [trained]
88 / 101
COVID19

Análise de dados NIR em R

Explorando o resultado com tidy()

pca_tabela <- tidy(dados_receita_pca_prep, 1)
pca_tabela
## # A tibble: 56,052 × 4
## terms value component id
## <chr> <dbl> <chr> <chr>
## 1 X10001.03 -0.0202 PC1 pca_OTwyZ
## 2 X3999.64 -0.0439 PC1 pca_OTwyZ
## 3 X4003.497 -0.0440 PC1 pca_OTwyZ
## 4 X4007.354 -0.0439 PC1 pca_OTwyZ
## 5 X4011.211 -0.0439 PC1 pca_OTwyZ
## 6 X4015.068 -0.0439 PC1 pca_OTwyZ
## 7 X4018.925 -0.0438 PC1 pca_OTwyZ
## 8 X4022.781 -0.0437 PC1 pca_OTwyZ
## 9 X4026.638 -0.0436 PC1 pca_OTwyZ
## 10 X4030.495 -0.0435 PC1 pca_OTwyZ
## # … with 56,042 more rows
89 / 101
COVID19

Análise de dados NIR em R

Calculando a variação das PC's

## pcs variacao_porcentagem variacao_cumulativa
## 1 PC1 9.983774e+01 99.83774
## 2 PC2 1.588772e-01 99.99662
## 3 PC3 1.852337e-03 99.99847
## 4 PC4 7.829202e-04 99.99926
## 5 PC5 4.341331e-04 99.99969
## 6 PC6 1.443706e-04 99.99984
## 7 PC7 1.197724e-04 99.99995
## 8 PC8 1.804392e-05 99.99997
## 9 PC9 1.109191e-05 99.99998
## 10 PC10 5.475665e-06 99.99999
## 11 PC11 2.229137e-06 99.99999
## 12 PC12 2.093980e-06 99.99999
## 13 PC13 1.370498e-06 100.00000
## 14 PC14 1.233161e-06 100.00000
## 15 PC15 8.109688e-07 100.00000
## 16 PC16 5.629829e-07 100.00000
## 17 PC17 5.169118e-07 100.00000
## 18 PC18 3.935604e-07 100.00000
## 19 PC19 3.134876e-07 100.00000
## 20 PC20 2.822530e-07 100.00000
## 21 PC21 2.382419e-07 100.00000
## 22 PC22 1.924840e-07 100.00000
## 23 PC23 1.692351e-07 100.00000
## 24 PC24 9.965630e-31 100.00000
## 25 PC25 9.965630e-31 100.00000
## 26 PC26 9.965630e-31 100.00000
## 27 PC27 9.965630e-31 100.00000
## 28 PC28 9.965630e-31 100.00000
## 29 PC29 9.965630e-31 100.00000
## 30 PC30 9.965630e-31 100.00000
## 31 PC31 9.965630e-31 100.00000
## 32 PC32 9.965630e-31 100.00000
## 33 PC33 9.965630e-31 100.00000
## 34 PC34 9.965630e-31 100.00000
## 35 PC35 9.965630e-31 100.00000
## 36 PC36 9.965630e-31 100.00000
sdev <- dados_receita_pca_prep$steps[[1]]$res$sdev
percent_variation <- sdev^2 / sum(sdev^2)
pca_variacao <-
data.frame(
pcs = unique(pca_tabela$component),
variacao_porcentagem = percent_variation*100,
variacao_cumulativa = cumsum(percent_variation*100)
)
pca_variacao
90 / 101
COVID19

Análise de dados NIR em R

Visualizando a PCA com ggplot2

pc1 <- filter(pca_variacao, pcs == "PC1")
pc2 <- filter(pca_variacao, pcs == "PC2")
juice(dados_receita_pca_prep) %>%
ggplot(aes(PC1, PC2)) +
geom_point(aes(color = SP1), alpha = 0.7, size = 2) +
xlab(paste0("PC1 (", round(pc1$variacao_porcentagem, 2), "%)")) +
ylab(paste0("PC2 (", round(pc2$variacao_porcentagem, 2), "%)"))
91 / 101
COVID19

Análise de dados NIR em R

Combinando etapas para a PCA

dados_receita_normal_pca <-
dados_receita_normal %>%
step_pca(all_predictors()) %>%
prep()
dados_receita_normal_pca
## Recipe
##
## Inputs:
##
## role #variables
## dados do espécime 2
## id 1
## identificador da face do foliolo 1
## outcome 1
## predictor 1557
##
## Training data contained 36 data points and no missing data.
##
## Operations:
##
## Centering and scaling for X10001.03, X3999.64, X4003.497, X4007.354... [trained]
## PCA extraction with X10001.03, X3999.64, X4003.497, X4007.354,... [trained]
92 / 101
COVID19

Análise de dados NIR em R

Checando as etapas da PCA com dados normalizados

Dados normalizados

tidy(dados_receita_normal_pca, 1)
## # A tibble: 3,114 × 4
## terms statistic value id
## <chr> <chr> <dbl> <chr>
## 1 X10001.03 mean 0.315 normalize_0VXeM
## 2 X3999.64 mean 0.693 normalize_0VXeM
## 3 X4003.497 mean 0.694 normalize_0VXeM
## 4 X4007.354 mean 0.694 normalize_0VXeM
## 5 X4011.211 mean 0.693 normalize_0VXeM
## 6 X4015.068 mean 0.693 normalize_0VXeM
## 7 X4018.925 mean 0.692 normalize_0VXeM
## 8 X4022.781 mean 0.690 normalize_0VXeM
## 9 X4026.638 mean 0.688 normalize_0VXeM
## 10 X4030.495 mean 0.686 normalize_0VXeM
## # … with 3,104 more rows
93 / 101
COVID19

Análise de dados NIR em R

Checando médias das variáveis

tidy(dados_receita_normal_pca, 1) %>%
filter(statistic == "mean")
## # A tibble: 1,557 × 4
## terms statistic value id
## <chr> <chr> <dbl> <chr>
## 1 X10001.03 mean 0.315 normalize_0VXeM
## 2 X3999.64 mean 0.693 normalize_0VXeM
## 3 X4003.497 mean 0.694 normalize_0VXeM
## 4 X4007.354 mean 0.694 normalize_0VXeM
## 5 X4011.211 mean 0.693 normalize_0VXeM
## 6 X4015.068 mean 0.693 normalize_0VXeM
## 7 X4018.925 mean 0.692 normalize_0VXeM
## 8 X4022.781 mean 0.690 normalize_0VXeM
## 9 X4026.638 mean 0.688 normalize_0VXeM
## 10 X4030.495 mean 0.686 normalize_0VXeM
## # … with 1,547 more rows
94 / 101
COVID19

Análise de dados NIR em R

Checando desvio padrão das variáveis

tidy(dados_receita_normal_pca, 1) %>%
filter(statistic == "sd")
## # A tibble: 1,557 × 4
## terms statistic value id
## <chr> <chr> <dbl> <chr>
## 1 X10001.03 sd 0.0504 normalize_0VXeM
## 2 X3999.64 sd 0.0548 normalize_0VXeM
## 3 X4003.497 sd 0.0548 normalize_0VXeM
## 4 X4007.354 sd 0.0549 normalize_0VXeM
## 5 X4011.211 sd 0.0549 normalize_0VXeM
## 6 X4015.068 sd 0.0549 normalize_0VXeM
## 7 X4018.925 sd 0.0549 normalize_0VXeM
## 8 X4022.781 sd 0.0548 normalize_0VXeM
## 9 X4026.638 sd 0.0547 normalize_0VXeM
## 10 X4030.495 sd 0.0546 normalize_0VXeM
## # … with 1,547 more rows
95 / 101
COVID19

Análise de dados NIR em R

Checando a PCA normalizada

pca_tabela_normalizada <- tidy(dados_receita_normal_pca, 2)
pca_tabela_normalizada
## # A tibble: 56,052 × 4
## terms value component id
## <chr> <dbl> <chr> <chr>
## 1 X10001.03 0.0257 PC1 pca_lZPx9
## 2 X3999.64 0.0216 PC1 pca_lZPx9
## 3 X4003.497 0.0216 PC1 pca_lZPx9
## 4 X4007.354 0.0217 PC1 pca_lZPx9
## 5 X4011.211 0.0217 PC1 pca_lZPx9
## 6 X4015.068 0.0218 PC1 pca_lZPx9
## 7 X4018.925 0.0218 PC1 pca_lZPx9
## 8 X4022.781 0.0218 PC1 pca_lZPx9
## 9 X4026.638 0.0218 PC1 pca_lZPx9
## 10 X4030.495 0.0219 PC1 pca_lZPx9
## # … with 56,042 more rows
96 / 101
COVID19

Análise de dados NIR em R

Calculando a variação das PC's

## pcs variacao_porcentagem variacao_cumulativa
## 1 PC1 9.500236e+01 95.00236
## 2 PC2 4.772334e+00 99.77469
## 3 PC3 1.379815e-01 99.91267
## 4 PC4 5.057695e-02 99.96325
## 5 PC5 1.919332e-02 99.98244
## 6 PC6 1.076041e-02 99.99320
## 7 PC7 4.050682e-03 99.99725
## 8 PC8 1.002161e-03 99.99825
## 9 PC9 6.999285e-04 99.99895
## 10 PC10 3.833044e-04 99.99934
## 11 PC11 1.616011e-04 99.99950
## 12 PC12 1.414900e-04 99.99964
## 13 PC13 1.004364e-04 99.99974
## 14 PC14 6.324811e-05 99.99980
## 15 PC15 4.144309e-05 99.99985
## 16 PC16 3.638183e-05 99.99988
## 17 PC17 2.951095e-05 99.99991
## 18 PC18 2.492981e-05 99.99994
## 19 PC19 2.111392e-05 99.99996
## 20 PC20 1.744787e-05 99.99998
## 21 PC21 1.303788e-05 99.99999
## 22 PC22 1.136185e-05 100.00000
## 23 PC23 1.703797e-29 100.00000
## 24 PC24 8.279586e-31 100.00000
## 25 PC25 8.279586e-31 100.00000
## 26 PC26 8.279586e-31 100.00000
## 27 PC27 8.279586e-31 100.00000
## 28 PC28 8.279586e-31 100.00000
## 29 PC29 8.279586e-31 100.00000
## 30 PC30 8.279586e-31 100.00000
## 31 PC31 8.279586e-31 100.00000
## 32 PC32 8.279586e-31 100.00000
## 33 PC33 8.279586e-31 100.00000
## 34 PC34 8.279586e-31 100.00000
## 35 PC35 8.279586e-31 100.00000
## 36 PC36 8.279586e-31 100.00000
sdev_pca_normalizada <- dados_receita_normal_pca$steps[[2]]$res$sdev
porcent_variacao_normalizada <- sdev_pca_normalizada^2 / sum(sdev_pca_normalizada^2)
pca_normalizada_variacao <-
data.frame(
pcs = unique(pca_tabela_normalizada$component),
variacao_porcentagem = porcent_variacao_normalizada*100,
variacao_cumulativa = cumsum(porcent_variacao_normalizada*100)
)
pca_normalizada_variacao
97 / 101
COVID19

Análise de dados NIR em R

Visualizando a PCA com dados normalizados

pc1_normal <- filter(pca_normalizada_variacao, pcs == "PC1")
pc2_normal <- filter(pca_normalizada_variacao, pcs == "PC2")
juice(dados_receita_normal_pca) %>%
ggplot(aes(PC1, PC2)) +
geom_point(aes(color = SP1), alpha = 0.7, size = 2) +
xlab(paste0("PC1 (", round(pc1_normal$variacao_porcentagem, 2), "%)")) +
ylab(paste0("PC2 (", round(pc2_normal$variacao_porcentagem, 2), "%)"))
98 / 101
COVID19

Análise de dados NIR em R

Referências importantes

Kuhn, M. e Johnson, K. 2019. Feature Engineering and Selection: A Practical Approach for Predictive Models. CRC Press.

Kuhn, M. 2019. The caret package. Disponível em https://topepo.github.io/caret/index.html.

Kuhn, M. 2019. A Short Introduction to the caret Package. Disponível em https://cran.r-project.org/web/packages/caret/vignettes/caret.html.

Kuhn, Max e Silge, J. 2021. Tidy Modeling with R. Disponível em https://www.tmwr.org/base-r.html.

Perdiz, R. O que é o tidyverse? Disponível em https://www.ricardoperdiz.com/blog/2020-04-tidyverse/

Silge, Julia. Todas suas postagens são úteis. #tidytuesday #tidymodels.

Wickham, H. e Grolemund, J. 2017. R for Data Science. Disponível em https://r4ds.had.co.nz.

100 / 101
COVID19

Análise de dados NIR em R

Grato! Retornaremos na parte 2, dia 02-07-2021

101 / 101
Paused

Help

Keyboard shortcuts

, , Pg Up, k Go to previous slide
, , Pg Dn, Space, j Go to next slide
Home Go to first slide
End Go to last slide
Number + Return Go to specific slide
b / m / f Toggle blackout / mirrored / fullscreen mode
c Clone slideshow
p Toggle presenter mode
t Restart the presentation timer
?, h Toggle this help
oTile View: Overview of Slides
sToggle scribble toolbox
Alt + fFit Slides to Screen
Esc Back to slideshow