Os componentes do PCA realmente representam a porcentagem de variação? Eles podem somar mais de 100%?

13

O "Aprendizado de Máquina para Hackers" de O'Reilly diz que cada componente principal representa uma porcentagem da variação. Citei a parte relevante da página abaixo (capítulo 8, p.207). Falando com outro especialista, eles concordaram que é a porcentagem.

No entanto, os 24 componentes somam 133,2095%. Como pode ser?

Tendo nos convencido de que podemos usar o PCA, como fazemos isso no R? Novamente, este é um local em que R brilha: a totalidade do PCA pode ser feita em uma linha de código. Usamos a função princomp para executar o PCA:

pca <- princomp(date.stock.matrix[,2:ncol(date.stock.matrix)])

Se digitarmos pca em R, veremos um resumo rápido dos principais componentes:

Call:
princomp(x = date.stock.matrix[, 2:ncol(date.stock.matrix)])
Standard deviations:
Comp.1 Comp.2 Comp.3 Comp.4 Comp.5 Comp.6 Comp.7
29.1001249 20.4403404 12.6726924 11.4636450 8.4963820 8.1969345 5.5438308
Comp.8 Comp.9 Comp.10 Comp.11 Comp.12 Comp.13 Comp.14
5.1300931 4.7786752 4.2575099 3.3050931 2.6197715 2.4986181 2.1746125
Comp.15 Comp.16 Comp.17 Comp.18 Comp.19 Comp.20 Comp.21
1.9469475 1.8706240 1.6984043 1.6344116 1.2327471 1.1280913 0.9877634
Comp.22 Comp.23 Comp.24
0.8583681 0.7390626 0.4347983
24 variables and 2366 observations.

Neste resumo, os desvios padrão nos dizem quanto da variação no conjunto de dados é explicada pelos diferentes componentes principais. O primeiro componente, chamado Comp.1, responde por 29% da variação, enquanto o próximo componente responde por 20%. No final, o último componente, Comp.24, responde por menos de 1% da variação. Isso sugere que podemos aprender muito sobre nossos dados apenas olhando para o primeiro componente principal.

[Código e dados podem ser encontrados no github .]

Darren Cook
fonte
6
Eu acho que a interpretação do autor Standard deviationsé um pouco errada. Como os desvios-padrão são de fato desvios-padrão, devemos quadrá-los para ver quanto da variação cada componente representa. O primeiro componente representaria % da variação total. 100×29.1001249229.10012492++0.43479832
assumednormal
4
Esta questão surge de dois erros básicos, receio: (1) erra o cabeçalho anunciando que os números são "Desvios padrão" e os confunde com variações e (2) assume que esses números são porcentagens, mas não são. (Suas unidades são o que quer que as ações sejam medidas: dólares ou variação percentual por ano ou o que seja.) Não há nenhum problema aqui: o comentário de @Max explica como encontrar a porcentagem da variação total.
whuber
1
@whuber Talvez eu devesse ter usado "erro de digitação" em vez de "bug"? :-) " Comp.1, responde por 29% da variância " está errado e deve ler " Comp.1, responde por 46% da variância "
Darren Cook
1
Obrigado, Darren: eu entendi errado que a confusão estava presente no livro e peguei "bug" para me referir ao Rpróprio software. Encontrar esse erro foi uma boa solução (espero que você tenha achado gratificante descobrir o que realmente está acontecendo com o PCA)!
whuber
5
Sim, isso é inquestionavelmente um bug do livro. Existem alguns lugares em que utilizei mal os desvios padrão em vez de desvios. (Por exemplo, há um ponto em que usamos o RMSE em vez do MSE para calcular o quadrado R). Espero que tenhamos tempo para sentar e corrigir esses tipos de bugs no futuro próximo.
26612 John Myles White

Respostas:

11

Use summary.princomppara ver a "Proporção de variação" e "Proporção cumulativa".

pca <- princomp(date.stock.matrix[,2:ncol(date.stock.matrix)])
summary(pca)
Joshua Ulrich
fonte
1
Obrigado Joshua. Portanto, o primeiro componente é na verdade 46% da variação. Vou enviar um relatório de bug para o livro.
Darren Cozinhe
Como é calculada a "Proporção de variação"? O número mostrado é 0,4600083. Mas sqrt(pca$sdev[1]/sum(pca$sdev))(aproximadamente sqrt(29.1/133.2)) dá 0,4673904.
Darren Cozinhe
3
@ DarrenCook: sdevimplica que você está olhando para o desvio padrão , ou seja, a raiz quadrada da variação (ou , usando a notação da minha resposta), que deve explicar a diferença. Tente emvez disso. λipca$sdev[1]^2/sum(pca$sdev^2)
MånsT
2
@ DarrenCook: use the source ... stats:::print.summary.princompmostra que esquadrinha o sdevcomponente, que stats:::princomp.defaultmostra sqrtos valores de eigen.
30512 Joshua Ulrich
11

Eles devem somar 100 %.

pXΣ

tr(Σ)=σ11+σ22++σpp.

λ1λ2λp.

tr(Σ)=λ1++λp
λiΣλp0

eiXeii1λi

Var(eiX)=eiΣei=λieiei=λi
k
(λ1++λkλ1++λp100) %
100 %k=p
MånsT
fonte
1
Você viu o comentário (mais recente) de @Max à pergunta? Ele acertou a resposta.
whuber
@ whuber: eu não tinha visto, então obrigado. Fiz uma observação semelhante em um comentário à resposta de Joshua.
31512
4

Aqui está um código R para complementar as respostas anteriores ( pca[["sdev"]]geralmente é escrito pca$sdev, mas causa uma formatação incorreta no trecho abaixo).

# Generate a dummy dataset.
set.seed(123)
x <- matrix(rnorm(400, sd=3), ncol=4)
# Note that princomp performs an unscaled PCA.
pca1 <- princomp(x)
# Show the fraction variance of each PC.
pca1[["sdev"]]^2
cumsum(pca1[["sdev"]]^2)/sum(pca1[["sdev"]]^2)
# Perform a scaled PCA.
pca2 <- princomp(x, cor=TRUE)
pca2[["sdev"]]^2
cumsum(pca2[["sdev"]]^2)/sum(pca2[["sdev"]]^2)

Portanto, como o @Max aponta, trabalhar com a variação em vez do desvio padrão e não esquecer de dividir pela variação total resolve o problema.

gui11aume
fonte