¿Cómo personalizar un modelo en CARET para realizar el modelo de clasificación de dos pasos PLS- [Classifer]?

Esta pregunta es una continuación del mismo hilo.aquí. A continuación se muestra un ejemplo de trabajo mínimo tomado de este libro:

Wehrens R. Chemometrics with R análisis de datos multivariados en ciencias naturales y ciencias de la vida. 1ª edición. Heidelberg; Nueva York: Springer. 2011. (página 250).

El ejemplo fue tomado de este libro y su paquete.ChemometricsWithR. Resaltó algunos escollos al modelar utilizando técnicas de validación cruzada.

El objetivo:
Una metodología de validación cruzada que utiliza el mismo conjunto de CV repetido para realizar una estrategia conocida dePLS seguido típicamente porLDA o primos como regresión logística, SVM, C5.0, CART, con el espíritu decaret paquete. Por lo tanto, se necesitaría PLS cada vez antes de llamar al clasificador de espera para clasificar PLSPuntuación Espacio en lugar de las propias observaciones. El enfoque más cercano en el paquete caret está haciendoPCA como un paso de preprocesamiento antes de modelar con cualquier clasificador. A continuación se muestra un procedimiento PLS-LDA con una sola validación cruzada para probar el rendimiento del clasificador, no hubo CV 10 veces o ninguna repetición. El código a continuación fue tomado del libro mencionado, pero con algunas correcciones, de lo contrario arroja un error:

library(ChemometricsWithR)
data(prostate)
prostate.clmat <- classvec2classmat(prostate.type) # convert Y to a dummy var

odd <- seq(1, length(prostate.type), by = 2) # training
even <- seq(2, length(prostate.type), by = 2) # holdout test

prostate.pls <- plsr(prostate.clmat ~ prostate, ncomp = 16, validation = "CV", subset=odd)

Xtst <- scale(prostate[even,], center = colMeans(prostate[odd,]), scale = apply(prostate[odd,],2,sd))

tst.scores <- Xtst %*% prostate.pls$projection # scores for the waiting trained LDA to test

prostate.ldapls <- lda(scores(prostate.pls)[,1:16],prostate.type[odd]) # LDA for scores
table(predict(prostate.ldapls, new = tst.scores[,1:16])$class, prostate.type[even])

predictionTest <- predict(prostate.ldapls, new = tst.scores[,1:16])$class)

library(caret)    
confusionMatrix(data = predictionTest, reference= prostate.type[even]) # from caret

Salida:

Confusion Matrix and Statistics

          Reference
Prediction bph control pca
   bph       4       1   9
   control   1      35   7
   pca      34       4  68

Overall Statistics

               Accuracy : 0.6564          
                 95% CI : (0.5781, 0.7289)
    No Information Rate : 0.5153          
    P-Value [Acc > NIR] : 0.0001874       

                  Kappa : 0.4072          
 Mcnemar's Test P-Value : 0.0015385       

Statistics by Class:

                     Class: bph Class: control Class: pca
Sensitivity             0.10256         0.8750     0.8095
Specificity             0.91935         0.9350     0.5190
Pos Pred Value          0.28571         0.8140     0.6415
Neg Pred Value          0.76510         0.9583     0.7193
Prevalence              0.23926         0.2454     0.5153
Detection Rate          0.02454         0.2147     0.4172
Detection Prevalence    0.08589         0.2638     0.6503
Balanced Accuracy       0.51096         0.9050     0.6643

Sin embargo, la matriz de confusión no coincidió con eso en el libro, de todos modos el código del libro se rompió, ¡pero este aquí funcionó conmigo!

Notas:
Aunque esto era solo un CV, pero la intención es acordar primero esta metodología,sd ymean del conjunto de trenes se aplicaron en el conjunto de prueba, PLUS transformado en puntajes PLS basado en un número específico de PCncomp. Quiero que esto ocurra en cada ronda del CV en el caret. Si la metodología como código es correcta aquí, entonces puede servir, como un buen comienzo para un ejemplo de trabajo mínimo mientras se modifica el código del paquete caret.

Notas al margen:
Puede ser muy desordenado con el escalado y el centrado, creo que algunas de las funciones PLS en R hacen el escalado interno, con o sin centrado, no estoy seguro, por lo que la construcción de un modelo personalizado en Caret debe manejarse con cuidado para evitar ambas faltas o Escalado múltiple o centrado (estoy en mis guardias con estas cosas).

Peligros de centrado / escalado múltiple
El código que aparece a continuación es solo para mostrar cómo el centrado / escalado de varios puntos puede cambiar los datos, aquí solo se muestra el centrado, pero también se aplica el mismo problema con el escalado.

set.seed(1)
x <- rnorm(200, 2, 1)
xCentered1 <- scale(x, center=TRUE, scale=FALSE)
xCentered2 <- scale(xCentered1, center=TRUE, scale=FALSE)
xCentered3 <- scale(xCentered2, center=TRUE, scale=FALSE)
sapply (list(xNotCentered= x, xCentered1 = xCentered1, xCentered2 = xCentered2, xCentered3 = xCentered3), mean)

Salida:

xNotCentered    xCentered1    xCentered2    xCentered3 
 2.035540e+00  1.897798e-16 -5.603699e-18 -5.332377e-18

Por favor, deje un comentario si me falta algo en algún lugar de este curso. Gracias.

Respuestas a la pregunta(4)

Su respuesta a la pregunta