TD5 : Sélection de variables

Auteur·rice

Guillaume Franchi

Exercice 1

Les données de cet exercice ont été simulées à des fins pédagogiques, et ne reflètent en rien une réalité biologique.

On cherche à optimiser la production d’une protéine recombinante exprimée par une bactérie (E coli) génétiquement modifiée cultivée en bioréacteur.

On réalise pour cela \(n=150\) expériences indépendantes, résumées dans le jeu de données disponible ici .

Chaque observation correspond à une expérience indépendante de culture, réalisée avec des conditions expérimentales légèrement différentes selon :

  • les paramètres physico-chimiques du milieu;
  • les conditions d’induction de l’expression;
  • les caractéristiques biologiques du système d’expression;
  • les variations techniques ou environnementales.

L’objectif est de modéliser le rendement final de production (en mg/L) en fonction de nombreuses variables explicatives, dont certaines ont un effet fort, d’autres un effet faible.

Les variables présentes dans le jeu de données sont :

  • yield : rendement final en protéine recombinante (en mg/L);
  • temperature : température de culture (°C)
  • pH : pH du milieu
  • oxygen : taux d’oxygène dissous (%)
  • glucose : concentration initiale en glucose (g/L)
  • iptg : concentration en inducteur IPTG (mM/L)
  • agitation : vitesse d’agitation (rpm)
  • growth_rate : taux de croissance bactérienne (\(h^{-1}\))
  • plasmid_copy : nombre moyen de copies plasmidiques par cellule
  • promoter_strength : force relative du promoteur
  • protein_stability : indice de stabilité de la protéine exprimée
  • mg : concentration en magnésium (mg/L)
  • ca : concentration en calcium (mg/L)
  • sensor_drift : dérive du capteur d’oxygène (%)
  • manganese_trace : concentration de manganèse dans le milieu (mg/L)
  • housekeeping_expression : unités d’ARN relatives (unités arbitraires)
  1. Importer les données, les représenter graphiquement, et en dresser un bref résumé statistique.
Voir le code
bioreac <- read.csv("bioreactor_data.csv",row.names = 1)
summary(bioreac)
     yield        temperature          pH            oxygen     
 Min.   :148.6   Min.   :34.69   Min.   :6.649   Min.   :33.57  
 1st Qu.:252.0   1st Qu.:36.36   1st Qu.:6.896   1st Qu.:53.02  
 Median :298.0   Median :36.94   Median :7.005   Median :60.09  
 Mean   :288.4   Mean   :36.98   Mean   :7.019   Mean   :59.54  
 3rd Qu.:322.0   3rd Qu.:37.58   3rd Qu.:7.134   3rd Qu.:66.58  
 Max.   :401.3   Max.   :39.19   Max.   :7.648   Max.   :85.71  
    glucose            iptg          agitation      growth_rate     
 Min.   : 4.380   Min.   :0.2195   Min.   :249.8   Min.   :0.03601  
 1st Qu.: 8.901   1st Qu.:0.7805   1st Qu.:288.0   1st Qu.:0.51590  
 Median :10.181   Median :0.9979   Median :302.1   Median :0.68884  
 Mean   :10.128   Mean   :0.9913   Mean   :301.2   Mean   :0.71285  
 3rd Qu.:11.469   3rd Qu.:1.1976   3rd Qu.:315.6   3rd Qu.:0.87860  
 Max.   :14.860   Max.   :1.8075   Max.   :353.7   Max.   :1.42469  
  plasmid_copy    promoter_strength protein_stability       mg        
 Min.   : 8.113   Min.   :2.686     Min.   :23.05     Min.   :0.5503  
 1st Qu.:16.584   1st Qu.:4.266     1st Qu.:44.08     1st Qu.:0.8939  
 Median :19.732   Median :4.930     Median :53.00     Median :1.0108  
 Mean   :20.050   Mean   :4.943     Mean   :50.77     Mean   :1.0189  
 3rd Qu.:22.845   3rd Qu.:5.623     3rd Qu.:57.54     3rd Qu.:1.1697  
 Max.   :35.920   Max.   :8.390     Max.   :72.84     Max.   :1.6581  
       ca          sensor_drift      manganese_trace  housekeeping_expression
 Min.   :0.3904   Min.   :-2.32076   Min.   :0.3746   Min.   :21.51          
 1st Qu.:0.8614   1st Qu.:-0.66182   1st Qu.:0.4692   1st Qu.:43.05          
 Median :1.0016   Median :-0.06476   Median :0.4948   Median :49.69          
 Mean   :1.0018   Mean   :-0.04402   Mean   :0.4956   Mean   :49.79          
 3rd Qu.:1.1585   3rd Qu.: 0.58321   3rd Qu.:0.5237   3rd Qu.:56.32          
 Max.   :1.5155   Max.   : 2.05850   Max.   :0.6141   Max.   :80.22          
