Skip to content

Commit a6bf316

Browse files
new version of B07Lb_ca
1 parent 7f603db commit a6bf316

File tree

1 file changed

+71
-163
lines changed

1 file changed

+71
-163
lines changed

inst/tutorials/B07Lb_ca/B07Lb_ca.Rmd

Lines changed: 71 additions & 163 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@ author: "Guyliann Engels & Philippe Grosjean"
44
description: "**SDD II Module 7** Analyse Factorielle des Correspondances."
55
tutorial:
66
id: "B07Lb_ca"
7-
version: 2.0.0/4
7+
version: 2.0.1/4
88
output:
99
learnr::tutorial:
1010
progressive: true
@@ -16,23 +16,10 @@ runtime: shiny_prerendered
1616
BioDataScience2::learnr_setup()
1717
SciViews::R("explore")
1818
19-
data("macroloire", package = "ade4")
20-
21-
envir <- macroloire$envir
22-
taxo <- macroloire$taxo
23-
24-
taxo$code <- rownames(taxo)
25-
species <- macroloire$labels
26-
species$code <- rownames(species)
27-
species <-left_join(species, taxo, by = "code")
28-
species <- janitor::clean_names(species)
29-
30-
invert <- as_dtx(t(macroloire$fau), rownames = "Station")
31-
invert2 <- smutate(invert, across(2:41, log1p))
32-
33-
column_to_rownames(invert2, "Station") %>.%
34-
ca(.) %->%
35-
invert_ca
19+
# caith -----
20+
caith <- read("caith", package = "MASS")
21+
caith_df <- as_dtf(caith)
22+
caith_ca <- ca(caith_df)
3623
```
3724

3825
```{r, echo=FALSE}
@@ -47,7 +34,7 @@ BioDataScience2::learnr_server(input, output, session)
4734

4835
## Objectifs
4936

50-
L'Analyse Factorielle des Correspondances (AFC) est une variante de l'Analyse en Composantes Principales (ACP) qui permet de traiter les variables qualitatives (deux variables qualitatives transformées en un tableau de contingence à double entrée). Elle permet aussi de traiter des variables quantitatives discrètes (entiers nuls ou positifs) comme des dénombrements d'espèces à divers stations, ce qui s'apparente également dans un certain sens à un tableau de contingence qui croise espèce et station. Ce tutoriel vous permettra de :
37+
L'Analyse Factorielle des Correspondances (AFC) est une variante de l'Analyse en Composantes Principales (ACP) qui permet de traiter les variables qualitatives (deux variables qualitatives transformées en un tableau de contingence à double entrée). Elle permet aussi de traiter des variables quantitatives discrètes (entiers nuls ou positifs) comme des dénombrements d'espèces à diverses stations, ce qui s'apparente également dans un certain sens à un tableau de contingence qui croise espèce et station. Ce tutoriel vous permettra de :
5138

5239
- Réaliser de manière guidée une AFC
5340

@@ -57,199 +44,120 @@ L'Analyse Factorielle des Correspondances (AFC) est une variante de l'Analyse en
5744

5845
Avant toute chose, assurez-vous d'avoir bien compris le contenu du [module 7](https://wp.sciviews.org/sdd-umons2/?iframe=wp.sciviews.org/sdd-umons2-2022/acp-afc.html) du cours et en particulier la [section 7.3](https://wp.sciviews.org/sdd-umons2/?iframe=wp.sciviews.org/sdd-umons2-2022/analyse-factorielle-des-correspondances.html).
5946

60-
## Les macroinvertébrés de la Loire (France)
47+
## Couleur des yeux et des cheveux
6148

62-
La Loire est un cours d'eau qui prend sa source dans le Massif Central pour se jeter dans l'Atlantique près de Nantes. Dans le jeu de données que nous traiterons ici, on dénombre 38 stations couvrant plus de 800 km du fleuve de sa source jusqu'à environ 200 km de son embouchure.
49+
L'étude porte sur 5387 personnes vivant dans l'ancienne région de Caithness, se situant au nord de l'Écosse.
6350

