Bagaimana cara melakukan regresi ortogonal (kuadrat terkecil total) melalui PCA?

29

Saya selalu menggunakan lm()dalam R untuk melakukan regresi linier pada . Fungsi itu mengembalikan koefisien sehinggayxβ

y=βx.

Hari ini saya belajar tentang kuadrat terkecil total dan princomp()fungsi itu (analisis komponen utama, PCA) dapat digunakan untuk melakukannya. Itu harus baik untuk saya (lebih akurat). Saya telah melakukan beberapa tes menggunakan princomp(), seperti:

r <- princomp( ~ x + y)

Masalah saya adalah: bagaimana menafsirkan hasilnya? Bagaimana saya bisa mendapatkan koefisien regresi? Dengan "koefisien" Maksud saya angka yang harus saya gunakan untuk mengalikan nilai untuk memberikan angka mendekati .x yβxy

Dail
sumber
Suatu saat teman-teman, saya agak bingung. lihat di: zoonek2.free.fr/UNIX/48_R/09.html Ini disebut PCA (Principal Component Analysis, alias "regresi orthogonal" atau "jumlah kuadrat tegak lurus" atau "total kuadrat terkecil") jadi saya pikir kita sedang berbicara tentang TLS dengan princomp () Tidak?
Dail
Tidak; itu adalah dua hal yang berbeda, lihat artikel wikipedia tentang PCA. Fakta yang digunakan di sini adalah peretasan (saya tidak tahu seberapa tepatnya, tapi saya akan memeriksanya); itu sebabnya ekstraksi koefisien yang kompleks.
1
Sebuah pertanyaan terkait: stats.stackexchange.com/questions/2691/… dan sebuah posting blog direferensikan oleh salah satu jawaban: cerebralmastication.com/2010/09/…
Jonathan

Jawaban:

48

Kuadrat terkecil biasa vs kuadrat terkecil total

Pertama mari kita pertimbangkan kasus paling sederhana dari hanya satu variabel prediktor (independen) . Untuk kesederhanaan, biarkan keduanya x dan y dipusatkan, yaitu intersep selalu nol. Perbedaan antara regresi OLS standar dan regresi "orthogonal" TLS jelas ditunjukkan pada gambar (diadaptasi oleh saya) ini dari jawaban paling populer di utas terpopuler di PCA:xxy

OLS vs TLS

OLS cocok persamaan dengan meminimalkan jarak kuadrat antara nilai-nilai yang diamati y dan nilai-nilai diprediksi y . TLS cocok dengan persamaan yang sama dengan meminimalkan jarak kuadrat antara ( x , y ) poin dan proyeksi mereka di telepon. Dalam kasus paling sederhana ini garis TLS hanyalah komponen utama pertama dari data 2D. Untuk menemukan β , jangan PCA pada ( x , y ) poin, yaitu membangun 2 × 2 kovarians matriks Σ dan menemukan vektor eigen pertama v =y=βxyy^(x,y)β(x,y)2×2Σ ; maka β = v y / v x .v=(vx,vy)β=vy/vx

Di Matlab:

 v = pca([x y]);    //# x and y are centered column vectors
 beta = v(2,1)/v(1,1);

Dalam R:

 v <- prcomp(cbind(x,y))$rotation
 beta <- v[2,1]/v[1,1]

By the way, ini akan menghasilkan kemiringan yang benar bahkan jika dan y tidak terpusat (karena fungsi PCA bawaan secara otomatis melakukan pemusatan). Untuk memulihkan intersep, hitung β 0 = ˉ y - β ˉ x .xyβ0=y¯-βx¯

OLS vs. TLS, regresi berganda

Diberikan variabel dependen dan banyak variabel independen x i (sekali lagi, semuanya berpusat untuk kesederhanaan), regresi sesuai dengan persamaan y = β 1 x 1 + ... + β p x p . OLS tidak cocok dengan meminimalkan kesalahan kuadrat antara nilai-nilai yang diamati dari y dan diperkirakan nilai-nilai y . TLS melakukan fit dengan meminimalkan jarak kuadrat antara yang diamati ( x , y ) R p + 1yxsaya

y=β1x1++βpxp.
yy^(x,y)Rp+1 poin dan poin terdekat pada bidang regresi / pesawat terbang.

Perhatikan bahwa tidak ada lagi "garis regresi"! Persamaan di atas menentukan hyperplane : ini adalah bidang 2D jika ada dua prediktor, 3D hyperplane jika ada tiga prediktor, dll. Jadi solusi di atas tidak berfungsi: kita tidak bisa mendapatkan solusi TLS dengan hanya mengambil PC pertama (yang merupakan sebuah garis). Meski begitu, solusinya dapat dengan mudah diperoleh melalui PCA.