library(GGally)
ggpairs(bioreac)

  1. Ajuster un modèle linéaire sur ces données. Préciser le coefficient de détermination \(R^2\) obtenu.
Réponse
mod_complet <- lm(data = bioreac,formula = yield~.)
summary(mod_complet)

Call:
lm(formula = yield ~ ., data = bioreac)

Residuals:
    Min      1Q  Median      3Q     Max 
-68.794 -13.671  -0.961  12.618  59.211 

Coefficients:
                          Estimate Std. Error t value Pr(>|t|)    
(Intercept)             -141.91979  151.67701  -0.936 0.351126    
temperature                1.42063    2.48508   0.572 0.568508    
pH                         0.42456   12.08486   0.035 0.972027    
oxygen                     0.02743    0.21308   0.129 0.897781    
glucose                   -0.27845    1.27386  -0.219 0.827303    
iptg                      -2.04058    6.80519  -0.300 0.764751    
agitation                  0.13058    0.10464   1.248 0.214221    
growth_rate              -12.54935   10.43807  -1.202 0.231380    
plasmid_copy               1.91336    0.43510   4.397 2.21e-05 ***
promoter_strength          7.85342    2.24496   3.498 0.000636 ***
protein_stability          3.93733    0.22154  17.772  < 2e-16 ***
mg                         4.49762   11.10956   0.405 0.686239    
ca                         1.92003   10.61796   0.181 0.856776    
sensor_drift              -0.84862    2.33783  -0.363 0.717179    
manganese_trace           85.60581   48.47194   1.766 0.079658 .  
housekeeping_expression    0.43360    0.21936   1.977 0.050136 .  
---
Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1

Residual standard error: 25.05 on 134 degrees of freedom
Multiple R-squared:  0.7588,    Adjusted R-squared:  0.7318 
F-statistic: 28.11 on 15 and 134 DF,  p-value: < 2.2e-16

On remarque que l’on ne peut pas rejeter l’hypothèse de nullité pour un grand nombre de coefficients.

Le coefficient de détermination obtenu est \(R^2 = 0.7588\).
  1. Préciser les coefficients du modèle qui semblent significativement non nuls. Que peut-on dire des autres coefficients ?
Réponse

Les coefficients du modèle significativement non nuls sont ceux associés aux variables plasmid_copy, promoter_strength et protein_stability. Les autres variables semblent donc rien n’apporter de plus que celles-ci dans le calcul du rendement final. On va tester la nullité simultanée des coefficients associés à ces dernières variables.

mod_reduit <- lm(data = bioreac,
                 formula = yield~plasmid_copy+promoter_strength+protein_stability+0)
# Ajouter le +0 indique que l'on ne prend pas de constante (Intercept) dans le modèle.
summary(mod_reduit)

Call:
lm(formula = yield ~ plasmid_copy + promoter_strength + protein_stability + 
    0, data = bioreac)

Residuals:
    Min      1Q  Median      3Q     Max 
