Come utilizzare i risultati R prcomp per la previsione?


25

Ho un data.frame con 800 obs. di 40 variabili e vorrei utilizzare l'analisi dei componenti di principio per migliorare i risultati della mia previsione (che finora funziona meglio con Support Vector Machine su circa 15 variabili selezionate manualmente).

Comprendo che un prcomp può aiutarmi a migliorare le mie previsioni, ma non so come utilizzare i risultati della funzione prcomp.

Ottengo il risultato:

> 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

Ho pensato di ottenere i parametri più importanti da usare, ma non trovo queste informazioni. Tutto ciò che vedo sono Deviazione standard ecc. Sui PC. Ma come posso usarlo per la previsione?


2
C'è anche una libreria R pls(Partial Least Squares), che ha strumenti per PCR ( Principal Component Regression ).
Stepan S. Sushko,

Risposte:


35

Mentre non sono sicuro della natura del tuo problema, posso dirti che ho usato PCA come mezzo per estrarre modelli dominanti in un gruppo di variabili predittive nella successiva costruzione di un modello. Nel tuo esempio, questi verrebbero trovati nei componenti principali (PC) PCAAnalysis$xe si baserebbero sulla ponderazione delle variabili presenti in PCAAnalysis$rotation. Un vantaggio di questo processo è che i PC sono ortogonali e quindi si eliminano i problemi di multicollinearità tra i predittori del modello. Il secondo è che potresti essere in grado di identificare un sottoinsieme più piccolo di PC che cattura la maggior parte della varianza nei tuoi predittori. Queste informazioni sono disponibili in summary(PCAAnalysis)o in PCAAnalysis$sdev. Infine, se sei interessato a utilizzare un sottoinsieme dei PC per la previsione, puoi impostare il tolparametro inprcomp a un livello superiore per rimuovere i PC finali.

Ora puoi "proiettare" nuovi dati sulla base di coordinate PCA usando la predict.prcomp()funzione. Dato che stai chiamando il tuo set di dati un set di dati di "training", potrebbe essere logico proiettare un set di dati di validazione sulla tua base PCA per il calcolo delle rispettive coordinate PC. Di seguito è riportato un esempio di adattamento di un PCA a 4 misurazioni biometriche di diverse specie di iris (che sono correlate in una certa misura). Successivamente, progetto i valori biometrici di un nuovo set di dati di fiori che hanno combinazioni simili di queste misurazioni per ciascuna delle tre specie di iris. Vedrai dal grafico finale che i loro PC proiettati si trovano in un'area simile della trama del set di dati originale.

Un esempio che utilizza il irisset di dati:

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

inserisci qui la descrizione dell'immagine


Grazie per aver fornito così tanti dettagli. Sfortunatamente il codice di esempio è troppo enigmatico per me. Vedo che stai usando predict. Dov'è il manuale di prcomp predict? è qui: stat.ethz.ch/R-manual/R-patched/library/stats/html/prcomp.html ?
Tucson,

Ora ho aggiunto ulteriori spiegazioni alla mia risposta. Spero che ora ti sia più chiaro. Sì, avevi ragione nel tuo link alla guida predict.prcomp.
Marc nella scatola il

11

Le informazioni dal comando summary () che hai allegato alla domanda ti consentono di vedere, ad esempio, la proporzione della varianza acquisita da ciascun componente principale (Proporzione di varianza). Inoltre, la proporzione cumulativa viene calcolata in base all'output. Ad esempio, è necessario disporre di 23 PC per acquisire il 75% della varianza nel set di dati.

Questa non è certamente l'informazione che di solito usi come input per ulteriori analisi. Piuttosto, ciò che di solito è necessario sono i dati ruotati, che vengono salvati come 'x' nell'oggetto creato da prcomp.

Utilizzo del codice R come breve esempio.

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

Quindi è possibile utilizzare i dati in newdat per ulteriori analisi, ad esempio come input per SVM o un modello di regressione. Inoltre, consultare, ad esempio, /programming/1805149/how-to-fit-a-linear-regression-model-with-two-principal-components-in-r per ulteriori informazioni.


1
Grazie @JTT. Quindi, se ora utilizzo newdat per creare un modello SVM, suppongo che il mio modello riceva input in questo nuovo universo ruotato, il che significa che dovrò anche ruotare i miei dati di test prima di applicarli al modello. È corretto? E se sì, come si fa a ruotare un data test.frame con la stessa rotazione?
Tucson,

3
Il modo più semplice è utilizzare il predict()metodo per i dati di test. Utilizzando l'esempio sopra, predict(pr, USArrests)verrà restituita la stessa matrice di pr$x. Per i dati di test, sostituire gli Stati Uniti con il nome dei dati di test. Puoi fare la stessa cosa a mano, ma questo è più semplice, poiché i metodi di previsione si occupano automaticamente del corretto ridimensionamento del set di dati di test.
JTT

1
Come funziona la previsione? Utilizza tutti i principali compensi. Nella tua risposta hai scelto solo 2 componenti per coprire l'80% della varianza. Cosa prevede la previsione?
Tucson,

1
La funzione predict()utilizza di default tutti i componenti. Tuttavia, è possibile limitare il numero di componenti restituiti, ad es. `Predict (pr, USArrests) [, 1: 2]. questo funzionerebbe per te?
JTT

Devi centrare e ridimensionare i tuoi nuovi dati prima della previsione? O predict()questo automaticamente dato i parametri iniziali con prcomp()?
Dale Kube,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.