64-
```{r}
65-
chart(macroloire$envir, Altitude ~ Distance %label=% rownames(macroloire$envir)) +
66-
geom_point() +
67-
geom_line() +
68-
labs(y = "Altitude [m]", x = "Distance à la source [km]") +
69-
ggrepel::geom_label_repel()
51+
```{r, echo=TRUE}
52+
caith <- read("caith", package = "MASS")
53+
caith
7054
```
7155

72-
Une diminution rapide de l'altitude est observée de la source à 250 km de cette dernière. Ensuite, la diminution est linéaire jusqu'à la dernière station située à 10 m d'altitude. On peut observer un saut de plus de 50 km et de 150m d'altitude entre la station 8 (Serre de la Fare) et la station 9 (Vorey).
56+
Le tableau de données est un tableau de contingence à double entrée. Observez les colonnes. On en dénombre `r dim(caith)[2]` colonnes. La première colonne est particulièrement intéressante en portant un nom particulier `.rownames`.
7357

74-
Les chercheurs ont dénombré 40 espèces d'invertébrés présentées ci-dessous.
58+
Rappelez-vous que nous retrouvons plusieurs types d'objets pour les tableaux de données : les `data.frames`, les `data.tables` ou encore les `tibbles`. Par défaut en utilisant les fonctions `SciViews`, les tableaux de données sont des `data.tables`. Vous pouvez vérifier la classe d'un objet avec la fonction `class()`.
7559

76-
```{r}
77-
knitr::kable(species, col.names = c("Espèce", "Code", "Genre", "Famille", "Ordre"))
60+
```{r, echo=TRUE}
61+
class(caith)
7862
```
7963

80-
## Visualisation des données
64+
## Réalisation de l'ACF
8165

82-
Voici le tableau des dénombrements effectués.
66+
Le tableau nécessaire afin de réaliser une analyse factorielle des correspondances ne doit comprendre que des valeurs numériques. La première colonne `.rownames` est donc un problème. Une solution serait de la retirer avec la fonction `sselect()`. Elle n'est cependant pas la meilleure solution. Cette colonne apporte une information très intéressante dont on ne veut pas se passer. Il est donc préférable d'employer un objet différent. Les `data.frames` supporte les noms des lignes (*rownames*).
8367

84-
```{r}
85-
invert
86-
```
87-
88-
Élaborez un graphique permettant de visualiser les dénombrements des espèces réalisés par les chercheurs. Sélectionnez les colonnes intéressantes à l'aide de leur position. Votre tableau se nomme `invert`.
68+
Convertissez l'objet `caith` un `data.tables` en `data.frames` à l'aide de la fonction `as_dtf()`. Nommez ce nouvel objet `caith_df`.
8969

90-
```{r visu1_h2, exercise=TRUE}
91-
___ %>.%
92-
smutate(., station = 1:nrow(___)) %>.%
93-
spivot_longer(., ____:___, names_to = "species", values_to = "n") %>.%
94-
chart(., ___ ~ ___ %fill=% n) +
95-
geom_raster() +
96-
labs( x = "Station", y = "Espèce", fill = "N")
70+
```{r dtf, exercise=TRUE}
71+
caith_df <- ___(___)
72+
# affichez le tableau
73+
caith_df
9774
```
9875

99-
```{r visu1_h2-hint-1}
100-
invert %>.%
101-
smutate(., station = 1:nrow(invert)) %>.%
102-
spivot_longer(., ___:___, names_to = "species", values_to = "n") %>.%
103-
chart(., species ~ ___ %fill=% n) +
104-
geom_raster() +
105-
labs( x = "Station", y = "Espèce", fill = "N")
106-
107-
#### ATTENTION: Hint suivant = solution !####
76+
```{r dtf-solution}
77+
caith_df <- as_dtf(caith)
78+
# affichez le tableau
79+
caith_df
10880
```
10981

