Wie verwende ich R prcomp-Ergebnisse für die Vorhersage?

25

Ich habe einen data.frame mit 800 obs. von 40 Variablen, und möchte die Ergebnisse meiner Vorhersage mithilfe der Hauptkomponentenanalyse verbessern (was bisher mit Support Vector Machine an 15 handverlesenen Variablen am besten funktioniert).

Ich verstehe, dass ein prcomp mir helfen kann, meine Vorhersagen zu verbessern, aber ich weiß nicht, wie ich die Ergebnisse der prcomp-Funktion verwenden soll.

Ich erhalte das Ergebnis:

> 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

Ich dachte, ich würde die Parameter erhalten, die am wichtigsten sind, aber ich finde diese Informationen einfach nicht. Ich sehe nur die Standardabweichung usw. auf den PCs. Aber wie verwende ich das zur Vorhersage?

Tucson
quelle
2
Es gibt auch eine R-Bibliothek pls(Partial Least Squares) mit Werkzeugen für die PCR ( Principal Component Regression ).
Stepan S. Sushko

Antworten:

35

Obwohl ich hinsichtlich der Art Ihres Problems unsicher bin, kann ich Ihnen sagen, dass ich PCA als Mittel zum Extrahieren dominanter Muster in einer Gruppe von Prädiktorvariablen in der späteren Erstellung eines Modells verwendet habe. In Ihrem Beispiel befinden sich diese in den Hauptkomponenten (PCs) PCAAnalysis$xund basieren auf der Gewichtung der Variablen in PCAAnalysis$rotation. Ein Vorteil dieses Prozesses besteht darin, dass PCs orthogonal sind, sodass Sie Probleme der Multikollinearität zwischen den Modellvorhersagen beseitigen. Die zweite Möglichkeit besteht darin, dass Sie möglicherweise eine kleinere Teilmenge von PCs identifizieren können, die den größten Teil der Varianz in Ihren Prädiktoren erfassen. Diese Informationen finden Sie in summary(PCAAnalysis)oder in PCAAnalysis$sdev. Wenn Sie eine Teilmenge der PCs zur Vorhersage verwenden möchten, können Sie den tolParameter in einstellenprcomp auf eine höhere Ebene, um nachfolgende PCs zu entfernen.

Jetzt können Sie mit der predict.prcomp()Funktion neue Daten auf die PCA-Koordinatenbasis "projizieren" . Da Sie Ihren Datensatz als "Trainings" -Datensatz bezeichnen, kann es sinnvoll sein, einen Validierungsdatensatz zur Berechnung der entsprechenden PC-Koordinaten auf Ihre PCA-Basis zu projizieren. Unten sehen Sie ein Beispiel für die Anpassung einer PCA an 4 biometrische Messungen verschiedener Irisarten (die bis zu einem gewissen Grad korreliert sind). Anschließend projiziere ich biometrische Werte eines neuen Datensatzes von Blumen, die ähnliche Kombinationen dieser Messungen für jede der drei Irisarten aufweisen. Aus dem endgültigen Diagramm wird ersichtlich, dass sich die projizierten PCs in einem ähnlichen Bereich des Diagramms befinden wie der ursprüngliche Datensatz.

Ein Beispiel mit dem irisDatensatz:

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

Bildbeschreibung hier eingeben

Marc in der Kiste
quelle
Vielen Dank für die Bereitstellung so vieler Details. Leider ist mir der Beispielcode zu kryptisch. Ich sehe, dass Sie vorhersagen. Wo ist das Handbuch für prcomp vorherzusagen? ist es hier: stat.ethz.ch/R-manual/R-patched/library/stats/html/prcomp.html ?
Tucson
Ich habe jetzt meiner Antwort weitere Erklärungen hinzugefügt. Hoffentlich ist es dir jetzt klarer. Ja, Sie haben den Link zur predict.prcompHilfe korrekt angegeben .
Marc in der Box
11

Mit den Informationen aus dem Befehl summary (), den Sie an die Frage angehängt haben, können Sie z. B. den Anteil der Abweichung anzeigen, den jede Hauptkomponente erfasst (Anteil der Abweichung). Zusätzlich wird der kumulative Anteil zur Ausgabe berechnet. Beispielsweise benötigen Sie 23 PCs, um 75% der Varianz in Ihrem Datensatz zu erfassen.

Dies sind sicherlich nicht die Informationen, die Sie normalerweise als Eingabe für weitere Analysen verwenden. Was Sie normalerweise benötigen, sind die gedrehten Daten, die in dem von prcomp erstellten Objekt als 'x' gespeichert werden.

Verwenden von R-Code als kurzes Beispiel.

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

Anschließend können Sie die Daten im NewDat für weitere Analysen verwenden, z. B. als Eingabe für SVM oder ein Regressionsmodell. Weitere Informationen finden Sie beispielsweise unter https://stackoverflow.com/questions/1805149/how-to-fit-a-linear-regression-model-with-two-principal-components-in-r .

JTT
quelle
1
Vielen Dank, dass Sie @JTT. Wenn ich jetzt newdat verwende, um ein SVM-Modell zu erstellen, wird mein Modell vermutlich in dieses neue gedrehte Universum eingegeben. Das bedeutet, dass ich auch meine Testdaten drehen muss, bevor ich sie auf das Modell übertrage. Ist das richtig? Und wenn ja, wie können Sie einen Testdatenrahmen mit derselben Drehung drehen?
Tucson
3
Am einfachsten ist es, die predict()Methode für die Testdaten zu verwenden. Wenn Sie das obige Beispiel verwenden, predict(pr, USArrests)wird dieselbe Matrix wie zurückgegeben pr$x. Ersetzen Sie für Testdaten die USarrests durch den Namen der Testdaten. Sie können dasselbe von Hand tun, dies ist jedoch einfacher, da die Vorhersagemethoden automatisch für die korrekte Skalierung des Testdatensatzes sorgen.
JTT
1
Wie funktioniert die Vorhersage? Verwendet es alle Hauptkomponenten? In Ihrer Antwort haben Sie nur 2 Komponenten ausgewählt, um 80% der Varianz abzudecken. Was macht Predict?
Tucson
1
Die Funktion predict()verwendet standardmäßig alle Komponenten. Sie können jedoch die Anzahl der zurückgegebenen Komponenten begrenzen, z. B. `predict (pr, USArrests) [, 1: 2]. Würde das für dich funktionieren?
JTT
Müssen Sie Ihre neuen Daten vor der Vorhersage zentrieren und skalieren? Oder macht predict()das bei den initialen Parametern automatisch mit prcomp()?
Dale Kube