-68.413 -15.606  -1.276  15.716  59.909 

Coefficients:
                  Estimate Std. Error t value Pr(>|t|)    
plasmid_copy        2.1102     0.3778   5.586 1.10e-07 ***
promoter_strength   8.2808     1.6238   5.100 1.03e-06 ***
protein_stability   4.0388     0.1668  24.221  < 2e-16 ***
---
Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1

Residual standard error: 24.84 on 147 degrees of freedom
Multiple R-squared:  0.9929,    Adjusted R-squared:  0.9928 
F-statistic:  6881 on 3 and 147 DF,  p-value: < 2.2e-16
anova(mod_complet,mod_reduit)
Analysis of Variance Table

Model 1: yield ~ temperature + pH + oxygen + glucose + iptg + agitation + 
    growth_rate + plasmid_copy + promoter_strength + protein_stability + 
    mg + ca + sensor_drift + manganese_trace + housekeeping_expression
Model 2: yield ~ plasmid_copy + promoter_strength + protein_stability + 
    0
  Res.Df   RSS  Df Sum of Sq      F Pr(>F)
1    134 84056                            
2    147 90677 -13     -6621 0.8119 0.6467
Ici, on ne peut effectivement pas rejeter l’hypothèse comme quoi tous ces coefficients son nuls, y compris l’intercept.
  1. Afin d’expliquer au mieux la variable yield, on va appliquer la méthode de sélection “forward” à ce modèle linéaire.
  1. A l’aide de la fonction regsubsets() du package leaps, appliquer la procédure “forward” au jeu de données.
Voir le code
library(leaps)
list_forward <- regsubsets(x=yield~.,data=bioreac,method="forward",nvmax=ncol(bioreac))
# nvmax correspond au nombre maximal de variables que le procédé va sélectionner.
  1. Représenter graphiquement dans quel ordre les variables sont sélectionnées.
Voir le code
plot(list_forward,scale="r2",main="Suite de variables sélectionnées par la méthode forward")

  1. Stocker le résumé de la procédure dans un objet summary_forward. A partir de cet objet, et des fonctions AIC(), BIC() et lm(), récupérer les \(AIC\), \(BIC\) et \(R_a^2\) pour chaque modèle de la procédure.
Voir le code
summary_forward <- summary(list_forward)
# Récupération des R^2 ajustés (et des critères BIC ?)
adjr2_forward <- summary_forward$adjr2
# bic_forward <-summary_forward$bic 

# Cette dernière ligne est commentée. Il ne s'agit pas exactement des "vrais" critères BIC
# dans la fonction regsubsets(), mais ils sont égaux à une constante près...
# On pourrait donc les utiliser aussi sans changer la procédure.

# Pour le critère AIC, on va devoir ajuster un modèle linéaire pour chaque modèle,
# puis récupérer l'AIC.

# On crée d'abord un vecteur vide où on va stocker les AIC ensuite.
aic_forward <- rep(NA,length(adjr2_forward))
bic_forward <- rep(NA,length(aic_forward))
for(i in 1:length(aic_forward)){
  # On crée la formule à utiliser pour ajuster le modèle linéaire
  # Dans summary_foraward$which, on récupère les noms de variables sélectionnées 
  # à chaque étape de la méthode forward.
  formula_i <- as.formula(paste0("yield~",paste(names(which(summary_forward$which[i,-1])),collapse = "+")))
  lm_i <- lm(data=bioreac,formula = formula_i)
  aic_forward[i] <- AIC(lm_i)
  bic_forward[i] <- BIC(lm_i)
}
  1. Représenter ces différents critères sur un graphique ayant :
  • en abscisses le nombre de variables utilisées;
  • en ordonnées la valeur du critère étudié.
Voir le code
library(ggplot2)
df_forward <- data.frame(Nvar=1:length(aic_forward),
                         R2a = adjr2_forward,
                         AIC=aic_forward,
                         BIC=bic_forward)
