Skip to content

Commit 30aba6a

Browse files
committed
Learns for module 6 ready for 2024-2025
1 parent 523b21a commit 30aba6a

File tree

5 files changed

+45
-35
lines changed

5 files changed

+45
-35
lines changed

BioDataScience2.Rproj

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
Version: 1.0
2+
ProjectId: 6555a6e3-6e2f-4997-beb8-e7dbb5f0afe7
23

34
RestoreWorkspace: No
45
SaveWorkspace: No

DESCRIPTION

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
Package: BioDataScience2
2-
Version: 2024.5.0
2+
Version: 2024.6.0
33
Title: A Series of Learnr Documents for Biological Data Science 2
44
Description: Interactive documents using learnr for studying biological data science (second course).
55
Authors@R: c(

NEWS.md

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,8 @@
1+
# BioDataScience2 2024.6.0
2+
3+
- Learnrs **B06La_ahc** and **B06Lb_kmeans** revised for 2024-2025.
4+
5+
16
# BioDataScience2 2024.5.0
27

38
- Learnr **B05La_nls** revised for 2024-2025.

inst/tutorials/B06La_ahc/B06La_ahc.Rmd.inactivated renamed to inst/tutorials/B06La_ahc/B06La_ahc.Rmd

Lines changed: 24 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -43,7 +43,7 @@ BioDataScience2::learnr_server(input, output, session)
4343
- Vérifier que vous avez bien compris la logique et les différentes étapes de réalisation d'un dendrogramme : matrice de distance, classification ascendante hiérarchique (CAH), représentation graphique et coupure du dendrogramme pour obtenir des groupes.
4444
- Vous préparer à analyser et interpréter de manière autonome un jeu de données multivariées à l'aide de la CAH.
4545

46-
Vous devez avoir étudié le contenu du [module 6](https://wp.sciviews.org/sdd-umons2/?iframe=wp.sciviews.org/sdd-umons2-2023/cah-kmeans-div.html){target="_blank"} du cours et réalisé les exercices H5P qui s'y trouvent avant de vous lancer dans ce tutoriel Learnr.
46+
Vous devez avoir étudié le contenu du [module 6](https://wp.sciviews.org/sdd-umons2/?iframe=wp.sciviews.org/sdd-umons2-2024/cah-kmeans-div.html){target="_blank"} du cours et réalisé les exercices H5P qui s'y trouvent avant de vous lancer dans ce tutoriel Learnr.
4747

4848
## Communautés piscicoles de rivière
4949

@@ -65,7 +65,7 @@ doubs$xy %>.%
6565
theme_void()
6666
```
6767

68-
À chaque station, les hommes de terrain ont effectué une collecte des poissons présents et les ont dénombrés. Au total, ils ont observé 27 espèces reprises dans la table suivante.
68+
À chaque station, les hommes de terrain ont effectué une collecte des poissons présents et les ont dénombrés. Au total, ils ont observé 27 espèces reprises dans le tableau suivant.
6969

7070
```{r, echo=FALSE}
7171
doubs$species %>.%
@@ -78,7 +78,7 @@ doubs$species %>.%
7878

7979
![Le vairon *Phoxinus phoxinus*, une des espèces les plus abondantes dans le Doubs. Domaine public, photo d'Adrien Pinot.](images/vairon.jpg)
8080

81-
Le tableau de données, dans `fish` se présente comme ceci (seules les 6 premières lignes sont imprimées) :
81+
Le tableau de données, dans `fish` se présente comme ceci (seules les six premières lignes sont imprimées) :
8282

8383
```{r, echo=TRUE}
8484
head(fish)
@@ -118,24 +118,24 @@ question("À partir des données du tableau et de la description ci-dessus, quel
118118
correct = "Bravo ! Ici les classes d'abondance de 0 à 5 sont parfaites. La question subsiste quant à garder ou non les espèces qui ne seraient observées que très, très rarement... mais comme nous n'avons pas à disposition les dénombrements bruts, nous ne pourrons pas le faire. Nous faisons donc confiance au prétraitement réalisé par les auteurs initiaux.")
119119
```
120120

121-
## Étape 2 : matrice de distances
121+
## Étape 2 : matrice de distance
122122

123123
Nous réalisons ensuite une matrice des distances entre stations. Des dizaines d'indices différents existent. Lequel ou lesquelles choisiriez-vous ici, si nous nous cantonnons aux quatre indices principaux détaillés dans le cours (pour une présentation vraiment beaucoup plus complète des indices, voyez [cet article](http://www.numericalecology.com/Reprints/Gower&Leg_JClass86.pdf){target="_blank"}) ?
124124

125125
```{r qu_indice_fish}
126-
question("À partir des données du tableau `fish`, vous souhaitez réaliser un matrice de distances avec l'indice le plus adapté. Quel indice pourriez-vous choisir ? (plusieurs réponses peuvent être sélectionnées)",
126+
question("À partir des données du tableau `fish`, vous souhaitez réaliser une matrice de distance avec l'indice le plus adapté. Quel indice pourriez-vous choisir ? (plusieurs réponses peuvent être sélectionnées)",
127127
answer("Indice de Bray-Curtis", correct = TRUE),
128128
answer("Indice de Canberra", correct = TRUE),
129129
answer("Distance Euclidienne"),
130130
answer("Indice de Manhattan"),
131131
allow_retry = TRUE, random_answer_order = TRUE,
132-
incorrect = "La grande question à se poser est celle de la représentativité des doubles zéros (et nous avons vu qu'il y en a beaucoup dans notre jeu de données.",
133-
correct = "Seuls les indices qui n'utilisent pas les doubles zéros comme information sont pertinents ici. Canberra effectuera une pondération des espèces les unes par rapport aux autres contrairement à Bray-Curtis. Cela correspond à deux points de vue différents : soit la communauté dans son ensemble caractérise le milieu, soit les espèces les plus abondantes définissent principalement ces communautés. En pratique ici, la pondération est déjà incluse via l'échelle d'abondance par espèce.")
132+
incorrect = "La grande question à se poser est celle de la représentativité des doubles zéros (et nous avons vu qu'il y en a beaucoup dans notre jeu de données).",
133+
correct = "Seuls les indices qui n'utilisent pas les doubles zéros comme information sont pertinents ici. Canberra effectuera une pondération des espèces les unes par rapport aux autres contrairement à Bray-Curtis. Cela correspond à deux points de vue différents : soit la communauté dans son ensemble caractérise le milieu, soit les espèces les plus abondantes définissent principalement ces communautés. En pratique ici, la pondération est déjà incluse via l'échelle d'abondance par espèce.")
134134
```
135135

136-
### Calcul de la matrice de distances
136+
### Calcul de la matrice de distance
137137

138-
À partir du jeu de données `fish`, calculez la matrice de distances entre stations en utilisant l'indice de Bray-Curtis et `dissimilarity()`, considérant que toutes les fonctions nécessaires sont déjà chargées dans R. Pour une aide concernant les arguments de la fonction, voyez `?vegan::vegdist`.
138+
À partir du jeu de données `fish`, calculez la matrice de distance entre stations en utilisant l'indice de Bray-Curtis et `dissimilarity()`, considérant que toutes les fonctions nécessaires sont déjà chargées dans R. Pour une aide concernant les arguments de la fonction, voyez `?vegan::vegdist`.
139139

140140
```{r fish_bray_h2, exercise=TRUE}
141141
print(fish_dist <- ___(___, ___ = ___))
@@ -153,10 +153,10 @@ print(fish_dist <- dissimilarity(fish, method = "bray"))
153153
```
154154

155155
```{r fish_bray_h2-check}
156-
grade_code("Vous venez de réaliser votre première matrice de distances. L'argument `method =` de la fonction `dissimilarity()` précise la métrique utilisée : \"bray\" pour Bray-Curtis, \"canberra\" pour l'indice de Canberra, \"euclidean\" pour la distance Euclidienne et \"manhattan\" pour la distance de Manhattan.")
156+
grade_code("Vous venez de réaliser votre première matrice de distance. L'argument `method =` de la fonction `dissimilarity()` précise la métrique utilisée : \"bray\" pour Bray-Curtis, \"canberra\" pour l'indice de Canberra, \"euclidean\" pour la distance Euclidienne et \"manhattan\" pour la distance de Manhattan.")
157157
```
158158

159-
Notez l'avis (warning) qui s'affiche. En réalité, aucun poisson n'a été observé à la station 8. Dans ce cas, la métrique n'est pas fiable pour la comparaison (ne pas en observer ne signifie pas qu'il n'y en a pas, mais juste qu'on n'en a pas capturé).
159+
Notez l'avis (*warning*) qui s'affiche. En réalité, aucun poisson n'a été observé à la station 8. Dans ce cas, la métrique n'est pas fiable pour la comparaison (ne pas en observer ne signifie pas qu'il n'y en a pas, mais juste qu'on n'en a pas capturé).
160160

161161
En temps normal, nous pourrions aussi tester d'autres variantes en utilisant, par exemple, l'indice de Canberra ou en transformant les données. Mais ici, l'échelle choisie a *déjà* réglé le problème des espèces abondantes *versus* rares en faveur d'un poids équivalent pour chaque espèce.
162162

@@ -206,7 +206,7 @@ question("À partir des données du tableau et de la description ci-dessus, quel
206206
answer("Logarithme", message = "La transformation logarithmique est utilisée lorsqu'il y a une très large plage dans les données (plusieurs ordres de grandeur) et pas de valeurs nulles ou négatives"),
207207
answer("Logarithme(x + 1)", message = "log(x + 1) est utilisé pour réduire une disparité de plusieurs ordres des grandeur et lorsque les valeurs sont nulles ou positives"),
208208
answer("Double racine carrée", message = "La transformation double racine carrée est utilisée pour minimiser de manière douce l'impact des espèces abondantes lorsque les données sont des dénombrements non encore transformés"),
209-
answer("Exponentielle", message = "L'exponentielle amplifie la différence entre les petites et les grandes valeurs ; elle donne un poids encore plus grands aux observations élevées"),
209+
answer("Exponentielle", message = "L'exponentielle amplifie la différence entre les petites et les grandes valeurs ; elle donne un poids encore plus grands aux observations élevées"),
210210
allow_retry = TRUE, random_answer_order = TRUE,
211211
incorrect = "Réfléchissez... est-ce ici des données brutes, ou alors sont-elles déjà transformées ?",
212212
correct = "Ici une mise à l'échelle partielle a déjà été réalisée via les coefficients multiplicateurs (et la transformée log(x + 1) pour la pente). Aucune transformation supplémentaire n'est donc requise. Sinon, nous pouvons toujours standardiser les données, et cela se justifie lorsque nous avons des unités différents et incompatibles entre elles comme ici.")
@@ -215,19 +215,19 @@ question("À partir des données du tableau et de la description ci-dessus, quel
215215
### Choix de l'indice
216216

217217
```{r qu_indice_envir}
218-
question("Vous souhaitez réaliser un matrice de distances sur les données environnementales. Quels sont les indices les plus adaptés ?",
218+
question("Vous souhaitez réaliser un matrice de distance sur les données environnementales. Quels sont les indices les plus adaptés ?",
219219
answer("Indice de Bray-Curtis", message = "L'indice de Bray-Curtis sert plutôt pour des dénombrements d'espèces."),
220220
answer("Indice de Canberra", message = "L'indice de Canberra ne prenant pas en compte les doubles zéros, il est plutôt mal adapté pour des données environnementales."),
221221
answer("Distance Euclidienne", correct = TRUE),
222222
answer("Indice de Manhattan", correct = TRUE),
223223
allow_retry = TRUE, random_answer_order = TRUE,
224224
incorrect = "Hum, pas tout-à-fait... Quelles métriques prennent en compte les doubles zéros comme similarité (deux sites ayant même concentration nulle en une substance chimique se ressemblent).",
225-
correct = "Excellent ! C'est en fait des métriques différentes qui sont utilisées pour les dénombrement d'espèces ou les données environnementales.")
225+
correct = "Excellent ! C'est en fait des métriques différentes qui sont utilisées pour les dénombrement d'espèces ou les données environnementales.")
226226
```
227227

228228
### Distance euclidienne 1
229229

230-
À partir des données contenues dans `envir`, calculez la matrice de dissimilarités en utilisant la distance euclidienne et *sans* transformer les données. Pour rappel, vous explorez l'aide en ligne de `?vegan::vegdist` pour déterminer les arguments à utiliser dans `dissimilarity()`.
230+
À partir des données contenues dans `envir`, calculez la matrice de dissimilarité en utilisant la distance euclidienne et *sans* transformer les données. Pour rappel, vous explorez l'aide en ligne de `?vegan::vegdist` pour déterminer les arguments à utiliser dans `dissimilarity()`.
231231

232232
```{r euclidean1_h2, exercise=TRUE}
233233
print(envir_dist <- ___(___, ___))
@@ -245,12 +245,12 @@ print(envir_dist <- dissimilarity(envir, method = "euclidean"))
245245
```
246246

247247
```{r euclidean1_h2-check}
248-
grade_code("Parfait ! Nous allons calculer une autre version de la matrice de dissimilarité pour comparaison.")
248+
grade_code("Parfait ! Nous allons calculer une autre version de la matrice de dissimilarité pour comparaison.")
249249
```
250250

251251
### Distance euclidienne 2
252252

253-
Calculez une nouvelle matrice de dissimilarités de distances euclidiennes, mais cette fois en **standardisant** les données. Inspirez-vous des notes de cours pour déterminer quel argument utiliser en plus pour cela.
253+
Calculez une nouvelle matrice de dissimilarité avec distances euclidiennes, mais cette fois en **standardisant** les données. Inspirez-vous des notes de cours pour déterminer quel argument utiliser en plus pour cela.
254254

255255
```{r euclidean2_h3, exercise=TRUE}
256256
print(envir_dist <- ___(___, ___, ___))
@@ -272,7 +272,7 @@ print(envir_dist <- dissimilarity(envir, method = "euclidean", scale = TRUE))
272272
```
273273

274274
```{r euclidean2_h3-check}
275-
grade_code("Vous pourriez aussi essayer une autre méthode sur ces données standardisées comme la distance de Manhattan en utilisant `method = \"manhattan\"`. La fonction qui standardise en R est `scale()`, et l'argument ici porte le même nom : `scale = `.")
275+
grade_code("Vous pourriez aussi essayer une autre méthode sur ces données standardisées comme la distance de Manhattan en utilisant `method = \"manhattan\"`. La fonction qui standardise en R est `scale()`, et l'argument ici porte le même nom : `scale = `.")
276276
```
277277

278278
## Étape 3 : classification ascendante hiérarchique
@@ -306,7 +306,7 @@ chart(envir_clust)
306306
```
307307

308308
```{r hclust1_h2-check}
309-
grade_code("Félicitation ! Vous venez de réaliser votre premier dendrogramme. Savez-vous qu'il existe plusieurs stratégies possibles pour comparer les distances ? Utiliser l'argument `method =` de la fonction `cluster()` pour changer de méthode. Par défaut, c'est la méthode des liens complets qui est utilisée `method = \"complete\"`.")
309+
grade_code("Félicitation ! Vous venez de réaliser votre premier dendrogramme. Savez-vous qu'il existe plusieurs stratégies possibles pour comparer les distances ? Utiliser l'argument `method =` de la fonction `cluster()` pour changer de méthode. Par défaut, c'est la méthode des liens complets qui est utilisée `method = \"complete\"`.")
310310
```
311311

312312
### Dendrogramme 2
@@ -337,7 +337,7 @@ chart$circular(envir_clust)
337337
```
338338

339339
```{r hclust2_h3-check}
340-
grade_code("Très bien ! Regardez comme cette technique vous a permis d'obtenir des groupes bien individualisés. Il existe bien d'autres méthodes que vous pouvez utiliser pour calculer votre dendrogramme. Un dendrogramme circulaire permet de l'étaler beaucoup plus. C'est utile lorsqu'il y a beaucoup d'individus à représenter. Par contre, il est moins facile à lire.")
340+
grade_code("Très bien ! Regardez comme cette technique vous a permis d'obtenir des groupes bien individualisés. Il existe bien d'autres méthodes que vous pouvez utiliser pour calculer votre dendrogramme. Un dendrogramme circulaire permet de l'étaler beaucoup plus. C'est utile lorsqu'il y a beaucoup d'individus à représenter. Par contre, il est moins facile à lire.")
341341
```
342342

343343
La variante horizontale du dendrogramme permet aussi de visionner plus d'items que le dendrogramme vertical sans qu'il ne soit trop encombré. Contrairement à la version circulaire, il est beaucoup plus facile d'y repérer le niveau de coupure idéal.
@@ -370,10 +370,10 @@ chart$horizontal(envir_clust) +
370370
```
371371

372372
```{r hclust3_h2-check}
373-
grade_code("Bravo. Vous voyez en quoi ce dendrogramme est plus facile à utiliser pour déterminer un niveau de coupure idéale ? Une coupure à 7 permet de former 4 groupes. Une coupure à 10 se justifie également, et elle séparera alors les stations en 3 groupes.")
373+
grade_code("Bravo ! Vous voyez en quoi ce dendrogramme est plus facile à utiliser pour déterminer un niveau de coupure idéale ? Une coupure à 7 permet de former quatre groupes. Une coupure à 10 se justifie également, et elle séparera alors les stations en trois groupes.")
374374
```
375375

376-
Notez que vous indiquez le niveau de coupure avec le même code, quelle que soit la variante du dendrogramme utilisée avec `chart()`. Il n'est pas toujours facile de repérer la valeur à utiliser pour la coupure. La méthode `str()` appliquée à votre objet "cluster" `envir_clust` vous renvoie une visualisation textuelle du dendrogramme qui permet de lire directement les niveaux des différentes branches. Pour ne pas afficher tout, mais limiter à un nombre de groupes donnés, vous pouvez utiliser l'argument `max.level = <nbr_de_groupes>`. Démonstration.
376+
Notez que vous indiquez le niveau de coupure avec le même code, quelle que soit la variante du dendrogramme utilisée avec `chart()`. Il n'est pas toujours facile de repérer la valeur à utiliser pour la coupure. La méthode `str()` appliquée à votre objet **cluster** `envir_clust` vous renvoie une visualisation textuelle du dendrogramme qui permet de lire directement les niveaux des différentes branches. Pour ne pas afficher tout, mais limiter à un nombre de groupes donnés, vous pouvez utiliser l'argument `max.level = <nbr_de_groupes>`. Démonstration :
377377

378378
```{r}
379379
envir_dist <- dissimilarity(envir, method = "euclidean", scale = TRUE)
@@ -423,9 +423,9 @@ Si nous pouvons montrer une certaine cohérence entre le regroupement selon l'ha
423423
table(fish = fish_groups, envir = envir_groups)
424424
```
425425

426-
La première colonne avec les nombres de 1 à 5 reprend les numéros de groupes pour `fish`. La première ligne avec les nombres de 1 à 4 sont les numéros des groupes d'`envir`. Le reste est la table de contingence proprement dite. Par exemple, nous avons 7 stations simultanément dans les deux groupes n°1. Nous avons 4 stations dans le groupe 1 de `fish` et le groupe 2 d'`envir`. Par contre en dessous, deux stations sont dans le groupe n°1 d'`envir` et en même temps dans le groupe n°2 de `fish`, et 5 stations sont simultanément dans les deux groupes n°2, et ainsi de suite.
426+
La première colonne avec les nombres de 1 à 5 reprend les numéros de groupes pour `fish`. La première ligne avec les nombres de 1 à 4 sont les numéros des groupes d'`envir`. Le reste est la table de contingence proprement dite. Par exemple, nous avons sept stations simultanément dans les deux groupes n°1. Nous avons quatre stations dans le groupe 1 de `fish` et le groupe 2 d'`envir`. Par contre en dessous, deux stations sont dans le groupe n°1 d'`envir` et en même temps dans le groupe n°2 de `fish`, et cinq stations sont simultanément dans les deux groupes n°2, et ainsi de suite.
427427

428-
Notre singleton est le groupe n°3 de `fish` que nous ignorons. Pour les groupes n°1 et 2 nous avons un maximum de stations sur la diagonale (7 pour 1/1 et 5 pour 2/2) montrant ainsi une bonne concordance. Le groupe n°4 de `fish` correspond à 5 stations dans le groupe 4 d'`envir` et 3 stations dans son groupe 2. Enfin, 2 des 3 stations du groupe `fish` 5 correspondent au groupe `envir` 3. Mais notez ceci (allez revoir les sorties de `predict()` plus haut) : le groupe 5 de `fish` contient les stations 23, 24 et 25. Le groupe 3 d'`envir` contient les stations 23 et 25, alors que la station 24 est placée dans le groupe 4 pour `envir`. Par conséquent, il est fort probable que le dendrogramme d'`envir` ait mal classé cette station 24 et donc, que la correspondance `fish` 5 = `envir` 3 soit excellente.
428+
Notre singleton est le groupe n°3 de `fish` que nous ignorons. Pour les groupes n°1 et 2 nous avons un maximum de stations sur la diagonale (sept pour 1/1 et cinq pour 2/2) montrant ainsi une bonne concordance. Le groupe n°4 de `fish` correspond à cinq stations dans le groupe 4 d'`envir` et trois stations dans son groupe 2. Enfin, deux des trois stations du groupe `fish` 5 correspondent au groupe `envir` 3. Mais notez ceci (allez revoir les sorties de `predict()` plus haut) : le groupe 5 de `fish` contient les stations 23, 24 et 25. Le groupe 3 d'`envir` contient les stations 23 et 25, alors que la station 24 est placée dans le groupe 4 pour `envir`. Par conséquent, il est fort probable que le dendrogramme d'`envir` ait mal classé cette station 24 et donc, que la correspondance `fish` 5 = `envir` 3 soit excellente.
429429

430430
Ce genre de résultat est assez caractéristique de données biologiques : la concordance n'est pas parfaite, mais une belle tendance se dégage avec les correspondances qui peuvent être résumées finalement comme suit :
431431

0 commit comments

Comments
 (0)