BioDataScience2::learnr_setup()
SciViews::R("explore", lang = "fr")
BioDataScience2::learnr_banner()
BioDataScience2::learnr_server(input, output, session)

Objectifs

L'Analyse Factorielle Multiple (AFM) est une méthode statistique exploratoire qui permet de travailler avec plusieurs tableaux de données. Cette méthode permet également de faire le lien entre l'analyse en composantes principales (ACP) et l'Analyse factorielle des correspondances (AFC). La première méthode permet de travailler uniquement sur des variables quantitatives et la seconde uniquement sur des variables qualitatives. L'AFM est capable de traiter les deux types de variables simultanément. Cette méthode est, par exemple, employée en écologie. Sur une station un ensemble de mesures physico-chimiques peuvent être réalisées ainsi qu'un relevé de la faune et/ou de la flore.

Il est donc utile de comprendre la logique et l'usage de cette analyse. Ce tutoriel vous permettra de :

Avant toute chose, assurez vous d'avoir bien compris le contenu de la section 8.1 du cours de SDD II.

Étude de composition floristique

Des chercheurs ont étudié la composition floristique et les variables environnementales dans des forêts de pins sylvestres (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, by Mapsed, license CC-BY-SA 4.0

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 de l'é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 | µg/g de MO | | K | potassium | µg/g de MO | | Ca | calcium | µg/g de MO | | Mg | magnésium | µg/g de MO | | S | soufre | µg/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 | - |

Ces données sont disponibles depuis varechem dans le package {vegan} et nous en réaliserons un tableau nommé envir.

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

Les scientifiques ont également réalisé un relevé floristique (en excluant Pinus sylvestris du relevé). On y observe une couverture en pourcentage pour chaque station de chacune des 44 espèces étudiées. Ces données sont disponibles depuis varespec dans le package {vegan} que nous lirons dans la variable spec.

read("varespec", package = "vegan") %>.%
  srename(., station = .rownames) ->
  spec
head(spec)

Les données mises à disposition proviennent de l'étude suivante Väre, H., Ohtonen, R. and Oksanen, J. (1995) Effects of reindeer grazing on vegetation in dry Pinus sylvestris forests. Journal of Vegetation Science 6, 523--530.

Préparation du tableau de données

La première étape consiste dans la réalisation d'un tableau de données unique. Vous allez donc combiner le tableau envir avec le tableau spec en un seul objet nommé vare en spécifiant la colonne similaire entre ces deux tableaux qui est la variable station et qui servira de point de référence à la fusion. Affichez ensuite les premières lignes du tableau vare avec la fonction head().

read("varechem", package = "vegan") %>.%
  srename(., station = .rownames) ->
  envir
read("varespec", package = "vegan") %>.%
  srename(., station = .rownames) ->
  spec
vare <- sleft_join(___ , ___, by = "___")
head(___)
vare <- sleft_join(envir , spec, by = "___")
head(___)

#### ATTENTION: Hint suivant = solution !####
## Solution ##
vare <- sleft_join(envir , spec, by = "station")
head(vare)
grade_code("Maintenant que vous avez assemblé vos deux tableaux, vous allez pouvoir réaliser votre MFA. Il reste toutefois encore une petite étape avant cela.")

Il va encore falloir convertir la variable station en nom de ligne grâce à la fonction column_to_rownames(). Les numéros de stations seront utilisés par la suite sur la représentation dans l'espace de vos stations.

read("varechem", package = "vegan") %>.%
  srename(., station = .rownames) ->
  envir
read("varespec", package = "vegan") %>.%
  srename(., station = .rownames) ->
  spec

vare <- sleft_join(envir , spec, by = "station")
vare <- column_to_rownames(___, var = "___")
# Vérification des noms des lignes avec rownames()
rownames(___)
vare <- column_to_rownames(vare, var = "___")
# Vérification des noms des lignes avec rownames()
rownames(vare)

#### ATTENTION: Hint suivant = solution !####
## Solution ##
vare <- column_to_rownames(vare, var = "station")
# Vérification des noms des lignes avec rownames()
rownames(vare)
grade_code("Bravo ! Vous venez de convertir la colonne station en nom de lignes. Cette astuce peut être utile dans certain cas. Il y a également la fonction inverse `rownames_to_column()`. Tout est prêt pour réaliser l'AFM à présent.")

Réalisation de l'AFM

L'AFM peut s'obtenir grâce à la fonction mfa(). Cette dernière requiert l'utilisation d'une formule avec une syntaxe un peu particulière. Votre formule commence par un ~ puis elle est composée de blocs qui doivent contenir trois éléments :

  1. Le nombre n de colonnes constituant le groupe
  2. Le type des variables qui composent le groupe. Vous avez quatre possibilités :

    • std : variables quantitatives que l'on souhaite standardiser et traiter par une ACP

    • num : variables quantitatives continues que l'on ne souhaite traiter par une ACP sans les standardiser

    • fct : variables qualitatives facteurs associées à des tableaux de contingences qu'on traite par une AFC

    • cnt : variables quantitatives de type dénombrements qu'on traite par une AFC

    • Le nom à donner au groupe

Le tableau vare est composé de quatorze variables associées à des mesures physico-chimiques et 44 variables liées à des relevés floristiques. Votre formule doit comprendre les éléments suivants pour que votre analyse soit la plus proche possible de celle que les auteurs ont réalisée dans la publication :

Réalisez l'AFM demandée en utilisant le tableau vare puis affichez un résumé de l'objet vare_mfa obtenu avec la fonction summary()

read("varechem", package = "vegan") %>.%
  srename(., station = .rownames) ->
  envir
read("varespec", package = "vegan") %>.%
  srename(., station = .rownames) ->
  spec
vare <- sleft_join(envir , spec, by = "station")
vare <- column_to_rownames(vare, var = "station")
vare_mfa <- mfa(data = ___, ~ ___*___ %as% ___ + ___*___ %as% ___)
summary(___)
vare_mfa <- mfa(data = vare, ~ ___*___ %as% ___ + ___*___ %as% ___)
summary(vare_mfa)
vare_mfa <- mfa(data = vare, ~ 14*std %as% physico + ___*___ %as% ___)
summary(vare_mfa)

#### ATTENTION: Hint suivant = solution !####
## Solution ##
vare_mfa <- mfa(data = vare, ~ 14*std %as% physico + 44*num %as% flore)
summary(vare_mfa)
grade_code("Le résumé de votre analyse est complexe. Intéressez-vous en premier lieu à la part de variance représentée sur chaque axe. Cette information vous sera utile pour répondre à la question suivante.")
question("Quelle est la proportion de la variance cumulée sur les deux premiers axes de l'AFM ?",
  answer("58%", correct = TRUE),
  answer("23%"),
  answer("34%"), 
  correct = "Bien joué ! Les deux premiers axes de l'AFM expriment 58% de la variance. Gardez à l'esprit que cette valeur est assez faible. Il serait aussi intéressant de considérer les trois premiers axes qui expriment 68% de la variance totale.",
  incorrect = "Oups, ce n'est pas la bonne réponse. Afin de trouver la bonne réponse, relisez le tableau `Eigenvalues` de votre analyse",
  allow_retry = TRUE
    )

Graphique des éboulis

Réalisez un graphique des éboulis sur l'objet vare_mfa que vous avez créé plus haut.

read("varechem", package = "vegan") %>.%
  srename(., station = .rownames) ->
  envir
read("varespec", package = "vegan") %>.%
  srename(., station = .rownames) ->
  spec

vare <- sleft_join(envir , spec, by = "station")
vare <- column_to_rownames(vare, var = "station")

vare_mfa <- mfa(data = vare, ~ 14*std %as% physico + 44*num %as% flore)
chart$___(___)
chart$___(vare_mfa)

#### ATTENTION: Hint suivant = solution !####
## Solution ##
chart$scree(vare_mfa)
grade_code("Ce graphique des éboulis permet de visualiser la part de variance exprimée sur chaque composante principale. Nous voyons bien que le premier axe reprend une très grande part de variance. On observe un saut pour le troisième axe et une diminution progressive de la variance exprimée sur les axes suivants.")

Représentation des variables

Réalisez un graphique permettant de visualiser les variables dans le premier plan de l'AFM.

chart$___(___ , choices = c(___, ___))
chart$___(vare_mfa, choices = c(___, ___))

#### ATTENTION: Hint suivant = solution !####
## Solution ##
chart$loadings(vare_mfa, choices = c(1, 2))
grade_code("Ce graphique est assez chargé car il combine les vecteurs du groupe \"physico\" et du groupe \"flore\". Il s'analyse comme pour une ACP via la visualisation de l'importance des variables intiales dans le plan de l'AFM sous forme de vecteurs. Il est indispensable pour interpréter le graphique suivant qui répartit les observations dans le même plan. La norme (longueur) du vecteur indique si la variable est bien représentée dans ce plan ou non. Plus la norme du vecteur se rapproche de l'unité, matérialisée par le cercle, mieux c'est. Les vecteurs aux normes trop faibles ne sont pas considérés dans l'analyse, pour ce plan-là en tous cas. Ensuite, les variables qui pointent dans la même direction sont corrélées positivement. Les variables qui pointent dans le sens opposé sont inversément corrélées. Les vecteurs orthogonaux correspondent à des variables non ou très faiblement corrélées entre elles.")

Représentation des plans des ACP

L'AFM est un compromis réalisé entre les analyses indépendantes des différents tableaux. Réalisez une représentation des plans des ACP.

chart$___(___, choices = c(___, ___))
chart$___(vare_mfa, choices = c(___, ___))

#### ATTENTION: Hint suivant = solution !####
## Solution ##
chart$axes(vare_mfa, choices = c(1, 2))
grade_code("Ce graphique est similaire au précédent. Il s'interprète de la même façon. Cependant, on ne s'intéresse plus à la projection de chaque variable initiale mais des plans des ACP pour chaque groupe de variables. La première dimension du groupe \"flore\" pointe dans la même direction que la seconde dimension du groupe \"physico\". Il y a donc un forte corrélation entre ces deux plans. On obtient le même résultat pour le premier axe de \"physico\" et du second axe de \"flore\". Les normes des vecteurs sont proche de un pour chacune des ACP. Les deux ACP sont représentées correctement dans l'AFM.")

Représentation des individus

Réalisez un graphique permettant de visualiser les individus dans le premier plan de l'AFM constitué des deux premières composantes principales.

chart$___(___, choices = c(___, ___))
chart$___(vare_mfa, choices = c(___, ___)) 

#### ATTENTION: Hint suivant = solution !####
## Solution ##
chart$scores(vare_mfa, choices = c(1, 2))
grade_code("La forme du nuage de points et la présence de différents groupes sont à observer ici. Nous pouvons voir, par exemple, un regroupement des stations 5, 6 et 7. On retrouve également un groupe particulier composé des stations 2, 3, 4, 9, 10, 11 et 12. Attention, les numéros des stations ne sont pas ici une indication de leur proximité les unes des autres.")

Interprétation de l'AFM

La représentation des variables ainsi que la représentation de stations sont deux graphiques complémentaires qui permettent d'interpréter l'AFM. Gardez à l'esprit que la part de variance exprimée par les deux premiers axes reste relativement faible avec 58%.

read("varechem", package = "vegan") %>.%
  srename(., station = .rownames) ->
  envir
read("varespec", package = "vegan") %>.%
  srename(., station = .rownames) ->
  spec

vare <- sleft_join(envir , spec, by = "station")
vare <- column_to_rownames(vare, var = "station")

vare_mfa <- mfa(data = vare, ~ 14*std %as% physico + 44*num %as% flore)

chart$scores(vare_mfa, choices = c(1, 2))
chart$loadings(vare_mfa, choices = c(1, 2))

Les stations 2, 3, 4, 9, 10, 11 et 12 sont des stations particulières qui ne sont pas des zones de pâturages. On retrouve dans ces stations une dominance de Cladina stellaris alors que cette espèce est très peu présente dans les zones de pâturages. Les zones de pâturages sont caractérisées par une haute concentration en azote. Les stations 5, 6 et 7 sont des zones de pâturages avec une forte teneur en azote et une présence massive de Cladina arbuscala.

Nous n'irons pas plus loin dans l'interprétation de cette AFM et vous laissons la possibilité de lire la publication liée à cette étude. Les scientifiques ont réalisé une NMDS en fait, pas une AFM, mais les résultats obtenus sont assez proches. Nous étudierons la MDS et la NMDS dans le module suivant du cours.

Conclusion

Cette AFM vous a permis d'analyser deux tableaux contenant des variables quantitatives, traités différemment (l'un standardisé, l'autre pas) en même temps. L'AFM permet aussi d'y adjoindre des groupes qualitatifs avec des analyses de type AFC. Cette méthode multi-tableaux est donc très polyvalente (mais notez qu'il en existe d'autres aussi).

Maintenant que vous avez compris la logique et que vous êtes capable d'écrire le code permettant de réaliser une AFM, vous pouvez appliquer cette technique par vous-même (assignation GitHub dans le cours).

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.