ggplot(df_forward) + aes(x=Nvar,y=R2a)+
  geom_line(color="skyblue4",lwd=1)+
  geom_point(color="skyblue4")+
  theme_minimal()+
  labs(title="Courbe des R2 ajustés pour la méthode forward",
       x="Nombre de variables")

ggplot(df_forward) + aes(x=Nvar,y=AIC)+
  geom_line(color="tomato4",lwd=1)+
  geom_point(color="tomato4")+
  theme_minimal()+
  labs(title="Courbe des AIC pour la méthode forward",
       x="Nombre de variables")

ggplot(df_forward) + aes(x=Nvar,y=BIC)+
  geom_line(color="springgreen4",lwd=1)+
  geom_point(color="springgreen4")+
  theme_minimal()+
  labs(title="Courbe des BIC pour la méthode forward",
       x="Nombre de variables")

  1. Quel modèle retient-on finalement ?
Réponse

Tout dépend du critère retenu :

  • On retient le modèle à 7 variables avec le critère \(R_a^2\), donc on conserve les variables :
summary_forward$which[7,]
            (Intercept)             temperature                      pH 
                   TRUE                   FALSE                   FALSE 
                 oxygen                 glucose                    iptg 
                  FALSE                   FALSE                   FALSE 
              agitation             growth_rate            plasmid_copy 
                   TRUE                    TRUE                    TRUE 
      promoter_strength       protein_stability                      mg 
                   TRUE                    TRUE                   FALSE 
                     ca            sensor_drift         manganese_trace 
                  FALSE                   FALSE                    TRUE 
housekeeping_expression 
                   TRUE 
  • On retient le modèle à 5 variables avec le critère \(AIC\) :
summary_forward$which[5,]
            (Intercept)             temperature                      pH 
                   TRUE                   FALSE                   FALSE 
                 oxygen                 glucose                    iptg 
                  FALSE                   FALSE                   FALSE 
              agitation             growth_rate            plasmid_copy 
                  FALSE                   FALSE                    TRUE 
      promoter_strength       protein_stability                      mg 
                   TRUE                    TRUE                   FALSE 
                     ca            sensor_drift         manganese_trace 
                  FALSE                   FALSE                    TRUE 
housekeeping_expression 
                   TRUE 
  • On retient enfin le modèle à 3 variables avec le critère \(BIC\) :
summary_forward$which[3,]
            (Intercept)             temperature                      pH 
                   TRUE                   FALSE                   FALSE 
                 oxygen                 glucose                    iptg 
                  FALSE                   FALSE                   FALSE 
              agitation             growth_rate            plasmid_copy 
                  FALSE                   FALSE                    TRUE 
      promoter_strength       protein_stability                      mg 
                   TRUE                    TRUE                   FALSE 
                     ca            sensor_drift         manganese_trace 
                  FALSE                   FALSE                   FALSE 
housekeeping_expression 
                  FALSE 
Remarque : tous ces modèles contiennent la constante (Intercept).
  1. Refaire la question précédente, mais en utilisant cette fois-ci la méthode de sélection “backward”.
Réponse
list_backward <- regsubsets(x=yield~.,data=bioreac,method="backward",nvmax=ncol(bioreac))
plot(list_backward,scale="r2",main="Suite de variables sélectionnées par la méthode backward")

plot(list_forward,scale="r2",main="Suite de variables sélectionnées par la méthode forward")

Les deux graphiques étant strictement identiques, nul besoin de poursuivre l’étude, on aura les mêmes modèles, et don les mêmes résultats que précédemment.

Remarque : attention, ce n’est pas toujours le cas !
  1. Quel modèle peut-on finalement retenir ? Préciser le critère utilisé.
Réponse

Il n’y a pas vraiment de bonne ou de mauvaise réponse ici, il faut simplement préciser le critère choisi.

On va prendre le critère \(BIC\), qui était beaucoup plus parcimonieux en termes de variables utilisées, et qui correspond de plus aux tests de significativité qu’on a pu réaliser précédemment.

