Skip to content

Commit 258d576

Browse files
last of major updates to book (FR)
1 parent caeba74 commit 258d576

13 files changed

+665
-441
lines changed

book-en/06-generalization.Rmd

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@ We will now go over these aspects.
1212

1313
So far, we have worked with simple (Gaussian) additive models, the non-linear equivalent to a linear model.
1414

15-
However, ecological datasets often do not fit the assumptions rof Gaussian models. So, what can we do if the observations of the response variable do **not follow a Normal distribution**? Or if the **variance is not constant** (heteroscedasticity)?
15+
However, ecological datasets often do not fit the assumptions of Gaussian models. So, what can we do if the observations of the response variable do **not follow a Normal distribution**? Or if the **variance is not constant** (heteroscedasticity)?
1616

1717
Just like generalized linear models (GLM), we can formulate **generalized** additive models to deal with these issues.
1818

@@ -217,7 +217,7 @@ AIC(smooth_interact, smooth_interact_tw)
217217
```
218218

219219
:::explanation
220-
AIC allows us to compare models that are based on different distributions
220+
AIC allows us to compare models that are based on different distributions!
221221
:::
222222

223223
The AIC score for `smooth_interact_tw` is _much_ smaller than the AIC score for the `smooth_interact`. Using a *Tweedie* instead of a *Normal* distribution greatly improves our model!

book-fr/01-preparation-pour-l-atelier.Rmd

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -36,7 +36,6 @@ Tout le matériel de l'atelier se trouve sur [r.qcbs.ca/fr/workshops/r-workshop-
3636
Pour cet atelier, nous travaillerons avec les jeux de données suivants :
3737

3838
* [ISIT.csv](https://r.qcbs.ca/workshop08/pres-en/data/ISIT.csv)
39-
* [other_dist.csv](https://r.qcbs.ca/workshop08/pres-en/data/other_dist.csv)
4039

4140
Vous devriez également vous assurer que vous avez téléchargé, installé et chargé les librairies R suivants:
4241

book-fr/02-introduction-fr.Rmd

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -21,11 +21,15 @@ $$y_i = \beta_0 + \beta_1x_{1,i}+\beta_2x_{2,i}+\beta_3x_{3,i}+...+\beta_kx_{k,i
2121

2222
Les modèles linéaires fonctionnent très bien dans certains cas spécifiques où tous ces critères sont respectés:
2323

24-
![](images/linreg.png)
24+
```{r, fig.align = 'center', out.width = '70%', echo = FALSE, purl = FALSE}
25+
knitr::include_graphics("images/linreg.png")
26+
```
2527

26-
Dans la réalité, il est souvent impossible de respecter ces critères. Cela signifie que, dans de nombreux cas, les modèles linéaires sont inappropriés:
28+
En réalité, il est souvent impossible de respecter ces critères. Cela signifie que, dans de nombreux cas, les modèles linéaires sont inappropriés:
2729

28-
![](images/linreg_bad.png)
30+
```{r, fig.align = 'center', out.width = '100%', echo = FALSE, purl = FALSE}
31+
knitr::include_graphics("images/linreg_bad.png")
32+
```
2933

3034
Alors, comment résoudre ce problème ? Pour répondre à cette question, nous devons d'abord considérer ce que le modèle de régression tente de faire. Un modèle linéaire essaye d'ajuster la __meilleure droite__ qui passe au milieu des données _sans __sur-ajuster___ les données, ce qui se produirait si nous tracions simplement une ligne entre chaque point et ses voisins.
3135

book-fr/03-fonctionnement.Rmd

Lines changed: 14 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -24,19 +24,27 @@ $$y_i = \beta_0 + x_i\beta_1 + x^2_i\beta_2 + x^3_i\beta_3 + x^4_i\beta_4 + \ep
2424

2525
Chaque fonction de base est multipliée par un paramètre à valeur réelle, $\beta_j$, et est ensuite additionnée pour donner la <font color="orange">courbe finale $f(x)$</font>.
2626

27-
![](images/polynomial_basis_example.png)
27+
```{r, fig.align = 'center', out.width='100%', echo = FALSE, purl = FALSE}
28+
knitr::include_graphics("images/polynomial_basis_example.png")
29+
```
2830

2931
En faisant varier le coefficient $\beta_j$, on peut faire varier la forme de $f(x)$ pour produire une fonction polynomiale d'ordre 4 ou moins.
3032

3133
## Exemple: une base de spline cubique
3234

3335
Un spline cubique est une courbe construite à partir de sections d'un polynôme cubique reliées entre elles de sorte qu'elles sont continues en valeur. Chaque section du spline a des coefficients différents.
3436

35-
![](images/cubic_spline_fr.png)
37+
```{r, fig.align = 'center', echo = FALSE, purl = FALSE, out.width='100%'}
38+
knitr::include_graphics("images/cubic_spline_fr.png")
39+
```
40+
3641

3742
Voici une représentation d'une fonction lisse utilisant une base de régression spline cubique de rang 5 avec des nœuds situés à incréments de 0.2:
3843

39-
![](images/graphic6.1.jpg)
44+
```{r, fig.align = 'center', echo = FALSE, purl = FALSE, out.width='7s0%'}
45+
knitr::include_graphics("images/graphic6.1.jpg")
46+
```
47+
4048

4149
Dans cet exemple, les nœuds sont espacés uniformément à travers la gamme des valeurs observées de x. Le choix du degré de finesse du modèle est pré-déterminé par le nombre de nœuds, qui était arbitraire.
4250

@@ -65,7 +73,9 @@ $$M = 1/n \times \sum_{i=1}^n (\hat{f_i} - f_i)^2$$
6573
:::explanation
6674
__Le principe de validation croisée__
6775

68-
![](images/illustration_of_smooth_sel.png)
76+
```{r, fig.align = 'center', out.width = '100%', echo = FALSE, purl = FALSE}
77+
knitr::include_graphics("images/illustration_of_smooth_sel.png")
78+
```
6979

7080
Dans le premier panneau, la courbe correspond à un ajustement faible par
7181
rapport aux données et ne fait pas mieux avec le point manquant. Dans le

book-fr/04-plusieurs-termes-non-lineaires.Rmd

Lines changed: 15 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -46,8 +46,9 @@ Dans notre modèle de base, les EDF de la fonction lisse `s(SampleDepth)` sont ~
4646

4747
Traçons les termes lissés (`s(SampleDepth)`) et linéaires (`Season`) de notre modèle ajusté:
4848

49-
```{r}
50-
plot(basic_model, all.terms = TRUE, page = 1)
49+
```{r, fig.height = 4}
50+
par(mfrow = c(1,2))
51+
plot(basic_model, all.terms = TRUE)
5152
```
5253

