Bagaimana cara menggunakan hasil R prcomp untuk prediksi?


25

Saya memiliki data.frame dengan 800 obs. dari 40 variabel, dan ingin menggunakan Analisis Komponen Prinsip untuk meningkatkan hasil prediksi saya (yang sejauh ini bekerja paling baik dengan Mesin Vector Support pada sekitar 15 variabel pilihan).

Saya mengerti prcomp dapat membantu saya meningkatkan prediksi saya, tetapi saya tidak tahu bagaimana cara menggunakan hasil dari fungsi prcomp.

Saya mendapatkan hasilnya:

> PCAAnalysis <- prcomp(TrainTrainingData, scale.=TRUE)
> summary(PCAAnalysis)
Importance of components:
                          PC1    PC2    PC3    PC4    PC5   PC6    PC7    PC8    PC9   PC10   PC11   PC12   PC13   PC14
Standard deviation     1.7231 1.5802 1.3358 1.2542 1.1899 1.166 1.1249 1.1082 1.0888 1.0863 1.0805 1.0679 1.0568 1.0520
Proportion of Variance 0.0742 0.0624 0.0446 0.0393 0.0354 0.034 0.0316 0.0307 0.0296 0.0295 0.0292 0.0285 0.0279 0.0277
Cumulative Proportion  0.0742 0.1367 0.1813 0.2206 0.2560 0.290 0.3216 0.3523 0.3820 0.4115 0.4407 0.4692 0.4971 0.5248
                         PC15   PC16   PC17   PC18  PC19   PC20   PC21   PC22   PC23   PC24   PC25   PC26   PC27   PC28
Standard deviation     1.0419 1.0283 1.0170 1.0071 1.001 0.9923 0.9819 0.9691 0.9635 0.9451 0.9427 0.9238 0.9111 0.9073
Proportion of Variance 0.0271 0.0264 0.0259 0.0254 0.025 0.0246 0.0241 0.0235 0.0232 0.0223 0.0222 0.0213 0.0208 0.0206
Cumulative Proportion  0.5519 0.5783 0.6042 0.6296 0.655 0.6792 0.7033 0.7268 0.7500 0.7723 0.7945 0.8159 0.8366 0.8572
                         PC29   PC30   PC31   PC32   PC33   PC34   PC35   PC36    PC37                 PC38
Standard deviation     0.8961 0.8825 0.8759 0.8617 0.8325 0.7643 0.7238 0.6704 0.60846 0.000000000000000765
Proportion of Variance 0.0201 0.0195 0.0192 0.0186 0.0173 0.0146 0.0131 0.0112 0.00926 0.000000000000000000
Cumulative Proportion  0.8773 0.8967 0.9159 0.9345 0.9518 0.9664 0.9795 0.9907 1.00000 1.000000000000000000
                                       PC39                 PC40
Standard deviation     0.000000000000000223 0.000000000000000223
Proportion of Variance 0.000000000000000000 0.000000000000000000
Cumulative Proportion  1.000000000000000000 1.000000000000000000

Saya pikir saya akan mendapatkan parameter yang paling penting untuk digunakan, tetapi saya tidak menemukan informasi ini. Yang saya lihat adalah Standar Deviasi dll pada PC. Tetapi bagaimana saya menggunakan ini untuk prediksi?


2
Ada juga R library pls(Partial Least Squares), yang memiliki alat untuk PCR ( Principal Component Regression ).
Stepan S. Sushko

Jawaban:


35

Sementara saya tidak yakin tentang sifat masalah Anda, saya dapat memberitahu Anda bahwa saya telah menggunakan PCA sebagai sarana untuk mengekstraksi pola dominan dalam kelompok variabel prediktor di kemudian membangun model. Dalam contoh Anda, ini akan ditemukan di komponen utama (PC) PCAAnalysis$x,, dan mereka akan didasarkan pada bobot variabel yang ditemukan di PCAAnalysis$rotation. Salah satu keuntungan dari proses ini adalah bahwa PC bersifat ortogonal, dan dengan demikian Anda menghapus masalah multikolinieritas antara pemrediksi model. Yang kedua, adalah bahwa Anda mungkin dapat mengidentifikasi subset yang lebih kecil dari PC yang menangkap mayoritas varian dalam prediktor Anda. Informasi ini dapat ditemukan di summary(PCAAnalysis)atau di PCAAnalysis$sdev. Terakhir, jika Anda tertarik menggunakan subset PC untuk prediksi, maka Anda dapat mengatur tolparameternyaprcomp ke tingkat yang lebih tinggi untuk menghapus trailing PC.

Sekarang, Anda dapat "memproyeksikan" data baru ke basis koordinat PCA menggunakan predict.prcomp()fungsi ini. Karena Anda memanggil set data Anda set data "pelatihan", ini masuk akal untuk kemudian memproyeksikan set data validasi ke PCA Anda untuk perhitungan koordinat PC masing-masing. Di bawah ini adalah contoh pemasangan PCA ke 4 pengukuran biometrik spesies iris yang berbeda (yang berkorelasi pada tingkat tertentu). Setelah ini, saya memproyeksikan nilai biometrik dari kumpulan data baru bunga yang memiliki kombinasi serupa dari pengukuran ini untuk masing-masing dari tiga spesies iris. Anda akan melihat dari grafik terakhir bahwa PC yang diproyeksikan berada di area yang sama dengan plot sebagai kumpulan data asli.

