Imagine que você precisa entender como se agrupam as comunidades do rio que estamos estudando. Essa necessidade vem do fato de que um usina hidroelétrica está para ser construída no rio e o governo encomendou estudos de impacto ambiental que precisam demonstrar várias coisas. Você como biólogo, que está preocupado com o rio, precisa convencer o governo de construir a hidroelétrica num setor do rio que tenha o menor impacto possível. Para isso, você vai precisar analisar tanto a comunidade de peixes quanto as condições fisico-químicas do rio.

Passo 1 - Faça uma PCA pra a tabela “env” (excluindo as colunas ‘dfs’ e ‘dis’). Seu intuito em vez de dividir o rio de maneira arbitrária é encontrar divisões naturais de características ambientais, que possam ser separadas pelo seu valor médio. Examine os PCs 1 e 2 e veja, através de histogramas em quantas porções o rio pode ser dividido.

Passo 2 - Faça um NMDS para os dados da comunidade biológica “spe” e use as mesmas categorias que você encontrou no passo anterior para pintar as amostras. Será que há uma coincidência?

Passo 3 - Use o métodos de K-means para gerar agrupamentos automáticos e veja se eles coincidem com os que você gerou usando o método anterior.

Carregando os dados :

library(vegan)
## Carregando pacotes exigidos: permute
## Carregando pacotes exigidos: lattice
## This is vegan 2.5-7
library(FactoMineR)
## Warning: package 'FactoMineR' was built under R version 4.1.2
library(factoextra)
## Warning: package 'factoextra' was built under R version 4.1.2
## Carregando pacotes exigidos: ggplot2
## Warning: package 'ggplot2' was built under R version 4.1.2
## Welcome! Want to learn more? See two factoextra-related books at https://goo.gl/ve3WBa
load ("C:/Users/debor/OneDrive/Documentos/EcoNum/github/NEwR-2ed_code_data/NEwR2-Data/Doubs.RData")
spe # matriz de abundância de espécies de peixes
##    Cogo Satr Phph Babl Thth Teso Chna Pato Lele Sqce Baba Albi Gogo Eslu Pefl
## 1     0    3    0    0    0    0    0    0    0    0    0    0    0    0    0
## 2     0    5    4    3    0    0    0    0    0    0    0    0    0    0    0
## 3     0    5    5    5    0    0    0    0    0    0    0    0    0    1    0
## 4     0    4    5    5    0    0    0    0    0    1    0    0    1    2    2
## 5     0    2    3    2    0    0    0    0    5    2    0    0    2    4    4
## 6     0    3    4    5    0    0    0    0    1    2    0    0    1    1    1
## 7     0    5    4    5    0    0    0    0    1    1    0    0    0    0    0
## 8     0    0    0    0    0    0    0    0    0    0    0    0    0    0    0
## 9     0    0    1    3    0    0    0    0    0    5    0    0    0    0    0
## 10    0    1    4    4    0    0    0    0    2    2    0    0    1    0    0
## 11    1    3    4    1    1    0    0    0    0    1    0    0    0    0    0
## 12    2    5    4    4    2    0    0    0    0    1    0    0    0    0    0
## 13    2    5    5    2    3    2    0    0    0    0    0    0    0    0    0
## 14    3    5    5    4    4    3    0    0    0    1    1    0    1    1    0
## 15    3    4    4    5    2    4    0    0    3    3    2    0    2    0    0
## 16    2    3    3    5    0    5    0    4    5    2    2    1    2    1    1
## 17    1    2    4    4    1    2    1    4    3    2    3    4    1    1    2
## 18    1    1    3    3    1    1    1    3    2    3    3    3    2    1    3
## 19    0    0    3    5    0    1    2    3    2    1    2    2    4    1    1
## 20    0    0    1    2    0    0    2    2    2    3    4    3    4    2    2
## 21    0    0    1    1    0    0    2    2    2    2    4    2    5    3    3
## 22    0    0    0    1    0    0    3    2    3    4    5    1    5    3    4
## 23    0    0    0    0    0    0    0    0    0    1    0    0    0    0    0
## 24    0    0    0    0    0    0    1    0    0    2    0    0    1    0    0
## 25    0    0    0    0    0    0    0    0    1    1    0    0    2    1    0
## 26    0    0    0    1    0    0    1    0    1    2    2    1    3    2    1
## 27    0    0    0    1    0    0    1    1    2    3    4    1    4    4    1
## 28    0    0    0    1    0    0    1    1    2    4    3    1    4    3    2
## 29    0    1    1    1    1    1    2    2    3    4    5    3    5    5    4
## 30    0    0    0    0    0    0    1    2    3    3    3    5    5    4    5
##    Rham Legi Scer Cyca Titi Abbr Icme Gyce Ruru Blbj Alal Anan
## 1     0    0    0    0    0    0    0    0    0    0    0    0
## 2     0    0    0    0    0    0    0    0    0    0    0    0
## 3     0    0    0    0    0    0    0    0    0    0    0    0
## 4     0    0    0    0    1    0    0    0    0    0    0    0
## 5     0    0    2    0    3    0    0    0    5    0    0    0
## 6     0    0    0    0    2    0    0    0    1    0    0    0
## 7     0    0    0    0    0    0    0    0    0    0    0    0
## 8     0    0    0    0    0    0    0    0    0    0    0    0
## 9     0    0    0    0    1    0    0    0    4    0    0    0
## 10    0    0    0    0    0    0    0    0    0    0    0    0
## 11    0    0    0    0    0    0    0    0    0    0    0    0
## 12    0    0    0    0    0    0    0    0    0    0    0    0
## 13    0    0    0    0    0    0    0    0    0    0    0    0
## 14    0    0    0    0    0    0    0    0    0    0    0    0
## 15    0    0    0    0    1    0    0    0    0    0    0    0
## 16    0    1    0    1    1    0    0    0    1    0    0    0
## 17    1    1    0    1    1    0    0    0    2    0    2    1
## 18    2    1    0    1    1    0    0    1    2    0    2    1
## 19    2    1    1    1    2    1    0    1    5    1    3    1
## 20    3    2    2    1    4    1    0    2    5    2    5    2
## 21    3    2    2    2    4    3    1    3    5    3    5    2
## 22    3    3    2    3    4    4    2    4    5    4    5    2
## 23    0    0    0    0    0    0    0    0    1    0    2    0
## 24    0    1    0    0    0    0    0    2    2    1    5    0
## 25    0    0    1    0    0    0    0    1    1    0    3    0
## 26    2    2    1    1    3    2    1    4    4    2    5    2
## 27    3    3    1    2    5    3    2    5    5    4    5    3
## 28    4    4    2    4    4    3    3    5    5    5    5    4
## 29    5    5    2    3    3    4    4    5    5    4    5    4
## 30    5    3    5    5    5    5    5    5    5    5    5    5
spa # matriz espacial
##          X       Y
## 1   85.678  20.000
## 2   84.955  20.100
## 3   92.301  23.796
## 4   91.280  26.431
## 5   92.005  29.163
## 6   95.954  36.315
## 7   98.201  38.799
## 8   99.455  46.406
## 9  109.782  55.865
## 10 130.641  66.576
## 11 142.748  81.258
## 12 147.270  85.839
## 13 156.817  89.516
## 14 159.435  92.791
## 15 150.820  91.084
## 16 132.662  87.956
## 17 128.298  93.918
## 18 130.560 102.446
## 19 128.459 105.428
## 20 114.862 103.129
## 21  97.163  90.245
## 22  88.200  86.373
## 23  79.596  83.508
## 24  74.753  78.734
## 25  67.146  74.683
## 26  53.770  71.598
## 27  43.637  68.673
## 28  30.514  61.166
## 29  20.495  43.848
## 30   0.000  41.562
env # matriz ambiental
##      dfs ele  slo   dis  pH har  pho  nit  amm  oxy  bod
## 1    0.3 934 48.0  0.84 7.9  45 0.01 0.20 0.00 12.2  2.7
## 2    2.2 932  3.0  1.00 8.0  40 0.02 0.20 0.10 10.3  1.9
## 3   10.2 914  3.7  1.80 8.3  52 0.05 0.22 0.05 10.5  3.5
## 4   18.5 854  3.2  2.53 8.0  72 0.10 0.21 0.00 11.0  1.3
## 5   21.5 849  2.3  2.64 8.1  84 0.38 0.52 0.20  8.0  6.2
## 6   32.4 846  3.2  2.86 7.9  60 0.20 0.15 0.00 10.2  5.3
## 7   36.8 841  6.6  4.00 8.1  88 0.07 0.15 0.00 11.1  2.2
## 8   49.1 792  2.5  1.30 8.1  94 0.20 0.41 0.12  7.0  8.1
## 9   70.5 752  1.2  4.80 8.0  90 0.30 0.82 0.12  7.2  5.2
## 10  99.0 617  9.9 10.00 7.7  82 0.06 0.75 0.01 10.0  4.3
## 11 123.4 483  4.1 19.90 8.1  96 0.30 1.60 0.00 11.5  2.7
## 12 132.4 477  1.6 20.00 7.9  86 0.04 0.50 0.00 12.2  3.0
## 13 143.6 450  2.1 21.10 8.1  98 0.06 0.52 0.00 12.4  2.4
## 14 152.2 434  1.2 21.20 8.3  98 0.27 1.23 0.00 12.3  3.8
## 15 164.5 415  0.5 23.00 8.6  86 0.40 1.00 0.00 11.7  2.1
## 16 185.9 375  2.0 16.10 8.0  88 0.20 2.00 0.05 10.3  2.7
## 17 198.5 349  0.5 24.30 8.0  92 0.20 2.50 0.20 10.2  4.6
## 18 211.0 333  0.8 25.00 8.0  90 0.50 2.20 0.20 10.3  2.8
## 19 224.6 310  0.5 25.90 8.1  84 0.60 2.20 0.15 10.6  3.3
## 20 247.7 286  0.8 26.80 8.0  86 0.30 3.00 0.30 10.3  2.8
## 21 282.1 262  1.0 27.20 7.9  85 0.20 2.20 0.10  9.0  4.1
## 22 294.0 254  1.4 27.90 8.1  88 0.20 1.62 0.07  9.1  4.8
## 23 304.3 246  1.2 28.80 8.1  97 2.60 3.50 1.15  6.3 16.4
## 24 314.7 241  0.3 29.76 8.0  99 1.40 2.50 0.60  5.2 12.3
## 25 327.8 231  0.5 38.70 7.9 100 4.22 6.20 1.80  4.1 16.7
## 26 356.9 214  0.5 39.10 7.9  94 1.43 3.00 0.30  6.2  8.9
## 27 373.2 206  1.2 39.60 8.1  90 0.58 3.00 0.26  7.2  6.3
## 28 394.7 195  0.3 43.20 8.3 100 0.74 4.00 0.30  8.1  4.5
## 29 422.0 183  0.6 67.70 7.8 110 0.45 1.62 0.10  9.0  4.2
## 30 453.0 172  0.2 69.00 8.2 109 0.65 1.60 0.10  8.2  4.4

