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

Oficina de análise de dados NIR em ambiente R

Partes 4—5 - LDA e PLS

Ricardo Perdiz (Luz da Floresta) | 2021/07/02

COVID19
1 / 53
COVID19

Análise de dados NIR em R

Sumário

Recapitulação do primeiro dia

2 / 53
COVID19

Análise de dados NIR em R

Sumário

Recapitulação do primeiro dia

Interface para análise de dados do caret

2 / 53
COVID19

Análise de dados NIR em R

Sumário

Recapitulação do primeiro dia

Interface para análise de dados do caret

Análise discriminante linear (LDA)

2 / 53
COVID19

Análise de dados NIR em R

Sumário

Recapitulação do primeiro dia

Interface para análise de dados do caret

Análise discriminante linear (LDA)

Análise de mínimos quadrados parciais (PLS)

2 / 53
COVID19

Análise de dados NIR em R

Recapitulação

Manipulação de dados utilizando o dplyr

Preparação de dados pré-análise

PCA

Figura de Wickham, H. e Grolemund, G. (2016) http://r4ds.had.co.nz.

3 / 53
COVID19

Análise de dados NIR em R

Importando dados para a oficina

Opção 1 - Dados iris

dados <- iris

Opção 2 - Importação de dados próprios

library("data.table")
dados <- fread("MEUSDADOS.csv")

Opção 3 - Conjunto de dados nir_data1, que acompanha o pacote NIRtools2.

dados <-
fread("https://raw.githubusercontent.com/ricoperdiz/NIRtools/master/inst/extdata/nir_data.csv")
4 / 53
COVID19

Análise de dados NIR em R

Transformação do data.frame em um tibble1

library("tibble")
dados <- as_tibble(dados)
dados
## # A tibble: 150 × 5
## Sepal.Length Sepal.Width Petal.Length Petal.Width Species
## <dbl> <dbl> <dbl> <dbl> <fct>
## 1 5.1 3.5 1.4 0.2 setosa
## 2 4.9 3 1.4 0.2 setosa
## 3 4.7 3.2 1.3 0.2 setosa
## 4 4.6 3.1 1.5 0.2 setosa
## 5 5 3.6 1.4 0.2 setosa
## 6 5.4 3.9 1.7 0.4 setosa
## 7 4.6 3.4 1.4 0.3 setosa
## 8 5 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
## # ℹ 140 more rows
  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.
5 / 53
COVID19

Análise de dados NIR em R

Atenção!!!

Nova variável de nome de espécies

Em casos em que a variável contendo o nome da espécie apresente espaços, pontos . e/ou sinais diferentes, é necessário limparmos essa variável caso desejemos reter os valores de probabilidade atribuídos a cada espécie ao utilizarmos o caret. Em casos assim, podemos tomar o procedimento abaixo:

library("dplyr")
dados$SP1 <-
case_when(
dados$SP1 == "P. aracouchini" ~ "arac",
dados$SP1 == "P. calanense" ~ "cala"
) %>%
as.factor(.)
6 / 53
COVID19

Análise de dados NIR em R

Pré-processamento dos dados

7 / 53
COVID19

Análise de dados NIR em R

Pré-processamento dos dados

Divisão dos dados em treino e teste

library("rsample") # initial_split
dados_split <- initial_split(dados, strata = "Species")
treino <- training(dados_split)
teste <- testing(dados_split)
7 / 53
COVID19

Análise de dados NIR em R

Criação e preparo da receita

library("recipes")
treino_receita <-
recipes::recipe(Species ~ ., data = treino) %>%
prep()
treino_receita
##
## ── Recipe ────────────────────────────────────────────────────
##
## ── Inputs
## Number of variables by role
## outcome: 1
## predictor: 4
##
## ── Training information
## Training data contained 111 data points and no incomplete
## rows.
8 / 53
COVID19

Análise de dados NIR em R

PCA

I - PCA com todos os dados?

Primeiro, criamos uma receita indicando no argumento data o nome de nosso conjunto de dados. Depois fazemos as devidas atualizações dos papéis das variáveis que não são nem preditoras nem resposta com a função update_role(). Em seguida, executamos a PCA com a função step_pca() para todas as variáveis NIR, utilizando a função auxiliar all_predictors() para, por fim, prepararmos a receita com a função prep().

Depois, é só plotar os dados espremendo a receita, o que vai gerar uma PCA com os dados completos.

9 / 53
COVID19

Análise de dados NIR em R

I - PCA com todos os dados?