110-
```{r visu1_h2-solution}
111-
## Solution ##
112-
invert %>.%
113-
smutate(., station = 1:nrow(invert)) %>.%
114-
spivot_longer(., 2:41, names_to = "species", values_to = "n") %>.%
115-
chart(., species ~ station %fill=% n) +
116-
geom_raster() +
117-
labs( x = "Station", y = "Espèce", fill = "N")
82+
```{r dtf-check}
83+
grade_code("La conversion du tableau de données entre le `data.tables` en `data.frames` est simple avec la fonction `as_dtf()`. par defaut, la fonction reconnait la colonne .rownames et la converti en nom de ligne pour un objet de class data.frames qui les accepte.")
11884
```
11985

120-
```{r visu1_h2-check}
121-
grade_code("Ce graphique est peu lisible. Il y a des stations ou la même espèce a été observée plus de 200 fois. Il va falloir appliquer une transformation sur les données.")
122-
```
86+
Réalisez à présent une analyse factorielle des correspondances sur l'objet `caith_df` et nommez cet objet `caith_ca`. Proposez en plus le résumé de cet objet.
12387

124-
Le graphique précédent nous permet d'observer de grandes disparités entre les espèces. Vous allez devoir appliquer une modification mathématique afin de transformer les observations et de réduire les écarts entre les observations. Votre tableau comprend 41 colonnes dont la première est caractère. Il n'est donc pas possible de réaliser l'instruction suivante : DF \<- log1p(DF). Il n'est pas question d'écrire un `smutate()` avec 41 fois DF \<- smutate(DF, varx = log1p(varx),...). Il est possible de le faire bien plus simplement en utilisant par exemple `across()` au sein de la fonction `smutate()`. La fonction `across()` requiert les colonnes d'intérêt que vous pouvez spécifier par leur position. Un exemple pourrait être DF \<- smutate(DF, across(1:15, log)).
125-
126-
Vous avez à présent toutes les connaissances afin de transformer vos variables numériques avec la fonction `log1p()` et puis d'afficher le même graphique que précédemment.
127-
128-
```{r visu2_h2, exercise=TRUE}
129-
# Transformation des variables numériques
130-
invert2 <- smutate(invert, ___(___:___, ___))
131-
# Réalisation du même graphique que précédement.
132-
invert2 %>.%
133-
smutate(., station = 1:nrow(___)) %>.%
134-
spivot_longer(., ___:___, names_to = "species", values_to = "n") %>.%
135-
chart(., species ~ station %fill=% n) +
136-
geom_raster() +
137-
labs( x = "Station", y = "Espèce", fill = "N")
88+
```{r ca_h2, exercise=TRUE}
89+
# AFC
90+
___ <- ___()
91+
# Résumé de l'objet
92+
___(___)
13893
```
13994

140-
```{r visu2_h2-hint-1}
141-
# Transformation des variables numériques
142-
invert2 <- smutate(invert, across(___:___, log1p))
143-
# Réalisation du même graphique que précédement.
144-
invert2 %>.%
145-
smutate(., station = 1:nrow(___)) %>.%
146-
spivot_longer(., ___:___, names_to = "species", values_to = "n") %>.%
147-
chart(., species ~ station %fill=% n) +
148-
geom_raster() +
149-
labs( x = "Station", y = "Espèce", fill = "N")
150-
151-
#### ATTENTION: Hint suivant = solution !####
95+
```{r ca_h2-hint-1}
96+
# AFC
97+
caith_ca <- ca()
98+
# Résumé de l'objet
99+
___(caith_ca)
152100
```
153101

154-
```{r visu2_h2-solution}
155-
## Solution ##
156-
# Transformation des variables numériques
157-
invert2 <- smutate(invert, across(2:41, log1p))
158-
# Réalisation du même graphique que précédement.
159-
invert2 %>.%
160-
smutate(., station = 1:nrow(invert2)) %>.%
161-
spivot_longer(., 2:41, names_to = "species", values_to = "n") %>.%
162-
chart(., species ~ station %fill=% n) +
163-
geom_raster() +
164-
labs( x = "Station", y = "Espèce", fill = "N")
102+
```{r ca_h2-solution}
103+
# AFC
104+
caith_ca <- ca(caith_df)
105+
# Résumé de l'objet
106+
summary(caith_ca)
165107
```
166108