Fazendo um PCA para as variáveis ambientais excluindo “dfs” e “dis”:

env_simp<-env[,-c(1,4)] # excluindo "dfs" e "dis"
princomp(env_simp)-> 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

Já que o componente 1 concentra a maioria dos dados, plotamos um histograma.

library(tidyverse)
## -- Attaching packages --------------------------------------- tidyverse 1.3.1 --
## v tibble  3.1.5     v dplyr   1.0.7
## v tidyr   1.1.4     v stringr 1.4.0
## v readr   2.0.2     v forcats 0.5.1
## v purrr   0.3.4
## -- Conflicts ------------------------------------------ tidyverse_conflicts() --
## x dplyr::filter() masks stats::filter()
## x dplyr::lag()    masks stats::lag()
pca_env$scores %>% 
  as.tibble() %>% 
  ggplot(aes(Comp.1))+geom_histogram()
## Warning: `as.tibble()` was deprecated in tibble 2.0.0.
## Please use `as_tibble()` instead.
## The signature and semantics have changed, see `?as_tibble`.
## This warning is displayed once every 8 hours.
## Call `lifecycle::last_lifecycle_warnings()` to see where this warning was generated.
## `stat_bin()` using `bins = 30`. Pick better value with `binwidth`.

O histograma mostra valores positivos e negativos, dando uma ideia de divisão de valores. Usamos essa ideia para dividir o rio em dois grupos :o Alto Rio e o Médio-Baixo Rio.

