Le fichier data/T_Oir_StHilaire_87_02.txt
contient des relevés journaliers de la température de l’eau et de la température de l’air dans l’Oir, un petit fleuve côtier de Basse Normandie. Données journalières. On se pose la question du lien entre la température de l’eau et la température de l’air.
Une première étape essentielle consiste à visualiser les données. Proposer un code permettant de produire le graphique ci dessous~:
Transformation de la date en jours calendaires’une chaîne de caractères en dates.
df_temp <- df_temp %>% mutate(date_posixct = as.POSIXct(strptime(df_temp$date, format = "%d/%m/%Y")))
Le modèle de la régression simple s’écrit mathématiquement sous la forme suivante :
\[ Y_k = \alpha + \beta x_k + E_k, \quad E_k \overset{i.i.d}{\sim}\mathcal{N}(0, \sigma^2),\] où
L’estimation consiste à déterminer le choix des paramètre \(\alpha\) et \(\beta\) les plus pertinents. Une méthode générique d’estimation des paramètres d’un modèle statistique, consiste à optimiser une fonction nommée la vraisemblance, on le verra plus tard.
Dans un premier temps, on cherche à trouver la droite d’équation \(y=a +bx\) qui résume au mieux les données, i.e on cherche à minimiser l’écart entre nos observations \(y_i\) et la prédiction par le modèle \(\alpha + \beta x_i\), ce qui revient à trouver le minimum de la fonction
\[MCO(\alpha, \beta; \boldsymbol{y},\boldsymbol{x}) = \sum_{i=1}^{n} \{y_i - (\alpha + \beta x_i) \}^2. \]
La commande lm
de R
fait le travail, dans la commande suivante :
lm_eau_air <- lm(T_eau ~ T_air, data=df_temp)
Avant toute analyse, il est indispensable de discuter les hypothèses du modèle. Il est pour cela utile de regarder les graphiques de diagnostic
autoplot(lm_eau_air, data=df_temp)
On peut obtenir les coefficients estimés du modèle grâce à la commande :
coef(lm_eau_air)
## (Intercept) T_air
## 5.4149067 0.5976255
On a non seulement ces valeurs mais les tests de nullité des paramètre associés grâce à la commande :
summary(lm_eau_air)
##
## Call:
## lm(formula = T_eau ~ T_air, data = df_temp)
##
## Residuals:
## Min 1Q Median 3Q Max
## -5.8562 -0.9267 -0.0471 0.7730 8.9537
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) 5.414907 0.075402 71.81 <2e-16 ***
## T_air 0.597626 0.006115 97.72 <2e-16 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 1.539 on 2189 degrees of freedom
## Multiple R-squared: 0.8135, Adjusted R-squared: 0.8134
## F-statistic: 9550 on 1 and 2189 DF, p-value: < 2.2e-16
Le test nous indique l’existence d’un lien entre la température de l’eau et la température de l’air. On peut utiliser ce modèle pour prédire la température de l’eau à partir de la température de l’air. Il faut faire attention à ce que l’on veut prédire.
df_pred <- as.tibble(predict(lm_eau_air, interval="confidence")) %>% dplyr::select(fit =fit, lwr_conf = lwr, upr_conf = upr) %>% bind_cols(as.tibble(predict(lm_eau_air, interval="prediction"))) %>% select(-fit1, lwr_predict =lwr, upr_predict = upr) %>% bind_cols(df_temp)
## Warning in predict.lm(lm_eau_air, interval = "prediction"): predictions on current data refer to _future_ responses
ggplot(data = df_pred, aes(x = T_air, y = T_eau)) +
geom_point(alpha=0.2) +
geom_smooth(method = 'lm', se = TRUE) +
geom_line(data=df_pred, aes(y=lwr_conf), col='red', linetype='dotted') +
geom_line(data=df_pred, aes(y=upr_conf), col='red', linetype='dotted') +
geom_line(data=df_pred, aes(y=lwr_predict), col='green', linetype='dashed') +
geom_line(data=df_pred, aes(y=upr_predict), col='green', linetype='dashed')
La question se pose également de savoir si la température moyenne annuelle de l’eau change d’une année sur l’autre, c’est à dire peut on mettre en évidence une tendance climatique. Pour cela, on chercher à explorer un lien entre la température de l’eau et l’année. On cherche donc à explorer le lien entre une variable quantitative (la température) et une variable qualitative (l’année). C’est un modèle d’analyse de la variance.
ggplot(data=df_temp, aes(x = as.factor(annee), y = T_eau)) + geom_boxplot()
Il ne semble pas y avoir d’effet année, on peut néanmoins le vérifier.
Le modèle s’écrit sous la forme suivante:
\[ Y_{ik} = \mu + \alpha_i + E_{ik}, \quad E_{ik} \overset{i.i.d}{\sim}\mathcal{N}(0, \sigma^2),\]
où
lm1 <- lm(T_eau ~ annee, data = df_temp)
summary(lm1)
##
## Call:
## lm(formula = T_eau ~ annee, data = df_temp)
##
## Residuals:
## Min 1Q Median 3Q Max
## -9.9724 -2.5404 -0.1151 2.7758 9.8849
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) 33.32906 26.46860 1.259 0.208
## annee -0.01067 0.01327 -0.804 0.421
##
## Residual standard error: 3.564 on 2189 degrees of freedom
## Multiple R-squared: 0.0002953, Adjusted R-squared: -0.0001614
## F-statistic: 0.6466 on 1 and 2189 DF, p-value: 0.4214
On constate qu’un seul paramètre est estimé pour l’année or nous en attendions un par année. C’est le comportement objet de R qui lui indique de faire une régression linéaire et non une analyse de la variance. La variable année est en effet de classe numeric
. Il faut indique que l’année doit être traitée comme une variable qualitative, pour faire la différence on peut créer une nouvelle variable annee_fact
df_temp$annee_fact <- as.factor(df_temp$annee)
lm_eau_annee <- lm(T_eau~annee_fact, data = df_temp)
summary(lm_eau_annee)
##
## Call:
## lm(formula = T_eau ~ annee_fact, data = df_temp)
##
## Residuals:
## Min 1Q Median 3Q Max
## -9.8304 -2.5093 -0.1222 2.7800 9.8319
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) 12.12217 0.18663 64.951 <2e-16 ***
## annee_fact1988 0.04589 0.26376 0.174 0.862
## annee_fact1994 -0.01615 0.26394 -0.061 0.951
## annee_fact1995 -0.22373 0.26394 -0.848 0.397
## annee_fact2001 -0.28115 0.26394 -1.065 0.287
## annee_fact2002 0.01639 0.26394 0.062 0.950
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 3.566 on 2185 degrees of freedom
## Multiple R-squared: 0.001269, Adjusted R-squared: -0.001016
## F-statistic: 0.5552 on 5 and 2185 DF, p-value: 0.7344
lm_0 <- lm(T_eau~1, data = df_temp)
anova(lm_0, lm_eau_annee)
## Analysis of Variance Table
##
## Model 1: T_eau ~ 1
## Model 2: T_eau ~ annee_fact
## Res.Df RSS Df Sum of Sq F Pr(>F)
## 1 2190 27815
## 2 2185 27780 5 35.296 0.5552 0.7344
Discutons ici de la contrainte d’identifiabilité sur les \(\alpha\).
Avant toute chose, vérifions la validité des hypothèses sur les résidus.
autoplot(lm_eau_annee, data = df_temp)
On peut tester l’effet année:
anova(lm_eau_annee)
## Analysis of Variance Table
##
## Response: T_eau
## Df Sum Sq Mean Sq F value Pr(>F)
## annee_fact 5 35.3 7.0592 0.5552 0.7344
## Residuals 2185 27779.8 12.7138
Sans grande surprise, on ne met pas en évidence d’effet années, mais on constate également que la variance est très grande.
Néanmoins il est possible que cette absence d’effet année soit du à une trop grande variabilité du fait de la variabilité annuelle de la température au cours de l’année.
ggplot(data = df_temp, aes(x = as.factor(mois), y = T_eau)) + geom_boxplot()
ggplot(data = df_temp, aes(x = as.factor(mois), y = T_eau, col=annee_fact)) + geom_boxplot()
On veut donc expliquer la température en fonction de l’année et du mois. Le modèle s’écrit sous la forme suivante:
\[ Y_{ijk} = \mu + \alpha_i +\beta_j +\gamma_{ij} + E_{ijk}, \quad E_{ijk} \overset{i.i.d}{\sim}\mathcal{N}(0, \sigma^2),\]
où
Il est important de regarder le plan d’expérience pour détecter des potentiels déséquilibres dans le dispositif expérimental.
with(df_temp, table(mois, annee_fact))
## annee_fact
## mois 1987 1988 1994 1995 2001 2002
## 1 31 31 31 31 31 31
## 2 28 29 28 28 28 28
## 3 31 31 31 31 31 31
## 4 30 30 30 30 30 30
## 5 31 31 31 31 31 31
## 6 30 30 30 30 30 30
## 7 31 31 31 31 31 31
## 8 31 31 31 31 31 31
## 9 30 30 30 30 30 30
## 10 31 31 31 31 31 31
## 11 30 30 30 30 30 30
## 12 31 31 31 31 31 31
Le plan d’expérience est quasimment équilibré.
On peut par ailleurs suspecterl’effet d’une interaction entre les facteurs, on peut visualiser cette potentielle interaction en regardant le graphique d’interaction.
df_temp$mois_fact <- as.factor(df_temp$mois)
with( df_temp,
interaction.plot(trace.factor = annee_fact, x.factor = mois, response = T_eau) )
Ou en plus joli
df_temp %>%
ggplot() +
aes(x = mois_fact, color = annee_fact, group = annee_fact, y = T_eau) +
stat_summary(fun.y = mean, geom = "point") +
stat_summary(fun.y = mean, geom = "line")
Ce graphique semble indiquer l’existence d’interactions entre les deux facteurs.
On peut maintenant auster un modèle d’anlyse de la variance à 2 facteurs.
lm_eau_annee_mois <- lm(T_eau ~ annee_fact + mois_fact + annee_fact:mois_fact, data = df_temp)
autoplot(lm_eau_annee_mois, data = df_temp)
Les tests des différents effets sont testés dans la table d’anlayse de la variance suivante
anova(lm_eau_annee_mois)
## Analysis of Variance Table
##
## Response: T_eau
## Df Sum Sq Mean Sq F value Pr(>F)
## annee_fact 5 35.3 7.06 3.0262 0.009993 **
## mois_fact 11 19871.0 1806.45 774.4020 < 2.2e-16 ***
## annee_fact:mois_fact 55 2965.8 53.92 23.1162 < 2.2e-16 ***
## Residuals 2119 4943.0 2.33
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
Anova(lm_eau_annee_mois)
## Anova Table (Type II tests)
##
## Response: T_eau
## Sum Sq Df F value Pr(>F)
## annee_fact 36.2 5 3.103 0.008535 **
## mois_fact 19871.0 11 774.402 < 2.2e-16 ***
## annee_fact:mois_fact 2965.8 55 23.116 < 2.2e-16 ***
## Residuals 4943.0 2119
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
Les estimations des différents paramètres sont données dans la table
summary(lm_eau_annee_mois)
##
## Call:
## lm(formula = T_eau ~ annee_fact + mois_fact + annee_fact:mois_fact,
## data = df_temp)
##
## Residuals:
## Min 1Q Median 3Q Max
## -5.4996 -0.9342 0.0132 0.9145 5.1837
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) 5.6203 0.2743 20.488 < 2e-16 ***
## annee_fact1988 4.3423 0.3879 11.193 < 2e-16 ***
## annee_fact1994 3.1264 0.3879 8.059 1.27e-15 ***
## annee_fact1995 3.0773 0.3879 7.932 3.45e-15 ***
## annee_fact2001 3.0036 0.3879 7.743 1.50e-14 ***
## annee_fact2002 2.3832 0.3879 6.143 9.64e-10 ***
## mois_fact2 1.3787 0.3982 3.462 0.000546 ***
## mois_fact3 1.6765 0.3879 4.322 1.62e-05 ***
## mois_fact4 6.6453 0.3912 16.989 < 2e-16 ***
## mois_fact5 6.2974 0.3879 16.233 < 2e-16 ***
## mois_fact6 8.9500 0.3912 22.881 < 2e-16 ***
## mois_fact7 11.2285 0.3879 28.944 < 2e-16 ***
## mois_fact8 11.0140 0.3879 28.391 < 2e-16 ***
## mois_fact9 10.4897 0.3912 26.817 < 2e-16 ***
## mois_fact10 7.3733 0.3879 19.006 < 2e-16 ***
## mois_fact11 7.3231 0.3912 18.721 < 2e-16 ***
## mois_fact12 5.3894 0.3879 13.892 < 2e-16 ***
## annee_fact1988:mois_fact2 -4.0516 0.5606 -7.228 6.83e-13 ***
## annee_fact1994:mois_fact2 -1.7543 0.5631 -3.115 0.001862 **
## annee_fact1995:mois_fact2 0.2425 0.5631 0.431 0.666739
## annee_fact2001:mois_fact2 -1.1041 0.5631 -1.961 0.050050 .
## annee_fact2002:mois_fact2 -0.1957 0.5631 -0.348 0.728192
## annee_fact1988:mois_fact3 -2.8026 0.5486 -5.108 3.54e-07 ***
## annee_fact1994:mois_fact3 -0.3220 0.5486 -0.587 0.557361
## annee_fact1995:mois_fact3 -0.7324 0.5486 -1.335 0.182039
## annee_fact2001:mois_fact3 -0.1352 0.5486 -0.246 0.805426
## annee_fact2002:mois_fact3 0.3628 0.5486 0.661 0.508457
## annee_fact1988:mois_fact4 -5.1722 0.5532 -9.350 < 2e-16 ***
## annee_fact1994:mois_fact4 -4.7281 0.5532 -8.547 < 2e-16 ***
## annee_fact1995:mois_fact4 -4.8114 0.5532 -8.698 < 2e-16 ***
## annee_fact2001:mois_fact4 -4.5324 0.5532 -8.193 4.34e-16 ***
## annee_fact2002:mois_fact4 -3.4490 0.5532 -6.235 5.44e-10 ***
## annee_fact1988:mois_fact5 -1.5115 0.5486 -2.755 0.005918 **
## annee_fact1994:mois_fact5 -2.1747 0.5486 -3.964 7.62e-05 ***
## annee_fact1995:mois_fact5 -2.0810 0.5486 -3.793 0.000153 ***
## annee_fact2001:mois_fact5 -1.6853 0.5486 -3.072 0.002155 **
## annee_fact2002:mois_fact5 -1.2585 0.5486 -2.294 0.021889 *
## annee_fact1988:mois_fact6 -1.9736 0.5532 -3.568 0.000368 ***
## annee_fact1994:mois_fact6 -3.3070 0.5532 -5.978 2.64e-09 ***
## annee_fact1995:mois_fact6 -3.2450 0.5532 -5.866 5.17e-09 ***
## annee_fact2001:mois_fact6 -2.8349 0.5532 -5.125 3.25e-07 ***
## annee_fact2002:mois_fact6 -1.8789 0.5532 -3.397 0.000695 ***
## annee_fact1988:mois_fact7 -3.7042 0.5486 -6.752 1.88e-11 ***
## annee_fact1994:mois_fact7 -3.5223 0.5486 -6.420 1.68e-10 ***
## annee_fact1995:mois_fact7 -2.7542 0.5486 -5.020 5.59e-07 ***
## annee_fact2001:mois_fact7 -3.4201 0.5486 -6.234 5.48e-10 ***
## annee_fact2002:mois_fact7 -3.4814 0.5486 -6.346 2.70e-10 ***
## annee_fact1988:mois_fact8 -5.2149 0.5486 -9.505 < 2e-16 ***
## annee_fact1994:mois_fact8 -3.6863 0.5486 -6.719 2.34e-11 ***
## annee_fact1995:mois_fact8 -2.4703 0.5486 -4.503 7.08e-06 ***
## annee_fact2001:mois_fact8 -2.7532 0.5486 -5.018 5.65e-07 ***
## annee_fact2002:mois_fact8 -2.6881 0.5486 -4.900 1.03e-06 ***
## annee_fact1988:mois_fact9 -5.6136 0.5532 -10.148 < 2e-16 ***
## annee_fact1994:mois_fact9 -5.5482 0.5532 -10.030 < 2e-16 ***
## annee_fact1995:mois_fact9 -5.3089 0.5532 -9.597 < 2e-16 ***
## annee_fact2001:mois_fact9 -5.2808 0.5532 -9.546 < 2e-16 ***
## annee_fact2002:mois_fact9 -4.1629 0.5532 -7.525 7.73e-14 ***
## annee_fact1988:mois_fact10 -4.8903 0.5486 -8.914 < 2e-16 ***
## annee_fact1994:mois_fact10 -4.4639 0.5486 -8.136 6.86e-16 ***
## annee_fact1995:mois_fact10 -2.7359 0.5486 -4.987 6.64e-07 ***
## annee_fact2001:mois_fact10 -2.0763 0.5486 -3.785 0.000158 ***
## annee_fact2002:mois_fact10 -3.4396 0.5486 -6.269 4.38e-10 ***
## annee_fact1988:mois_fact11 -10.4693 0.5532 -18.926 < 2e-16 ***
## annee_fact1994:mois_fact11 -4.1008 0.5532 -7.413 1.77e-13 ***
## annee_fact1995:mois_fact11 -7.5866 0.5532 -13.714 < 2e-16 ***
## annee_fact2001:mois_fact11 -7.2710 0.5532 -13.144 < 2e-16 ***
## annee_fact2002:mois_fact11 -4.4173 0.5532 -7.985 2.28e-15 ***
## annee_fact1988:mois_fact12 -6.1670 0.5486 -11.241 < 2e-16 ***
## annee_fact1994:mois_fact12 -4.1336 0.5486 -7.534 7.22e-14 ***
## annee_fact1995:mois_fact12 -8.0365 0.5486 -14.648 < 2e-16 ***
## annee_fact2001:mois_fact12 -8.3319 0.5486 -15.187 < 2e-16 ***
## annee_fact2002:mois_fact12 -3.7257 0.5486 -6.791 1.44e-11 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 1.527 on 2119 degrees of freedom
## Multiple R-squared: 0.8223, Adjusted R-squared: 0.8163
## F-statistic: 138.1 on 71 and 2119 DF, p-value: < 2.2e-16
On a constaté un lien entre température de l’air et température l’eau et un effet de l’année et une effet du mois.
Supposons que la température de l’air contient déjà le signal des variations saisonnières. (il faudrait le vérifier).
On peut se demander si le lien liant température de l’air et température de l’eau est le même quelle que soit l’année. Ce qui nous amène à examiner le lien entre une variable quantitative (la température de l’eau) et deux variables dont l’une est quantitative (tempéraiture de l’autre ) et l’autre qualitative. C’est le modèle d’analyse de la covariance.
Pour tester cette hypothèse, on écrit un modèle dans lequel on autorise une relation différente chaque année :
\[ Y_{ik} = \mu + \alpha_i + \beta x_{ik} + \gamma x_{ik} + E_{ik}, \quad E_{ik} \overset{i.i.d}{\sim}\mathcal{N}(0, \sigma^2),\]
où
\(Y_{ik}\) désigne la température de l’eau de la k\(^{\mbox{ème}}\) mesure de l’année \(i\),
\(\gamma_i\) est le paramètre inconnu qui règle la différence entre la pente commune à toutes les années et la pente de l’année \(i\).
df_temp$annee_fact <- as.factor(df_temp$annee)
ggplot(data=df_temp, aes(x = T_air, y = T_eau, col = annee_fact)) + geom_point(alpha=0.1) + guides(col=guide_legend(title = "Année")) +
geom_smooth(method = "lm", se = FALSE)
lm_eau_air_annee <- lm( T_eau ~ annee + T_air + annee: T_air, data = df_temp)
summary(lm_eau_air_annee)
##
## Call:
## lm(formula = T_eau ~ annee + T_air + annee:T_air, data = df_temp)
##
## Residuals:
## Min 1Q Median 3Q Max
## -6.1868 -0.9101 0.0457 0.8298 8.4296
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) 148.263258 25.561853 5.800 7.59e-09 ***
## annee -0.071651 0.012821 -5.588 2.58e-08 ***
## T_air -3.243721 2.114907 -1.534 0.1252
## annee:T_air 0.001928 0.001061 1.818 0.0692 .
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 1.511 on 2187 degrees of freedom
## Multiple R-squared: 0.8204, Adjusted R-squared: 0.8202
## F-statistic: 3331 on 3 and 2187 DF, p-value: < 2.2e-16
Pourquoi n’a t on pas une pente par année ?
lm_eau_air_annee <- lm( T_eau ~ annee_fact + T_air + annee_fact:T_air, data = df_temp)
autoplot(lm_eau_air_annee, data=df_temp)
L’analyse des résidus ne contredit pas les hypothèses du modèle.
anova(lm_eau_air_annee)
## Analysis of Variance Table
##
## Response: T_eau
## Df Sum Sq Mean Sq F value Pr(>F)
## annee_fact 5 35.3 7.1 3.4692 0.003983 **
## T_air 1 22967.3 22967.3 11287.1529 < 2.2e-16 ***
## annee_fact:T_air 5 378.6 75.7 37.2124 < 2.2e-16 ***
## Residuals 2179 4433.9 2.0
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
Anova(lm_eau_air_annee)
## Anova Table (Type II tests)
##
## Response: T_eau
## Sum Sq Df F value Pr(>F)
## annee_fact 374.3 5 36.790 < 2.2e-16 ***
## T_air 22967.3 1 11287.153 < 2.2e-16 ***
## annee_fact:T_air 378.6 5 37.212 < 2.2e-16 ***
## Residuals 4433.9 2179
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
summary(lm_eau_air_annee)
##
## Call:
## lm(formula = T_eau ~ annee_fact + T_air + annee_fact:T_air, data = df_temp)
##
## Residuals:
## Min 1Q Median 3Q Max
## -5.9420 -0.8083 0.0689 0.7628 7.2236
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) 6.84177 0.13847 49.409 < 2e-16 ***
## annee_fact1988 -3.11366 0.23502 -13.249 < 2e-16 ***
## annee_fact1994 -0.87285 0.23588 -3.700 0.000221 ***
## annee_fact1995 -1.96999 0.21485 -9.169 < 2e-16 ***
## annee_fact2001 -1.83219 0.21429 -8.550 < 2e-16 ***
## annee_fact2002 -2.12815 0.25564 -8.325 < 2e-16 ***
## T_air 0.53445 0.01180 45.279 < 2e-16 ***
## annee_fact1988:T_air 0.24044 0.01991 12.076 < 2e-16 ***
## annee_fact1994:T_air -0.01323 0.01903 -0.695 0.487047
## annee_fact1995:T_air 0.07885 0.01739 4.534 6.10e-06 ***
## annee_fact2001:T_air 0.08313 0.01767 4.704 2.71e-06 ***
## annee_fact2002:T_air 0.11075 0.02112 5.245 1.72e-07 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 1.426 on 2179 degrees of freedom
## Multiple R-squared: 0.8406, Adjusted R-squared: 0.8398
## F-statistic: 1045 on 11 and 2179 DF, p-value: < 2.2e-16
Tous les modèles étudiés dans cet exemple font partie de la famille des modèles linéaires.
Le modèle linéaire regroupe tous les modèles pour lesquels le comportement moyen de la variable réponse, i.e. ce qui est prédit par le modèle, est une fonction linéaire des paramètres inconnus. On note souvent \(\hat{y_k}\) la prédiction par le modèle de la k\(^{\mbox{ème}}\) mesure, dans ce cas un modèle linéaire est un modèle tel que \(\hat{y_k}\) est une fonction linéaire des paramètres. Avec cette définition, le modèle \[ Y_k = \alpha + \beta x_k+ \delta x^2_k + E_k, \quad E_k \overset{i.i.d}{\sim}\mathcal{N}(0, \sigma^2),\]
est toujours un modèle linéaire, bien que le lien entre \(y\) et \(x\) ne soit pas linéaire.
Tous les modèles linéaires peuvent être ajustés avec la fonction lm
.
On s’intéresse maintenant aux données de croissance du fichier data/growth_data.txt
.
df_growth <- read.table('data/growth_data.txt', header = TRUE, sep = ' ')
head(df_growth)
## age length
## 1 19 36.29889
## 2 12 31.84360
## 3 1 15.77166
## 4 17 33.56730
## 5 38 39.41566
## 6 11 30.48877
ggplot(data=df_growth, aes(y=length, x=age)) + geom_point(alpha = 0.3)
Ajustement d’un modèle linéaire
lm_length_age <- lm( length ~ age, data= df_growth)
autoplot(lm_length_age, data=df_growth)
On constate une tendance forte dans les résidus. Le modèle n’est pas adapté; S’agissant de données de croissance, on peut tenter d’ajuster un modèle de von Bertalanffy. Dans ce cas le modèle s’écrit
\[ Y_k = g(x_k) + E_{k}, \quad E_{k} \overset{i.i.d}{\sim}\mathcal{N}(0, \sigma^2),\]
avec - \(Y_k\) la longueur de l’individu \(k\), - \(x_k\) l’âge de lindividu \(k\) - \(g\) la fonction de von Bertalanffy : \(g(x)= L_{\infty} (1-exp(-K*(x-x_0))).\)
func_VonB <- function(x, K, Linf, x0){
res <- Linf*(1-exp(-K*(x-x0)))
return(res)
}
nls
Pour ajuster cette relation on peut utiliser la fonction nls
## definir des valeurs initiales de parametres
nls_vonB <- nls(length ~ func_VonB(age, K, Linf, x0), start = list(Linf=40,K=1, x0=10), data = df_growth)
summary(nls_vonB)
##
## Formula: length ~ func_VonB(age, K, Linf, x0)
##
## Parameters:
## Estimate Std. Error t value Pr(>|t|)
## Linf 38.92930 1.15156 33.806 < 2e-16 ***
## K 0.09638 0.01377 6.999 2.14e-06 ***
## x0 -4.15486 0.84659 -4.908 0.000133 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 1.701 on 17 degrees of freedom
##
## Number of iterations to convergence: 15
## Achieved convergence tolerance: 9.313e-07
Les hypothèses sur les résidus étant les mêmes, il faut les vérifier ‘à la main’.
df_nls_vonB <- df_growth %>% mutate(
fitted = nlsResiduals(nls_vonB)$resi2[,1],
res_stand = nlsResiduals(nls_vonB)$resi2[,2])
ggplot(data = df_nls_vonB, aes(x = fitted, y = res_stand)) + geom_point() + geom_smooth(method = 'loess')
On peut calculer une somme des carrés résiduelle
RSS_1 <- with(df_nls_vonB, sum((length-fitted)^2))
R2_1 <- RSS_1 / with(df_nls_vonB, sum( (length- mean(length))^2) )
saumons
̀A partir de la table saumons
, explorer la variation de la densité en fonction des différents facteurs âge, année, habitat, secteurs, vitesse du courant
Indications :
A rendre en binome sous forme de fichier RMarkdown pour le vendredi 14 septembre.