167-
```{r visu2_h2-check}
168-
grade_code("Vous venez d'ajouter à votre liste de fonction utile, la fonction `across()`. N'hésitez pas à consulter la page d'aide de cette fonction. La transformation `log(x + 1)` fut très efficace afin de réduire les écarts entre les observations. On observe par exemple que *Hydropsyche contubernalis* (E26) et Hydropsyche exocellata (E28) sont des espèces présentes dans de très nombreuses stations.")
109+
```{r ca_h2-check}
110+
grade_code("Le code est simple à réaliser. Le résumé de l'objet met en avant qu'avec les deux premiers axes ont couvre 99.6% de la variance. Le premier axe couvre plus de 86%. L'essentiel de l'information se lira sur ce seul axe.")
169111
```
170112

171-
## AFC
113+
Proposez le graphique des éboulis associé à l'objet `caith_ca`
172114

173-
Calculez à présent votre AFC avec la fonction `ca()` et nommez votre objet `invert_ca`. La variable `Station` ne doit pas être employée dans l'AFC. Nous vous proposons de débuter par retirer la variable Station et la placer comme nom des lignes du tableau `invert2` à l'aide de `column_to_rownames()`. Consultez la page d'aide de cette fonction afin d'en connaitre les arguments.
115+
```{r scree, exercise=TRUE}
116+
___$___()
117+
```
174118

175-
```{r ca_h3, exercise=TRUE}
176-
# Conversion de la colonne Station en nom de lignes
177-
invert2 <- ___(___, var = ___)
178-
# Calcul de l'AFC
179-
___ <- ___(___)
180-
# Affichage du résumé
181-
summary(___, rows = FALSE, columns = FALSE)
119+
```{r scree-solution}
120+
chart$scree(caith_ca)
182121
```
183122

184-
```{r ca_h3-hint-1}
185-
# Conversion de la colonne Station en nom de lignes
186-
invert2 <- ___(invert2, var = "___")
187-
# Calcul de l'AFC
188-
___ <- ___(invert2)
189-
# Affichage du résumé
190-
summary(___, rows = FALSE, columns = FALSE)
123+
```{r scree-check}
124+
grade_code("Ce graphique vient en complément du premier tableau proposé dans le résumé. On observe que le premier axe comprend une grande part de la variance.")
191125
```
192126

193-
```{r ca_h3-hint-2}
194-
# Conversion de la colonne Station en nom de lignes
195-
invert2 <- column_to_rownames(invert2, var = "Station")
196-
# Calcul de l'AFC
197-
___ <- ___(invert2)
198-
# Affichage du résumé
199-
summary(____, rows = FALSE, columns = FALSE)
127+
Proposez enfin la carte (biplot) de votre objet `caith_ca`.
200128

201-
#### ATTENTION: Hint suivant = solution !####
129+
```{r biplot, exercise=TRUE}
130+
___$___()
202131
```
203132

