Comment utiliser les résultats de R prcomp pour la prédiction?

25

J'ai un data.frame avec 800 obs. de 40 variables, et j'aimerais utiliser l'analyse des composants principaux pour améliorer les résultats de ma prédiction (qui fonctionne jusqu'à présent le mieux avec Support Vector Machine sur une quinzaine de variables sélectionnées à la main).

Je comprends qu'un prcomp peut m'aider à améliorer mes prévisions, mais je ne sais pas comment utiliser les résultats de la fonction prcomp.

J'obtiens le résultat:

> 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

Je pensais que j'obtiendrais les paramètres les plus importants à utiliser, mais je ne trouve tout simplement pas ces informations. Tout ce que je vois, c'est l'écart type, etc. sur les PC. Mais comment utiliser cela pour la prédiction?

tucson
la source
2
Il y a aussi la bibliothèque R pls(Partial Least Squares), qui a des outils pour la PCR ( Principal Component Regression ).
Stepan S. Sushko

Réponses:

35

Bien que je ne sois pas sûr de la nature de votre problème, je peux vous dire que j'ai utilisé l'ACP comme moyen d'extraire des motifs dominants dans un groupe de variables prédictives dans la construction ultérieure d'un modèle. Dans votre exemple, ceux-ci se trouveraient dans les principaux composants (PC) PCAAnalysis$x, et ils seraient basés sur la pondération des variables trouvées dans PCAAnalysis$rotation. Un avantage de ce processus est que les PC sont orthogonaux, et donc vous supprimez les problèmes de multicolinéarité entre les prédicteurs du modèle. La seconde est que vous pourriez être en mesure d'identifier un plus petit sous-ensemble de PC qui captent la majorité de la variance de vos prédicteurs. Ces informations peuvent être trouvées dans summary(PCAAnalysis)ou dans PCAAnalysis$sdev. Enfin, si vous souhaitez utiliser un sous-ensemble de PC pour la prédiction, vous pouvez définir le tolparamètre dansprcomp à un niveau supérieur pour supprimer les PC à la fin.

Maintenant, vous pouvez "projeter" de nouvelles données sur la base de coordonnées PCA en utilisant la predict.prcomp()fonction. Puisque vous appelez votre ensemble de données un ensemble de données "d'apprentissage", il peut être judicieux de projeter ensuite un ensemble de données de validation sur votre base PCA pour le calcul de leurs coordonnées PC respectives. Vous trouverez ci-dessous un exemple d'ajustement d'une ACP à 4 mesures biométriques de différentes espèces d'iris (qui sont corrélées dans une certaine mesure). Par la suite, je projette les valeurs biométriques d'un nouvel ensemble de données de fleurs qui ont des combinaisons similaires de ces mesures pour chacune des trois espèces d'iris. Vous verrez sur le graphique final que leurs PC projetés se trouvent dans une zone similaire de l'intrigue que l'ensemble de données d'origine.

Un exemple utilisant l' irisensemble de données:

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

entrez la description de l'image ici

Marc dans la boîte
la source
Merci d'avoir fourni autant de détails. Malheureusement, l'exemple de code est trop cryptique pour moi. Je vois que vous utilisez Predict. Où est le manuel de prcomp prédire? est-ce ici: stat.ethz.ch/R-manual/R-patched/library/stats/html/prcomp.html ?
tucson
J'ai maintenant ajouté plus d'explications à ma réponse. J'espère que c'est plus clair pour vous maintenant. Oui, vous aviez raison dans votre lien vers l' predict.prcompaide.
Marc dans la boite
11

Les informations de la commande summary () que vous avez jointe à la question vous permettent de voir, par exemple, la proportion de la variance capturée par chaque composant principal (Proportion de la variance). De plus, la proportion cumulée est calculée en sortie. Par exemple, vous devez disposer de 23 PC pour capturer 75% de la variance dans votre ensemble de données.

Ce ne sont certainement pas les informations que vous utilisez généralement comme entrée pour d'autres analyses. Au lieu de cela, ce dont vous avez généralement besoin, ce sont les données pivotées, qui sont enregistrées sous la forme «x» dans l'objet créé par prcomp.

Utiliser le code R comme exemple court.

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

Ensuite, vous pouvez utiliser les données dans le nouveau fichier pour d'autres analyses, par exemple, comme entrée dans SVM ou un modèle de régression. Voir également, par exemple, /programming/1805149/how-to-fit-a-linear-regression-model-with-two-principal-components-in-r pour plus d'informations.

JTT
la source
1
Merci @JTT. Donc, si j'utilise maintenant newdat pour créer un modèle SVM, je suppose que mon modèle prend des données dans ce nouvel univers pivoté, ce qui signifie que je devrai également faire pivoter mes données de test avant de les appliquer au modèle. Est-ce correct? Et si oui, comment faites-vous pivoter un data.frame de test avec la même rotation?
tucson
3
Le moyen le plus simple consiste à utiliser la predict()méthode pour les données de test. En utilisant l'exemple ci-dessus, predict(pr, USArrests)retournera la même matrice que pr$x. Pour les données de test, remplacez USarrests par le nom des données de test. Vous pouvez faire la même chose à la main, mais c'est plus facile, car les méthodes de prévision prennent automatiquement en charge la mise à l'échelle correcte de l'ensemble de données de test.
JTT
1
Comment fonctionne Predict? Utilise-t-il tous les principaux composants? Dans votre réponse, vous n'aviez choisi que 2 composants pour couvrir 80% de la variance. Que fait Predict?
tucson
1
La fonction predict()utilise par défaut tous les composants. Cependant, vous pouvez limiter le nombre de composants renvoyés, par exemple, `predire (pr, USArrests) [, 1: 2]. Cela marcherait-il pour toi?
JTT
Avez-vous besoin de centrer et de mettre à l'échelle vos nouvelles données avant la prédiction? Ou est- predict()ce que cela se fait automatiquement avec les paramètres initiaux avec prcomp()?
Dale Kube