5354
:::puzzle
@@ -105,8 +106,9 @@ two_term_summary$s.table
105106

106107
Regardons les relations entre les prédicteurs linéaires et non-linéaires et notre variable réponse.
107108

108-
```{r}
109-
plot(two_term_model, page = 1, all.terms = TRUE)
109+
```{r, fig.height = 8}
110+
par(mfrow = c(2,2))
111+
plot(two_term_model, all.terms = TRUE)
110112
```
111113

112114
## GAM à plusieurs variables
@@ -133,8 +135,9 @@ two_smooth_summary$s.table
133135

134136
Regardons les relations entre les prédicteurs linéaires et non-linéaires et notre variable réponse.
135137

136-
```{r}
137-
plot(two_smooth_model, page = 1, all.terms = TRUE)
138+
```{r, fig.height = 8}
139+
par(mfrow = c(2,2))
140+
plot(two_smooth_model, all.terms = TRUE)
138141
```
139142

140143
:::puzzle
@@ -187,12 +190,14 @@ __2.__ Est-ce que `Latitude` est un terme important à inclure dans le modèle?
187190

188191
Commençons par visualiser les 4 effets qui sont maintenant inclus dans chaque modèle:
189192

190-
```{r}
191-
plot(three_term_model, page = 1, all.terms = TRUE)
193+
```{r, fig.height = 8}
194+
par(mfrow = c(2,2))
195+
plot(three_term_model, all.terms = TRUE)
192196
```
193197

194-
```{r}
195-
plot(three_smooth_model, page = 1, all.terms = TRUE)
198+
```{r, fig.height = 8}
199+
par(mfrow = c(2,2))
200+
plot(three_smooth_model, all.terms = TRUE)
196201
```
197202

198203
Nous devrions également examiner nos tableaux de coefficients. Qu'est-ce que les EDF nous disent à propos de _l'ondulation_, ou la non-linéarité, des effets de nos prédicteurs?

book-fr/05-interactions.Rmd

