BioDataScience2::learnr_setup() SciViews::R("explore") # Preparation dataset data("doubs", package = "ade4") envir <- as_dtx(doubs$env) fish <- as_dtx(doubs$fish)
BioDataScience2::learnr_banner()
BioDataScience2::learnr_server(input, output, session)
N'entamez ce tutoriel qu'après avoir compris le principe des k-moyennes et les indices de diversité proposés dans le module 6 du cours. Assurez-vous d'avoir réalisé les exercices H5P qui s'y trouvent avant de vous lancer dans ce tutoriel-ci.
Nous utilisons ici les mêmes jeux de données longuement présentés dans le tutoriel précédent sur la classification ascendante hiérarchique. Trente stations ont été échantillonnées le long du Doubs, une rivière qui serpente entre la France et la Suisse.
{width="60%"}
Les données environnementales se trouvent dans le tableau envir
dont voici les premières lignes :
head(envir)
Pour rappel, le tableau suivant reprend les onze variables mesurées. Rappelez-vous que les auteurs de l'étude d'où sont issues ces données ont décidé d'appliquer des coefficients multiplicateurs pour homogénéiser les données :
| label | description | unités * coef |
|:-------:|:---------------------------------|:---------------|
| dfs | distance depuis la source | km * 10 |
| alt | altitude | m |
| slo | pente des berges en log(x + 1)
| ‰ * 100 |
| flo | flux moyen minimum | m^3^/s * 100 |
| pH | pH de l'eau | - * 10 |
| har | dureté totale de l'eau | mg Ca^++^/L |
| pho | phosphates | mg/L * 100 |
| nit | nitrates | mg/L * 100 |
| amm | azote ammoniacal | mg/L * 100 |
| oxy | oxygène dissout | mg/L * 10 |
| bdo | demande biologique en oxygène | mg/L * 10 |
Les observations relatives à la distribution des poissons sont disponibles dans le tableau fish
dont voici les premières lignes. Pour rappel, les valeurs sont toutes bornées entre 0 et 5. Il s'agit en fait de classes d'abondance, avec 0 = absence et 5 = abondance maximale, voir ce descriptif complet{target="_blank"}.
head(fish)
Les 27 espèces de poissons étudiées au sein des 30 stations sont présentées dans le tableau ci-dessous
doubs$species %>.% sselect(., -English) %>.% smutate(., Scientific = paste0("*", Scientific, "*")) %>.% srename(., `Nom scientifique` = Scientific, `Nom français` = French, Code = code) %>.% knitr::kable(.)
Référence
Verneaux, J. (1973) Cours d'eau de Franche-Comté (Massif du Jura). Recherches écologiques sur le réseau hydrographique du Doubs. Essai de biotypologie. Thèse d'état, Besançon. 1--257.
La méthode des k-moyennes (k-means en anglais) permet de réaliser des regroupements d'individus en partant d'un tableau multivarié. Elle a donc le même objectif que la classification ascendante hiérarchique (CAH) que vous avez découverte précédemment. La méthode des k-moyennes a l'avantage, par rapport à la classification ascendante hiérarchique, d'être moins gourmande en temps de calcul et en mémoire vive. Elle sera donc à privilégier lorsque vous vous retrouvez confronté à un grand jeu de données. Par contre, elle est souvent moins efficace que la CAH.
Dans ce tutoriel, les données employées ne sont pas de gros jeux de données, et vous avez pu constater que la CAH s'y applique facilement. Néanmoins, nous les conservons à des fins de comparaison entre les deux techniques k-moyennes et CAH.
Avec la méthode des k-moyennes, vous devez spécifier le nombre de groupes que vous souhaitez réaliser à l'avance. Souvent, à ce stade de l'analyse, il est inconnu. Vous pouvez utiliser profile_k()
pour vous aider à choisir la valeur de k qui diminuera le plus la somme des carrés des distances intragroupes, comme indicateur de la qualité de votre regroupement.
Sur base du jeu de données envir
, réalisez un graphique permettant d'estimer le nombre de groupes à employer dans la méthode des k-moyennes. Les variables mesurées ayant des unités différentes, n'oubliez pas de standardiser vos données en utilisant la fonction scale()
et assignez-les ensuite à envir_scale
. Ce n'est pas le cas pour ce jeu de données, mais pensez aussi à éliminer les colonnes non numériques à l'aide de select()
si vous en avez dans votre tableau de départ.
envir_scale <- ___(___) ___(___)
envir_scale <- ___(envir) ___(envir_scale) #### ATTENTION: Hint suivant = solution !####
## Solution ## envir_scale <- scale(envir) profile_k(envir_scale)
grade_code("Avec de ce graphique, vous avez un outil qui peut vous aider à déterminer le nombre *k* de centres à utiliser. La valeur obtenue pour *k* = 1 nous indique de combien les données sont dispersées. En augmentant la valeur de *k*, l'objectif est de faire des regroupements pour diminuer cette variance intragroupe, mais pas au delà d'une valeur qui ne diminuerait plus de manière importante.")
question("Sur base du graphique que vous avez réalisé, quelle valeur de *k* utiliseriez-vous ?", answer("1"), answer("2"), answer("3"), answer("4", correct = TRUE), answer("5"), answer("Plus de 5"), allow_retry = TRUE, correct = "Bravo, vous avez trouvé la bonne réponse. Sur le graphique, on choisira une valeur de *k* à la base du coude, lorsque l'ajout d'un *k* supplémentaire ne permet plus de faire baisser la valeur de manière importante.", incorrect = "Retentez votre chance. Nous recherchons des sauts importants dans la décroissance de la somme des carrés (*total within sum of square*). L'objectif est de choisir la valeur de *k* à la base du coude, lorsque l'ajout d'un *k* supplémentaire ne permet plus de faire baisser la somme des carrés de manière importante.")
Maintenant que vous avez défini la valeur de k que vous allez utiliser, vous pouvez procéder au calcul des k-moyennes en utilisant la fonction k_means()
. Vous lui fournirez le tableau de départ contenant uniquement des valeurs numériques, éventuellement standardisées, et spécifierez le nombre k =
de groupes souhaités.
La position initiale des k centres est déterminée aléatoirement. Le résultat final peut donc varier et ne pas être optimal. Pour éviter cela, nous pouvons utiliser l'argument nstart =
qui testera différentes situations de départ pour conserver le meilleur résultat. Par défaut, une seule situation aléatoire de départ nstart = 1
est considérée. Avec une valeur plus importante de nstart =
, votre analyse sera plus robuste... mais cela augmentera le temps de calcul.
En utilisant le tableau standardisé mis à votre disposition et enregistré sous envir_scale
, réalisez un regroupement avec la fonction k_means()
. Utilisez pour cela une valeur k de 4 et 25 positions de départ différentes.
envir_scale <- as_dtx(scale(envir))
set.seed(210219) (envir_kmn <- ___(___, ___ = ___, nstart = ___))
set.seed(210219) (envir_kmn <- ___(envir_scale, ___ = 4, nstart = 25)) #### ATTENTION: Hint suivant = solution !####
## Solution ## set.seed(210219) (envir_kmn <- k_means(envir_scale, k = 4, nstart = 25))
grade_code("Vous venez de réaliser votre première classification par les k-moyennes ! La sortie que vous obtenez est l'impression du contenu de l'objet **k_means** qui vous donne beaucoup d'information. Vous avez le nombre de stations présentes dans chaque groupe (2, 12, 6 et 10). Ensuite, la section \"Cluster means\" reprend les positions des centres pour les quatre groupes que vous avez réalisés. Une mesure de la qualité de regroupement de vos données est présentée dans \"Within cluster sum of squares\", 69.3% ici. Plus cette valeur sera proche de 100% mieux ce sera.")
Tracez un graphique des nitrates nit
en fonction de l'oxygène dissout oxy
. Regroupez les stations par de la couleur en utilisant les groupes que vous avez calculés et représentez les centres sur votre graphique.
envir_scale <- as_dtx(scale(envir)) set.seed(210219) envir_kmn <- k_means(envir_scale, k = 4, nstart = 25)
___(___, ___ = ___)
chart(___, ___ = c(___, ___))
chart(___, choices = c("___", "___")) #### ATTENTION: Hint suivant = solution !####
## Solution ## chart(envir_kmn, choices = c("oxy", "nit"))
grade_code("Vous voyez comme c'est facile ! Les fonctions `SciViews::R` vous facilitent la tâche. Naturellement, vous pouvez aussi choisir d'autres paires de variables pour visualiser votre regroupement.")
La notion de diversité est complexe. On peut néanmoins faire ressortir deux éléments principaux que sont le nombre d'espèces différentes présentes sur la zone d'étude et l'abondance de chaque espèce. Il existe une multitude d'indices, dont la richesse spécifique, l'indice de Simpson, l'indice de Shannon...
Un des premiers indices mis au point est la richesse spécifique. Cet indice dénombre les espèces dans les stations étudiées. À titre d'exercice, déterminez la richesse spécifique pour chaque station du tableau fish
en utilisant la fonction adéquate.
___::___(___)
vegan::___(fish) #### ATTENTION: Hint suivant = solution !####
## Solution ## vegan::specnumber(fish)
grade_code("La fonction `specnumber()` du package {vegan} effectue ce calcul. Inspectez le résultat afin de répondre à la question suivante.")
question("Quelle est la station avec la richesse spécifique la plus élevée ?", answer("Station 1"), answer("Station 8"), answer("Station 15"), answer("Station 29", correct = TRUE), answer("Station 30"), allow_retry = TRUE, correct = "Vous avez trouvé la bonne réponse.", incorrect = "Retentez votre chance. Les stations sont affiché de la numéro 1 à la numéro 30.")
Cet indice est simple et facile à comprendre. Attention, toutefois, qu'il ne tient pas compte de l'abondance de chaque espèce étudiée dans les stations, ni des compositions respectives entre les stations (espèces communes ou exclusives à l'une ou l'autre station). Il est donc utile de compléter votre étude en ajoutant une information complémentaire.
Vous avez découvert une série d'indices de similarité ou de dissimilarité au cours de ce module 6. Nous vous proposons d'employer à présent l'indice de Jaccard. Cet indice permet une comparaison entre deux sites en calculant le rapport entre les espèces communes aux deux sites et celles propres à chaque relevé. La formule est la suivante :
$$J = \frac{N_c}{N_1 + N2 – N_c}$$
où :
Les valeurs de l'indice varient entre 0 lorsque les deux sites n'ont aucune espèce en commun, et 1 quand les deux sites ont toutes leurs espèces en commun. Utilisez l'indice de Jaccard pour calculer une matrice de distance entre les trente stations.
Comparez les stations entre elles deux à deux à l'aide de l'indice de Jaccard sur le tableau fish
. Nommez cet objet fish_jacc
.
fish_jacc <- ___(___, method = ___, binary = ___)
fish_jacc <- ___(___, method = "jaccard", binary = TRUE) #### ATTENTION: Hint suivant = solution !####
## Solution ## fish_jacc <- dissimilarity(fish, method = "jaccard", binary = TRUE)
grade_code("L'indice de Jaccard nécessite des données de type présence/absence (1 ou 0). Le tableau `fish` présente des abondances en semi-quantitatif (valeurs entre 0 et 5). Grâce à l'argument `binary = TRUE`, ce tableau est transformé en présence/absence à l'intérieur du calcul de `dissimilarity()` afin qu'il convienne ensuite au calcul de cet indice.")
À présent que vous avez obtenu votre matrice de distance (fish_jacc
), vous pouvez effectuer un regroupement à l'aide de la CAH avec la méthode ward.D2
et en tracer un dendrogramme.
fish_jacc <- dissimilarity(fish, method = "jaccard", binary = TRUE)
# Calcul de la CAH avec la méthode des liens "ward.D2" fish_clust <- ___(___, ___) # Dendrogramme horizontal ___(___)
# Calcul de la CAH avec la méthode des liens "ward.D2" fish_clust <- cluster(___, method = ___) # Dendrogramme horizontal chart$___(fish_clust)
# Calcul de la CAH avec la méthode des liens "ward.D2" fish_clust <- cluster(fish_jacc, method = "ward.D2") # Dendrogramme horizontal chart$horizontal(fish_clust)
grade_code("Vous avez obtenu un dendrogramme horizontal intéressant. On peut, par exemple, observer que les station 23, 24 et 25 sont regroupées. Elles se différencient des stations précédentes (16-22) et des stations suivantes (26-30) du point de vue de la diversité selon l'indice de Jaccard (on ne tient pas compte de la station 8 qui ne comprend pas espèce).")
Vous venez de terminer votre auto-évaluation relative à la classification par les k-moyenne et les indices de diversité. Vous allez maintenant appliquer ces techniques sur d'autres données 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 )
Add the following code to your website.
For more information on customizing the embed code, read Embedding Snippets.