14.5 Componentes Principais (PCA)
Análise de Componentes Principais (PCA) é o método mais conhecido de ordenação, mas diferentemente dos métodos que se baseiam em matrizes de distância (ver abaixo) que são mais flexíveis e menos exigentes quanto à premissas estatísticas, a ordenação com PCA tem as seguintes limitações:
Os componentes principais são independentes apenas se os dados possuirem distribuição normal conjuntamente;
A PCA é sensível à escala relativa das variáveis originais.
Um exemplo:
# análise de componentes principais
?prcomp
data(iris) # carrega o conjunto de dados iris para a rea de trabalho
<- iris[, 1:4] dt
<- prcomp(dt, scale. = T, tol = 0, retx = T)
meu.pca # entenda os argumentos usados
# classe gerada
class(meu.pca)
## [1] "prcomp"
# elementos do resultado
names(meu.pca)
## [1] "sdev" "rotation" "center" "scale" "x"
Vamos fazer uma figura utilizando a função ordiplot()
do pacote vegan
:
# fazendo uma figura com ordiplot
# veja o help
?ordiplot
# quando da variação está explicado pelos eixos
<- summary(meu.pca)
resumo <- resumo$importance
var.expl # veja a proporção cumulativa dos eixos gerados
"Cumulative Proportion", ] var.expl[
## PC1 PC2 PC3 PC4
## 0.72962 0.95813 0.99482 1.00000
# quatro eixos explicam 100% da variacao
# pega a proporção explicada por cada eixo
<- var.expl["Proportion of Variance", ]
tt <- tt * 100
tt # gera um gráfico de barras com isso
barplot(tt, xlab = "Eixos PCA", ylab = "Variação explicada %")
# define cor e simbolo por especie
<- as.factor(iris$Species)
tx # simbolos para os níveis
<- 21:23
upchs # cores para os níveis
<- rainbow(length(levels(tx)), alpha = 0.5)
cores
# gera a figura
<- ordiplot(meu.pca, type = "n") fig
# adiciona os pontos de cada linha
ordiplot(meu.pca, type = "n")
points(fig, "sites", pch = upchs[as.numeric(tx)], bg = cores[as.numeric(tx)], col = "white")
# pega os scores das variaveis
# que mostram os efeitos das variáveis usadas
<- vegan::scores(meu.pca, display = "species")
mls mls
PC1 | PC2 | PC3 | PC4 | |
---|---|---|---|---|
Sepal.Length | 0.5210659 | -0.3774176 | 0.7195664 | 0.2612863 |
Sepal.Width | -0.2693474 | -0.9232957 | -0.2443818 | -0.1235096 |
Petal.Length | 0.5804131 | -0.0244916 | -0.1421264 | -0.8014492 |
Petal.Width | 0.5648565 | -0.0669420 | -0.6342727 | 0.5235971 |
# plota flexas para esses efeitos
ordiplot(meu.pca, type = "n")
points(fig, "sites", pch = upchs[as.numeric(tx)], bg = cores[as.numeric(tx)], col = "white")
<- 2 # para aumentar as flexas um pouco
ft arrows(0, 0, mls[, 1] * ft, mls[, 2] * ft, length = 0.05, angle = 20, col = "black", lwd = 2)
text(mls[, 1] * ft, mls[, 2] * ft, labels = rownames(mls), col = "black", cex = 0.8, pos = 4)