BioDataScience2::learnr_setup()
SciViews::R("explore")
library(kohonen)

# Preparation du jeu de données
read("varechem", package = "vegan") %>.%
  srename(., station = .rownames) ->
  envir
BioDataScience2::learnr_banner()
BioDataScience2::learnr_server(input, output, session)

Objectifs

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

Avant toute chose, assurez-vous d'avoir bien compris le contenu du module 10 du cours. N'oubliez pas de réaliser les exercices H5P qui figurent dans cette section avant de vous lancer dans ce tutoriel.

Données environnementales

Des chercheurs ont étudié la composition floristique et les variables environnementales dans des forêts de pins oligotrophes (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.

Fénoscandie

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é mesuré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.

| label | description | unités | |:------------:|:-------------------------------|:-----------| | N | azote | mg/g de MO | | P | phosphore | mg/g de MO | | K | potassium | mg/g de MO | | Ca | calcium | mg/g de MO | | Mg | magnésium | mg/g de MO | | S | soufre | mg/g de MO | | Al | aluminium | µg/g de MO | | Fe | fer | µg/g de MO | | Mn | manganèse | µg/g de MO | | Zn | zinc | µg/g de MO | | Mo | molybdène | µg/g de MO | | Baresoil | surface estimée de sol nu | \% | | Humdepth | épaisseur de la couche d'humus | cm | | pH | pH du sol | - |

Vous pouvez facilement télécharger ces données depuis "varechem" dans le package {vegan} et en visualiser les premières lignes.

read("varechem", package = "vegan") %>.%
  rename(., station = .rownames) ->
  envir
head(envir)

Pour avoir une idée globale du jeu de données, vous pouvez commencer par utiliser skimr::skim().

skimr::skim(envir)

Nous constatons 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 ensuite être transformé en matrice, car la fonction som() du package {kohonen} ne peut utiliser que ce type d'objet.

Transformation en matrice

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.

___ %>.%
  sselect(., -station) %>.%  # Éliminer station
  ___(.) %>.%             # Standardiser
  ___(.) ->.              # Transformer en objet matrix
  envir_mat
head(envir_mat)
___ %>.%
  sselect(., -station) %>.%  # Éliminer station
  ___(.) %>.%                # Standardiser
  as.___(.)  ->              # Transformer en objet matrix
  envir_mat
head(envir_mat)

#### ATTENTION: Hint suivant = solution !####
## Solution ##
envir %>.%
  sselect(., -station) %>.%  # Éliminer station
  scale(.) %>.%              # Standardiser
  as.matrix(.) %->%          # Transformer en objet matrix
  envir_mat
head(envir_mat)
grade_code("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 standardiser si nécessaire, vous allez pourvoir rentrer dans le vif du sujet ! ")

Cartes auto-adaptatives (SOM)

Pour réalisez le calcul de votre carte auto-adaptative ou SOM, vous allez utiliser la fonction som() du package {kohonen}. Avant de faire le calcul, il est important de noter que l'analyse fait intervenir le générateur pseudo-aléatoire. Il peut-être donc intéressant de le fixer en déterminant un point de départ avec set.seed() si vous souhaitez rendre votre analyse reproductible.

Pour utiliser la fonction som(), il faut lui renseigner une matrice et utiliser l'argument grid = avec la fonction somgrid() pour préciser la topologie de la carte. Cette fonction somgrid() nécessite au minimum trois arguments : le nombre de cellules en x, 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" ou "hexagonal", respectivement.

À partir de votre matrice envir_mat, calculez la SOM pour une grille hexagonale de 3 par 3. Affichez le résumé de votre analyse avec summary().

envir %>.%
  sselect(., -station) %>.%
  scale(.) %>.%
  as.matrix(.) ->
  envir_mat
set.seed(198)
envir_som <- ___(___, ___ = ___(___, ___, ___))
___(___)
set.seed(198)
envir_som <- ___(envir_mat, grid = ___(3, ___, ___ = ___))
___(___)
set.seed(198)
envir_som <- ___(envir_mat, grid = ___(3, ___, topo = "___"))
___(envir_som)

#### ATTENTION: Hint suivant = solution !####
## Solution ##
set.seed(198)
envir_som <- som(envir_mat, grid = somgrid(3, 3, topo = "hexagonal"))
summary(envir_som)
grade_code("Et voilà... 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'information. Pas de panique. SOM étant une technique esssentiellement visuelle, c'est en réalisant ensuite différents graphiques que vous allez expliciter le résultat de votre analyse.")

Évolution de l'apprentissage

envir %>.%
  sselect(., -station) %>.%
  scale(.) %>.%
  as.matrix(.) ->
  envir_mat

set.seed(198)
envir_som <- som(envir_mat, grid = somgrid(3, 3, topo = "hexagonal"))

Vous réalisez vos graphiques à partir de l'objet kohonen obtenu à partir de som(), en utilisant la fonction plot(). Il existe plusieurs types de graphiques disponibles, vous pouvez dès lors consulter l'aide en ligne ?kohonen::plot.kohonen pour en savoir plus.

Commencez par visualiser l'évolution de l'apprentissage en utilisant l'argument type = "changes". Vous avez à disposition l'objet envir_som.

___(___, ___)
___(envir_som, ___ = "changes")

#### ATTENTION: Hint suivant = solution !####
## Solution ##
plot(envir_som, type = "changes")
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.")

Stations sur la carte

Vous allez maintenant placer les stations sur la carte SOM. Pour cela, vous devez utiliser l'argument type = "mapping". Afin d'avoir une grille hexagonale, vous pouvez utiliser l'argument shape = "straight".

Repré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

___(___, type = ___, shape = ___, ___ = envir$station)
___(envir_som, type = ___, shape = ___, labels = envir$station)

#### ATTENTION: Hint suivant = solution !####
## Solution ##
plot(envir_som, type = "mapping", shape = "straight", labels = envir$station)
grade_code("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.")

Représentation des variables

Les cellules représentent des stations présentant 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. Représentez ce graphique pour envir_som dans une grille hexagonale et en utilisant l'argument codeRendering = "segments" pour représenter les variables.

___(___, type = ___, codeRendering = ___, shape = ___)
___(envir_som, type = "codes", codeRendering = ___, shape = ___)

#### ATTENTION: Hint suivant = solution !####
## Solution ##
plot(envir_som, type = "codes", codeRendering = "segments", shape = "straight")
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 gaunche de la carte alors que les concentrations les plus basses sont à droite. Les stations en bas de la carte présentent des concentrations plus élevée en `Al` et en `Fe` contrairement aux stations du haut. L'épaisseur de l'humus est la plus grande pour les stations en haut de la carte de même que la surface de sol nu. Le pH est, quant à lui, plus élevé dans les stations en bas à aux deux extrémités.")

Conclusion

Vous êtes arrivé à la fin de l'auto-évaluation relative aux cartes auto-adaptative. Vous avez acquis la maîtrise 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 un projet GitHub.

question_text(
  "Laissez-nous vos impressions sur cet outil pédagogique",
  answer("", TRUE, message = "Pas de commentaires... C'est bien aussi."),
  incorrect = "Vos commentaires sont enregistrés.",
  placeholder = "Entrez vos commentaires ici...",
  allow_retry = TRUE
)


BioDataScience-Course/BioDataScience2 documentation built on April 12, 2025, 9:45 a.m.