[R] SAMPLS R implementation : pbm with algorithm application

nicolas baurin nicolas.baurin at univ-orleans.fr
Mon Sep 11 19:25:24 CEST 2000


Hello R people,

i'm trying to implement the Partial Least Squares algorithm called
SAMPLS from "J.Comp-Aided Molecular Design", 7 (1993), 587-619. It's
faster than the classical PLS algorithm for fat matrix (m>>n).

Here's the algorithm from the article of Bush B. L. and Nachbar R.B.:
    X is the matrix of explanatories proprieties (m*n) , y the matrix of
responses, h the number of latent variables extracted
    XT is for X matrix transposed
    x* is for the quantities for one sample (y* is the response
predicted from the model derived; i used one to test my R traduction
compared to the R pls module )


   Calculate the covariance matrix C=XXT    and     c*=Xx* for
prediction
     y is centered and become y1
    y*1=0


    For h =1,2,3...hmax
        s=Cyh
        center s
        working scalar for prediction sample s*=c*Tyh
        orthogonalize s to previous t: for g=1,...(h-1),
s=s-(tgTs/tgTtg)tg
        orthogonalize s* to previous t*: for g=1,...(h-1),
s*=s*-(tgTs/tgTtg)t*g

            t*h=s*
        th=s
        th2=tTt
        betah=(tTyh)/th2

        update yh+1=yh-betahth
           buid up prediction y*h+1=y*h+betaht*h

    end of cycle
----------------------------------- R-code
##xe and  ye  are the explanatories and responses matrices, xtest and
ytestsampls the variables for 1 sample

x2<-scale(xe,scale=FALSE)
y2<-scale(ye,scale=FALSE)

lv<-1
xtest<-as.matrix(x2[1,])
t<-matrix(0,nrow(ye),1)
c<-xe%*%t(xe)
yh<-y2
ytestsampls<-0
ctest<-xe%*%xtest


for (h in 1:lv) {
 s<-c%*%yh
 s<-scale(s,scale=FALSE)
stest<-t(ctest)%*%yh

##what follows works only for h=1 and 2, i know

 if (h>1) { s<-s- ( as.numeric( (t(t)%*%s)  / (t(t)%*%t) ) *t )
  stest<-stest-( as.numeric( (t(t)%*%s)  / (t(t)%*%t) ) *ttest )
  }
ttest<-stest
 t<-s
 t2<-t(t)%*%t
 beta<-t(t)%*%yh
 beta<-as.numeric(beta/t2)

ytestsampls<-ytestsampls + as.numeric(beta)*(ttest)
 yh<-yh-(beta*t)
}

ytestsampls2<-ytestsampls+mean(ye)



-------------------

When lv (number of variables extracted ) is 1 , no problem the y
predicted (ytestsampls2) is the same as when using the R module pls
(library(pls)). But when using lv=2, there is a difference , thus an
error in my code that must come from the update steps.

Does it come from the original algorithm or from my traduction.

Merci d'avance,

sorry for the size of this e-mail and thanks for reading it till all,

--
Nicolas Baurin

Doctorant
Institut de Chimie Organique et Analytique, UPRES-A 6005
Université d'Orléans, BP 6759
45067 ORLEANS Cedex 2, France
Tel: (33+) 2 38 49 45 77

-------------- next part --------------
An HTML attachment was scrubbed...
URL: https://stat.ethz.ch/pipermail/r-help/attachments/20000911/dca546d4/attachment.html


More information about the R-help mailing list