Como usar os resultados do R prcomp para previsão?


25

Eu tenho um data.frame com 800 obs. de 40 variáveis ​​e gostaria de usar a Análise de componentes principais para melhorar os resultados da minha previsão (que até agora está funcionando melhor com a Support Vector Machine em cerca de 15 variáveis ​​escolhidas a dedo).

Entendo que um prcomp pode me ajudar a melhorar minhas previsões, mas não sei como usar os resultados da função prcomp.

Eu obtenho o resultado:

> 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

Pensei em obter os parâmetros mais importantes para usar, mas simplesmente não encontro essas informações. Tudo o que vejo são Desvio Padrão, etc., nos PCs. Mas como uso isso para previsão?


2
Há também a biblioteca R pls(Mínimos Quadrados Parciais), que possui ferramentas para PCR ( Regressão de Componentes Principais ).
Stepan S. Sushko 04/02

Respostas:


35

Embora não tenha certeza da natureza do seu problema, posso dizer que usei o PCA como um meio de extrair padrões dominantes em um grupo de variáveis ​​preditoras na construção posterior de um modelo. No seu exemplo, eles seriam encontrados nos principais componentes (PCs) PCAAnalysis$xe seriam baseados na ponderação das variáveis ​​encontradas em PCAAnalysis$rotation. Uma vantagem desse processo é que os PCs são ortogonais e, portanto, você remove problemas de multicolinearidade entre os preditores do modelo. A segunda é que você pode identificar um subconjunto menor de PCs que captura a maioria das variações em seus preditores. Esta informação pode ser encontrada em summary(PCAAnalysis)ou em PCAAnalysis$sdev. Por fim, se você estiver interessado em usar um subconjunto dos PCs para previsão, poderá definir o tolparâmetro emprcomp para um nível superior para remover os PCs à direita.

Agora, você pode "projetar" novos dados na base de coordenadas do PCA usando a predict.prcomp()função Como você está chamando seu conjunto de dados de "treinamento", pode fazer sentido projetar um conjunto de dados de validação na base do PCA para o cálculo de suas respectivas coordenadas do PC. Abaixo está um exemplo de ajuste de um PCA para 4 medições biométricas de diferentes espécies de íris (que estão correlacionadas em algum grau). A seguir, projeto valores biométricos de um novo conjunto de dados de flores que possuem combinações semelhantes dessas medidas para cada uma das três espécies de íris. Você verá no gráfico final que os PCs projetados estão em uma área semelhante ao gráfico que o conjunto de dados original.

Um exemplo usando o irisconjunto de dados:

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

insira a descrição da imagem aqui


Obrigado por fornecer muitos detalhes. Infelizmente, o código de exemplo é muito enigmático para mim. Vejo que você está usando prever. Onde está o manual para a previsão do prcomp? está aqui: stat.ethz.ch/R-manual/R-patched/library/stats/html/prcomp.html ?
quer

Adicionei mais explicações à minha resposta. Espero que esteja mais claro para você agora. Sim, você estava correto no seu link para a predict.prcompajuda.
Marc na caixa

11

As informações do comando summary () que você anexou à pergunta permitem ver, por exemplo, a proporção da variação que cada componente principal captura (Proporção da variação). Além disso, a proporção cumulativa é calculada na saída. Por exemplo, você precisa ter 23 PCs para capturar 75% da variação no seu conjunto de dados.

Essa certamente não é a informação que você normalmente usa como entrada para análises adicionais. Em vez disso, o que você normalmente precisa são os dados rotacionados, que são salvos como 'x' no objeto criado pelo prcomp.

Usando o código R como um pequeno exemplo.

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

Em seguida, você pode usar os dados no newdat para análises adicionais, por exemplo, como entrada no SVM ou em algum modelo de regressão. Além disso, consulte, por exemplo, /programming/1805149/how-to-fit-a-linear-regression-model-with-two-principal-components-in-r para obter mais informações.


11
Obrigado @JTT. Portanto, se agora eu uso newdat para criar um modelo SVM, suponho que meu modelo tenha entrada nesse novo universo rotacionado, o que significa que também precisarei rotacionar meus dados de teste antes de aplicá-los ao modelo. Isso está correto? E se sim, como você gira um teste data.frame com a mesma rotação?
tucson

3
A maneira mais fácil é usar o predict()método para os dados de teste. Usando o exemplo acima, predict(pr, USArrests)retornará a mesma matriz que pr$x. Para dados de teste, substitua USarrests pelo nome dos dados de teste. Você pode fazer o mesmo manualmente, mas isso é mais fácil, pois os métodos de previsão cuidam automaticamente do dimensionamento correto do conjunto de dados de teste.
JTT 16/10

11
Como o trabalho de previsão? Ele usa todos os principais componentes. Na sua resposta, você escolheu apenas 2 componentes para cobrir 80% da variação. O que o predizer faz?
quer

11
A função predict()usa por padrão todos os componentes. No entanto, você pode limitar o número de componentes retornados, por exemplo, `predict (pr, USArrests) [, 1: 2]. Isso funcionaria para você?
JTT 16/10

Você precisa centralizar e dimensionar seus novos dados antes da previsão? Ou isso é predict()feito automaticamente com os parâmetros iniciais prcomp()?
Dale Kube
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.