Ich bin sehr neu in Partial Least Squares (PLS) und versuche, die Ausgabe der R-Funktion plsr()
im pls
Paket zu verstehen . Lassen Sie uns Daten simulieren und den PLS ausführen:
library(pls)
n <- 50
x1 <- rnorm(n); xx1 <- scale(x1)
x2 <- rnorm(n); xx2 <- scale(x2)
y <- x1 + x2 + rnorm(n,0,0.1); yy <- scale(y)
p <- plsr(yy ~ xx1+xx2, ncomp=1)
Ich hatte erwartet, dass die folgenden Nummern und
> ( w <- loading.weights(p) )
Loadings:
Comp 1
xx1 0.723
xx2 0.690
Comp 1
SS loadings 1.0
Proportion Var 0.5
> a <- w["xx1",]
> b <- w["xx2",]
> a^2+b^2
[1] 1
werden berechnet, um zu maximieren
> cor(y, a*xx1+b*xx2)
[,1]
[1,] 0.9981291
aber das ist nicht genau der Fall:
> f <- function(ab){
+ a <- ab[1]; b <- ab[2]
+ cor(y, a*xx1+b*xx2)
+ }
> optim(c(0.7,0.6), f, control=list(fnscale=-1))
$par
[1] 0.7128259 0.6672870
$value
[1] 0.9981618
Handelt es sich um einen numerischen Fehler, oder verstehe ich die Natur von und falsch? ?
Ich würde auch gerne wissen, was diese Koeffizienten sind:
> p$coef
, , 1 comps
yy
xx1 0.6672848
xx2 0.6368604
EDIT : Jetzt sehe ich was p$coef
ist:
> x <- a*xx1+b*xx2
> coef(lm(yy~0+x))
x
0.9224208
> coef(lm(yy~0+x))*a
x
0.6672848
> coef(lm(yy~0+x))*b
x
0.6368604
Ich denke also, ich habe Recht mit der Natur von und .
EDIT: In Anbetracht der Kommentare von @chl denke ich, dass meine Frage nicht klar genug ist, also lass mich mehr Details angeben. In meinem Beispiel gibt es einen Vektor von Antworten und eine zweispaltige Matrix von Prädiktoren, und ich verwende die normalisierte Version von und die normalisierte Version von (zentriert und dividiert durch Standardabweichungen). Die Definition der ersten PLS-Komponente ist wobei und gewählt sind, dass ein Maximalwert des inneren Produkts erhalten wird. Daher entspricht dies der Maximierung der Korrelation zwischenX ~ Y Y ~ X X t 1 t 1 = a ~ X 1 + b ~ X 2 a b ⟨ t 1 , ~ Y ⟩ t 1 Y . und , nicht wahr?
quelle
pls
In diesem JSS-Dokument finden Sie einen guten Überblick über das Paket und die PLS-Regression .?coef.mvr
Antworten:
Die PLS-Regression beruht auf iterativen Algorithmen (z. B. NIPALS, SIMPLS). Ihre Beschreibung der Hauptideen ist richtig: Wir suchen einen (PLS1, eine Antwortvariable / mehrere Prädiktoren) oder zwei (PLS2, mit verschiedenen Modi, mehreren Antwortvariablen / mehreren Prädiktoren) Vektoren von Gewichten, (und v ) Zum Beispiel, um eine lineare Kombination der ursprünglichen Variablen zu bilden, so dass die Kovarianz zwischen Xu und Y (Yv, für PLS2) maximal ist. Konzentrieren wir uns darauf, das erste Gewichtungspaar zu extrahieren, das der ersten Komponente zugeordnet ist. Formal lautet das Kriterium zur Optimierung max cov ( X u , Y v )u v
In Ihrem Fall Y ist univariate, so dass es zu maximierenbeträgt
COV ( X u , y ) ≡ Var ( X u ) 1 / 2 × cor ( X u , y ) × Var ( y ) 1 / 2 ,
X=[x_1;x_2]
Ich sollte Arthur Tenenhaus danken der mich in die richtige Richtung wies.
pls. regression
pls.pcr
Mit einer kleinen Simulation kann es wie folgt erhalten werden:
Sie können die obigen Ergebnisse (
u=[0.5792043;0.8151824]
insbesondere) mit den Ergebnissen von R-Paketen vergleichen. Wenn Sie beispielsweise NIPALS aus dem Chemometrics- Paket verwenden (eine andere mir bekannte Implementierung ist im mixOmics- Paket verfügbar ), erhalten Sie Folgendes :Ähnliche Ergebnisse würden mit
plsr
und seinem Standard-Kernel-PLS-Algorithmus erzielt :Vorausgesetzt, Sie ändern Ihre Funktion, um sie auf eine lesbare zu optimieren
und
u
danach normalisieren (u <- u/sqrt(crossprod(u))
), du solltest näher an der obigen Lösung sein.Im allgemeineren Fall (PLS2) kann man zusammenfassend sagen, dass die ersten kanonischen PLS-Vektoren die beste Approximation der Kovarianzmatrix von X und Y in beide Richtungen sind.
Verweise
quelle