Skip to content

Commit d065386

Browse files
committed
B06Lc_som update to version 2
1 parent 4e38d89 commit d065386

File tree

2 files changed

+145
-110
lines changed

2 files changed

+145
-110
lines changed

devel/tutorials/B06Lc_som/B06Lc_som.Rmd

Lines changed: 145 additions & 110 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@ author: "Guyliann Engels & Philippe Grosjean"
44
description: "**SDD II Module 6** Cartes auto-adaptatives (SOM)"
55
tutorial:
66
id: "B06Lc_som"
7-
version: 1.0.0
7+
version: 2.0.0/5
88
output:
99
learnr::tutorial:
1010
progressive: true
@@ -15,12 +15,11 @@ runtime: shiny_prerendered
1515
BioDataScience2::learnr_setup()
1616
SciViews::R()
1717
library(BioDataScience)
18-
library(ade4)
1918
library(kohonen)
2019
2120
# Preparation dataset ------
22-
data("doubs")
23-
enviro <- doubs$env
21+
read("varechem", package = "vegan") %>.%
22+
rename(., station = rownames) -> envir
2423
```
2524

2625
```{r, echo=FALSE}
@@ -33,174 +32,210 @@ BioDataScience2::learnr_server(input, output, session)
3332

3433
----
3534

36-
**Ce tutoriel est encore sous sa première version, il est en cours de mise à jour.**
35+
## Objectif
3736

38-
## Objectifs
37+
Le tutoriel learnr sur les cartes auto-adaptatives (SOM) que vous vous apprêtez à réaliser vous permettra de :
3938

40-
- TODO
39+
- comprendre comment réaliser les différentes étapes de la SOM : transformation du jeu de données en matrice, calcul de la SOM et représentation sous forme de différents graphiques.
40+
- acquérir les outils nécessaires à l'analyse et l'interprétation d'un jeu de données multivariées grâce à la SOM.
4141

42+
Avant toute chose, assurez vous d'avoir bien compris le contenu du [module 6](https://wp.sciviews.org/sdd-umons2/?iframe=wp.sciviews.org/sdd-umons2-2020/k-moyenne-mds-som.html) du cours et en particulier la [section 6.3](https://wp.sciviews.org/sdd-umons2/?iframe=wp.sciviews.org/sdd-umons2-2020/cartes-auto-adaptatives-som.html). N'oubliez pas de réaliser les exercices H5P qui figurent dans cette section avant de vous lancer dans ce tutoriel Learnr.
4243

43-
## Contexte
44+
## Données environnementales
4445

45-
Des scientifiques ont réalisé des mesures d'abondance d'espèces de poissons et des mesures physico-chimiques sur 30 stations différentes.
46+
Des chercheurs ont étudié la composition floristique et les variables environnementales dans des forêts de pins oligotropes (*Pinus sylvestris*) dans l'est de la Fennoscandie, une région située au nord de l'Europe constituée de la Finlande, de la péninsule Scandinave, de la Carélie et de la péninsule de Kola.
4647

47-
L'objet `doubs` du package `ade4` est une liste qui contient 4 jeux de donnnées. Nous nous intéresserons aux données portant sur les mesures environnementales.
48+
![Fénoscandie](images/Fennoscandia.jpg)
49+
50+
Les 24 sites sélectionnés pour cette étude sont situés dans le nord de la Finlande et dans la péninsule de Kola. Quatorze variables environnementales ont été mésurées sur les différents sites d'étude dont onze permettant d'évaluer la quantité de nutriments présentant dans la matière organique (MO). Les différentes variables mesurées sont présentées dans le tableau ci-dessous.
51+
52+
| label | description | unités |
53+
|:------------:|:-------------------------------|:-----------|
54+
| **N** | azote | mg/g de MO |
55+
| **P** | phosphore | µg/g de MO |
56+
| **K** | potassium | µg/g de MO |
57+
| **Ca** | calcium | µg/g de MO |
58+
| **Mg** | magnésium | µg/g de MO |
59+
| **S** | soufre | µg/g de MO |
60+
| **Al** | aluminium | µg/g de MO |
61+
| **Fe** | fer | µg/g de MO |
62+
| **Mn** | manganèse | µg/g de MO |
63+
| **Zn** | zinc | µg/g de MO |
64+
| **Mo** | molybdène | µg/g de MO |
65+
| **Baresoil** | sourface estimée de sol nu | % |
66+
| **Humdepth** | épaisseur de la couche d'humus | cm |
67+
| **pH** | pH du sol | - |
68+
69+
Vous pouvez facilement télécharger ces données depuis `"varechem"` dans le package {vegan} et en visualiser les premières lignes.
4870