mod_choisi <- lm(data=bioreac,formula = yield~plasmid_copy + promoter_strength+protein_stability)
  1. Effectuer l’analyse des résidus du modèle finalement retenu. Commenter.
Réponse
  • On calcule tout d’abord les résidus studentisés.
res_stud <- rstudent(mod_choisi)
  • On analyse d’abord les possibles valeurs aberrantes.
df_stud <- data.frame(Index=1:length(res_stud),Residus = res_stud)
q <- qt(p=0.975,df=nrow(bioreac)-5)
# les résidus studentisés suivent une loi de Student avec n-p-1 ddl, où p est le
# nombre de paramètres à estimer.

ggplot(df_stud) + aes(x=Index,y=Residus)+
  geom_point(color="violetred4")+
  geom_hline(yintercept = c(-q,q),color="tomato4",linetype="dashed")+
  theme_minimal()+
  labs(y="Résidus studentisés",
       title="Recherche de valeurs aberrantes")

On peut également calculer la proportion de valeurs aberrantes.

mean(abs(res_stud) > q) 
[1] 0.06666667

On rappelle que les valeurs aberrantes sont les observations mal prédites par le modèle. Ici, on ne devrait pas dépasser 5% de valeurs aberrantes. Si l’on dépasse un peu ce taux, on ne le dépasse pas de beaucoup, et on voit sur le graphique qu’aucun résidu ne s’éloigne trop des bornes fixés.

En bref : Rien n’attire notre attention pour l’instant.

  • On analyse ensuite l’hypothèse de normalité du modèle par un Q-Q plot.
ggplot(df_stud) + aes(sample=Residus)+
  geom_qq(color="tan")+
  geom_qq_line(linetype="dashed",color="tan3",lwd=1)+
  theme_minimal()+
  labs(x="Quantiles théoriques",
       y="Quantiles empiriques",
       title = "Q-Q plot des résidus studentisés")

Les points sont bien alignés avec la droite, on valide donc l’hypothèse de normalité.

  • Enfin, on va analyser brièvement la structure des résidus.
# On récupère les valeurs ajustées du modèle
df_stud$pred <- mod_reduit$fitted.values

ggplot(df_stud) + aes(x=pred,y=Residus)+
  geom_point(color="peru")+
  theme_minimal()+
  labs(title = "Structure des résidus",
       x="Valeurs ajustées",
       y="Résidus studentisés")

Aucune strucutre particulière ne se dégage ici. On peut valider l’hypothèse d’homoscédasticité (les bruits ont tous la même variance).

En résumé :l’analyse des résidus n’a pas montré de valeurs particulièrement aberrantes ni exhibé une structure remettant en cause notre modèle linéaire. Cela ne siginfie pas que notre modèle est juste, simplement que l’on n’a pas détecté de faille particulière.

  1. Etudier les points leviers du modèle finalement retenu. Commenter.
Réponse

Rappel : un levier correspond au poid qu’a une observation sur sa propre prévision par le modèle.

On récupère d’abord ces leviers.

leviers <- hatvalues(mod_choisi)
df_leviers <- data.frame(Index=1:length(leviers),Leviers=leviers)

On les représente ensuite par un diagramme en barres, avec les seuils \(2p/n\) et \(3p/n\).

ggplot(df_leviers) + aes(x=Index,y=Leviers)+
  geom_bar(stat="identity",fill="skyblue3")+
  geom_hline(aes(yintercept = 8/nrow(bioreac),
             linetype="Seuil 2p/n"),
             color="tomato4")+
  geom_hline(aes(yintercept = 12/nrow(bioreac),
                 linetype="Seuil 3p/n"),color="tomato4")+
  scale_linetype_manual(values=c("dashed","dotted"))+
  theme_minimal()+
  labs(y="Poids H_ii",
       title = "Recherche des points leviers")+
  theme(legend.title = element_blank())