Seperti sebelumnya, PCA dilakukan pada titik . Ini menghasilkan p + 1 vektor eigen di kolom V . Vektor p eigen pertama mendefinisikan hyperplane p -dimensional H yang kita butuhkan; yang terakhir (nomor p + 1 ) vektor eigen v p + 1 adalah orthogonal untuk itu. Pertanyaannya adalah bagaimana mengubah basis H yang diberikan oleh vektor eigen p pertama menjadi koefisien β .(x,y)p+1VppHp+1vp+1Hpβ

Perhatikan bahwa jika kita mengatur untuk semua i k dan hanya x k = 1 , maka y = β k , yaitu vektor ( 0 , ... , 1 , ... , β k ) H terletak pada hyperplane H . Di sisi lain, kita tahu bahwa v p + 1 = ( v 1 , ... , v p + 1xi=0ikxk=1y^=βk

(0,,1,,βk)H
H ortogonal untuk itu. Yaitu produk titik mereka harus nol: v k + β k v p + 1 = 0 β k = - v k / v p + 1 .
vp+1=(v1,,vp+1)H
vk+βkvp+1=0βk=vk/vp+1.

Di Matlab:

 v = pca([X y]);    //# X is a centered n-times-p matrix, y is n-times-1 column vector
 beta = -v(1:end-1,end)/v(end,end);

Dalam R:

 v <- prcomp(cbind(X,y))$rotation
 beta <- -v[-ncol(v),ncol(v)] / v[ncol(v),ncol(v)]

Sekali lagi, ini akan menghasilkan lereng yang benar bahkan jika dan y tidak terpusat (karena fungsi PCA bawaan secara otomatis melakukan pemusatan). Untuk memulihkan intersep, hitung β 0 = ˉ y - ˉ x β .xyβ0=y¯x¯β

x(x,y)vy(1)/vx(1)=vx(2)/vy(2)

Solusi formulir tertutup untuk TLS

β

Xyvp+1[Xy]σp+12vp+1/vp+1=(β1)

(XXXyyXyy)(β1)=σp+12(β1),
βTLS=(XXσp+12I)1Xy,
βOLS=(XX)1Xy.

Regresi berganda multivarian

Rumus yang sama dapat digeneralisasi ke kasus multivariat, tetapi bahkan untuk menentukan apa yang dilakukan TLS multivariat, akan memerlukan beberapa aljabar. Lihat Wikipedia di TLS . Regresi OLS multivariat setara dengan sekelompok regresi OLS univariat untuk setiap variabel dependen, tetapi dalam kasus TLS tidak demikian.

amuba kata Reinstate Monica
sumber
1
Saya tidak tahu R, tetapi masih ingin memberikan cuplikan R untuk referensi di masa mendatang. Ada banyak orang di sini yang mahir dalam R. Silakan mengedit cuplikan saya jika diperlukan! Terima kasih.
Amuba kata Reinstate Monica
(0,,1,,βk)
xixk=1y=βjxjy=βk1=βk(0,,1,βk)y=βjxj
Amuba kata Reinstate Monica
Sepertinya saya salah membaca bagian itu, tetapi sekarang sudah jelas. Terima kasih atas klarifikasi juga.
JohnK
2
Dalam R, Anda mungkin lebih suka "eigen (cov (cbind (x, y))) $ vektor" lebih dari "prcomp (cbind (x, y)) $ rotasi" karena yang pertama jauh lebih cepat untuk vektor yang lebih besar.
Thomas Browne
9

Berdasarkan implementasi GNU Octave yang naif ditemukan di sini , sesuatu seperti ini mungkin (butiran garam, sudah terlambat) bekerja.

tls <- function(A, b){

  n <- ncol(A)
  C <- cbind(A, b)

  V <- svd(C)$v
  VAB <- V[1:n, (n+1):ncol(V)]
  VBB <- V[(n+1):nrow(V), (n+1):ncol(V)]
  return(-VAB/VBB)
}
cashoes
sumber
4

princompmenjalankan analisis komponen utama alih-alih total kuadrat terkecil regresi. Sejauh yang saya tahu tidak ada fungsi R atau paket yang melakukan TLS; paling banyak ada regresi Deming di MethComp .
Namun, tolong perlakukan ini sebagai saran bahwa kemungkinan besar itu tidak sepadan.


sumber
Saya pikir Deming dalam paket MethComp adalah TLS - apa bedanya?
mark999
Anda harus memberikannya rasio kesalahan pada x dan y; TLS murni mengoptimalkan ini.