
Figura de Wickham, H. e Grolemund, G. (2016) http://r4ds.had.co.nz.
irisdados <- iris
library("data.table")dados <- fread("MEUSDADOS.csv")
nir_data1, que acompanha o pacote NIRtools2.dados <- fread("https://raw.githubusercontent.com/ricoperdiz/NIRtools/master/inst/extdata/nir_data.csv")
data.frame em um tibble1library("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 rowstibble em https://r4ds.had.co.nz/tibbles.html. 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(.)treino e testelibrary("rsample") # initial_splitdados_split <- initial_split(dados, strata = "Species")treino <- training(dados_split)teste <- testing(dados_split)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.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.
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, ... | Trainedpca_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_f6kUqsdev_pca_normalizada <- dados_completos_receita_pca_pre$steps[[2]]$res$sdevporcent_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.00000library("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), "%)"))

Duas funções básicas:
caret::train()caret::trainControl()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
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.
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.
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.
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")
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.
Venables, W. N. e Ripley, B. D. (2002) Modern Applied Statistics with S. Fourth Edition.
Lista completa de modelos aceitos no caret: https://topepo.github.io/caret/available-models.html.
Multicolinearidade pode diminuir o poder preditivo da classificação pois viola a independência das observações.
Receita criada no slide Criação da receita.
library("caret")
ldafit_cvsimples <- train( treino_receita, treino, method = "lda", metric = "Accuracy" )
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.9627761treinogetTrainPerf(ldafit_cvsimples)
## TrainAccuracy TrainKappa method## 1 0.9754789 0.9627761 ldatestepredicao_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 virginicatesteCó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.
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(.)

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 logreturnData: Retorna os dados que servem de entrada?p: Porcentagem em LGOCVclassProbs: valor lógico para determinar se as probabilidades de atribuição a cada classe devem ser calculadasreturnResamp: all, final or noneallowParallel: Paraleliza??trainControltrainControl()cvctrl_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 )train() - Inames(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 modeloldafit_cv_10fold$modelType # tipo de modeloldafit_cv_10fold$bestTuneldafit_cv_10fold$call # formula utilizada em train()ldafit_cv_10fold$dots # se verbose == TRUE ou FALSEldafit_cv_10fold$resample # estatisticas em cada reamostragemldafit_cv_10fold$metric # qual metrica utilizada em train()ldafit_cv_10fold$control # especificacoes de trainControl()
train() - II - Prediçõesldafit_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 Fold10train() - IV - resultadosldafit_cv_10fold$results
## parameter Accuracy Kappa AccuracySD KappaSD## 1 none 0.9818182 0.9723259 0.03833064 0.05834346train() - V - Modelo finalResultado 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.0107treinogetTrainPerf(ldafit_cv_10fold)
## TrainAccuracy TrainKappa method## 1 0.9818182 0.9723259 ldatesteCódigo
predicao_lda_cv_10fold <- ldafit_cv_10fold %>% predict(., newdata = teste)confusionMatrix(data = predicao_lda_cv_10fold, reference = teste$Species)
Resultado

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)

repeatedcvctrl_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 )
resultado_lda_sem_receita_basico <- train( Species ~ ., data = treino, method = "lda", metric = "Accuracy" )
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.9495212treinogetTrainPerf(resultado_lda_sem_receita_basico)
## TrainAccuracy TrainKappa method## 1 0.9667379 0.9495212 ldatestepredicao_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.0000Função confusao_lab() do pacote NIRtools1.
par(mar = c(1, 5, 5, 1))table(teste$Species, predicao_lda_sem_receita_basico) %>% NIRtools::confusao_lab(.)

Método muito utilizado na quimiometria, especialmente quando o número de variáveis preditoras é significantemente maior que o número de observações.
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.
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")
caretMesmo conjunto de dados utilizado anteriormente. Coloco aqui para facilitar a preparação dos dados para a PLS.
dados <- irisdados <- 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()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 )
É 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.
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.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.7885LOOCVctrl_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) )
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 2treinogetTrainPerf(plsfit_exemplo_loocv)
## TrainAccuracy TrainKappa method## 1 0.7747748 0.6621622 plstesteCó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.8462Resultado

Função confusao_lab() do pacote NIRtools1.
par(mar = c(1, 5, 5, 1))table(teste$Species, predicao_plsfit_exemplo_loocv) %>% NIRtools::confusao_lab(.)

trainControl() e train() - controla argumentos e treina modelosgetTrainPerf() avalia o modelo com dados treinopredict() para predizer categoria das amostras em testeconfusionMatrix() para obter métricas de performance e matriz de confusãoconfusao_lab para plotar uma matriz de confusão no estilo LABOTAM. ## 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.13Keyboard 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 |
| o | Tile View: Overview of Slides |
| s | Toggle scribble toolbox |
| Esc | Back to slideshow |