204-
```{r ca_h3-solution}
205-
## Solutions
206-
# Conversion de la colonne Station en nom de lignes
207-
invert2 <- column_to_rownames(invert2, var = "Station")
208-
# Calcul de l'AFC
209-
invert_ca <- ca(invert2)
210-
# Affichage du résumé
211-
summary(invert_ca, rows = FALSE, columns = FALSE)
133+
```{r biplot-solution}
134+
chart$biplot(caith_ca)
212135
```
213136

214-
```{r ca_h3-check}
215-
grade_code("La fonction column_to_rownames() a son inverse qui est rownames_to_column(). Ajoutez ces deux fonctions à votre boite à outils des fonctions utiles. Concernant le résumé de votre AFC, notez que les deux premières dimensions ne capture que 31 % de la Variabilité totale.")
137+
```{r biplot-check}
138+
grade_code("Ce graphique va s'analyser en 3 étapes. On va d'abord s'intéresser aux yeux, puis au cheveux et enfin les deux ensembles. Faites le travail par vous même avant de vous rendre dans la section suivante pour comparer votre analyse avec celle que nous vous proposons.")
216139
```
217140

218-
Réalisez à présent le graphique des éboulis et la carte (biplot) de votre objet `invert_ca`
219-
220-
```{r ca_plot_h2, exercise = TRUE}
221-
# graphe des éboulis
222-
___(___)
223-
# biplot
224-
chart$biplot(___, choices = c(1, 2), repel = TRUE)
225-
```
141+
## Interprétation de ACF
226142

227-
```{r ca_plot_h2-hint-1}
228-
# graphe des éboulis
229-
chart$___(___)
230-
# biplot
231-
chart$___(___, choices = c(1, 2), repel = TRUE)
143+
Les instructions réalisées pour obtenir l'AFC sont assez simples, mais toute la subtilité vient de l'analyse des résultats.
232144

233-
#### ATTENTION: Hint suivant = solution !####
145+
```{r}
146+
caith_df <- as_dtf(read("caith", package = "MASS"))
147+
caith_ca <- ca(caith_df)
148+
summary(caith_ca)
149+
chart$biplot(caith_ca, repel = TRUE)
234150
```
235151

236-
```{r ca_plot_h2-solution}
237-
## Solution ##
238-
# graphe des éboulis
239-
chart$scree(invert_ca)
240-
# biplot
241-
chart$biplot(invert_ca, choices = c(1, 2), repel = TRUE)
242-
```
152+
Les deux premiers axes couvrent 99.6% de la variance. Du point de vue des cheveux, on observe une transition des cheveux clairs à gauche vers les cheveux foncés à droite. Du point de vue des yeux, les yeux clairs sont à gauche et les yeux foncés à droite.
243153

244-
```{r ca_plot_h2-check}
245-
grade_code("La part de la variance exprimée par l'AFC est faible avec à peine plus de 30%. On peut néanmoins observer des éléments intéressants. Nous observons la forme typique du fer à cheval lors de la réalisation d'un transect. Certaines espèces de trichoptères comme *Agapetus delicatulus*, *Philopotamus montanus* ou encore *Plectrocnemia geniculata*, et de coléoptère comme *Limnius perrisi* ou *Esolus angustatus* sont plus présente dans les stations de plus haute altitude (S1-S3).")
246-
```
154+
On observe la même transition du clair vers le foncé aussi bien pour les cheveux que pour les yeux. Les individus aux yeux clairs vont être liés aux cheveux clairs et les individus aux yeux foncés sont associés aux cheveux foncés.
247155

248156
## Conclusion
249157

250158
Cette AFC nous a permis d'y voir plus clair entre les différentes stations et les espèces qui y vivent. Sans rien connaître sur ces espèces, nous avons pu mettre en évidence une tendance.
251159

252-
Maintenant que vous avez compris la logique, que vous maîtriser les techniques pour préparer vos données et que vous êtes capable d'écrire le code permettant de réaliser une AFC, vous pouvez appliquer tout cela dans une assignation GitHub (voir dans le cours).
160+
Maintenant que vous avez compris la logique, que vous maîtrisez les techniques pour préparer vos données et que vous êtes capable d'écrire le code permettant de réaliser une AFC, vous pouvez appliquer tout cela dans une assignation GitHub (voir dans le cours).
253161

254162
```{r comm_noscore, echo=FALSE}
255163
question_text(

0 commit comments

Comments
 (0)