On constate un certains nombre de points leviers, que l’on peut investiguer davantage.

bioreac[leviers>8/nrow(bioreac),]
       yield temperature       pH   oxygen   glucose      iptg agitation
17  300.6369    37.49785 7.127314 58.94329 11.481800 0.8640407  325.5316
23  306.9330    35.97400 6.993187 46.61226  7.354098 1.2539309  309.1492
36  229.9010    37.68864 6.960565 39.47777 11.557720 0.4171131  288.1401
42  251.3472    36.79208 6.935063 69.59005 12.808101 1.0813200  281.7287
63  235.2732    36.66679 7.246495 62.73766 11.764930 1.5898744  298.4465
76  387.4770    38.02557 7.011950 54.10519 11.100088 0.4114877  288.1622
85  148.5600    36.77951 6.885122 64.76133 13.891702 0.6874933  296.1645
89  258.2510    36.67407 7.064861 55.64355  8.782886 0.9036025  301.1243
98  213.4633    38.53261 6.728032 68.45732 11.278984 0.9707646  320.9061
122 289.8229    36.05253 7.192506 62.86424  7.087068 0.4815086  302.8725
124 325.3996    36.74391 6.720945 72.72267 10.640805 0.5412068  318.0703
142 298.1752    36.73780 7.210836 64.54769 10.929936 1.2970787  311.2408
    growth_rate plasmid_copy promoter_strength protein_stability        mg
17    1.1130075    14.554274          2.825875          63.05262 0.9448219
23    0.4577970    14.872289          2.835453          62.95426 0.8817966
36    0.7316665    14.881882          3.065556          30.31338 1.1978116
42    0.7476183     8.112965          5.806109          39.26357 1.0558322
63    0.7862664    32.122446          4.737329          38.30793 1.0077047
76    0.6378635    35.920222          5.229395          65.80432 1.1639256
85    1.1750156    14.885081          3.635168          23.04671 0.8414777
89    0.3948330    27.895728          3.008462          45.46086 1.3538732
98    0.6469902    25.985388          4.129423          30.07414 1.3945407
122   0.4270206    26.708201          3.005921          36.80874 1.6581035
124   0.8861103    20.833906          8.390371          48.55389 1.2841151
142   0.8415031    30.323521          6.459966          38.91672 0.9048770
           ca sensor_drift manganese_trace housekeeping_expression
17  1.2087783   0.87643126       0.4807601                53.76475
23  0.9928120  -0.22412600       0.5415721                60.32128
36  1.1250703  -0.60862162       0.4916211                48.30740
42  0.6497396   0.92551124       0.4168320                50.04160
63  0.7733080   0.44129312       0.4468094                57.78107
76  0.5812721  -0.82351673       0.4753058                39.40876
85  0.8020936  -0.90793470       0.5000604                44.41486
89  0.9558631   1.08919224       0.4694631                48.22028
98  0.9280036  -0.02100754       0.4538396                47.52226
122 0.9868432  -0.29448179       0.5455245                42.89583
124 1.0965478  -0.63569453       0.3850987                66.41784
142 0.7863990   0.17558835       0.5025026                42.25685
Des valeurs importantes de certaines variables peuvent expliquer le poids d’une observation, mais cela ne signifie pas pour autant que celle-ci est anormale.
  1. Etudier les distances de Cook du modèle finalement retenu. Commenter.
Réponse

Rappel : la distance de Cook mesure l’influence des observatiosn sur l’estimation des paramètres du modèle.

On récupère les distances de Cook afin de les représenter par un diagramme en barres. On représente dans un premier temps le seuil \(4/n\).

cook <- cooks.distance(mod_choisi)
df_cook <- data.frame(Index=1:length(cook),Cook=cook)