pca_env$scores %>% 
  as.tibble() %>% 
  mutate(setor=ifelse(Comp.1<0,"Médio-Baixo Rio", "Alto Rio"))-> env_set
fviz_pca_ind(pca_env,
             geom.ind = "text", # ver as amostras
             col.ind = env_set$setor, # color by groups
             palette = c("#00AFBB", "#E7B800"),
             addEllipses = TRUE, # Concentration ellipses
             legend.title = "Agrupamentos"
             )

Testando uma outra forma de visualizar essas variáveis:

Gerando um PCA :

res.pca<- PCA(env_simp)
## Warning: ggrepel: 5 unlabeled data points (too many overlaps). Consider
## increasing max.overlaps

O primeiro gráfico mostra a distribuição das amostras em relação às variáveis do segundo gráfico, onde é possível observar quais as variáveis tiveram maior influência nos locais amostrados. O segundo gráfico traz informações importantes de correlação entre as variáveis como por exemplo, a correlação negativa já observada entre oxy e bod. Esse gráfico ainda traz outras informações interessantes como a aparente correlação positiva entre a amônia, o fósforo e o nitrato. Se formos combinar esses dois gráficos teremos esse tipo de gráfico:

fviz_pca(res.pca)

Aqui fica mais claro às quais variáveis os locais de amostragem estão submetidos, onde podemos visualizar uma alta heterogeineidade ambiental.