dados_completos_receita_pca_pre <-
recipes::recipe(Species ~ ., data = dados) %>%
step_normalize(all_predictors()) %>%
step_pca(all_predictors()) %>%
prep()
dados_completos_receita_pca_pre
##
## ── Recipe ────────────────────────────────────────────────────
##
## ── Inputs
## Number of variables by role
## outcome: 1
## predictor: 4
##
## ── Training information
## Training data contained 150 data points and no incomplete
## rows.
##
## ── Operations
## • Centering and scaling for: Sepal.Length, ... | Trained
## • PCA extraction with: Sepal.Length, ... | Trained
10 / 53
COVID19

Análise de dados NIR em R

II - PCA com todos os dados?

pca_tabela <- tidy(dados_completos_receita_pca_pre, 2)
pca_tabela
## # A tibble: 16 × 4
## terms value component id
## <chr> <dbl> <chr> <chr>
## 1 Sepal.Length 0.521 PC1 pca_f6kUq
## 2 Sepal.Width -0.269 PC1 pca_f6kUq
## 3 Petal.Length 0.580 PC1 pca_f6kUq
## 4 Petal.Width 0.565 PC1 pca_f6kUq
## 5 Sepal.Length -0.377 PC2 pca_f6kUq
## 6 Sepal.Width -0.923 PC2 pca_f6kUq
## 7 Petal.Length -0.0245 PC2 pca_f6kUq
## 8 Petal.Width -0.0669 PC2 pca_f6kUq
## 9 Sepal.Length 0.720 PC3 pca_f6kUq
## 10 Sepal.Width -0.244 PC3 pca_f6kUq
## 11 Petal.Length -0.142 PC3 pca_f6kUq
## 12 Petal.Width -0.634 PC3 pca_f6kUq
## 13 Sepal.Length 0.261 PC4 pca_f6kUq
## 14 Sepal.Width -0.124 PC4 pca_f6kUq
## 15 Petal.Length -0.801 PC4 pca_f6kUq
## 16 Petal.Width 0.524 PC4 pca_f6kUq
11 / 53
COVID19

Análise de dados NIR em R

III - PCA com todos os dados?

Variação das PC's

sdev_pca_normalizada <- dados_completos_receita_pca_pre$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$component),
variacao_porcentagem = porcent_variacao_normalizada*100,
variacao_cumulativa = cumsum(porcent_variacao_normalizada*100)
)
pca_normalizada_variacao
## pcs variacao_porcentagem variacao_cumulativa
## 1 PC1 72.9624454 72.96245
## 2 PC2 22.8507618 95.81321
## 3 PC3 3.6689219 99.48213
## 4 PC4 0.5178709 100.00000
12 / 53
COVID19

Análise de dados NIR em R

IV - PCA com todos os dados?

Plotando PCA com dados completos

library("ggplot2")
pc1 <- filter(pca_normalizada_variacao, pcs == "PC1")
pc2 <- filter(pca_normalizada_variacao, pcs == "PC2")
juice(dados_completos_receita_pca_pre) %>%
ggplot(aes(PC1, PC2)) +
geom_point(aes(color = Species), alpha = 0.7, size = 2) +
xlab(paste0("PC1 (", round(pc1$variacao_porcentagem, 2), "%)")) +
ylab(paste0("PC2 (", round(pc2$variacao_porcentagem, 2), "%)"))

13 / 53
COVID19

Análise de dados NIR em R

Pacote caret - Classification And REgression Training (Kuhn 2021)

14 / 53
COVID19

Análise de dados NIR em R

Interface para análise de dados do caret

O pacote contem funções para simplificar tanto o treinamento de modelos para regressões e análises de classificação como a avaliação da efetividade dos modelos gerados.

15 / 53
COVID19

Análise de dados NIR em R

Interface para análise de dados do caret

O pacote contem funções para simplificar tanto o treinamento de modelos para regressões e análises de classificação como a avaliação da efetividade dos modelos gerados.

Fluxo de processamento e análise de dados

15 / 53
COVID19

Análise de dados NIR em R

Interface para análise de dados do caret

O pacote contem funções para simplificar tanto o treinamento de modelos para regressões e análises de classificação como a avaliação da efetividade dos modelos gerados.

Fluxo de processamento e análise de dados

Duas funções básicas:

caret::train()
caret::trainControl()
15 / 53
COVID19

Análise de dados NIR em R

Fluxograma de um perfil básico de análise

16 / 53
COVID19

Análise de dados NIR em R

Análise discriminante linear (LDA)

Método de redução de dimensões ao mesmo tempo em que se retem o máximo de informação possível. O método ajuda a achar a combinação linear das variáveis originais que providenciam a melhor separação entre os grupos.1