Figura de Wickham, H. e Grolemund, G. (2016) http://r4ds.had.co.nz.
irisdados <- iris
library("data.table")dados <- fread("MEUSDADOS.csv")
nir_data1, que acompanha o pacote NIRtools2.dados <- fread("https://raw.githubusercontent.com/ricoperdiz/NIRtools/master/inst/extdata/nir_data.csv")
data.frame em um tibble1library("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 rowstibble em https://r4ds.had.co.nz/tibbles.html. 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(.)treino e testelibrary("rsample") # initial_splitdados_split <- initial_split(dados, strata = "Species")treino <- training(dados_split)teste <- testing(dados_split)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.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.
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, ... | Trainedpca_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_f6kUqsdev_pca_normalizada <- dados_completos_receita_pca_pre$steps[[2]]$res$sdevporcent_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.00000library("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), "%)"))

Duas funções básicas:
caret::train()caret::trainControl()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
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.
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.
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.
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")
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.
Venables, W. N. e Ripley, B. D. (2002) Modern Applied Statistics with S. Fourth Edition.
Lista completa de modelos aceitos no caret: https://topepo.github.io/caret/available-models.html.
Multicolinearidade pode diminuir o poder preditivo da classificação pois viola a independência das observações.
Receita criada no slide Criação da receita.
library("caret")
ldafit_cvsimples <- train( treino_receita, treino, method = "lda", metric = "Accuracy" )
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.9627761treinogetTrainPerf(ldafit_cvsimples)
## TrainAccuracy TrainKappa method## 1 0.9754789 0.9627761 ldatestepredicao_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 virginicatesteCó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.
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(.)

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 logreturnData: Retorna os dados que servem de entrada?p: Porcentagem em LGOCVclassProbs: valor lógico para determinar se as probabilidades de atribuição a cada classe devem ser calculadasreturnResamp: all, final or noneallowParallel: Paraleliza??trainControltrainControl()cvctrl_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 )train() - Inames(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 modeloldafit_cv_10fold$modelType # tipo de modeloldafit_cv_10fold$bestTuneldafit_cv_10fold$call # formula utilizada em train()ldafit_cv_10fold$dots # se verbose == TRUE ou FALSEldafit_cv_10fold$resample # estatisticas em cada reamostragemldafit_cv_10fold$metric # qual metrica utilizada em train()ldafit_cv_10fold$control # especificacoes de trainControl()
train() - II - Prediçõesldafit_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 Fold10train() - IV - resultadosldafit_cv_10fold$results
## parameter Accuracy Kappa AccuracySD KappaSD## 1 none 0.9818182 0.9723259 0.03833064 0.05834346train() - V - Modelo finalResultado 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.0107treinogetTrainPerf(ldafit_cv_10fold)
## TrainAccuracy TrainKappa method## 1 0.9818182 0.9723259 ldatesteCódigo
predicao_lda_cv_10fold <- ldafit_cv_10fold %>% predict(., newdata = teste)confusionMatrix(data = predicao_lda_cv_10fold, reference = teste$Species)
Resultado

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)

repeatedcvctrl_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 )
resultado_lda_sem_receita_basico <- train( Species ~ ., data = treino, method = "lda", metric = "Accuracy" )
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.9495212treinogetTrainPerf(resultado_lda_sem_receita_basico)
## TrainAccuracy TrainKappa method## 1 0.9667379 0.9495212 ldatestepredicao_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.0000Função confusao_lab() do pacote NIRtools1.
par(mar = c(1, 5, 5, 1))table(teste$Species, predicao_lda_sem_receita_basico) %>% NIRtools::confusao_lab(.)

Método muito utilizado na quimiometria, especialmente quando o número de variáveis preditoras é significantemente maior que o número de observações.
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.
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")
caretMesmo conjunto de dados utilizado anteriormente. Coloco aqui para facilitar a preparação dos dados para a PLS.
dados <- irisdados <- 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()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 )
É 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.
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.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.7885LOOCVctrl_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) )
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 2treinogetTrainPerf(plsfit_exemplo_loocv)
## TrainAccuracy TrainKappa method## 1 0.7747748 0.6621622 plstesteCó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.8462Resultado

Função confusao_lab() do pacote NIRtools1.
par(mar = c(1, 5, 5, 1))table(teste$Species, predicao_plsfit_exemplo_loocv) %>% NIRtools::confusao_lab(.)

trainControl() e train() - controla argumentos e treina modelosgetTrainPerf() avalia o modelo com dados treinopredict() para predizer categoria das amostras em testeconfusionMatrix() para obter métricas de performance e matriz de confusãoconfusao_lab para plotar uma matriz de confusão no estilo LABOTAM. ## 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