R prcomp sonuçları tahmin için nasıl kullanılır?


25

800 obs ile bir data.frame var. 40 değişkenden biriyim ve öngörümün sonuçlarını geliştirmek için Temel Bileşen Analizi'ni kullanmak istiyorum (şu ana kadar bazı 15 elle toplanan değişkenlerde Support Vector Machine ile en iyi şekilde çalışıyor).

Bir prcomp 'ın tahminlerimi geliştirmeme yardımcı olabileceğini biliyorum, ancak prcomp fonksiyonunun sonuçlarını nasıl kullanacağımı bilmiyorum.

Sonuç aldım:

> 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

Kullanımı en önemli olan parametreleri elde edeceğimi düşündüm, ancak bu bilgiyi bulamıyorum. Tek gördüğüm PC'lerde Standart Sapma vb. Fakat bunu tahmin için nasıl kullanırım?


2
Ayrıca plsPCR için araçlara sahip ( Temel Bileşen Regresyonu ) R kütüphanesi (Kısmi En Küçük Kareler) vardır .
Stepan S. Sushko

Yanıtlar:


35

Sorununuzun mahiyeti konusunda emin olmasam da, PCA'yı bir modelin daha sonraki yapısında bir grup yordayıcı değişkeninde baskın kalıpları çıkarmak için kullandığımı söyleyebilirim. Örneğinizde, bunlar temel bileşenlerde (PC'ler) PCAAnalysis$xbulunacak ve bunlar içinde bulunan değişkenlerin ağırlığına bağlı olacaktır PCAAnalysis$rotation. Bu işlemin bir avantajı, PC'lerin dikgen olmasıdır ve bu nedenle model belirleyicileri arasındaki çoklu bağlantı problemlerini ortadan kaldırıyorsunuz. İkincisi, öngörücülerinizdeki varyansın çoğunu yakalayan daha küçük bir PC alt kümesini tanımlayabilmeniz olabilir. Bu bilgi içinde summary(PCAAnalysis)veya içinde bulunabilir PCAAnalysis$sdev. Son olarak, tahmin için PC'lerin bir alt kümesini kullanmakla ilgileniyorsanız, tolparametreyiprcomp takip eden bilgisayarları çıkarmak için daha yüksek bir seviyeye.

Şimdi, predict.prcomp()işlevi kullanarak PCA koordinatına yeni verileri "yansıtabilirsiniz" . Verilerinizi bir "eğitim" veri seti olarak adlandırdığınız için, bu onların kendi PC koordinatlarının hesaplanması için PCA bazınıza bir doğrulama verisi seti yansıtması mantıklı olabilir. Aşağıda bir PCA'nın farklı iris türlerinin (bir dereceye kadar ilişkili olan) 4 biyometrik ölçümüne uyması örneğidir. Bunu takiben, üç iris türünün her biri için bu ölçümlerin benzer kombinasyonlarını içeren yeni bir çiçek setinin biyometrik değerlerini tahmin ediyorum. Son grafikten yansıtılan PC'lerin arsanın orijinal veri setiyle aynı alanda bulunduğunu göreceksiniz.

irisVeri kümesini kullanan bir örnek :

### 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()

görüntü tanımını buraya girin


Çok fazla ayrıntı verdiğiniz için teşekkür ederiz. Ne yazık ki örnek kod benim için çok şifreli. Tahminimi kullandığını görüyorum. Prcomp tahmini için kılavuz nerede? burada mı : stat.ethz.ch/R-manual/R-patched/library/stats/html/prcomp.html ?
tucson,

Şimdi cevabımı daha fazla açıklama ekledim. Umarım şimdi size daha açık. Evet, predict.prcompyardım bağlantısında haklıydın .
Marc,

11

Soruya eklediğiniz summary () komutundaki bilgiler, örneğin her bir ana bileşenin yakaladığı varyansın oranını (varyansın oranı) görmenize olanak tanır. Ek olarak, kümülatif oran çıktı olarak hesaplanır. Örneğin, veri kümenizdeki varyansın% 75'ini yakalamak için 23 PC'niz olması gerekir.

Bu, kesinlikle daha ileri analizler için girdi olarak kullandığınız bilgiler değildir. Aksine, genellikle ihtiyacınız olan şey, prcomp tarafından oluşturulan nesnede 'x' olarak kaydedilen döndürülmüş veridir.

R kodunu kısa bir örnek olarak kullanmak.

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

Ardından, Newdat'taki verileri, örneğin SVM'ye veya bir regresyon modeline girdi olarak, daha fazla analiz için kullanabilirsiniz. Ayrıca, örneğin, bakınız /programming/1805149/how-to-fit-a-linear-regression-model-with-two-principal-components-in-r fazla bilgi için.


1
@TM'ye teşekkürler. Bu yüzden eğer şimdi bir SVM modeli oluşturmak için newdat kullanıyorsam, modelimin bu yeni döndürülmüş evrende girdi elde ettiğini düşünüyorum, bu da benim modele uygulamadan önce Test verilerimi döndürmem gerekeceği anlamına geliyor. Bu doğru mu? Ve eğer evet ise, bir test verisini nasıl döndürürsünüz, aynı döndürme ile?
tucson,

3
En kolay yol, predict()test verileri için yöntemi kullanmaktır . Yukarıdaki örneği kullanarak, predict(pr, USArrests)aynı matrisi döndürür pr$x. Test verileri için, USarrests'i test verileri adıyla değiştirin. Aynı şeyi el ile de yapabilirsiniz, ancak bu daha kolaydır, çünkü tahmin yöntemleri test veri setinin doğru şekilde ölçeklenmesini otomatik olarak halleder.
JTT

1
Tahmini nasıl çalışır? Tüm Asıl Bileşenleri kullanıyor mu? Cevabınızda, varyansın% 80'ini kapsayacak şekilde sadece 2 Bileşen seçtiniz. Tahmini ne yapar?
tucson,

1
İşlev predict(), tüm bileşenleri varsayılan olarak kullanır. Bununla birlikte, iade edilen bileşenlerin sayısını sınırlayabilirsiniz, örneğin, `tahmin (pr, USArrests) [, 1: 2]. Bu senin işine yarar mıydı?
JTT

Öngörüden önce yeni verilerinizi ortalamanız ve ölçeklemeniz mi gerekiyor? Yoksa predict()bu başlangıç ​​parametrelerini otomatik olarak veriyor prcomp()mu?
Dale Kube
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.