Saya sangat baru di parsial kuadrat terkecil (PLS) dan saya mencoba memahami output dari fungsi R plsr()
dalam pls
paket. Mari kita mensimulasikan data dan menjalankan PLS:
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)
Saya mengharapkan bahwa angka-angka berikut dan
> ( 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
dihitung untuk memaksimalkan
> cor(y, a*xx1+b*xx2)
[,1]
[1,] 0.9981291
tapi ini tidak persis seperti ini:
> 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
Apakah ini kesalahan numerik, atau apakah saya salah memahami sifat dan ?
Saya juga ingin tahu apa koefisien-koefisien ini:
> p$coef
, , 1 comps
yy
xx1 0.6672848
xx2 0.6368604
EDIT : Sekarang saya melihat apa p$coef
itu:
> 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
Jadi saya pikir saya benar tentang sifat dan .b
EDIT: Mengingat komentar yang diberikan oleh @chl saya merasa pertanyaan saya tidak cukup jelas, jadi izinkan saya memberikan lebih banyak detail. Dalam contoh saya ada vektor tanggapan dan matriks dua kolom dari prediktor dan saya menggunakan versi normalisasi dari dan versi normal dari (terpusat dan dibagi dengan standar deviasi). Definisi komponen PLS pertama adalah dengan dan dipilih agar memiliki nilai maksimal produk dalam .X ~ Y Y ~ X X t 1 t 1 = a ~ X 1 + b ~ X 2 a b ⟨ t 1 , ~ Y ⟩ t 1 YKarenanya itu setara dengan memaksimalkan korelasi antara dan , bukan?
sumber
pls
paket dan regresi PLS dalam makalah JSS ini .?coef.mvr
Jawaban:
X=[x_1;x_2]
Saya harus berterima kasih kepada Arthur Tenenhaus yang menunjuk saya ke arah yang benar.
Menggunakan vektor bobot unit tidak membatasi dan beberapa paket (u sketsa menawarkan diskusi yang bagus juga (hlm. 26-29). Yang juga sangat penting adalah kenyataan bahwa sebagian besar rutinitas PLS (setidaknya yang saya tahu di R) mengasumsikan bahwa Anda memberikan variabel yang tidak standar karena pemusatan dan / atau penskalaan ditangani secara internal (ini terutama penting ketika melakukan validasi silang, misalnya ).
pls. regression
dalam bentuk plsgenomik , berdasarkan kode dari paket Wehrens sebelumnyapls.pcr
) akan mengembalikan vektor bobot yang tidak standar (tetapi dengan komponen laten masih dalam norma 1), jika diminta. Tetapi sebagian besar paket PLS akan mengembalikan terstandarisasi , termasuk yang Anda gunakan, terutama yang mengimplementasikan algoritma SIMPLS atau NIPALS; Saya menemukan ikhtisar yang baik dari kedua pendekatan dalam presentasi Barry M. Wise, Properties of Partial Least Squares (PLS) Regresi, dan perbedaan antara Algoritma , tetapi chemometricsDengan batasan , vektor ditemukan menjadiu′u=1 u
Menggunakan sedikit simulasi, dapat diperoleh sebagai berikut:
Anda dapat membandingkan hasil di atas (
u=[0.5792043;0.8151824]
, khususnya) dengan apa yang akan diberikan paket R. Misalnya, menggunakan NIPALS dari paket chemometrics (implementasi lain yang saya tahu tersedia dalam paket mixOmics ), kita akan mendapatkan:Hasil serupa akan diperoleh dengan
plsr
dan algoritma PLS kernel default:Dalam semua kasus, kita dapat memeriksa bahwa memiliki panjang 1.u
Asalkan Anda mengubah fungsi Anda untuk mengoptimalkan ke yang berbunyi
dan menormalkan
u
setelah itu (u <- u/sqrt(crossprod(u))
), Anda harus lebih dekat dengan solusi di atas.Sidenote : Karena kriteria (1) setara dengan dapat ditemukan sebagai vektor singular kiri dari SVD sesuai dengan nilai eigen terbesar:u X ′ Y
Dalam kasus yang lebih umum (PLS2), cara untuk meringkas di atas adalah dengan mengatakan bahwa vektor kanonik PLS pertama adalah perkiraan terbaik dari matriks kovarians X dan Y di kedua arah.
Referensi
sumber