17 / 53
COVID19

Análise de dados NIR em R

Análise discriminante linear (LDA)

Método de redução de dimensões ao mesmo tempo em que se retem o máximo de informação possível. O método ajuda a achar a combinação linear das variáveis originais que providenciam a melhor separação entre os grupos.1

Maximiza a medida inter-classes e minimiza a medida intra-classes.

17 / 53
COVID19

Análise de dados NIR em R

Análise discriminante linear (LDA)

Método de redução de dimensões ao mesmo tempo em que se retem o máximo de informação possível. O método ajuda a achar a combinação linear das variáveis originais que providenciam a melhor separação entre os grupos.1

Maximiza a medida inter-classes e minimiza a medida intra-classes.

Utilizada quando a variável dependente é categórica, e as variáveis independentes são quantitativas.

17 / 53
COVID19

Análise de dados NIR em R

Análise discriminante linear (LDA)

Método de redução de dimensões ao mesmo tempo em que se retem o máximo de informação possível. O método ajuda a achar a combinação linear das variáveis originais que providenciam a melhor separação entre os grupos.1

Maximiza a medida inter-classes e minimiza a medida intra-classes.

Utilizada quando a variável dependente é categórica, e as variáveis independentes são quantitativas.

Em R, utilizamos a função lda() do pacote MASS (Venables e Ripley 2002)2.

17 / 53
COVID19

Análise de dados NIR em R

Análise discriminante linear (LDA)

Método de redução de dimensões ao mesmo tempo em que se retem o máximo de informação possível. O método ajuda a achar a combinação linear das variáveis originais que providenciam a melhor separação entre os grupos.1

Maximiza a medida inter-classes e minimiza a medida intra-classes.

Utilizada quando a variável dependente é categórica, e as variáveis independentes são quantitativas.

Em R, utilizamos a função lda() do pacote MASS (Venables e Ripley 2002)2.

Usando o caret, a função é a mesma, porém dentro de uma interface comum a vários métodos diferentes3.

library("MASS")
  1. Fávero, L. P., Belfiore, P., Silva, F. L. e Chan, B.L. (2009) Análise de dados: Modelagem multivariada para tomada de decisões. Rio de Janeiro: Elsevier.

  2. Venables, W. N. e Ripley, B. D. (2002) Modern Applied Statistics with S. Fourth Edition.

  3. Lista completa de modelos aceitos no caret: https://topepo.github.io/caret/available-models.html.

17 / 53
COVID19

Análise de dados NIR em R

Premissas1

  • Normalidade multivariada
  • Homogeneidade de variância/covariância
  • Independência entre as observações
18 / 53
COVID19

Análise de dados NIR em R

Premissas1

  • Normalidade multivariada
  • Homogeneidade de variância/covariância
  • Independência entre as observações

Multicolinearidade pode diminuir o poder preditivo da classificação pois viola a independência das observações.

  1. Fávero, L. P., Belfiore, P., Silva, F. L. e Chan, B.L. (2009) Análise de dados: Modelagem multivariada para tomada de decisões. Rio de Janeiro: Elsevier.
18 / 53
COVID19

Análise de dados NIR em R

Um exemplo - I - Execução

Receita criada no slide Criação da receita.

library("caret")
ldafit_cvsimples <-
train(
treino_receita, treino,
method = "lda",
metric = "Accuracy"
)
19 / 53
COVID19

Análise de dados NIR em R

Checagem de resultados

ldafit_cvsimples
## Linear Discriminant Analysis
##
## 111 samples
## 4 predictor
## 3 classes: 'setosa', 'versicolor', 'virginica'
##
## Recipe steps:
## Resampling: Bootstrapped (25 reps)
## Summary of sample sizes: 111, 111, 111, 111, 111, 111, ...
## Resampling results:
##
## Accuracy Kappa
## 0.9754789 0.9627761
20 / 53
COVID19

Análise de dados NIR em R

Um exemplo - II - Medindo performance do treino

getTrainPerf(ldafit_cvsimples)
## TrainAccuracy TrainKappa method
## 1 0.9754789 0.9627761 lda
21 / 53
COVID19

Análise de dados NIR em R

Um exemplo - III - Predições e performance em teste

predicao_lda_basico <-
ldafit_cvsimples %>%
predict(., newdata = teste)
predicao_lda_basico
## [1] setosa setosa setosa setosa setosa
## [6] setosa setosa setosa setosa setosa
## [11] setosa setosa setosa versicolor versicolor
## [16] versicolor versicolor versicolor versicolor versicolor
## [21] versicolor versicolor versicolor versicolor versicolor
## [26] versicolor virginica virginica virginica virginica
## [31] virginica virginica virginica virginica virginica
## [36] virginica virginica virginica virginica
## Levels: setosa versicolor virginica
22 / 53
COVID19

