"Rotasi" adalah pendekatan yang dikembangkan dalam analisis faktor; ada rotasi (seperti misalnya varimax) diterapkan pada pemuatan , bukan vektor eigen dari matriks kovarians. Loading adalah vektor eigen yang diskalakan oleh akar kuadrat dari masing-masing nilai eigen. Setelah rotasi varimax, vektor pemuatan tidak ortogonal lagi (meskipun rotasi disebut "ortogonal"), jadi orang tidak bisa hanya menghitung proyeksi ortogonal data ke arah pemuatan yang diputar.
@ Jawaban FTusell mengasumsikan bahwa rotasi varimax diterapkan pada vektor eigen (bukan untuk memuat). Ini akan sangat tidak konvensional. Silakan lihat akun terperinci saya PCA + varimax untuk detail: Apakah PCA diikuti oleh rotasi (seperti varimax) masih PCA? Secara singkat, jika kita melihat SVD dari matriks data X=USV⊤ , maka untuk memutar beban berarti memasukkan RR⊤ untuk beberapa matriks rotasi R sebagai berikut: X=(UR)(R⊤SV⊤).
Jika rotasi diterapkan ke pemuatan (seperti biasanya), maka setidaknya ada tiga cara mudah untuk menghitung PC yang dirotasi dengan varimax di R:
Mereka sudah tersedia melalui fungsi psych::principal
(menunjukkan bahwa ini memang pendekatan standar). Perhatikan bahwa ia mengembalikan skor terstandarisasi , yaitu semua PC memiliki varian unit.
Satu dapat secara manual menggunakan varimax
fungsi untuk memutar beban, dan kemudian menggunakan beban diputar baru untuk mendapatkan skor; kita perlu melipatgandakan data dengan pseudo-invers dari pemuatan yang diputar (lihat rumus dalam jawaban ini oleh @ttnphns ). Ini juga akan menghasilkan skor standar.
Seseorang dapat menggunakan varimax
fungsi untuk memutar beban, dan kemudian menggunakan $rotmat
matriks rotasi untuk memutar skor standar yang diperoleh prcomp
.
Ketiga metode menghasilkan hasil yang sama:
irisX <- iris[,1:4] # Iris data
ncomp <- 2
pca_iris_rotated <- psych::principal(irisX, rotate="varimax", nfactors=ncomp, scores=TRUE)
print(pca_iris_rotated$scores[1:5,]) # Scores returned by principal()
pca_iris <- prcomp(irisX, center=T, scale=T)
rawLoadings <- pca_iris$rotation[,1:ncomp] %*% diag(pca_iris$sdev, ncomp, ncomp)
rotatedLoadings <- varimax(rawLoadings)$loadings
invLoadings <- t(pracma::pinv(rotatedLoadings))
scores <- scale(irisX) %*% invLoadings
print(scores[1:5,]) # Scores computed via rotated loadings
scores <- scale(pca_iris$x[,1:2]) %*% varimax(rawLoadings)$rotmat
print(scores[1:5,]) # Scores computed via rotating the scores
Ini menghasilkan tiga keluaran identik:
1 -1.083475 0.9067262
2 -1.377536 -0.2648876
3 -1.419832 0.1165198
4 -1.471607 -0.1474634
5 -1.095296 1.0949536
Catatan: The varimax
fungsi dalam R menggunakan normalize = TRUE, eps = 1e-5
parameter secara default ( lihat dokumentasi ). Seseorang mungkin ingin mengubah parameter ini (mengurangi eps
toleransi dan menjaga normalisasi Kaiser) ketika membandingkan hasilnya dengan perangkat lunak lain seperti SPSS. Saya berterima kasih kepada @GottfriedHelms karena membawa ini menjadi perhatian saya. [Catatan: parameter ini berfungsi saat diteruskan ke varimax
fungsi, tetapi tidak berfungsi saat diteruskan ke psych::principal
fungsi. Tampaknya ini adalah bug yang akan diperbaiki.]
principal
,prcomp
danprincomp
, tetapi hasil yang diambil / kesimpulan studi sangat berbeda satu sama lain. Untuk apa yang saya mengerti, prcomp dan princomp tidak mengembalikan skor standar atau memuat. Pertanyaan saya adalah: apa pendekatan terbaik? Apakah saya benar-benar menginginkan hasil standar? Bukankah kode sayapca_iris <- prcomp(irisX, center=T, scale=T)
diikuti olehvarimax(pca_iris$rotation)$loadings
benar seperti Anda di atas?principal
prosedur, yang selalu dihitung dengan Kaiser-normalisasi dan eps = 1e-5. Tidak ada informasi sejauh ini, mengapa di r-fiddle.org versi ini berfungsi dengan benar. Jadi kita harus menunggu pembaruan - dan saya harus menghapus semua komentar yang sudah usang. amoeba - akan lebih baik untuk memperbarui komentar dalam jawaban Anda sesuai. Terima kasih atas semua kerjasamanya!Anda harus menggunakan matriks
$loadings
, bukan$rotmat
:Matriks
$rotmat
adalah ortogonal yang menghasilkan pemuatan baru dari yang tidak diputar.EDIT pada 12 Februari 2015:
Sebagai benar menunjukkan bawah oleh @amoeba (lihat juga / nya posting sebelumnya serta pos lain dari @ttnphns ) jawaban ini tidak benar. Pertimbangkan matriks data X . Dekomposisi nilai singular adalah X = U S V T dimana V memiliki sebagai kolom nya yang (dinormalisasi) vektor eigen dari X ' X . Sekarang, rotasi adalah perubahan koordinat dan jumlah untuk menulis persamaan di atas sebagai: X = ( U S T ) ( T T V T =n×m X
Dengan kata lain, solusi yang saya usulkan hanya benar dalam kasus tertentu di mana itu akan sia-sia dan tidak masuk akal.
Terima kasih yang tulus pergi ke @amoeba untuk menjelaskan masalah ini kepada saya; Saya telah hidup dengan kesalahpahaman ini selama bertahun-tahun.
EDIT LEBIH LANJUT 12 Februari 2015
sumber
psych::principal
. [Selain itu, saya mengedit jawaban Anda untuk menyisipkan penskalaan, seperti yang dibahas dalam komentar di atas.]Saya sedang mencari solusi yang berfungsi untuk PCA dilakukan menggunakan ade4 .
Silakan temukan fungsi di bawah ini:
Dibuat pada 2020-01-14 oleh paket reprex (v0.3.0)
Semoga bantuan ini!
sumber