4971
```{r}
50-
data(doubs, package = "ade4")
51-
class(doubs)
72+
read("varechem", package = "vegan") %>.%
73+
rename(., station = rownames) -> envir
74+
head(envir)
5275
```
5376

54-
Ce tableau comprend 30 sites d'échantillonages avec 11 mesures environnementales.
77+
Pour avoir une idée globale du jeu de données, vous pouvez commencer par utiliser `skim()`.
5578

5679
```{r}
57-
enviro <- doubs$env
80+
skimr::skim(envir)
5881
```
5982

60-
Voici une courte description des variables étudiées (en anglais). Ces informations proviennent de la page d'aide `?ade4::doubs`
83+
On constate qu'aucune donnée n'est manquante et que toutes les variables sont numériques à l'exception de la première colonne nommée "station" qui contient les numéros des stations. Il faut donc l'enlever pour la suite de l'étude. Les unités étant différentes, il faudra également standardiser les données. Le tableau devra également être transformé en matrice car la fonction `som()` du package {kohonen} ne peut utiliser que ce type d'objet.
84+
85+
### Transformation en matrice
86+
87+
Transformez votre jeu de données `envir` en matrice. N'oubliez pas de commencer par retirer la colonne correspondant aux numéros de station et de standardiser vos données.
6188