Análise de dados NIR em R

Um exemplo - III - Predições e performance em teste

Código

confusionMatrix(data = predicao_lda_basico, reference = teste$Species)

Resultado

Para entender métricas de performance: https://topepo.github.io/caret/measuring-performance.html#class.

23 / 53
COVID19

Análise de dados NIR em R

Um exemplo - IV - Matriz de confusão

Função confusao_lab() do pacote NIRtools1. Caso não consigam ou não desejem instalar o pacote, basta fazer um source():

source("https://raw.githubusercontent.com/ricoperdiz/NIRtools/master/R/confusion_matrix.R")
par(mar = c(1, 5, 5, 1))
table(teste$Species, predicao_lda_basico) %>%
confusao_lab(.)

24 / 53
COVID19

Análise de dados NIR em R

Argumentos1 para criação de modelos com a função trainControl()

  • method: boot, cv, LOOCV, LGOCV, repeatedcv e none (há mais opções!)
  • number e repeats: primeiro controla o número de divisões em cv/repeatedcv OU número de iterações para bootstrap e LOOCV; segundo se aplica somente ao k-fold.
  • verboseIter: Mostra um log
  • returnData: Retorna os dados que servem de entrada?
  • p: Porcentagem em LGOCV
  • classProbs: valor lógico para determinar se as probabilidades de atribuição a cada classe devem ser calculadas
  • returnResamp: all, final or none
  • allowParallel: Paraleliza?
  1. Para uma lista completa, acesse a ajuda da função: ?trainControl
25 / 53
COVID19

Análise de dados NIR em R

Prática com trainControl()

Validação cruzada simples - cv

ctrl_cv <-
trainControl(method = "cv",
number = 10, # faz uma validacao 10-fold
verboseIter = FALSE,
returnData = TRUE, # Nao importante! Pode ser falso
classProbs = TRUE,
savePredictions = "all")
ldafit_cv_10fold <-
train(
treino_receita, treino,
method = "lda",
trControl = ctrl_cv,
metric = "Accuracy" # em classificacoes, dois valores sao possiveis: Accuracy ou Kappa
)
26 / 53
COVID19

Análise de dados NIR em R

Acessando o resultado de train() - I

names(ldafit_cv_10fold)
## [1] "method" "modelInfo" "modelType"
## [4] "recipe" "results" "pred"
## [7] "bestTune" "call" "dots"
## [10] "metric" "control" "finalModel"
## [13] "trainingData" "resample" "resampledCM"
## [16] "perfNames" "maximize" "yLimits"
## [19] "times" "levels" "rs_seed"

Para acessar as informações, basta executar um dos comandos abaixo:

ldafit_cv_10fold$method # metodo utilizado
ldafit_cv_10fold$modelInfo # info do modelo
ldafit_cv_10fold$modelType # tipo de modelo
ldafit_cv_10fold$bestTune
ldafit_cv_10fold$call # formula utilizada em train()
ldafit_cv_10fold$dots # se verbose == TRUE ou FALSE
ldafit_cv_10fold$resample # estatisticas em cada reamostragem
ldafit_cv_10fold$metric # qual metrica utilizada em train()
ldafit_cv_10fold$control # especificacoes de trainControl()
27 / 53
COVID19

Análise de dados NIR em R

Acessando o resultado de train() - II - Predições

ldafit_cv_10fold$pred %>%
filter(obs != pred)
## obs rowIndex pred setosa versicolor
## 1 versicolor 64 virginica 7.082366e-31 0.1304324
## 2 virginica 99 versicolor 6.506261e-27 0.8282785
## virginica parameter Resample
## 1 0.8695676 none Fold07
## 2 0.1717215 none Fold10
28 / 53
COVID19

Análise de dados NIR em R

Acessando o resultado de train() - IV - resultados

ldafit_cv_10fold$results
## parameter Accuracy Kappa AccuracySD KappaSD
## 1 none 0.9818182 0.9723259 0.03833064 0.05834346
29 / 53
COVID19

Análise de dados NIR em R

Acessando o resultado de train() - V - Modelo final

Resultado da LDA, caso fizéssemos uso da função lda(), referente ao modelo final:

