-
Notifications
You must be signed in to change notification settings - Fork 0
/
equipe_5_oral_3.Rmd
1219 lines (979 loc) · 44.3 KB
/
equipe_5_oral_3.Rmd
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
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
775
776
777
778
779
780
781
782
783
784
785
786
787
788
789
790
791
792
793
794
795
796
797
798
799
800
801
802
803
804
805
806
807
808
809
810
811
812
813
814
815
816
817
818
819
820
821
822
823
824
825
826
827
828
829
830
831
832
833
834
835
836
837
838
839
840
841
842
843
844
845
846
847
848
849
850
851
852
853
854
855
856
857
858
859
860
861
862
863
864
865
866
867
868
869
870
871
872
873
874
875
876
877
878
879
880
881
882
883
884
885
886
887
888
889
890
891
892
893
894
895
896
897
898
899
900
901
902
903
904
905
906
907
908
909
910
911
912
913
914
915
916
917
918
919
920
921
922
923
924
925
926
927
928
929
930
931
932
933
934
935
936
937
938
939
940
941
942
943
944
945
946
947
948
949
950
951
952
953
954
955
956
957
958
959
960
961
962
963
964
965
966
967
968
969
970
971
972
973
974
975
976
977
978
979
980
981
982
983
984
985
986
987
988
989
990
991
992
993
994
995
996
997
998
999
1000
---
title: "Les vaches,<br>les amphibiens<br>et vous"
author: "Équipe 5 - Florent Déry, Morgane Le Goff, Myriam Trottier-Paquet"
date: "`r Sys.Date()`"
output:
ioslides_presentation:
widescreen: true
smaller: true
editor_options:
chunk_output_type: console
---
<style>
pre {
line-height: 1.2em;
font-size: 10px;
}
</style>
## Contexte, objectif et question de recherche (étape 1)
Les pâturages occupent actuellement 26% des surfaces terrestres libres de glaces et cette proportion est appelée à augmenter. Il est essentiel de comprendre l'impact du bétail sur la faune et la flore sauvages afin d’atténuer la perte de biodiversité mondiale due à l’augmentation de la superficie de terres converties en pâturages pour le bétail.
*Objectif :*
La présente étude cherche à quantifier les impacts du pâturage du bétail sur l'abondance et la diversité des amphibiens dans les zones agricoles du centre-sud de la Floride.
*Questions :*
1. Est-ce que la communauté d’amphibiens diffère entre les étangs dont le bétail est exclu de ceux non-exclu?
2. Est-ce que l’intensité de l’utilisation par le bétail affecte la communauté d’amphibiens en prenant en compte les variables environnementales et la communauté animale?
3. Quelle sont les variables les plus influentes sur la communauté d’amphibiens et combien de variation ces variables expliquent-elles?
*Objectif :*
Vérifier l'impact du pâturage par le bétail (vaches) sur les communautés d'amphibiens d'étangs du Centre-Sud de la Floride, É.-U.
### Hypothèses et prédictions (étape 2)
La présence et l'intensité d'utilisation du bétail modifient les conditions physico-chimiques des étangs, et ainsi l'abondance des invertébrés, poissons et écrevisses, ce qui détermine la composition des communautés amphibiennes.
Prédictions:
* Les conditions physico-chimiques sont différentes entre les étangs cloturés vs non-cloturés.
+ Les vaches seront corrélées positivement aux nitrites
+ Les vaches seront corrélées positivement à la *temperature*?
+ Les vaches seront corrélées positivement à la conductivité
+ Les vaches seront corrélées négativement au pH
+ Les vaches seront corrélées négativement à l'O²
* Les espèces généralistes seront présentes dans tous les sites car elles sont tolérantes à une grande étendue de conditions.
+ À l'inverse, les espèces fragiles ou spécialistes occuperont des sites avec des conditions optimales
## Variables du système (étape 3)
Le jeu de données contient cinq *composantes*:
* les variables reliées au *pâturage*
* les caractéristiques physico-chimiques
* les facteurs biotiques
* les caractéristiques topographiques
* la matrice d'abondance des amphibiens
Jettons un coup d'oeil à la structure (`glimpse()`) puis au `summary()` du jeu de données:
## Variables du système (étape 3)
```{r load_n_glimpse_dat, echo=F, warnings=F, message=F}
require(tidyverse)
dat=read.delim("data/jeu_ecologique.txt") %>%
mutate(etang=as.factor(as.character(etang)),
cloture=factor(cloture)) %>%
rename(vache_std=vache) %>%
arrange(aire)
glimpse(dat)
```
## Variables du système (étape 3)
```{r summary_dat_xs, echo=F, warnings=F, message=F}
summary(dat[,1:13])
```
## Variables du système (étape 3)
```{r summary_dat_ys, echo=F, warnings=F, message=F}
summary(dat[,14:22])
```
## Rôle, type et distribution des variables (étape 4)
La variable dépendante (Y) est représentée par une matrice d'abondances d'amphibiens. Les données d'abondance ont été standardisées par unité d'effort et par abondance totale pour chaque espèce.
* Les valeurs d'abondance relative sont entre 0 et 0.86.
* Les zéros (absences) composent 70.5% de la matrice.
```{r format_Ys, echo=F, warnings=F, message=F}
amphi<-dat %>%
select(etang,A_Gr:N_Vi) %>%
column_to_rownames("etang")
```
```{r step_4_quick_look_to_Ys, echo=F, warnings=F, message=F, eval=F}
range(amphi)# Étendue
sum(amphi==0) ; sum(amphi==0)/(nrow(amphi)*ncol(amphi))# Nombre de zéros, puis proportion de zéros dans la communauté
```
## Étape 4 - distribution des Ys
```{r distribution_ys, echo=F, warnings=F, message=F, fig.align="center", fig.dim=c(10,5) }
amphi %>%
pivot_longer(1:9,names_to = "espece", values_to = "prop") %>%
mutate(lng_nm=case_when(espece=="A_Gr"~ "Acris gryllus",
espece=="G_Ca"~ "Gastrophryne carolinensis",
espece=="S_La"~ "Siren lacertina",
espece=="H_Ci"~ "Hyla cinerea",
espece=="H_Fe"~ "Hyla Femoralis",
espece=="H_Sq"~ "Hyla squirella",
espece=="L_Gr"~ "Lithobates grylio",
espece=="L_Sp"~ "Lithobates sphenocephalus",
espece=="N_Vi"~ "Notophthalmus viridescens")) %>%
ggplot(aes(prop))+
geom_histogram()+
geom_density()+
facet_wrap(~lng_nm, scales="free_y")+
theme_bw()
```
## Étape 4 - Variables indépendantes X
* La variable `cloture` est une variable catégorique à deux facteurs (Yes, No).
* La variable `vache_std` (Intensité d'utilisation de l'étang par le bétail) est une variable numérique continue dont la distribution [min ; max = 0 ; 0.6] est biaisée à gauche.
* 5 étangs sont clôturés ; 35 étangs ne l'étaient pas. Parmi ces derniers, 3 étangs ne semblent pas avoir été utilisés par les vaches (`vache_std`=0)
```{r distribution_xs, echo=F, warnings=F, message=F, fig.align="center", fig.dim=c(10,4) }
p1= ggplot(dat, aes(cloture, fill=cloture))+
geom_bar()+
xlab("Étang clôturé ou non?")+
ylab("Nombre d'étangs")+
scale_fill_manual(values=c("steelblue4", "darkgoldenrod2"))+
theme_bw()
p2=ggplot(dat, aes(vache_std))+
geom_histogram(aes(fill=cloture))+
geom_density()+
xlab("Nombre de fèces standardisé")+
ylab("Nombre d'étangs")+
scale_fill_manual(values=c("steelblue4", "darkgoldenrod2"))+
theme_bw()+
theme(legend.position = c(0.8, 0.8))
require(patchwork)
p1 + p2 + plot_layout(ncol=2, widths=c(0.33, .67))
```
## Étape 4 - Variables | Caractéristiques physico-chimiques
* `conductivite`: numérique continue, distribution normale
* `nitrates` : numérique continue, distribution déviée à gauche
* `temperature` (Celcius): numérique continue, distribution déviée à gauche
+ Quelques valeurs extrèmes **-> on y reviendra!**
```{r distribution_covariables_chim_a, echo=F, warnings=F, message=F, fig.align="center", fig.dim=c(8,4) }
par(mfrow=c(1,3))
hist(dat$conductivite,
main="Conductivité",
xlab="Conductivité",
col="cornflowerblue")
hist(dat$nitrates,
main="Nitrates",
xlab="Nitrates",
col="cornflowerblue")
hist(dat$temperature,
main="Température",
xlab="Température en degré C",
col="cornflowerblue")
range(dat$pH)
```
## Étape 4 - Variables | Caractéristiques physico-chimiques
* Oxygène: numérique continue, distribution normale
+ Il y a des valeurs négatives!!! **-> on y reviendra!**
* pH: numérique continue, distribution déviée à gauche
+ Des étangs sont plus acides que du jus de citron, et presqu'aussi basiques que de l'eau de Javel! **-> on y reviendra!**
```{r distribution_covariables_chim_b, echo=F, warnings=F, message=F, fig.align="center", fig.dim=c(10,4.3) }
par(mfrow=c(1,2))
hist(dat$oxygene,
main="Oxygène",
xlab="Oxygène dissous",
col="cornflowerblue")
hist(dat$pH,
main="pH",
xlab="pH",
col="cornflowerblue")
```
## Étape 4 - Covariables | Caractéristiques topographiques
* Profondeur (cm): numérique continue, distribution normale
* Aire (m²): numérique continue, distribution *relativement* normale
```{r distribution_covariables_topo, echo=F, warnings=F, message=F, fig.align="center", fig.dim=c(10,4.3) }
par(mfrow=c(1,2))
hist(dat$profondeur,
main="Profondeur",
xlab="Profondeur en cm",
col="cornflowerblue")
hist(dat$aire,
main="Aire",
xlab="Aire en m^2",
col="cornflowerblue")
```
## Étape 4 - Variables | Facteurs biotiques
* Invertébrés: numérique continue, distribution déviée à gauche
* Écrevisses: numérique continue, distribution déviée à gauche avec beaucoup de zéros **-> on y reviendra!**
* Poissons: numérique continue, distribution avec beaucoup de zéros **-> on y reviendra!**
```{r distribution_covariables_biotiques, echo=F, warnings=F, message=F, fig.align="center", fig.dim=c(8,4) }
par(mfrow=c(1,3))
hist(dat$invertebres,
main="Invertébrés",
xlab="Abondance d'invertébrés prédateurs",
ylab="Nombre d'étangs",
col="cornflowerblue")
hist(dat$ecrevisses,
main="Écrevisses",
xlab="Abondance d'écrevisses",
ylab="Nombre d'étangs",
col="cornflowerblue")
hist(dat$poissons,
main="Poissons",
xlab="Abondance de poissons",
ylab="Nombre d'étangs",
col="cornflowerblue")
```
## Interactions potentielles à tester (étape 5)
Aucune.
## Exploration des données (étape 6) - Données aberrantes en X (6.1)
* Les valeurs de vache_std sont entre 0 et 0.575
* Il ne semble pas y avoir de données aberrantes, mais 3 étangs non-clôturés ne semblent pas avoir été visités par les vaches.
```{r abberent_Xs_vache, echo=F, warnings=F, message=F, fig.align="center", fig.dim=c(8,4) }
range(dat$vache_std)
p3=ggplot(dat)+
geom_histogram(aes(vache_std))+
xlab("")+
ylab("Fréquence")+
theme_bw()
p4=ggplot(dat)+
geom_point(aes(y=rownames(dat), x=vache_std))+
xlab("")+
ylab("Index (No de ligne)")+
theme_bw()
p5=ggplot(dat)+
geom_boxplot(aes(x=vache_std))+
xlab("")+
ylab("")+
theme_bw()+
theme(axis.line.y=element_blank(),
axis.text.y=element_blank(),
axis.ticks.y=element_blank())
require(cowplot)
p6=plot_grid(p3,p5, nrow=2, rel_heights = c(3.5, 1))
plot_grid(p6,p4, ncol=2)+
labs(caption="Nombre de fèces standardisé")
```
## 6.1 - Données aberrantes en X
* O²: Il y a des valeurs négatives!!!
+ pour la suite de nos analyses, nous avons décidé de retirer les sites ayant des valeurs d'oxygène inférieur à 0. Ces valeurs sont
- pH: Des étangs sont plus acides que du jus de citron, et presqu'aussi basiques que de l'eau de Javel!
```{r abberent_Xs_physico, echo=F, warnings=F, message=F, fig.align="center", fig.dim=c(8,4) }
Chimie<-dat[ , c(5:9)]
l1 <- function() {
par(
mar=c(1,1,1,1),
mfrow=c(1,5)
)
for(i in 1:ncol(Chimie)) {
hist(Chimie[,i], main=names(Chimie)[i], breaks=30)
}
}
l2 <- function() {
par(
mar=c(1,1,1,1),
mfrow=c(1,5)
)
for(i in 1:ncol(Chimie)) {
boxplot(Chimie[,i],horizontal = T, main=NULL)
}
}
library(gridGraphics); library(cowplot)
plot_grid(ggdraw(l1) , ggdraw(l2), ncol=1, rel_heights = c(.8, .2))
```
## 6.1 - Données aberrantes en X
* O²
+ Pour la suite de nos analyses, nous avons décidé de retirer les sites (n=2) ayant des valeurs d'oxygène inférieures à 0. Ces valeurs sont vraissemblablement des erreurs de mesures, on ne peut pas assumer qu'elles étaient à 0, ou à une autre valeur.
* pH
+ Dans la section "Matériel supplémentaire", nous avons vérifié les valeurs de pH supérieures à 9 et inférieures à 4.
- Rien ne semblait anormal au niveau des autres paramètres mesurés à ces étangs, sauf peut-être la présence de poissons mêmne lorsque le pH était de 1.88. Ceci nous pousse à croire que la variable pH n'est probablement pas fiable.
- *Pour la suite, nous allons ignorer les variables de pH pour les analyses*
## 6.1 - Données aberrantes en X
Pas de données particulièrement aberrantes en ce qui concerne la topographie des étangs
```{r aberrant_Xs_topo, echo=F, warnings=F, message=F, fig.align="center", fig.dim=c(8,4) }
Top<-dat[ , c(4, 10)]
l1=function() {
par(
mfrow=c(1,2),
mar=c(1,1,1,1)
)
for(i in 1:ncol(Top)) {
hist(Top[,i], main=names(Top)[i], breaks=30)
}
}
l2=function() {
par(
mfrow=c(1,2),
mar=c(1,1,1,1)
)
for(i in 1:ncol(Top)) {
boxplot(Top[,i], main=NULL, horizontal=T)
}
}
plot_grid(ggdraw(l1) , ggdraw(l2), ncol=1, rel_heights = c(.8, .2))
```
## 6.1 - Données aberrantes en X
* En ce qui concerne les poissons et les écrevisses, il semble y avoir beaucoup de zéros. Il faudra peut-être transformer les variables poissons et écrevisses. comme on a tenté de le faire, sans grand succès, à la section "Matériel supplémentaire".
* Les écrevisses étant des prédateurs des grenouilles (tétards), on pourrait peut-être travailler en absence-présence d'écrevisses dans nos analyses, si cette variable est problématique.
* On a vérifié l'influence de travailler avec des variables binaires pour les comptes de poissons et d'écrevisses à la section "Matériel supplémentaire".
*Pour la suite, nous travaillerons avec les données originales*, qu'on remet graphiquement ici:
```{r aberrant_Xs_biotiques, echo=F, warnings=F, message=F, fig.align="center", fig.dim=c(8,3) }
living<-dat[ , c("invertebres", "poissons", "ecrevisses")]
l1=function () {
par(
mfrow=c(1,3),
mar=c(1,1,1,1)
)
for(i in 1:ncol(living)) {
hist(living[,i], main=names(living)[i], breaks=30)
}
}
l2=function () {
par(
mfrow=c(1,3),
mar=c(1,1,1,1)
)
for(i in 1:ncol(living)) {
boxplot(living[,i], main=NULL, horizontal=T)
}
}
plot_grid(ggdraw(l1) , ggdraw(l2), ncol=1, rel_heights = c(.8, .2))
```
## 6.1 - Données aberrantes en Y
* On a déjà jetté un coup d'oeil à la distribution des abondances relatives d'amphibien à l'étape 4. Le voici en rappel, mais seulement avec des boxplots.
* Pas vraiment de données aberrantes (beaucoup de 0, mais pas aberrant en soi), si ce n'est que de quelques espèces rares.
```{r aberrant_Ys, echo=F, warnings=F, message=F, fig.align="center", fig.dim=c(10,5) }
amphi<-dat %>%
select(etang,A_Gr:N_Vi) %>%
column_to_rownames("etang")
amphi %>%
pivot_longer(1:9,names_to = "espece", values_to = "prop") %>%
mutate(lng_nm=case_when(espece=="A_Gr"~ "Acris gryllus",
espece=="G_Ca"~ "Gastrophryne carolinensis",
espece=="S_La"~ "Siren lacertina",
espece=="H_Ci"~ "Hyla cinerea",
espece=="H_Fe"~ "Hyla Femoralis",
espece=="H_Sq"~ "Hyla squirella",
espece=="L_Gr"~ "Lithobates grylio",
espece=="L_Sp"~ "Lithobates sphenocephalus",
espece=="N_Vi"~ "Notophthalmus viridescens")) %>%
ggplot()+
geom_boxplot(aes(prop), varwidth = F, width=.1)+
facet_wrap(~lng_nm, scales="free_x")+
theme_bw()+
theme(axis.text.y = element_blank())
```
## 6.1 - Données aberrantes en Y
* On peut toutefois inspecter le compte d'espèces à chaque site (convertir les abondances relatives en 0-1 pour chaque site). On peut aussi jetter un coup d'oeil à la richesse spécifique, avec le fait d'être cloturé ou pas (pourquoi pas?!).
* On peut voir quelles espèces sont rares dans notre jeu de données à gauche, et que les seuls sites mono-spcifiques sont aussi sans clôture, à droite.
```{r amphi_barplot, echo=F, warnings=F, message=F, fig.align="center", fig.dim=c(8,3)}
amphi<-dat %>%
select(etang,A_Gr:N_Vi) %>%
column_to_rownames("etang") %>%
vegan::decostand(amphi, method = "pa") %>%
mutate(cloture=dat$cloture)
tmp=data.frame(table(rowSums(amphi[amphi$cloture=="No", 1:9]))) %>%
bind_rows(data.frame(table(rowSums(amphi[amphi$cloture=="Yes", 1:9])))) %>%
mutate(cloture=c(rep("No", 6), rep("Yes", 4)))
colnames(tmp) = c("especes_presentes", "nombre_de_sites", "cloture")
plot_grid(
ggplot()+
geom_col(aes(y=sort(colSums(amphi[,1:9])),
x=factor(names(sort(colSums(amphi[,1:9]))),
levels=names(sort(colSums(amphi[,1:9])))))
)+
xlab("Espèce")+
ylab("Nombre de présences\n(tous les sites confondus)")+
theme_classic(),
ggplot(tmp)+
geom_col(aes(especes_presentes,nombre_de_sites, fill=cloture))+
xlab("Richesse spécifique à chaque site")+
scale_fill_manual(values=c("steelblue4", "darkgoldenrod2"))+
scale_y_continuous("Nombre de sites",
breaks=seq(0, 12, 2),
limits=c(0,12.1))+
theme_classic()+
theme(legend.position = c(0.8, .8))
)
```
## 6.2 - Homogénéité de la variance et 6.3 - Normalité des Ys
* Dans notre cas, on ne s'attend pas à ce que la variance des Ys soit homogène (on ne fait pas des modèles linéaires où les résidus devraient être homogènes, etc.); qui plus est, ce n'est pas une supposition à respecter dans le cadre d'une analyse multivariée...
* Dans notre cas, on ne s'attend pas à ce que la variance des Ys soit normale non plus.
## 6.4 - Problèmes de 0 dans les Y
Comme on a vu plus tôt à l'étape 4 les zéros (absences) composent 70.5% de la matrice. Il se pourrait d'ailleurs que la faible présence de certaines espèces (H_Fe, N_Vi et A_GR) pose des problèmes pour l'analyse visée.
## 6.5 - Collinéarité des X
```{r, echo=F, message=F, warnings=F, fig.width=10, fig.height=6}
dat %>%
select(vache_std:poissons) %>%
relocate(aire, .after = profondeur) %>%
psych::pairs.panels()
```
## 6.5 - Collinéarité des X
En ce qui concerne les variables numériques, on a quelques corrélations, mais rien de révoltant, surtout si on choisi une analyse qui n'est invalidée par ces collinéarités.
Pêut-être un peu plus *d'intérêt* pour les corrélations avec `vache_std`:
* Corrélé positivement aux `nitrates` et à la `conductivite`,
* Corrélé négativement au `pH`
## 6.5 - Collinéarité des X
Variable cloture vs. variables *physico-chimiques*: rien d'alarmant, considérant qu'on a seulement 5 étangs clôturés. Semble y avoir une tendance entre le fait d'être clôturé et les nitrates.
```{r, echo=F, message=F, warnings=F, fig.width=7, fig.height=4.3, fig.align="center"}
dat %>%
select(cloture, conductivite:pH) %>%
pivot_longer(conductivite:pH, names_to = "parametre", values_to = "mesure") %>%
ggplot(aes(y= mesure, x=cloture )) +
geom_boxplot(outlier.shape = NA)+
geom_jitter(height=0, width=.1)+
facet_wrap(~parametre, scales = "free_y")+
theme_bw()
```
## 6.5 - Collinéarité des X
Variable cloture vs. variables *topographiques* : rien d'alarmant, considérant qu'on a seulement 5 étangs clôturés.
```{r, echo=F, message=F, warnings=F, fig.width=7, fig.height=4.3, fig.align="center"}
dat %>%
select(cloture, profondeur, aire) %>%
pivot_longer(profondeur:aire, names_to = "caracteristique", values_to = "mesure") %>%
ggplot(aes(y= mesure, x=cloture )) +
geom_boxplot(outlier.shape = NA)+
geom_jitter(height=0, width=.1)+
facet_wrap(~caracteristique, scales = "free_y")+
theme_bw()
```
## 6.5 - Collinéarité des X
Variable clôture vs. variables *biotiques*
```{r, echo=F, message=F, warnings=F, fig.width=7, fig.height=4.3, fig.align="center"}
dat %>%
select(cloture, invertebres:poissons) %>%
pivot_longer(invertebres:poissons, names_to = "taxon", values_to = "compte") %>%
ggplot(aes(y= compte, x=cloture )) +
geom_boxplot(outlier.shape = NA)+
geom_jitter(height=0, width=.1)+
facet_wrap(~taxon, scales = "free_y")+
theme_bw()
```
## 6.6 - Liens X et Y
Abondances relatives en fonction des paramètres physico-chimiques
> Ligne + interval = smooth ('loess'; 'y ~ x').
```{r echo=F, fig.align="center", fig.height=4.3, fig.width=7, message=FALSE, warnings=F}
set.seed(1)
pal=paletteer::paletteer_d("colorBlindness::paletteMartin") %>% sample(9)
dat%>%
pivot_longer(A_Gr:N_Vi, names_to = "espece", values_to = "prop") %>%
pivot_longer(conductivite:pH, names_to = "parametre", values_to = "mesure") %>%
ggplot(aes(x= mesure, y= prop))+
geom_point(aes(color=espece), size=2) +
geom_smooth()+
scale_color_manual(values=pal)+
facet_wrap(~parametre, scales= "free_x")+
ylab("Proportion par site")+
xlab("Mesure du paramètre")+
theme_bw()
# %>%
# mutate(prof_cat=factor(
# case_when(
# profondeur < 181 ~ "very_shallow",
# profondeur %in% c(181:242)~ "shallow",
# profondeur %in% c(243:330)~ "medium",
# profondeur %in% c(331:460)~ "deep",
# profondeur > 460 ~ "very_deep"
# ), levels= c("very_shallow",
# "shallow",
# "medium",
# "deep",
# "very_deep")))
```
## 6.6 - Liens X et Y
Abondances relatives en fonction des caractéristiques topographiques
> Ligne + interval = smooth ('loess'; 'y ~ x').
```{r, echo=F, message=F, warnings=F, fig.width=7, fig.height=4.3, fig.align="center"}
dat%>%
pivot_longer(A_Gr:N_Vi, names_to = "espece", values_to = "prop") %>%
select(prop, profondeur, aire, espece) %>%
pivot_longer(profondeur:aire, names_to = "caracteristique", values_to = "mesure") %>%
ggplot(aes(x= mesure, y= prop))+
geom_point(aes(color=espece), size=2) +
geom_smooth()+
scale_color_manual(values=pal)+
facet_wrap(~caracteristique, scales= "free_x")+
ylab("Proportion par site")+
xlab("Mesure du paramètre")+
theme_bw()
```
## 6.6 - Liens X et Y
Abondances relatives en fonction des facteurs biotiques
> Ligne + interval = smooth ('loess'; 'y ~ x').
```{r, echo=F, message=F, warnings=F, fig.width=10, fig.height=4.3, fig.align="center"}
dat%>%
pivot_longer(A_Gr:N_Vi, names_to = "espece", values_to = "prop") %>%
pivot_longer(invertebres:poissons, names_to = "facteur_biotique", values_to = "compte") %>%
ggplot(aes(x= compte, y= prop))+
geom_point(aes(color=espece), size=2) +
geom_smooth()+
scale_color_manual(values=pal)+
facet_wrap(~facteur_biotique, scales= "free_x")+
ylab("Proportion par site")+
xlab("Mesure du paramètre")+
theme_bw()
```
## 6.6 - Liens X et Y
Abondances relatives en fonction de l'intensité des vaches et de la présence de cloture.
> Ligne + interval = smooth ('loess'; 'y ~ x').
```{r, echo=F, message=F, warnings=F, fig.width=10, fig.height=4.3, fig.align="center"}
p1=dat%>%
pivot_longer(A_Gr:N_Vi, names_to = "espece", values_to = "prop") %>%
ggplot(aes(x= cloture, y= prop))+
geom_boxplot(outlier.shape = NA)+
geom_jitter(aes(color=espece),height=0, width=.1)+
scale_color_manual(values=pal)+
ylab("Proportion par site")+
xlab("Cloturé?")+
theme_bw()+
theme(legend.position = "none")
p2= dat%>%
pivot_longer(A_Gr:N_Vi, names_to = "espece", values_to = "prop") %>%
ggplot(aes(x= vache_std, y= prop))+
geom_point(aes(color=espece), size=2) +
geom_smooth()+
scale_color_manual(values=pal)+
ylab("Proportion par site")+
xlab("Intensité d'utilisation par les vaches")+
theme_bw()
require(patchwork)
p1+p2+plot_layout(ncol=2, guides = "collect")
```
## 6.7 - Indépendance des Y
Richesse spécifique à chaque site:
* Les données semblent indépendantes.
Plus ou moins pour vérifier l'indépendance des sites, mles étangs avec plus d'espèces semblent être plus creux et plus gros.
```{r, echo=F, message=F, warnings=F, fig.width=10, fig.height=4.3, fig.align="center"}
# Richesse spécifique vs sites
amphi<-dat %>%
select(etang,A_Gr:N_Vi) %>%
column_to_rownames("etang") %>%
vegan::decostand(amphi, method = "pa")
sit.pres <- apply(amphi > 0, 1, sum)
sit.pres= data.frame(sit.pres) %>%
rownames_to_column(var = "etang") %>%
inner_join(., dat[, c("etang", "profondeur","aire")]) %>%
rename(richesse= sit.pres)
require(ggplot2)
plot_grid(
ggplot(sit.pres)+
#geom_point( aes(x=etang, y=richesse))+
geom_step(aes(x=etang, y=richesse, group=1))+
xlab("") +
scale_y_continuous("Richesse spécifique",
breaks= 1:6) +
ggtitle("Ordre dans les données")+
theme_classic() +
theme(axis.text.x = element_text(angle = 90)),
sit.pres %>%
mutate(etang=factor(etang, levels=etang[order(.$profondeur)], ordered = T)) %>%
ggplot()+
#geom_point( aes(x=etang, y=richesse))+
geom_step(aes(x=factor(etang), y=richesse, group=1))+
xlab("Site") +
scale_y_continuous("",
breaks= 1:6) +
ggtitle("Peu profond ---> très creux")+
theme_classic() +
theme(axis.text.x = element_text(angle = 90)),
sit.pres %>%
mutate(etang=factor(etang, levels=etang[order(.$aire)], ordered = T)) %>%
ggplot()+
#geom_point( aes(x=etang, y=richesse))+
geom_step(aes(x=factor(etang), y=richesse, group=1))+
xlab("") +
scale_y_continuous("",
breaks= 1:6) +
ggtitle("Moins gros ---> plus gros")+
theme_classic() +
theme(axis.text.x = element_text(angle = 90)),
ncol=3)
```
## 6.8 - Collinéarité des Y
```{r, echo=F, message=F, warnings=F, fig.width=9, fig.height=5.5, fig.align="center"}
dat%>%
select(A_Gr:N_Vi) %>%
psych::pairs.panels()
```
## Faits saillants de l'exploration (étape 6):
* Les données d'abondance ont été standardisées par unité d'effort et par abondance totale pour chaque espèce (somme pour chaque espèce est égale à 1).
+ Près de 71% des données de la matrice d'abondance sont égales à 0.
* Les variables physico-chimiques devront être standardisées
+ Certaines variables physico-chimiques semblent avoir des mesures erronnées.
+ L'oxygène et le pH, sont plus problématique. On va ignorer les valeurs de pH, et retirer les sites d'O² négatifs.
+ On a vérifié les valeurs extrèmes de temperature (section matériel supplémentaire), rien à signaler. La transformation log ne colle pas particulièrement les valeurs extrèmes au reste des données.
* La transformation log des poissons ou des écrevisses n'atténue pas la sureprésentation des zéros vus dans la distribution des données brutes.
* La topographie des étangs pourrait influencer d'autres facteurs physico-chimiques, et donc l'aire et la profondeur devraient être considérés comme des covariables.
+ Les étangs plus creux et plus grands semblent avoir une richesse spécifique supérieure.
## Étape 7. Choix de l'analyse
**Pourquoi une analyse multivariée?**
* Analyse de données complexes en terme de dimensionalité: Plusieurs variables avec plusieurs dimensions de manière simultanée - On veut analyser la réponse de la communauté d’amphibiens (abondance de plusieurs espèces) à différents facteurs: conditions physico-chimiques, abondance d’autres espèces animales et topographie.
**Quelle analyse multivariée?**
* Nous avons décidé d'utiliser une analyse de redondance (RDA) partielle pour analyser comment la présence de clôture, l'utlisation des étangs par les vaches et les variables physico-chimiques en plus des facteurs biotiques font varier la communauté d'amphibiens, en prennant en compte l'effet de l'aire et de la profondeur des étangs comme co-variables.
**Pourquoi?**
* Approprié pour mettre en lien des variables liées aux espèces (matrice Y) et des variables environnementales (matrice X) comme dans notre cas.
* Test non paramétrique donc pas besoin de supposer une distribution normale multivariée: la majorité de nos variables dans la RDA partielle ne sont pas distribués de manière normale.
* RDA partielle parce qu’on a des covariables qui ne nous intéressent pas mais qui vont influencer les relations entre les autres variables.
* Combine une régression linéaire multiple à une ordination classique (PCA).
**Pourquoi pas MANOVA? Pourquoi pas PCA/analyse non-contrainte?**
## Étape 7. Choix de transformation de la matrice d'abondance:
Communauté d’amphibiens :
* Problème de doubles zéros
* Données standardisées par abondance totale d’espèce
Transformation nécessaire: mesure de **dissimilarité asymétrique**. Nous avons 2 options:
1. Utiliser les données d’abondance standardisées et les transformer
2. Utiliser les données de présence-absence (binaire) et les transformer
Nous choisissons la 1re option.
* On conserver davantage d’information sur les co-fluctuations des abondances et ça respecte l’idée des investigateurs de donner davantage de poids aux espèces rares dans l’analyse de la communauté amphibienne de ces étangs.
* Nous utiliserons la transformation de Hellinger, recommandée par de nombreux auteurs pour l’ordination des données d’abondance d’espèces (Legendre et Legendre, 2012) et qui obtient le meilleur R² pour représenter la distance géographique réelle (Legendre et Gallagher, 2001).
## Étape 8.0 Exécuter l'analyse
A- On commence par transformer les matrices d'abondance.
```{r hellinger_tranformation, message=FALSE}
library("vegan")
#library(adespatial)
# Faire une matrice de distance Hellinger
# Alternate, two-step computation in vegan:
amphi.hel= dat%>%
subset(oxygene>0) %>%
# on enlève les sites avec l'oxygène à 0 ^^
select(A_Gr:N_Vi) %>%
decostand("hellinger")
rownames(amphi.hel) <- subset(dat, oxygene>0)$etang
# On change le nom des lignes pour se retrouver plus tard ^^
head(amphi.hel) %>% round(digits = 2)
```
## Étape 8.0 Exécuter l'analyse
B- On standardize les covariables.
```{r standardize_covariables,message=FALSE}
# Co-variables
topo=dat %>%
subset(oxygene>0) %>%
select(aire, profondeur) %>%
decostand("standardize")
rownames(topo) <- subset(dat, oxygene>0)$etang
# On change le nom des lignes pour se retrouver plus tard ^^
head(topo) %>% round(digits = 2)
```
## Étape 8.0 Exécuter l'analyse
C- Les variables.
```{r standardize_variables, message=FALSE}
env=dat %>%
select( vache_std, conductivite:temperature, invertebres:poissons) %>%
select(-pH) %>% # on enlève ceci. pas assez fiable.
subset(oxygene>0) %>% # erreurs de mesure. pas assez fiable.
decostand("standardize") %>%
mutate(cloture=dat[dat$oxygene>0,]$cloture) %>% data.frame()
# on rattache la variable cloture, qui n'est pas standardisée (catégorique)^^
rownames(env) <- subset(dat, oxygene>0)$etang
# On change le nom des lignes pour se retrouver plus tard ^^
glimpse(env)
```
# RDA partielle | modèle global
## Étape 8.1 Exécuter l'analyse
On lance la RDA partielle:
```{r RDA_launched, message=FALSE}
require(vegan)
(prda=rda(amphi.hel~ . + Condition(topo$aire +topo$profondeur), env) )
```
## Étape 8.1 Exécuter l'analyse
Donc, *avant* de valider si l'analyse a bien fonctionné, on peu voir dans le output de la RDA que près de 10% de la variance dans l'abondance est expliquée par les covariables, et environ 37% par les variables environnementales. <br> Par contre, ces pourcentages de variance expliqué sont biaisés. Effectivement,lorsqu'on utilise un R² ajusté, la variation expliquée par les variables environnementales tombent à :
```{r RDA_code, message=FALSE}
(R2adj <- round(RsquareAdj(prda)$adj.r.squared, dig=3))
```
Plus modeste! Aussi, ça concorde un peu plus avec la comparaison des premières valeurs propres de la RDA et de la PCA sur la variation résiduelle, qui sont pas mal similaires.
## Étape 8.2 Valider l'analyse
Le test de permutations du modèle global nous indique que le modèle a quand même une certaine valeur, il permet d'expliquer une proportion de la variance dans les communautés d'abondances :
```{r RDA_check_model}
#source("panelutils.R")
anova(prda, permutations = how(nperm = 999))
```
## Étape 8.2 Valider l'analyse
Le test de permutations sur les axes nous indique que seulement le premier axe de la RDA est *significatif*
```{r RDA_check_axis}
anova(prda, by="axis", permutations = how(nperm = 999))
```
## Étape 8.2 Valider l'analyse
Le tests de permutations sur les variables explicatives montre que les variables `cloture`, `nitrates`, `vache_std` et `poissons` semblent mieux expliquer la variance dans la matrice d'abondances des amphibiens. C'est aussi envisageable de réduire le nombre de variables dans la RDA dans de prochaines étapes.
```{r RDA_checks_terms}
anova(prda, by="term", permutations = how(nperm = 999))
```
## Étape 8.2 Valider l'analyse
Vérifier s'il y a de la collinéarité entre les variables explicatives:
```{r RDA_checks_vif}
vif.cca(prda)
```
Tout est bien. <br>
Jettons un coup d'oeil au triplots maintenant
## Étape 8.3 - Interpréter les résultats : triplots
```{r RDA_triplots_scale_1, echo=F, message=F, warnings=F, results="hide", fig.dim=c(10, 5), fig.align="center"}
source("triplot.rda.R")
par(mfrow=c(1,2))
triplot.rda(prda, scaling=1,
move.origin=c(0, 0),
mar.percent=0,
silent=T, site.sc = "lc", optimum = T)
triplot.rda(prda, scaling=2,
move.origin=c(0, 0),
mar.percent=0.05,
silent=T,site.sc = "lc", optimum = T)
```
## 8.3 - Interpréter les résultats : triplots
* Différences dans la communauté d’amphibiens entre les étangs clôturés et non clôturés
+ Les espèces d’amphibiens rares dans notre système sont favorisées par la présence de clôture
* L’intensité d’utilisation des étangs par les vaches n’influence pas la communauté d’amphibiens
Ces triplots sont très chargés, et beaucoup de variables sont près de l'origine.<br>On peut surement réduire les variables dans la RDA!
## - à compléter ! Modèle parcimonieux
On prend le backward ou le forward ? On choisi d'inclure les variables issues du backward selection ? <br>
On lance la RDA partielle pour le modèle parcimonieux.
```{r RDA.parci_launched, message=FALSE, echo=T, eval=F}
#require(vegan)
(rda.parci=rda(amphi.hel~ cloture + poissons + Condition(topo$aire +topo$profondeur), env) )
(R2adj.parci <- round(RsquareAdj(rda.parci)$adj.r.squared, dig=3))
set.seed(1)
anova(rda.parci, permutations = how(nperm = 999))
anova(rda.parci, by="axis", permutations = how(nperm = 999))
anova(rda.parci, by="term", permutations = how(nperm = 999))
vif.cca(rda.parci)
#source("triplot.rda.R")
par(mfrow=c(1,3),
mar=c(4,2,1,1))
triplot.rda(rda.parci, scaling=1,
move.origin=c(0, 0),
mar.percent=0.05,
silent=T)
triplot.rda(rda.parci, scaling=2,
move.origin=c(0, 0),
mar.percent=0.05,
silent=T)
```
## - à compléter. triplot super cool qui donne pas la meme chose qu'avec triplot.rda().
```{r, echo=FALSE, eval=F}
# Triplot joli
perc <- round(100*(summary(rda.parci)$cont$importance[2, 1:2]), 2)
## extract scores - these are coordinates in the RDA space
sc_si <- scores(rda.parci, display=c("lc"), choices=c(1,2))
sc_sp <- scores(rda.parci, display="species", choices=c(1,2))
sc_bp <- scores(rda.parci, display="bp", choices=c(1, 2))
par(mfrow=c(1,3),
mar=c(4,2,1,1))
triplot.rda(rda.parci, scaling=1,
move.origin=c(0, 0),
mar.percent=0.05,
silent=T)
triplot.rda(rda.parci, scaling=2,
move.origin=c(0, 0),
mar.percent=0.05,
silent=T)
# Set up a blank plot with scaling, axes, and labels
plot(rda.parci,
scaling = 1, # set scaling type
type = "none", # this excludes the plotting of any points from the results
frame = T,
# set axis limits
ylim = c(-1,1),
xlim = c(-.6,.6),
# label the plot (title, and axes)
main = "Triplot RDA - scaling 1",
xlab = paste0("RDA1 (", perc[1], "%)"),
ylab = paste0("RDA2 (", perc[2], "%)") ,
bty="o"
)
# add points for site scores
points(sc_si,
pch = 21, # set shape (here, circle with a fill colour)
col = "black", # outline colour
bg = "lightgreen", # fill colour
cex = 1.2) # size
points(sc_si[c("48","90", "126", "150", "209"), ],
pch = 21, # set shape (here, circle with a fill colour)
col = "black", # outline colour
bg = "darkgreen", # fill colour
cex = 1.2) # size
# add points for species scores
points(sc_sp,
pch = 24, # set shape (here, square with a fill colour)
col = "orange",
bg = "orange",
cex = 1.2)
# add text labels for species abbreviations
text(sc_sp + c(0.03, 0.09), # adjust text coordinates to avoid overlap with points
labels = rownames(sc_sp),
col = "orange",
font = 2, # bold
cex = 1)
# add arrows for effects of the expanatory variables
arrows(0,0, # start them from (0,0)
sc_bp[,1], sc_bp[,2], # end them at the score value
col = "red",
lwd = 1)
# add text labels for arrows
text(x = sc_bp[,1] -0.1, # adjust text coordinate to avoid overlap with arrow tip
y = sc_bp[,2] - 0.03,
labels = rownames(sc_bp),
col = "red",
cex = 0.9,
font = 1)
```
## 8.3 - à compléter ! Partitionner la variance : modèle global vs parcimonieux
```{r var-par-modele-global, echo=F, message=F, warnings=F, results="hide", fig.dim=c(10.5, 5.3), fig.align="left"}
# Explanation of fraction labels (two, three and four explanatory matrices) with optional colours)
#par(mfrow = c(1, 3), mar = c(1, 1, 1, 1))
# showvarparts(2, bg = c("red", "blue"))
# showvarparts(3, bg = c("red", "blue", "yellow"))
# showvarparts(4, bg = c("red", "blue", "yellow", "green"))
## Partitionner la variance avec toutes les variables du modèle
vache<-env %>% select(cloture, vache_std)
anim<-env %>% select(invertebres:poissons)
chem<-env %>% select(conductivite:temperature)
topo=topo
amphi.part.all <- varpart(amphi.hel, vache, chem, topo, anim)
par(mfrow= c(1,2),
mar=c(1,0,2,.2))
plot(amphi.part.all,
digits = 3,
bg = c("red",
"blue",
"yellow", "orange"),
Xnames = c("Bétail", "Physico-chimie", "Topo", "Facteurs\nbiotiques"),
id.size=0.9, cex=.8)+
title("Modèle global")
```
## À compléter : interprétation variance
## Matériel supplémentaire | Effet de quelques variables moins discipliniés
On a voulu vérifier la validité de valeurs plus élevées ou plus basses pour le pH et la température. <br>
- Premièrement, les valeurs extrèmes de température ont lieu surtout dans les petits étangs peu profonds, donc ce ne sont probablement pas des erreurs de mesures.
- Deuxièmement, les valeurs de pH très élevées et très basses sont louches un peu. P. ex. même avec un pH de 1.88, des poissons ont été observés dans l'étang 155.