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
dt <- iris[, 1:4]
meu.pca <- prcomp(dt, scale. = T, tol = 0, retx = T)
# 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
resumo <- summary(meu.pca)
var.expl <- resumo$importance
# veja a proporção cumulativa dos eixos gerados
var.expl["Cumulative Proportion", ]
##     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
tt <- var.expl["Proportion of Variance", ]
tt <- tt * 100
# gera um gráfico de barras com isso
barplot(tt, xlab = "Eixos PCA", ylab = "Variação explicada %")

# define cor e simbolo por especie
tx <- as.factor(iris$Species)
# simbolos para os níveis
upchs <- 21:23
# cores para os níveis
cores <- rainbow(length(levels(tx)), alpha = 0.5)

# gera a figura
fig <- ordiplot(meu.pca, type = "n")

# 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
mls <- vegan::scores(meu.pca, display = "species")
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")
ft <- 2 # para aumentar as flexas um pouco
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)