ldafit_cv_10fold$finalModel
## Call:
## lda(x, y)
##
## Prior probabilities of groups:
## setosa versicolor virginica
## 0.3333333 0.3333333 0.3333333
##
## Group means:
## Sepal.Length Sepal.Width Petal.Length Petal.Width
## setosa 5.029730 3.440541 1.481081 0.2459459
## versicolor 5.972973 2.751351 4.254054 1.3162162
## virginica 6.610811 2.989189 5.616216 2.0405405
##
## Coefficients of linear discriminants:
## LD1 LD2
## Sepal.Length 0.9107941 -0.6076288
## Sepal.Width 1.3721594 2.7462192
## Petal.Length -2.1944206 -0.2260993
## Petal.Width -2.8023531 1.9159240
##
## Proportion of trace:
## LD1 LD2
## 0.9893 0.0107
30 / 53
COVID19

Análise de dados NIR em R

Medindo performance do treino

getTrainPerf(ldafit_cv_10fold)
## TrainAccuracy TrainKappa method
## 1 0.9818182 0.9723259 lda
31 / 53
COVID19

Análise de dados NIR em R

Predições e performance em teste

Código

predicao_lda_cv_10fold <-
ldafit_cv_10fold %>%
predict(., newdata = teste)
confusionMatrix(data = predicao_lda_cv_10fold, reference = teste$Species)

Resultado

32 / 53
COVID19

Análise de dados NIR em R

Matriz de confusão

Função confusao_lab() do pacote NIRtools1.

par(mar = c(1, 5, 5, 1))
table(teste$Species, predicao_lda_basico) %>%
NIRtools::confusao_lab(., add_CP = TRUE)

33 / 53
COVID19

Análise de dados NIR em R

Validação cruzada repetida - repeatedcv

ctrl_lda_repeatedcv <-
trainControl(
method = "repeatedcv",
number = 10, # faz uma validacao 10-fold
repeats = 10,
verboseIter = FALSE,
returnData = FALSE, # Nao importante! Pode ser falso
classProbs = TRUE,
savePredictions = "all"
)
ldafit_repeatedcv_10fold_10vezes <-
train(
treino_receita, treino,
method = "lda",
trControl = ctrl_lda_repeatedcv,
metric = "Accuracy" # em classificacoes, dois valores sao possiveis: Accuracy ou Kappa
)
34 / 53
COVID19

Análise de dados NIR em R

Receitas de pré-processamento e o caret

Por que aprender isso?

35 / 53
COVID19

Análise de dados NIR em R

Receitas de pré-processamento e o caret

Por que aprender isso?

Mais possibilidades no pré-processamento dos dados

Manter variáveis adicionais para medir performance

35 / 53
COVID19

Análise de dados NIR em R

E o caret sem receita, pode?

36 / 53
COVID19

Análise de dados NIR em R

E o caret sem receita, pode?

Pode!

Execução

resultado_lda_sem_receita_basico <-
train(
Species ~ .,
data = treino,
method = "lda",
metric = "Accuracy"
)

Checagem de resultado

print(resultado_lda_sem_receita_basico)
## Linear Discriminant Analysis
##
## 111 samples
## 4 predictor
## 3 classes: 'setosa', 'versicolor', 'virginica'
##
## No pre-processing
## Resampling: Bootstrapped (25 reps)
## Summary of sample sizes: 111, 111, 111, 111, 111, 111, ...
## Resampling results:
##
## Accuracy Kappa
## 0.9667379 0.9495212
36 / 53
COVID19

Análise de dados NIR em R

Medindo performance do treino

getTrainPerf(resultado_lda_sem_receita_basico)
## TrainAccuracy TrainKappa method
## 1 0.9667379 0.9495212 lda
37 / 53
COVID19

Análise de dados NIR em R

Predições e performance em teste

predicao_lda_sem_receita_basico <-
resultado_lda_sem_receita_basico %>%
predict(., newdata = teste)
confusionMatrix(data = predicao_lda_sem_receita_basico, reference = teste$Species)
## Confusion Matrix and Statistics
##
## Reference
## Prediction setosa versicolor virginica
## setosa 13 0 0
## versicolor 0 13 0
## virginica 0 0 13
##
## Overall Statistics
##
## Accuracy : 1
## 95% CI : (0.9097, 1)
## No Information Rate : 0.3333
## P-Value [Acc > NIR] : < 2.2e-16
##
## Kappa : 1
##
## Mcnemar's Test P-Value : NA
##
## Statistics by Class:
##
## Class: setosa Class: versicolor
## Sensitivity 1.0000 1.0000
## Specificity 1.0000 1.0000
## Pos Pred Value 1.0000 1.0000
## Neg Pred Value 1.0000 1.0000
## Prevalence 0.3333 0.3333
## Detection Rate 0.3333 0.3333
## Detection Prevalence 0.3333 0.3333
## Balanced Accuracy 1.0000 1.0000
## Class: virginica
## Sensitivity 1.0000
## Specificity 1.0000
## Pos Pred Value 1.0000
## Neg Pred Value 1.0000
## Prevalence 0.3333
## Detection Rate 0.3333
## Detection Prevalence 0.3333
## Balanced Accuracy 1.0000
38 / 53
COVID19