Em um outro gráfico de hierarquia das amostras em relação às variáveis podemos visualizar três clusters bem definidos :

No cluster 1 por exemplo temos amostras com altos valores para ele (elevação) e slo (declive) e baixos valores para har (calcium concentration-hardness, concentração de cálcio-dureza) e nit (nitrato). No cluster 2 temos altos valores para a variável har e baixos para ele. Já no cluster 3 as variáveis mais significativas (da maior para a menor) são bod, pho, amn e nit, com os menores valores para oxy e ele.

Apesar dessa análise trazer três clusters, não existem aparentemente diferenças gritantes entre o entre os clusters 2 e 3, havendo até partes onde eles se intersectam : Ambos apresentam baixos valores para ele e valores próximos para har, por exemplo. O que faz ter sentido a primeira análise que dividiu o rio em duas partes, Alto Rio e Médio-Baixo Rio.

Analisando agora a matriz de espécies do rio :

nmds<-metaMDS(spe[-8,])
## Run 0 stress 0.07477809 
## Run 1 stress 0.1128294 
## Run 2 stress 0.07477801 
## ... New best solution
## ... Procrustes: rmse 0.0001865905  max resid 0.0008933482 
## ... Similar to previous best
## Run 3 stress 0.09288418 
## Run 4 stress 0.117344 
## Run 5 stress 0.1133686 
## Run 6 stress 0.1203765 
## Run 7 stress 0.08797362 
## Run 8 stress 0.1226315 
## Run 9 stress 0.0880154 
## Run 10 stress 0.07477824 
## ... Procrustes: rmse 0.0002743227  max resid 0.001314125 
## ... Similar to previous best
## Run 11 stress 0.07477829 
## ... Procrustes: rmse 0.0003001347  max resid 0.001438945 
## ... Similar to previous best
## Run 12 stress 0.1125692 
## Run 13 stress 0.07478419 
## ... Procrustes: rmse 0.003654012  max resid 0.01453342 
## Run 14 stress 0.1222462 
## Run 15 stress 0.07506666 
## ... Procrustes: rmse 0.01475416  max resid 0.06363312 
## Run 16 stress 0.07429346 
## ... New best solution
## ... Procrustes: rmse 0.0238784  max resid 0.09223832 
## Run 17 stress 0.07506669 
## Run 18 stress 0.07506671 
## Run 19 stress 0.08797356 
## Run 20 stress 0.1221737 
## *** No convergence -- monoMDS stopping criteria:
##     19: stress ratio > sratmax
##      1: scale factor of the gradient < sfgrmin
nmds$points
##            MDS1        MDS2
## 1  -1.755186345  0.85754723
## 2  -1.122441494 -0.24958002
## 3  -0.978481611 -0.27813191
## 4  -0.617315547 -0.11860201
## 5   0.072590749  0.44662406
## 6  -0.423165043 -0.17083916
## 7  -0.866329876 -0.28234888
## 9  -0.007637838 -0.87244213
## 10 -0.527345780 -0.41367157
## 11 -1.066088458 -0.04946677
## 12 -0.974735714 -0.13234358
## 13 -1.157212489  0.10455014
## 14 -0.799570811  0.10931496
## 15 -0.498053065  0.16054758
## 16 -0.186300728  0.26959115
## 17  0.084055662  0.12202834
## 18  0.295952809  0.11236282
## 19  0.449559301  0.14254262
## 20  0.769125673  0.27433703
## 21  0.855498121  0.38503357
## 22  0.944242178  0.44977139
## 23  0.768651364 -1.43281673
## 24  1.129475633 -0.62031852
## 25  0.867674694 -0.86662838
## 26  0.931321146  0.13251282
## 27  0.966574239  0.37868238
## 28  1.008287364  0.38272306
## 29  0.784551356  0.56532825
## 30  1.052304511  0.59369227
## attr(,"centre")
## [1] TRUE
## attr(,"pc")
## [1] TRUE
## attr(,"halfchange")
## [1] TRUE
## attr(,"internalscaling")
## [1] 1.020891
nmds_dat<-data.frame(nmds$points, env_set$setor[-8])
colnames(nmds_dat) <- c("MDS1","MDS2","setor")
nmds_dat %>%  #Plotando o gráfico
  ggplot(aes(MDS1, MDS2, color=setor))+geom_point()