ggplot(df_cook)+aes(x=Index,y=Cook)+
  geom_bar(stat="identity",fill="skyblue")+
  geom_hline(aes(yintercept = 4/nrow(bioreac),
             linetype = "Seuil 4/n"),
             color="tomato4")+
  scale_linetype_manual(values="dashed")+
  theme_minimal()+
  labs(y="Distance de Cook c_i",
       title = "Représentation des distances de Cook")+
  theme(legend.title = element_blank())

Un certain nombre d’observations ont une distance de Cook importante. On peut enquêter un peu plus sur ces derniers.

bioreac[cook>4/nrow(bioreac),]
       yield temperature       pH   oxygen   glucose      iptg agitation
8   183.2303    35.73494 6.925512 62.11980  9.030025 0.5763923  295.9708
11  326.4029    38.22408 7.210542 73.01176 11.743930 0.8808908  310.7958
32  380.4778    36.70493 7.252637 48.11566 10.628115 0.4433285  318.0887
36  229.9010    37.68864 6.960565 39.47777 11.557720 0.4171131  288.1401
111 319.4340    36.42465 6.895777 64.92229  8.332313 1.3183286  318.2242
122 289.8229    36.05253 7.192506 62.86424  7.087068 0.4815086  302.8725
140 334.3360    35.55611 7.033613 72.35693  7.366979 1.3057471  307.9059
143 230.3564    35.42786 7.229053 66.59903 11.681080 1.7148780  277.6717
    growth_rate plasmid_copy promoter_strength protein_stability        mg
8     0.5152814    20.272766          6.107995          35.04173 0.8250437
11    1.4246946    27.409670          5.201837          69.00136 0.9523503
32    0.4334500    21.663109          6.953668          54.21885 1.0852029
36    0.7316665    14.881882          3.065556          30.31338 1.1978116
111   1.1185592    22.551366          6.342624          41.31776 1.2288525
122   0.4270206    26.708201          3.005921          36.80874 1.6581035
140   0.7883974     9.005384          4.561437          59.69434 1.0855733
143   0.6090535    30.967950          4.417940          42.13764 1.3233155
           ca sensor_drift manganese_trace housekeeping_expression
8   1.0069055    0.3769622       0.4789851                47.27943
11  1.2046404   -1.4284596       0.4938191                49.70322
32  1.1659148    1.4250983       0.4788328                47.18376
36  1.1250703   -0.6086216       0.4916211                48.30740
111 0.7858859    1.1129151       0.5053249                54.04691
122 0.9868432   -0.2944818       0.5455245                42.89583
140 1.0109586   -0.7967689       0.4475450                53.50256
143 1.3131629   -1.0438446       0.5102815                57.30816

Des valeurs extrêmes peuvent mettre la puce à l’oreille si une observation est anormale ou non.

On peut utiliser les seuils préconisés par Cook pour voir si ces observations sont préoccupantes.

ggplot(df_cook)+aes(x=Index,y=Cook)+
  geom_bar(stat="identity",fill="skyblue")+
  geom_hline(aes(yintercept = qf(0.1,4,nrow(bioreac)-4),
             linetype = "Seuil f(0.1)"),
             color="tomato4")+
  scale_linetype_manual(values="dashed")+
  theme_minimal()+
  labs(y="Distance de Cook c_i",
       title = "Représentation des distances de Cook")+
  theme(legend.title = element_blank())

Aucune observation ne semble posséder une trop grande influence sur l’estimation des paramètres.

En résumé : sur l’ensemble des dernières questions, rien n’a semblé remettre l’étude statisique en cause. On peut donc valider le modèle assez sereinement.

Remarque : encore une fois, cela ne signifie pas que notre modèle est juste, mais on n’a rien détecté de particulièrement étrange.

On aurait pu néanmoins trouver des observations anormales par les dernières procédures. Dans un tel cas, il convient de déterminer avec le responsable de l’expérience ce qui a pu se produire pour une telle observation, et la retirer le cas échéant. Il n’appartient cependant pas au statisticien seul de retirer une donnée observée, simplement pour justifier son modèle !