Análise de dados NIR em R

Matriz de confusão

Função confusao_lab() do pacote NIRtools1.

par(mar = c(1, 5, 5, 1))
table(teste$Species, predicao_lda_sem_receita_basico) %>%
NIRtools::confusao_lab(.)

39 / 53
COVID19

Análise de dados NIR em R

Análise de mínimos quadrados parciais (PLS)

Método muito utilizado na quimiometria, especialmente quando o número de variáveis preditoras é significantemente maior que o número de observações.

40 / 53
COVID19

Análise de dados NIR em R

Análise de mínimos quadrados parciais (PLS)

Método muito utilizado na quimiometria, especialmente quando o número de variáveis preditoras é significantemente maior que o número de observações.

Baseia-se em variáveis latentes, em que cada fator é definido como uma combinação linear das variáveis originais das variáveis preditoras ou variável resposta.

40 / 53
COVID19

Análise de dados NIR em R

Análise de mínimos quadrados parciais (PLS)

Método muito utilizado na quimiometria, especialmente quando o número de variáveis preditoras é significantemente maior que o número de observações.

Baseia-se em variáveis latentes, em que cada fator é definido como uma combinação linear das variáveis originais das variáveis preditoras ou variável resposta.

Essencialmente, trata-se de uma versão supervisionada da PCA1

library("pls")
40 / 53
COVID19

Análise de dados NIR em R

PLS com o pacote caret

41 / 53
COVID19

Análise de dados NIR em R

PLS com o pacote caret

Dados

Mesmo conjunto de dados utilizado anteriormente. Coloco aqui para facilitar a preparação dos dados para a PLS.

dados <- iris
dados <- as_tibble(dados)
dados_split <- initial_split(dados, strata = "Species")
treino <- training(dados_split)
teste <- testing(dados_split)
treino_receita <-
recipes::recipe(Species ~ ., data = treino) %>%
prep()
41 / 53
COVID19

Análise de dados NIR em R

Execução

ctrl_exemplo_pls <-
trainControl(
method = "repeatedcv",
number = 10,
repeats = 10,
verboseIter = FALSE,
savePredictions = "final")
plsfit_exemplo <-
train(
treino_receita, treino,
method = "pls",
metric = "Accuracy",
trControl = ctrl_exemplo_pls,
tuneLength = 3
)
42 / 53

É importante comentar sobre a utilidade do argumento tuneGrid da função train() quando executamos uma PLS.

Também comentar sobre a possibilidade de paralelização da análise por meio do pacote paralell e a função registerDoParallel.

COVID19

Análise de dados NIR em R

Checando o resultado

plsfit_exemplo
## Partial Least Squares
##
## 111 samples
## 4 predictor
## 3 classes: 'setosa', 'versicolor', 'virginica'
##
## Recipe steps:
## Resampling: Cross-Validated (10 fold, repeated 10 times)
## Summary of sample sizes: 99, 99, 99, 101, 100, 99, ...
## Resampling results across tuning parameters:
##
## ncomp Accuracy Kappa
## 1 0.6704242 0.5055691
## 2 0.7864798 0.6787244
## 3 0.7934949 0.6889434
##
## Accuracy was used to select the optimal model using
## the largest value.
## The final value used for the model was ncomp = 3.
43 / 53
COVID19

Análise de dados NIR em R

Acurácia por número de componentes

plot(plsfit_exemplo)

44 / 53
COVID19

Análise de dados NIR em R

Predições e performance