Lines changed: 90 additions & 55 deletions
Original file line numberDiff line numberDiff line change
@@ -1,55 +1,90 @@
1-
# Interactions
2-
3-
Il y a deux façons de modéliser une interaction entre deux variables:
4-
5-
- si une variable est quantitative et l'autre est qualitative, on
6-
utilise l'argument `by` &#8594; `s(x, by=facteur)`,
7-
- si les deux variables sont quantitatives, on inclut les deux termes
8-
sous une même fonction non linéaire &#8594; `s(x1, x2)`.
9-
10-
L'argument `by` permet de faire varier un terme non linéaire selon les
11-
différents niveaux d'un facteur. Nous allons examiner ceci en utilisant
12-
notre variable qualitative `x0` et examiner si la non-linérité de
13-
`s(x2)` varie selon les différents niveaux de `x0`. Pour déterminer si
14-
les courbes diffèrent significativement entre les niveaux du facteur,
15-
nous allons utiliser une ANOVA sur l'interaction.
16-
17-
```{r, echo = TRUE, eval = FALSE}
18-
categorical_interact <- gam(y~x0+s(x1)+s(x2,by=x0),data=gam_data)
19-
categorical_interact_summary <- summary(categorical_interact)
20-
print(categorical_interact_summary$s.table)
21-
plot(categorical_interact,page=1)
22-
# ou nous pouvons utiliser la fonction vis.gam où theta représente la rotation du plan x-y
23-
vis.gam(categorical_interact,view=c("x2","x0"),theta=40,n.grid=500,border=NA)
24-
anova(two_smooth_model, categorical_interact,test="Chisq")
25-
```
26-
27-
![](images//graphic3.1b.png){width="350"}
28-
29-
Nous pouvons constater à partir du graphique que les formes des termes
30-
non linéaires sont comparables entre les quatre niveaux de `x0`.
31-
L'ANOVA le confirme également (déviance = 98,6, *p* = 0,2347).
32-
33-
Ensuite, nous allons examiner l'interaction non linéaire entre deux
34-
termes quantitatifs, `x1` et `x2`. Cette fois-ci, l'argument `by` est
35-
supprimé.
36-
37-
```{r, echo = TRUE, eval = FALSE}
38-
smooth_interact <- gam(y~x0+s(x1,x2),data=gam_data)
39-
smooth_interact_summary <- summary(smooth_interact)
40-
print(smooth_interact_summary$s.table)
41-
plot(smooth_interact,page=1,scheme=3)
42-
# plot(smooth_interact,page=1,scheme=1) donne un graphique comparable à vis.gam()
43-
vis.gam(smooth_interact,view=c("x1","x2"),theta=40,n.grid=500,border=NA)
44-
anova(two_smooth_model,smooth_interact,test="Chisq")
45-
```
46-
47-
![](images//graphic3.2b.png){width="350"}
48-
49-
L'interaction entre `s(x1)` et `s(x2)` est significative et le
50-
graphique en deux dimensions illustre très bien cette interaction non
51-
linéaire. La relation entre y et x1 change en fonction de la valeur de
52-
`x2`. Vous pouvez changez la valeur de l'argument `theta` pour tourner
53-
l'axe du graphique. Si vous prévoyez exécuter un grand nombre de
54-
graphiques, supprimez l'argument `n.grid = 500`, car ceci fait appel à
55-
des calculs intensifs et ralentit R.
1+
# GAM avec des termes d'interaction
2+
3+
Il y a deux façons de modéliser une interaction entre deux variables :
4+
5+
- pour deux variables non-linéaire : `s(x1, x2)`
6+
- pour une variable non-linéaire et une variable linéaire (quantitative ou qualitative) : utiliser l'argument `by`, `s(x1, by = x2)`
7+
- Quand `x2` est qualitative, vous avez un terme non linéaire qui varie entre les différents niveaux de `x2`
8+
- Quand `x2` est quantitative, l'effet linéaire de `x2` varie avec `x1`
9+
- Quand `x2` est qualitative, le facteur doit être ajouté comme effet principal dans le modèle
10+
11+
## Interaction entre variables non-linéaire et qualitatif
12+
13+
Nous allons examiner l'effet de l'interaction en utilisant notre variable qualitative `Season` et examiner si la non-linéarité de `s(SampleDepth)` varie selon les différents niveaux de `Season`.
14+
15+
```{r}
16+
factor_interact <- gam(Sources ~ Season +
17+
s(SampleDepth,by=Season) +
18+
s(RelativeDepth),
19+
data = isit, method = "REML")
20+
21+
summary(factor_interact)$s.table
22+
```
23+
24+
```{r, fig.height = 8}
25+
par(mfrow = c(2,2))
26+
plot(factor_interact)
27+
```
28+
29+
:::explanation
30+
Les deux premiers graphiques montrent l'effet d'interaction entre notre variable lisse `SampleDepth` et chaque niveau de notre variable factorielle, `Season`. Voyez-vous une différence entre les deux courbes ?
31+
:::
32+
33+
Les graphiques montrent quelques différences entre la forme des termes lisses entre les deux niveaux de `Season`. La différence la plus notable est le pic dans le deuxième panneau, qui nous indique qu'il y a un effet de `SampleDepth` entre 1000 et 2000 qui est important dans la saison 2, mais qui ne se produit pas dans la saison 1. Cela suggère que l'effet d'interaction pourrait être important à inclure dans notre modèle.
34+
35+
Nous pouvons également représenter l'effet d'interaction en 3D sur un seul graphique, en utilisant `vis.gam()`.
36+
37+
```{r}
38+
vis.gam(factor_interact, theta = 120, n.grid = 50, lwd = .4)
39+
```
40+
> On peut changer le degré de rotation de notre plan x-y avec l'argument `theta`.
41+
42+
Pour vérifier notre hypothèse que cette interaction est importante, on peut faire une comparaison de modèles en utilisant l'AIC pour déterminer si le terme d'interaction améliore la performance de notre modèle.
43+
44+
```{r}
45+
AIC(two_smooth_model, factor_interact)
46+
```
47+
48+
L'AIC de notre modèle avec une interaction factorielle entre le lisse `SampleDepth` et le `Season` a un score AIC plus bas, ce qui nous indique que ce modèle est plus performant que `two_smooth_model`. L'inclusion de cette interaction semble améliorer les performances de notre modèle.
49+
50+
51+
## Interaction entre variables non linéaires
52+
53+
Finalement, nous regardons les interactions entre deux termes non linéaires, `SampleDepth` et `RelativeDepth`.
54+
55+
```{r}
56+
smooth_interact <- gam(Sources ~ Season + s(SampleDepth, RelativeDepth),
57+
data = isit, method = "REML")
58+
summary(smooth_interact)$s.table
59+
```
60+
61+
Dans la section précédente, nous avons pu visualiser un effet d'interaction entre un terme non linéaire et un terme factoriel en dessinant une fonction lisse différente de `SampleDepth` pour chaque niveau de `Season`.
62+
63+
Dans ce modèle, nous avons deux termes non linéaires, donc l'effet de `SampleDepth` varie de façon linéaire avec `RelativeDepth`, et vice-versa. Lorsque nous visualisons cette interaction, nous obtenons plutôt un gradient entre deux fonctions continues lissées :
64+
65+
```{r}
66+
plot(smooth_interact, page = 1, scheme = 2)
67+
```
68+
69+
We can also plot this interaction on a 3D surface:
70+
71+
```{r}
72+
vis.gam(smooth_interact,
73+
view = c("SampleDepth", "RelativeDepth"),
74+
theta = 50, n.grid = 50, lwd = .4)
75+
```
76+
> Rappelez-vous, ce graphique peut être réorienté en changeant la valeur de l'argument `theta`.
77+
78+
:::explanation
79+
On peut changer la couleur du graphique 3D en utilisant l'argument `color`. Essayez de spécifier `color = "cm"` dans `vis.gam()` ci-dessus, et consultez `?vis.gam` pour plus d'options de couleurs.
80+
:::
81+
82+
Les graphiques illustrent une interaction non linéaire, où `Sources` est plus faible à des valeurs élevées de `SampleDepth` et `RelativeDepth`, mais augmente avec `RelativeDepth` alors que `SampleDepth` est faible.
83+
84+
Ainsi, il semble y avoir un effet d'interaction entre ces termes non linéaires. Est-ce que l'inclusion de l'interaction entre `s(SampleDepth)` et `s(RelativeDepth)` améliore notre modèle `two_smooth_model`?
85+
86+
```{r}
87+
AIC(two_smooth_model, smooth_interact)
88+
```
89+
90+
Le modèle avec l'interaction entre `s(SampleDepth)` et `s(RelativeDepth)` a un AIC inférieur, ce qui signifie que l'inclusion de cette interaction améliore la performance de notre modèle, et notre capacité à comprendre les déterminants de la bioluminescence.

book-fr/06-changer-la-fonction-de-base.Rmd

Lines changed: 0 additions & 101 deletions
This file was deleted.

0 commit comments

Comments
 (0)