library(tidyverse)
library(ggplot2)
library(factoextra)
library(vegan)
#Carregar os arquivos do Numerical Ecology
load("C:/Users/luiz8/Documents/Ciências Biológicas/2022.1/Ecologia Numérica/R/NEwR-2ed_code_data/NEwR2-Data/Doubs.RData")
#Remover dfs e dis
env <- env[,-c(1,4)]
#Criação da PCA
princomp(env)-> pca_env
summary(pca_env)
## Importance of components:
## Comp.1 Comp.2 Comp.3 Comp.4
## Standard deviation 267.1096679 11.533521173 6.9246972888 4.0343429098
## Proportion of Variance 0.9972202 0.001859241 0.0006702139 0.0002274875
## Cumulative Proportion 0.9972202 0.999079484 0.9997496976 0.9999771850
## Comp.5 Comp.6 Comp.7 Comp.8
## Standard deviation 1.018804e+00 7.091927e-01 2.482529e-01 1.600339e-01
## Proportion of Variance 1.450751e-05 7.029758e-06 8.613915e-07 3.579612e-07
## Cumulative Proportion 9.999917e-01 9.999987e-01 9.999996e-01 9.999999e-01
## Comp.9
## Standard deviation 6.461191e-02
## Proportion of Variance 5.834949e-08
## Cumulative Proportion 1.000000e+00
Podemos notar, então, que o PC1 explica quase que a totalidade da informação.
Utilzando PC1 (Comp.1):
pca_env$scores %>%
as_tibble() %>%
ggplot(aes(Comp.1)) + geom_histogram()
Utilizando PC2 (Comp.2):
pca_env$scores %>%
as_tibble() %>%
ggplot(aes(Comp.2)) + geom_histogram()
Vamos dividir o rio em 2 partes, médio-baixo e alto, usando o valor 10 do PC1 como divisório, já que é aproximadamente nele que há a divisão maior entre as partes do histograma. O PC2 não parece ser muito bom para as análises, mas utilizamos o valor 2 para dividir.
#Criar as classificações
pca_env$scores %>%
as_tibble() %>%
mutate(setor1=ifelse(Comp.1<10,"medio-baixo", "alto")) %>%
mutate(setor2=ifelse(Comp.2<2,"medio-baixo", "alto")) -> env_set
#Plotar gráfico PC1
fviz_pca_ind(pca_env,
geom.ind = "point",
col.ind = env_set$setor1,
palette = c("#00AFBB", "#E7B800"),
addEllipses = TRUE,
legend.title = "Grupos"
)
#Plotar gráfico PC2
fviz_pca_ind(pca_env,
geom.ind = "point",
col.ind = env_set$setor2,
palette = c("#00AFBB", "#E7B800"),
addEllipses = TRUE,
legend.title = "Grupos"
)
Como esperado, a classificação de acordo com o PC1 gerou resultados bem melhores e é possível notar uma divisão entre as 2 áreas. Fato que fica ainda mais explícito quando se observa esse gráfico:
fviz_eig(pca_env)
Que nos mostra que PC1 (comp.1) realmente tem quase 100% da informação.
Para saber isso, plotaremos o gráfico NMDS codificado com cores relativas a divisão criada.
#Criação do NMDS
nmds<-metaMDS(spe)
## Run 0 stress 0.001878781
## Run 1 stress 9.387515e-05
## ... New best solution
## ... Procrustes: rmse 0.004582759 max resid 0.009217972
## ... Similar to previous best
## Run 2 stress 4.723814e-05
## ... New best solution
## ... Procrustes: rmse 0.0001599194 max resid 0.0003168627
## ... Similar to previous best
## Run 3 stress 9.895516e-05
## ... Procrustes: rmse 0.0001456367 max resid 0.0002722373
## ... Similar to previous best
## Run 4 stress 6.314478e-05
## ... Procrustes: rmse 3.764033e-05 max resid 7.154917e-05
## ... Similar to previous best
## Run 5 stress 9.933156e-05
## ... Procrustes: rmse 0.000162794 max resid 0.0003328481
## ... Similar to previous best
## Run 6 stress 5.62247e-05
## ... Procrustes: rmse 2.980778e-05 max resid 5.989537e-05
## ... Similar to previous best
## Run 7 stress 9.87876e-05
## ... Procrustes: rmse 0.0002489909 max resid 0.0004973338
## ... Similar to previous best
## Run 8 stress 9.413792e-05
## ... Procrustes: rmse 0.0001395671 max resid 0.0002710208
## ... Similar to previous best
## Run 9 stress 9.755819e-05
## ... Procrustes: rmse 0.0001437138 max resid 0.0002891157
## ... Similar to previous best
## Run 10 stress 6.840587e-05
## ... Procrustes: rmse 3.775781e-05 max resid 9.112487e-05
## ... Similar to previous best
## Run 11 stress 9.871132e-05
## ... Procrustes: rmse 5.156517e-05 max resid 7.847622e-05
## ... Similar to previous best
## Run 12 stress 6.547911e-05
## ... Procrustes: rmse 4.224527e-05 max resid 8.611773e-05
## ... Similar to previous best
## Run 13 stress 7.593512e-05
## ... Procrustes: rmse 3.887498e-05 max resid 7.257405e-05
## ... Similar to previous best
## Run 14 stress 8.346256e-05
## ... Procrustes: rmse 0.0001366852 max resid 0.0002651075
## ... Similar to previous best
## Run 15 stress 9.189073e-05
## ... Procrustes: rmse 0.0001521368 max resid 0.0003010742
## ... Similar to previous best
## Run 16 stress 9.329477e-05
## ... Procrustes: rmse 5.067762e-05 max resid 9.080026e-05
## ... Similar to previous best
## Run 17 stress 9.202891e-05
## ... Procrustes: rmse 0.0001497166 max resid 0.0002957239
## ... Similar to previous best
## Run 18 stress 9.718175e-05
## ... Procrustes: rmse 0.0001567333 max resid 0.0003046979
## ... Similar to previous best
## Run 19 stress 9.825972e-05
## ... Procrustes: rmse 5.43103e-05 max resid 8.001208e-05
## ... Similar to previous best
## Run 20 stress 9.866117e-05
## ... Procrustes: rmse 0.0002461024 max resid 0.0004855225
## ... Similar to previous best
## *** Solution reached
#Juntando os dados para o plot
nmds_dat<-data.frame(nmds$points, env_set$setor1)
colnames(nmds_dat) <- c("MDS1","MDS2","setor")
nmds_dat<-nmds_dat[-8,] #retirando o 8, pois o local é vazio
#Plot do gráfico
nmds_dat %>%
ggplot(aes(MDS1, MDS2, color=setor))+geom_point()
Podemos notar que os resultados se mostraram bem diferentes e que não é possível encontrar padrão entre a divisão feita pelo PCA e os pontos do MDS.
Vamos utilizar agrupamentos automáticos K-means para comparar com nossos resultados.
Primeiramente, vemos quantos grupos existem.
fviz_nbclust(env, kmeans, method = "silhouette")
Temos 2 grupos, então vamos plotar o gráfico:
km_env<-kmeans(env, centers = 2)
fviz_cluster(km_env, data = env)
Vemos que realmente existem 2 grupos, assim como sugerido e observado no PCA, apesar da falta de relação com o NMDS.