Esse gráfico mostra que existe uma padronização na diversidade de espécies que depende das variáveis fisico-químicas do rio. Aparentemente existe especificidade de habitat (se observar ambos os gráficos dos Agrupamentos-PCA e ggplot das espécies) o que pode dificultar a implantação de uma hidroelétrica nesse ambiente. Se a necessidade de implantação não puder ser substituída recomendaria que fosse feita na parte do médio-baixo rio, sendo melhor no Baixo Rio, já que esse é o local com um maior grupo de espécies, e possui uma maior extensão fluvial.

Verificando o mesmo dado de espécies com o k-means:

k3<-kmeans(spe[,-8], centers = 3, nstart=25) #excluindo outras variáveis que não vão ser analisadas
k3
## K-means clustering with 3 clusters of sizes 8, 10, 12
## 
## Cluster means:
##       Cogo  Satr  Phph Babl  Thth     Teso  Chna Lele     Sqce      Baba
## 1 0.000000 0.125 0.375  1.0 0.125 0.125000 1.625 2.25 3.125000 3.7500000
## 2 0.200000 0.800 1.400  1.7 0.200 0.400000 0.500 1.30 1.700000 0.8000000
## 3 1.083333 4.000 4.250  4.0 1.000 1.166667 0.000 1.00 1.166667 0.4166667
##         Albi      Gogo Eslu      Pefl Rham       Legi  Scer       Cyca
## 1 2.12500000 4.3750000 3.25 2.7500000  3.5 3.00000000 2.125 2.62500000
## 2 0.90000000 1.2000000 0.80 1.0000000  0.5 0.40000000 0.400 0.30000000
## 3 0.08333333 0.6666667 0.50 0.3333333  0.0 0.08333333 0.000 0.08333333
##        Titi  Abbr Icme  Gyce      Ruru  Blbj Alal Anan
## 1 4.0000000 3.125 2.25 4.125 4.8750000 3.625  5.0  3.0
## 2 0.8000000 0.100 0.00 0.500 2.2000000 0.200  1.7  0.3
## 3 0.4166667 0.000 0.00 0.000 0.1666667 0.000  0.0  0.0
## 
## Clustering vector:
##  1  2  3  4  5  6  7  8  9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 
##  2  3  3  3  2  3  3  2  2  3  3  3  3  3  3  3  2  2  2  1  1  1  2  2  2  1 
## 27 28 29 30 
##  1  1  1  1 
## 
## Within cluster sum of squares by cluster:
## [1] 172.7500 305.9000 189.0833
##  (between_SS / total_SS =  65.5 %)
## 
## Available components:
## 
## [1] "cluster"      "centers"      "totss"        "withinss"     "tot.withinss"
## [6] "betweenss"    "size"         "iter"         "ifault"
#Fazendo clusters
fviz_cluster(k3, data = spe[,-8])