Contoh menggunakan iriskumpulan data:

### pca - calculated for the first 4 columns of the data set that correspond to biometric measurements ("Sepal.Length" "Sepal.Width"  "Petal.Length" "Petal.Width")
data(iris)

# split data into 2 parts for pca training (75%) and prediction (25%)
set.seed(1)
samp <- sample(nrow(iris), nrow(iris)*0.75)
iris.train <- iris[samp,]
iris.valid <- iris[-samp,]

# conduct PCA on training dataset
pca <- prcomp(iris.train[,1:4], retx=TRUE, center=TRUE, scale=TRUE)
expl.var <- round(pca$sdev^2/sum(pca$sdev^2)*100) # percent explained variance

# prediction of PCs for validation dataset
pred <- predict(pca, newdata=iris.valid[,1:4])

###Plot result
COLOR <- c(2:4)
PCH <- c(1,16)

pc <- c(1,2) # principal components to plot

png("pca_pred.png", units="in", width=5, height=4, res=200)
op <- par(mar=c(4,4,1,1), ps=10)
plot(pca$x[,pc], col=COLOR[iris.train$Species], cex=PCH[1], 
 xlab=paste0("PC ", pc[1], " (", expl.var[pc[1]], "%)"), 
 ylab=paste0("PC ", pc[2], " (", expl.var[pc[2]], "%)")
)
points(pred[,pc], col=COLOR[iris.valid$Species], pch=PCH[2])
legend("topright", legend=levels(iris$Species), fill = COLOR, border=COLOR)
legend("topleft", legend=c("training data", "validation data"), col=1, pch=PCH)
par(op)
dev.off()

masukkan deskripsi gambar di sini


Terima kasih telah memberikan begitu banyak detail. Sayangnya kode contoh terlalu samar bagi saya. Saya melihat Anda menggunakan prediksi. Di mana manual untuk prcomp memprediksi? apakah itu di sini: stat.ethz.ch/R-manual/R-patched/library/stats/html/prcomp.html ?
tucson

Saya sekarang telah menambahkan lebih banyak penjelasan untuk jawaban saya. Semoga lebih jelas bagi Anda sekarang. Ya, Anda benar di tautan Anda ke predict.prcompbantuan.
Marc di dalam kotak

11

Informasi dari perintah ringkasan () yang Anda lampirkan pada pertanyaan memungkinkan Anda untuk melihat, misalnya, proporsi varian yang ditangkap setiap komponen utama (Proporsi varians). Selain itu, proporsi kumulatif dihitung untuk output. Misalnya, Anda harus memiliki 23 PC untuk menangkap 75% varians dalam kumpulan data Anda.

Ini tentu bukan informasi yang biasanya Anda gunakan sebagai masukan untuk analisis lebih lanjut. Alih-alih, yang biasanya Anda butuhkan adalah data yang diputar, yang disimpan sebagai 'x' pada objek yang dibuat oleh prcomp.

Menggunakan kode R sebagai contoh singkat.

pr<-prcomp(USArrests, scale = TRUE)
summary(pr) # two PCs for cumulative proportion of >80% 
newdat<-pr$x[,1:2]

Kemudian Anda dapat menggunakan data dalam tanggal baru untuk analisis lebih lanjut, misalnya, sebagai input untuk SVM atau model regresi. Juga, lihat, misalnya, /programming/1805149/how-to-fit-a-linear-regress-model-with-two-principal-components-in-r untuk informasi lebih lanjut.


1
@JTT terima kasih. Jadi jika sekarang saya menggunakan data baru untuk membuat model SVM, saya kira model saya mengambil input dalam dunia baru yang dirotasi ini, yang berarti saya juga perlu memutar data Tes saya sebelum menerapkannya pada model. Apakah ini benar? Dan jika ya, bagaimana Anda memutar data uji. Bingkai dengan rotasi yang sama?
tucson

3
Cara termudah adalah menggunakan predict()metode untuk data uji. Menggunakan contoh di atas, predict(pr, USArrests)akan mengembalikan matriks yang sama dengan pr$x. Untuk data uji, ganti sandaran US dengan nama data uji. Anda dapat melakukan hal yang sama dengan tangan, tetapi ini lebih mudah, karena metode prediksi menangani penskalaan yang benar dari kumpulan data uji.
JTT

1
Bagaimana cara kerjanya? Apakah ini menggunakan semua Kompensasi Utama. Dalam jawaban Anda, Anda hanya memilih 2 Komponen untuk mencakup 80% dari varian. Apa yang diprediksi dilakukan?
tucson

1
Fungsi ini predict()menggunakan semua komponen secara default. Namun, Anda dapat membatasi jumlah komponen yang dikembalikan, mis. `Predict (pr, USArrests) [, 1: 2]. Apakah itu akan berhasil untuk Anda?
JTT

Apakah Anda perlu memusatkan dan menskala data baru Anda sebelum prediksi? Atau apakah predict()itu secara otomatis diberi parameter awal dengan prcomp()?
Dale Kube
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.