plsfit_exemplo %>%
predict(newdata = teste) %>%
confusionMatrix(data = ., reference = teste$Species)
## Confusion Matrix and Statistics
##
## Reference
## Prediction setosa versicolor virginica
## setosa 13 0 0
## versicolor 0 8 3
## virginica 0 5 10
##
## Overall Statistics
##
## Accuracy : 0.7949
## 95% CI : (0.6354, 0.907)
## No Information Rate : 0.3333
## P-Value [Acc > NIR] : 4.429e-09
##
## Kappa : 0.6923
##
## Mcnemar's Test P-Value : NA
##
## Statistics by Class:
##
## Class: setosa Class: versicolor
## Sensitivity 1.0000 0.6154
## Specificity 1.0000 0.8846
## Pos Pred Value 1.0000 0.7273
## Neg Pred Value 1.0000 0.8214
## Prevalence 0.3333 0.3333
## Detection Rate 0.3333 0.2051
## Detection Prevalence 0.3333 0.2821
## Balanced Accuracy 1.0000 0.7500
## Class: virginica
## Sensitivity 0.7692
## Specificity 0.8077
## Pos Pred Value 0.6667
## Neg Pred Value 0.8750
## Prevalence 0.3333
## Detection Rate 0.2564
## Detection Prevalence 0.3846
## Balanced Accuracy 0.7885
45 / 53
COVID19

Análise de dados NIR em R

Validação cruzada Leave-one-out - LOOCV

ctrl_loocv <-
trainControl(
method = "LOOCV",
verboseIter = FALSE,
savePredictions = "final")
plsfit_exemplo_loocv <-
train(
treino_receita, treino,
method = "pls",
metric = "Accuracy",
trControl = ctrl_loocv,
tuneGrid = expand.grid(ncomp = 2)
)
46 / 53
COVID19

Análise de dados NIR em R

Checagem de resultado

plsfit_exemplo_loocv
## Partial Least Squares
##
## 111 samples
## 4 predictor
## 3 classes: 'setosa', 'versicolor', 'virginica'
##
## Recipe steps:
## Resampling: Leave-One-Out Cross-Validation
## Summary of sample sizes: 110, 110, 110, 110, 110, 110, ...
## Resampling results:
##
## Accuracy Kappa
## 0.7747748 0.6621622
##
## Tuning parameter 'ncomp' was held constant at a value of 2
47 / 53
COVID19

Análise de dados NIR em R

Medindo performance do treino

getTrainPerf(plsfit_exemplo_loocv)
## TrainAccuracy TrainKappa method
## 1 0.7747748 0.6621622 pls
48 / 53
COVID19

Análise de dados NIR em R

Predições e performance em teste

Código

predicao_plsfit_exemplo_loocv <-
plsfit_exemplo_loocv %>%
predict(., newdata = teste)
confusionMatrix(data = predicao_plsfit_exemplo_loocv, reference = teste$Species)
## Confusion Matrix and Statistics
##
## Reference
## Prediction setosa versicolor virginica
## setosa 13 0 0
## versicolor 0 9 2
## virginica 0 4 11
##
## Overall Statistics
##
## Accuracy : 0.8462
## 95% CI : (0.6947, 0.9414)
## No Information Rate : 0.3333
## P-Value [Acc > NIR] : 5.641e-11
##
## Kappa : 0.7692
##
## Mcnemar's Test P-Value : NA
##
## Statistics by Class:
##
## Class: setosa Class: versicolor
## Sensitivity 1.0000 0.6923
## Specificity 1.0000 0.9231
## Pos Pred Value 1.0000 0.8182
## Neg Pred Value 1.0000 0.8571
## Prevalence 0.3333 0.3333
## Detection Rate 0.3333 0.2308
## Detection Prevalence 0.3333 0.2821
## Balanced Accuracy 1.0000 0.8077
## Class: virginica
## Sensitivity 0.8462
## Specificity 0.8462
## Pos Pred Value 0.7333
## Neg Pred Value 0.9167
## Prevalence 0.3333
## Detection Rate 0.2821
## Detection Prevalence 0.3846
## Balanced Accuracy 0.8462

Resultado

49 / 53
COVID19

Análise de dados NIR em R

Matriz de confusão

Função confusao_lab() do pacote NIRtools1.

par(mar = c(1, 5, 5, 1))
table(teste$Species, predicao_plsfit_exemplo_loocv) %>%
NIRtools::confusao_lab(.)

50 / 53
COVID19

Análise de dados NIR em R

Resumo de construção e avaliação de modelos com a interface caret

  • trainControl() e train() - controla argumentos e treina modelos
  • getTrainPerf() avalia o modelo com dados treino
  • predict() para predizer categoria das amostras em teste
  • confusionMatrix() para obter métricas de performance e matriz de confusão
  • confusao_lab para plotar uma matriz de confusão no estilo LABOTAM.
51 / 53
COVID19

Análise de dados NIR em R

Info do sistema