62-
- dfs : distance from the source (km * 10),
63-
- alt : altitude (m),
64-
- slo : (log(x + 1) where x is the slope (per mil * 100),
65-
- flo : minimum average stream flow (m3/s * 100),
66-
- pH : pH,
67-
- har : total hardness of water (mg/l of Calcium),
68-
- pho : phosphates (mg/l * 100),
69-
- nit : nitrates (mg/l * 100),
70-
- amm : ammonia nitrogen (mg/l * 100),
71-
- oxy : dissolved oxygen (mg/l * 10),
72-
- bdo : biological demand for oxygen (mg/l * 10)
89+
```{r matrix_h2, exercise=TRUE}
90+
___ %>.%
91+
___(., - station) %>.%
92+
___(.) %>.%
93+
___(.) -> envir_mat
94+
```
7395

74-
```{r, echo=TRUE}
75-
summary(enviro)
96+
```{r matrix_h2-hint-1}
97+
DF %>.%
98+
select(., - rownames) %>.%
99+
___(.) %>.%
100+
___(.) -> envir_mat
101+
```
102+
103+
```{r matrix_h2-solution}
104+
envir %>.%
105+
select(., - rownames) %>.%
106+
scale(.) %>.%
107+
as.matrix(.) -> envir_mat
108+
```
109+
110+
```{r matrix_h2-check}
111+
grade_code("Très bien ! Maintenant que vous avez transformé votre jeu de données en matrice après avoir pris soin de retirer les variables non numériques et de le standardiser si nécessaire, vous allez pourvoir rentrer dans le vif du sujet ! ")
76112
```
77113

78114
## Cartes auto-adaptatives (SOM)
79115

80-
La fonction som() du package {kohonen} ne peut employer qu'une matrice. Commencez par centrer et transfomez `enviro` en une matrice.
116+
Pour réalisez le calcul de votre carte auto-adaptative ou SOM, vous allez devoir utiliser la fonction `som()` du package {kohonen}. Avant de faire le calcul, il est impotant de noter que l'analyse fait intervenir le générateur pseudo-aléatoire. Il peut-être donc intéréssant de le fixer en déterminant un point de départ avec `set.seed()` si vous souhaitez rendre votre analyse reproductible.
81117

82-
```{r, echo = TRUE, eval = FALSE}
83-
# function de base
84-
DF %>.%
118+
Pour utilser la fonction `som()`, vous devrez lui renseigner une matrice et utiliser l'argument `grid =` avec la fonction `somgrid()` pour lui préciser la topologie de la carte. Cette fonction `somgrid()` nécessite au minimum 3 arguments, le nombre de cellules en x et en y (les dimensions de notre grille) et la topologie, grille rectangulaire ou grille hexagonale, spécifiée par l'argument `topo =` avec pour valeur `"rectangular"` et `"hexagonal"`, respectivement.
119+
120+
Avec la matrice `envir_mat` mise à votre disposition, calculez la SOM pour une grille hexagonale de 3 par 3. Afficher le résumer de votre objet avec la fonction `summary()`
121+
122+
```{r mat_prep}
123+
envir %>.%
124+
select(., - rownames) %>.%
85125
scale(.) %>.%
86-
as.matrix(.) -> MATRIX
126+
as.matrix(.) -> envir_mat
127+
```
87128

88-
som. <- som(MATRIX, grid = somgrid(X, Y, topo = "hexagonal"))
89-
# un premier graphique de diagnostic est le nombre d'observation pour
90-
plot(som., type = "mapping", shape = "straight")
129+
```{r som_h3, exercise=TRUE, exercise.setup="mat_prep"}
130+
set.seed(198) # fixe le générateur pseudo-aléatoire.
131+
envir_som <- ___(___, ___ = ___(___, ___, ___))
132+
___(___)
91133
```
92134

93-
```{r som_noscore, exercise = TRUE, exercise.checker=learndown::checker_ack_learnr}
94-
summary(enviro)
135+
```{r som_h3-hint-1}
136+
set.seed(198) # fixe le générateur pseudo-aléatoire.
137+
envir_som <- ___(MATRIX, grid = ___(X, Y, ___ = ___))
138+
___(___)
95139
```
96140

97-
```{r som_noscore-hint-1}
98-
# function de base
99-
DF %>.%
100-
scale(.) %>.%
101-
as.matrix(.) -> MATRIX
141+
```{r som_h3-hint-2}
142+
set.seed(198) # fixe le générateur pseudo-aléatoire.
143+
envir_som <- ___(envir_mat, grid = ___(3, Y, topo = ___))
144+
___(envir_som)
145+
```
102146

103-
som. <- som(MATRIX, grid = somgrid(X, Y, topo = "hexagonal"))
104-
# un premier graphique de diagnostic est le nombre d'observation pour
105-
plot(som., type = "mapping", shape = "straight")
147+
```{r som_h3-solution}
148+
set.seed(198) # fixe le générateur pseudo-aléatoire.
149+
envir_som <- som(envir_mat, grid = somgrid(3, 3, topo = "hexagonal"))
150+
summary(envir_som)
106151
```
107152

108-
```{r som_noscore-hint-2}
109-
# function de base
110-
enviro %>.%
153+
```{r som_h3-check}
154+
grade_code("Et voila ... vous venez de réaliser votre première SOM ! Comme vous le constatez, le résumé de l'objet que vous venez de créer ne vous fournit pas beaucoup d'informations. Pas de panique ! La SOM étant une technique esssentiellement visuelle, c'est en réalisant différents types de graphiques que vous allez obtenir l'information.")
155+
```
156+
157+
### Évolution de l'apprentissage
158+
159+
```{r carte_prep}
160+
envir %>.%
161+
select(., - rownames) %>.%
111162
scale(.) %>.%
112-
as.matrix(.) -> envi_mat
163+
as.matrix(.) -> envir_mat
164+
set.seed(198) # fixe le générateur pseudo-aléatoire.
165+
envir_som <- som(envir_mat, grid = somgrid(3, 3, topo = "hexagonal"))
166+
```
167+
168+
Lors de la réalisation d'une technique visuelle comme la SOM, le plus important c'est de représenter graphiquement la carte. Vous pouvez la réaliser avec des graphiques R de base en utilisant la fonction `plot()`. Il existe plusieurs types de graphiques disponibles, vous pouvez dès lors consulter l'aide en ligne `plot.kohonen` pour en savoir plus.
113169

114-
som. <- som(envi_mat, grid = somgrid(3, 3, topo = "hexagonal"))
115-
# un premier graphique de diagnostic est le nombre d'observation pour
116-
plot(som., type = "mapping", shape = "straight")
170+
Commençez par visualiser l'évolution de l'apprentissage en utilisant l'argument `type = "changes"`. Vous avez à disposition l'objet `envir_som`.
171+
172+
```{r changes_h2, exercise=TRUE, exercise.setup="carte_prep"}
173+
___(___, ___)
117174
```
118175

119-
```{r som_noscore-check}
120-
# TODO
176+
```{r changes_h2-hint-1}
177+
___(envir_som, ___ = "changes")
121178
```
122179

123-
```{r qu_som_noscore}
124-
question("Selon vous quelle est la grille la plus adpatée afin de représenter les données provenant d `enviro` ?",
125-
answer("Une grille 2 sur 1"),
126-
answer("Une grille 3 sur 3", correct = TRUE),
127-
answer("Une grille 5 sur 6"),
128-
allow_retry = TRUE)
180+
```{r changes_h2-solution}
181+
plot(envir_som, type = "changes")
129182
```
130183

131-
## Exploration graphique de som
184+
```{r changes_h2-check}
185+
grade_code("L’objectif est de réduire le plus possible les distances des stations par rapport aux cellules dans lesquelles elles devraient venir se placer. On cherche donc à être le plus bas possible sur l'axe des ordonnées. Ici, on constate qu'à partir de la 60^ème^ itération, la courbe ne diminue plus de manière significative.")
186+
```
132187

133-
Utilisez à nouveau le jeu de données `enviro`.
188+
### Stations sur la carte
134189

135-
- Réalisez une grille 3 sur 3
136-
- Réalisez un graphique de type = "codes"
190+
Vous allez maintenant placer les stations dans la carte. Pour cela, vous devez utiliser l'argument `type = "mapping"`. Afin d'avoir une grille hexagonale, vous pouvez utiliser l'argument `shape = "straight"`.
137191

138-
```{r, echo=TRUE, eval=FALSE}
139-
# function de base
140-
DF %>.%
141-
scale(.) %>.%
142-
as.matrix(.) -> MATRIX
192+
Réprésentez cette carte pour `envir_som`. Utilisez l'argument `labels =` pour afficher le numéro des stations disponibles dans la colonne `station` du jeu de données `envir`
143193

144-
som. <- som(MATRIX, grid = somgrid(X, Y, topo = "hexagonal"))
145-
# un premier graphique de diagnostic est le nombre d'observation pour
146-
plot(som., type = "mapping", shape = "straight")
147-
plot(som., type = "codes",
148-
codeRendering = "segments", shape = "straight")
149-
plot(zoo_som, type = "changes", shape = "straight")
194+
```{r mapping_h2, exercise=TRUE, exercise.setup="carte_prep"}
195+
___(___, type = ___, shape = ___, ___ = envir$station)
150196
```
151197

152-
```{r som1_noscore, exercise=TRUE, exercise.checker=learndown::checker_ack_learnr}
153-
summary(enviro)
198+
```{r mapping_h2-hint-1}
199+
___(envir_som, type = ___, shape = ___, labels = envir$station)
154200
```
155201

156-
```{r som1_noscore-hint-1}
157-
DF %>.%
158-
scale(.) %>.%
159-
as.matrix(.) -> MATRIX
202+
```{r mapping_h2-solution}
203+
plot(envir_som, type = "mapping", shape = "straight", labels = envir$station)
204+
```
160205

161-
som. <- som(MATRIX, grid = somgrid(X, Y, topo = "hexagonal"))
162-
# un premier graphique de diagnostic est le nombre d'observation pour
163-
plot(som., type = "mapping", shape = "straight")
164-
plot(som., type = "codes",
165-
codeRendering = "segments", shape = "straight")
166-
plot(zoo_som, type = "changes", shape = "straight")
206+
```{r mapping_h2-check}
207+
grade_code("Bravo ! Le graphique que vous venez d'obtenir permet de voir comment les stations sont regroupées. Les stations qui sont dans la même cellule ont des caractéristiques environnementales relativement similaires. Les stations regroupées dans les cellules à proximité de la cellule en haut à droite auront des caractérisques environnementales assez proche par contre les stations présentent dans des cellules plus éloignées, en bas à gauche par exemple, seront différentes. Il est possible de visualiser ces différences dans un autre graphique et c'est ce que vous allez faire maintenant.")
167208
```
168209

169-
```{r som1_noscore-hint-2}
170-
DF %>.%
171-
scale(.) %>.%
172-
as.matrix(.) -> MATRIX
210+
### Représentation des variables
173211

174-
som. <- som(MATRIX, grid = somgrid(X, Y, topo = "hexagonal"))
175-
# un premier graphique de diagnostic est le nombre d'observation pour
176-
plot(som., type = "codes",
177-
codeRendering = "segments", shape = "straight")
178-
```
212+
Les cellules représentent des stations présentants des compositions différentes. La carte SOM étant orientée, il est possible de lui associer des informations relatives aux variables. Le graphique obtenu avec l'argument `type = "codes"` permet la visualisation de ces différences de façon générale.
179213

180-
```{r som1_noscore-hint-3}
181-
enviro %>.%
182-
scale(.) %>.%
183-
as.matrix(.) -> enviro_mat
214+
Représentez ce graphique pour `envir_som` dans une grille hexagonale et en utilisant l'argument `codeRendering = "segments"` pour représenter les variables.
215+
216+
```{r codes_h2, exercise=TRUE, exercise.setup="carte_prep"}
217+
___(___, type = ___, codeRendering = ___, shape = ___)
218+
```
184219

185-
som. <- som(enviro_mat, grid = somgrid(3, 3, topo = "hexagonal"))
186-
# un premier graphique de diagnostic est le nombre d'observation pour
187-
plot(som., type = "codes",
188-
codeRendering = "segments", shape = "straight")
220+
```{r codes_h2-hint-1}
221+
___(envir_som, type = "codes", codeRendering = ___, shape = ___)
189222
```
190223

191-
```{r som1_noscore-check}
192-
# TODO
224+
```{r codes_h2-solution}
225+
plot(envir_som, type = "codes", codeRendering = "segments", shape = "straight")
193226
```
194227

195-
Après avoir réalisé ce graphiques, tentez de l'analyser.
228+
```{r codes_h2-check}
229+
grade_code("On remarque sur ce graphique que les stations présentants les concentrations les plus élevées en `P`, `K`, `Ca`, `Mg` et `S` sont sur la droite de la carte alors que les concentrations les plus basses sont à gauche. Les stations en haut de la carte présentent des concentrations plus élevée en `Al` et en `F` contrairement aux stations du bas. L'épaisseur de l'humus est la plus grande pour les stations en bas de la carte de même que la surface de sol nu. Le pH est quant à lui plus élevé dans les stations en haut à droite.")
230+
```
196231

197232
## Conclusion
198233

199-
Vous venez de terminer votre séance d'exercice.
234+
C'est excellent ! Vous êtes arrivé à la fin de auto-évaluation relative aux cartes auto-adaptative. Vous avez acquis de nouveaux outils vous permettant l'analyse et l'interprétation d'un jeu de données multivariées. Essayez maintenant d'appliquer ces techniques dans une assigantion GitHub.
200235

201236
```{r comm_noscore, echo=FALSE}
202237
question_text(
203-
"Laissez-nous vos impressions sur ce learnr",
238+
"Laissez-nous vos impressions sur cet outil pédagogique",
204239
answer("", TRUE, message = "Pas de commentaires... C'est bien aussi."),
205240
incorrect = "Vos commentaires sont enregistrés.",
206241
placeholder = "Entrez vos commentaires ici...",
176 KB
Loading

0 commit comments

Comments
 (0)