#Verificando o número de clusters
fviz_nbclust(spe[,-8], kmeans, method = "silhouette") 

#Plotando novamente com o número indicado 
k2<-kmeans(spe[,-8], centers =2, nstart=25)
fviz_cluster(k2, data = spe[,-8])

Já o K-means traz um tipo de agrupamento diferente. Ao que se parece o Alto-Rio se junta ao Médio, fazendo apenas um cluster. O Baixo-Rio se separa totalmente fazendo um cluster bem menor. Ao que essa análise indica, independemente das variáveis físico-químicas existe um maior intercâmbio entre as espécies do Alto(A) e Médio(M) Rio, que as do Médio e Baixo (B) Rio. Havendo a necessidade de reconsiderar as colocações anteriores quanto a posição de um usina hidroelétrica.

Será que isolar o grupo do alto rio é a melhor abordagem? Aparentemente esse seria um impacto bem maior que se considerarmos isolar o cluster menor na análise do K-means. No entanto analisando a riqueza e abundância de espécies (1 aula) temos que os setores M e B do Rio possuem uma maior representatividade que o Alto Rio, fazendo os serem mais importantes. Mas se levarmos em conta a integridade do rio e como isso pode afetar as espécies Rio-Abaixo, não é recomendável que a usina seja construída próximo à nascente. Pensando em um menor impacto ambiental é preferível que seja construída no Baixo Rio que em qualquer outro setor.

Gráficos da Aula 1 para comparação:

sit.pres <- apply(spe > 0, 1, sum)
sort(sit.pres)
##  8  1  2 23  3  7  9 10 11 12 13  4 24 25  6 14  5 15 16 26 30 17 20 22 27 28 
##  0  1  3  3  4  5  5  6  6  6  6  8  8  8 10 10 11 11 17 21 21 22 22 22 22 22 
## 18 19 21 29 
## 23 23 23 26
par(mfrow = c(1, 2))
#Riqueza de espécies e locais de amostragem
plot(sit.pres,type = "s",las = 1,col = "gray", main = "Riqueza de espécies vs. \n Gradiente Rio Acima-Rio Abaixo", xlab = "Número dos locais",ylab = "Riqueza de espécies")
text(sit.pres, row.names(spe), cex = .8, col = "brown")
#Fazendo um mapa de bolhas com coordenadas geográficas
plot(spa, asp = 1, main = "Mapa de riqueza de espécies",pch = 21,col = "white",bg = "brown", cex = 5 * sit.pres / max(sit.pres), xlab = "Coordenadas x (km)",ylab = "Coordenadas Y (km)")
lines(spa, col = "light blue")