## R version 4.5.1 (2025-06-13 ucrt)
## Platform: x86_64-w64-mingw32/x64
## Running under: Windows 11 x64 (build 26100)
##
## Matrix products: default
## LAPACK version 3.12.1
##
## locale:
## [1] LC_COLLATE=Portuguese_Brazil.utf8
## [2] LC_CTYPE=Portuguese_Brazil.utf8
## [3] LC_MONETARY=Portuguese_Brazil.utf8
## [4] LC_NUMERIC=C
## [5] LC_TIME=Portuguese_Brazil.utf8
##
## time zone: America/Manaus
## tzcode source: internal
##
## attached base packages:
## [1] stats graphics grDevices utils datasets
## [6] methods base
##
## other attached packages:
## [1] pls_2.8-5 MASS_7.3-65
## [3] metathis_1.1.4.9000 data.table_1.17.0
## [5] magrittr_2.0.3 caret_7.0-1
## [7] lattice_0.22-7 yardstick_1.3.2
## [9] workflowsets_1.1.0 workflows_1.2.0
## [11] tune_1.3.0 tidyr_1.3.1
## [13] tibble_3.2.1 rsample_1.3.0
## [15] recipes_1.2.1 purrr_1.0.4
## [17] parsnip_1.3.1 modeldata_1.4.0
## [19] infer_1.0.8 dplyr_1.1.4
## [21] dials_1.4.0 scales_1.3.0
## [23] broom_1.0.8 tidymodels_1.3.0
## [25] ggplot2_3.5.2 xaringanthemer_0.4.3.9000
## [27] rsvg_2.6.2 DiagrammeRsvg_0.1
## [29] DiagrammeR_1.0.11.9000
##
## loaded via a namespace (and not attached):
## [1] pROC_1.18.5 rlang_1.1.6
## [3] furrr_0.3.1 e1071_1.7-16
## [5] compiler_4.5.1 png_0.1-8
## [7] vctrs_0.6.5 reshape2_1.4.4
## [9] lhs_1.2.0 stringr_1.5.1
## [11] sysfonts_0.8.9 pkgconfig_2.0.3
## [13] fastmap_1.2.0 backports_1.5.0
## [15] labeling_0.4.3 utf8_1.2.4
## [17] promises_1.3.2 rmarkdown_2.29
## [19] prodlim_2024.06.25 xfun_0.52.1
## [21] showtext_0.9-7 cachem_1.1.0
## [23] jsonlite_2.0.0 later_1.4.2
## [25] parallel_4.5.1 R6_2.6.1
## [27] bslib_0.9.0 stringi_1.8.7
## [29] RColorBrewer_1.1-3 parallelly_1.43.0
## [31] rpart_4.1.24 lubridate_1.9.4
## [33] jquerylib_0.1.4 Rcpp_1.0.14
## [35] iterators_1.0.14 knitr_1.50
## [37] future.apply_1.11.3 NIRtools_0.0.0.9006
## [39] httpuv_1.6.15 Matrix_1.7-3
## [41] splines_4.5.1 nnet_7.3-20
## [43] timechange_0.3.0 tidyselect_1.2.1
## [45] rstudioapi_0.17.1 yaml_2.3.10
## [47] timeDate_4041.110 codetools_0.2-20
## [49] curl_6.2.2 listenv_0.9.1
## [51] plyr_1.8.9 withr_3.0.2
## [53] evaluate_1.0.3 xaringan_0.30.1
## [55] future_1.40.0 survival_3.8-3
## [57] proxy_0.4-27 xml2_1.3.8
## [59] pillar_1.10.2 rsconnect_1.3.4
## [61] whisker_0.4.1 stats4_4.5.1
## [63] foreach_1.5.2 generics_0.1.3
## [65] icons_0.2.0 servr_0.32
## [67] munsell_0.5.1 globals_0.16.3
## [69] class_7.3-23 glue_1.8.0
## [71] tools_4.5.1 xaringanExtra_0.8.0.9000
## [73] ModelMetrics_1.2.2.2 gower_1.0.2
## [75] visNetwork_2.1.2 grid_4.5.1
## [77] ipred_0.9-15 colorspace_2.1-1
## [79] nlme_3.1-168 showtextdb_3.0
## [81] cli_3.6.4 DiceDesign_1.10
## [83] rappdirs_0.3.3 lava_1.8.1
## [85] V8_6.0.3 gtable_0.3.6
## [87] GPfit_1.0-9 sass_0.4.10
## [89] digest_0.6.37 farver_2.1.2
## [91] htmlwidgets_1.6.4 htmltools_0.5.8.1
## [93] lifecycle_1.0.4 hardhat_1.4.1
## [95] mime_0.13
53 / 53
COVID19

Análise de dados NIR em R

Sumário

Recapitulação do primeiro dia

2 / 53
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
Esc Back to slideshow