Cours INAT - Analyse multivarié

Ben Messaoud Haifa

04/12/2020

Plan du cours

Test statistiques : Test de moyenne

Le test de student (ou t-test) est utilisé pour comparer deux moyennes ou pour comparer une moyenne observée m à une valeur théorique mu. Il existe différents variants du test de student:

# poids des femmes
x<- round(rnorm(10, mean=57, sd=15), 1) 
# Poids des hommes
y <- round(rnorm(10, mean=75, sd=15), 1) 
d<-as.data.frame(list(
                   group=c(rep("Femme", 10), rep("Homme", 10)),
                   poids=c(x, y)
                   ))
head(d)
##   group poids
## 1 Femme  49.9
## 2 Femme  60.8
## 3 Femme  31.9
## 4 Femme  55.1
## 5 Femme  54.7
## 6 Femme  56.7
res<-t.test(x, y, var.equal=TRUE)
res
## 
##  Two Sample t-test
## 
## data:  x and y
## t = -4.2398, df = 18, p-value = 0.0004927
## alternative hypothesis: true difference in means is not equal to 0
## 95 percent confidence interval:
##  -38.53971 -13.00029
## sample estimates:
## mean of x mean of y 
##     54.62     80.39

Test statistiques : Test de moyenne

Comment acceder aux valeurs retournées par la fonction t.test

# Affichage de la p-value
res$p.value
## [1] 0.0004927124
# Affichage de la moyenne
res$estimate
## mean of x mean of y 
##     54.62     80.39
# Affichage de l'intervalle de confiance
res$conf.int
## [1] -38.53971 -13.00029
## attr(,"conf.level")
## [1] 0.95

Test statistiques : Test de khi deux

L’hypothèse nulle (H0) est : le fait de connaître l’appartenance d’un individu à une population (selon un critère) ne donne aucun indice sur la caractéristique qui le défini selon l’autre critère.

Par exemple : est-ce que le fait de connaître la couleur des yeux de quelqu’un me permet de supposer sur son sexe ?

Rèponse : non.

Par exemple : est-ce que le fait de connaître la taille de quelqu’un permet de supposer sur son sexe ? Réponse : oui, plus un individu est petit, plus il y a des chances que ce soit une femme.

Résultats La p-value donne la probabilité de validation de H0

Plus la p-value est petite, plus il y a un lien entre les critères (et donc pas d’indépendance)

# Créations des vecteurs correspondant à 2 catégories et pour chaque catégories 4 tranches salariales :
hommes = c(50,70,110,60)
femmes = c(80,75,100,30)
# Création d'une matrice des effectifs comparative :
tableau = matrix(c(hommes, femmes),2,4,byrow=T) # (2 : nombre de lignes et 4 nombres de colonnes (tranches salariales))
tableau
##      [,1] [,2] [,3] [,4]
## [1,]   50   70  110   60
## [2,]   80   75  100   30
# Réalisation du test khi-deux - les résultats sont sauvegardés dans "khi_test"
test = chisq.test(tableau)
test # affiche le résultat du test
## 
##  Pearson's Chi-squared test
## 
## data:  tableau
## X-squared = 17.53, df = 3, p-value = 0.0005499

Test statistiques : Test de Shapiro-Wilk

Le test de Shapiro-Wilk est un test permettant de savoir si une série de données suit une loi normale.

Hypothèse nulle : l’échantillon suit une loi normale. Par conséquent si la p-value du test est significative, l’échantillon ne suit pas une loi normale.

shapiro.test(rnorm(100, mean = 5, sd = 3))
## 
##  Shapiro-Wilk normality test
## 
## data:  rnorm(100, mean = 5, sd = 3)
## W = 0.99144, p-value = 0.7795

L’exemple ci-dessus renvoie une p-value non significative. L’échantillon suit donc une loi normale.

Comment faire une ACP

# Charger les package
library("FactoMineR")
library("factoextra")
## Loading required package: ggplot2
## Welcome! Want to learn more? See two factoextra-related books at https://goo.gl/ve3WBa
# Charger les données
data(decathlon2)
# head(decathlon2)

Comment faire une ACP

Selon la terminologie ACP, nos données contiennent des:

Nous commençons par extraire les individus actifs et les variables actives pour l’ACP:

decathlon2.active <- decathlon2[1:23, 1:10]
head(decathlon2.active[, 1:6], 4)
##         X100m Long.jump Shot.put High.jump X400m X110m.hurdle
## SEBRLE  11.04      7.58    14.83      2.07 49.81        14.69
## CLAY    10.76      7.40    14.26      1.86 49.37        14.05
## BERNARD 11.02      7.23    14.25      1.92 48.93        14.99
## YURKOV  11.34      7.09    15.19      2.10 50.42        15.31

Standardisation des données

Dans l’analyse en composantes principales, les variables sont souvent normalisées. Ceci est particulièrement recommandé lorsque les variables sont mesurées dans différentes unités (par exemple: kilogrammes, kilomètres, centimètres, …); sinon, le résultat de l’ACP obtenue sera fortement affecté.

L’objectif est de rendre les variables comparables. Généralement, les variables sont normalisées de manière à ce qu’elles aient au final i) un écart type égal à un et ii) une moyenne égale à zéro.

Techniquement, l’approche consiste à transformer les données en soustrayant à chaque valeur une valeur de référence (la moyenne de la variable) et en la divisant par l’écart type. A l’issue de cette transformation les données obtenues sont dites données centrées-réduites. L’ACP appliquée à ces données transformées est appelée ACP normée.

La standardisation des données est une approche beaucoup utilisée dans le contexte de l’analyse des données d’expression de gènes avant les analyses de type PCA et de clustering.

Lors de la normalisation des variables, les données peuvent être transformées comme suit:

xi−mean(x)sd(x)

Où mean(x) est la moyenne des valeurs de x, et sd(x) est l’écart type (SD).

La fonction scale() peut être utilisée pour normaliser les données.

PCA(decathlon2.active, scale.unit = TRUE, ncp = 5, graph = TRUE)

## **Results for the Principal Component Analysis (PCA)**
## The analysis was performed on 23 individuals, described by 10 variables
## *The results are available in the following objects:
## 
##    name               description                          
## 1  "$eig"             "eigenvalues"                        
## 2  "$var"             "results for the variables"          
## 3  "$var$coord"       "coord. for the variables"           
## 4  "$var$cor"         "correlations variables - dimensions"
## 5  "$var$cos2"        "cos2 for the variables"             
## 6  "$var$contrib"     "contributions of the variables"     
## 7  "$ind"             "results for the individuals"        
## 8  "$ind$coord"       "coord. for the individuals"         
## 9  "$ind$cos2"        "cos2 for the individuals"           
## 10 "$ind$contrib"     "contributions of the individuals"   
## 11 "$call"            "summary statistics"                 
## 12 "$call$centre"     "mean of the variables"              
## 13 "$call$ecart.type" "standard error of the variables"    
## 14 "$call$row.w"      "weights for the individuals"        
## 15 "$call$col.w"      "weights for the variables"

Comment faire une ACP

library("FactoMineR")
res.pca <- PCA(decathlon2.active, graph = FALSE)
print(res.pca)
## **Results for the Principal Component Analysis (PCA)**
## The analysis was performed on 23 individuals, described by 10 variables
## *The results are available in the following objects:
## 
##    name               description                          
## 1  "$eig"             "eigenvalues"                        
## 2  "$var"             "results for the variables"          
## 3  "$var$coord"       "coord. for the variables"           
## 4  "$var$cor"         "correlations variables - dimensions"
## 5  "$var$cos2"        "cos2 for the variables"             
## 6  "$var$contrib"     "contributions of the variables"     
## 7  "$ind"             "results for the individuals"        
## 8  "$ind$coord"       "coord. for the individuals"         
## 9  "$ind$cos2"        "cos2 for the individuals"           
## 10 "$ind$contrib"     "contributions of the individuals"   
## 11 "$call"            "summary statistics"                 
## 12 "$call$centre"     "mean of the variables"              
## 13 "$call$ecart.type" "standard error of the variables"    
## 14 "$call$row.w"      "weights for the individuals"        
## 15 "$call$col.w"      "weights for the variables"

Comment faire une ACP

Comme décrit dans les sections précédentes, les valeurs propres (eigenvalues en anglais) mesurent la quantité de variance expliquée par chaque axe principal. Les valeurs propres sont grandes pour les premiers axes et petits pour les axes suivants. Autrement dit, les premiers axes correspondent aux directions portant la quantité maximale de variation contenue dans le jeu de données.

Nous examinons les valeurs propres pour déterminer le nombre de composantes principales à prendre en considération. Les valeurs propres et la proportion de variances (i.e. information) retenues par les composantes principales peuvent être extraites à l’aide de la fonction get_eigenvalue() [package factoextra].

library("factoextra")
eig.val <- get_eigenvalue(res.pca)
eig.val
##        eigenvalue variance.percent cumulative.variance.percent
## Dim.1   4.1242133        41.242133                    41.24213
## Dim.2   1.8385309        18.385309                    59.62744
## Dim.3   1.2391403        12.391403                    72.01885
## Dim.4   0.8194402         8.194402                    80.21325
## Dim.5   0.7015528         7.015528                    87.22878
## Dim.6   0.4228828         4.228828                    91.45760
## Dim.7   0.3025817         3.025817                    94.48342
## Dim.8   0.2744700         2.744700                    97.22812
## Dim.9   0.1552169         1.552169                    98.78029
## Dim.10  0.1219710         1.219710                   100.00000
fviz_eig(res.pca, addlabels = TRUE, ylim = c(0, 50))

Comment faire une ACP

Cercle de corrélation

La corrélation entre une variable et une composante principale (PC) est utilisée comme coordonnées de la variable sur la composante principale. La représentation des variables diffère de celle des observations: les observations sont représentées par leurs projections, mais les variables sont représentées par leurs corrélations (Abdi and Williams 2010).

fviz_pca_var(res.pca, col.var = "black")

Comment faire une ACP

Graphique des individus

La fonction fviz_pca_ind() est utilisée pour produire le graphique des individus. Pour créer un graphique simple, tapez ceci:

fviz_pca_ind (res.pca)

Comment faire une ANOVA

Le test ANOVA (ou Analyse de variance) est utilisé pour comparer la moyenne de plusieurs groupes. Le terme ANOVA est un peu trompeur. Bien que le nom de la technique fasse référence aux variances, l’objectif principal de l’ANOVA est d’étudier les différences de moyennes.

Ce chapitre décrit les différents types d’ANOVA pour comparer des groupes indépendants, notamment:

ANOVA à un facteur : une extension du test t pour échantillons indépendants comparant les moyennes dans une situation où il y a plus de deux groupes. C’est le cas le plus simple du test ANOVA où les données sont organisées en plusieurs groupes en fonction d’une seule variable de groupement (aussi appelée facteur). D’autres synonymes sont : ANOVA à 1 facteur, ANOVA à un facteur et ANOVA inter-sujets.

Comment faire une ANOVA

Charger les packages réquis

library(tidyverse)
## ── Attaching packages ─────────────────────────────────────── tidyverse 1.3.0 ──
## ✓ tibble  3.0.4     ✓ dplyr   1.0.2
## ✓ tidyr   1.1.2     ✓ stringr 1.4.0
## ✓ readr   1.4.0     ✓ forcats 0.5.0
## ✓ purrr   0.3.4
## ── Conflicts ────────────────────────────────────────── tidyverse_conflicts() ──
## x dplyr::filter() masks stats::filter()
## x dplyr::lag()    masks stats::lag()
library(ggpubr)
library(rstatix)
## 
## Attaching package: 'rstatix'
## The following object is masked from 'package:stats':
## 
##     filter

Comment faire une ANOVA

Ici, nous utiliserons le jeu de données intégré à R nommé PlantGrowth. Il contient le poids des plantes obtenues sous un contrôle et deux conditions de traitement différentes.

Charger et inspecter les données en utilisant la fonction sample_n_by() pour afficher une ligne aléatoire par groupes:

data("PlantGrowth")
set.seed(1234)
PlantGrowth %>% sample_n_by(group, size = 1)
## # A tibble: 3 x 2
##   weight group
##    <dbl> <fct>
## 1   5.14 ctrl 
## 2   3.83 trt1 
## 3   5.37 trt2

Comment faire une ANOVA

Afficher les niveaux de la variable de groupement:

levels(PlantGrowth$group)
## [1] "ctrl" "trt1" "trt2"

Calculer quelques statistiques sommaires (nombre, moyenne et sd) de la variable weight (poids) organisée par groupes:

PlantGrowth %>%
  group_by(group) %>%
  get_summary_stats(weight, type = "mean_sd")
## # A tibble: 3 x 5
##   group variable     n  mean    sd
##   <fct> <chr>    <dbl> <dbl> <dbl>
## 1 ctrl  weight      10  5.03 0.583
## 2 trt1  weight      10  4.66 0.794
## 3 trt2  weight      10  5.53 0.443

Pour visualiser nous allons faire un boxplot :

ggboxplot(PlantGrowth, x = "group", y = "weight")

Comment faire une ANOVA

L’hypothèse de normalité peut être vérifiée en utilisant l’une des deux approches suivantes:

Analyse des résidus du modèle ANOVA pour vérifier la normalité pour tous les groupes ensemble. Cette approche est plus facile et très pratique lorsque vous avez plusieurs groupes ou s’il y a peu de points de données par groupe. Vérifier la normalité pour chaque groupe séparément. Cette approche peut être utilisée lorsque vous n’avez que quelques groupes et plusieurs points de données par groupe.

Comment faire une ANOVA

Vérifier l’hypothèse de normalité en analysant les résidus du modèle. Le graphique QQ plot dessine la corrélation entre une donnée définie et la distribution normale.

# Construire le modèle linéaire
model  <- lm(weight ~ group, data = PlantGrowth)
# Créer un QQ plot des résidus
ggqqplot(residuals(model))

Dans le QQ plot, comme tous les points se situent approximativement le long de la ligne de référence, nous pouvons supposer une normalité.

Comment faire une ANOVA

# Calculer le test de normalité de Shapiro-Wilk
shapiro_test(residuals(model))
## # A tibble: 1 x 3
##   variable         statistic p.value
##   <chr>                <dbl>   <dbl>
## 1 residuals(model)     0.966   0.438

La p-value n’est pas significative (p = 0,13), on peut donc supposer une normalité.

Vérifier l’hypothèse de normalité par groupe. Calcul du test Shapiro-Wilk pour chaque niveau de groupe. Si les données sont normalement distribuées, la p-value doit être supérieure à 0,05.

PlantGrowth %>%
  group_by(group) %>%
  shapiro_test(weight)
## # A tibble: 3 x 4
##   group variable statistic     p
##   <fct> <chr>        <dbl> <dbl>
## 1 ctrl  weight       0.957 0.747
## 2 trt1  weight       0.930 0.452
## 3 trt2  weight       0.941 0.564

Comment faire une ANOVA

Le graphique residuals versus fits (résidus versus prédictions) peut être utilisé pour vérifier l’homogénéité des variances.

plot(model, 1)

Dans le graphique ci-dessus, il n’y a pas de relations évidentes entre les résidus et les valeurs calculées (fitted) (la moyenne de chaque groupe), ce qui est bon. On peut donc supposer l’homogénéité des variances.

Il est également possible d’utiliser le test de Levene pour vérifier l’homogénéité des variances:

PlantGrowth %>% levene_test(weight ~ group)
## # A tibble: 1 x 4
##     df1   df2 statistic     p
##   <int> <int>     <dbl> <dbl>
## 1     2    27      1.12 0.341

Comment faire une ANOVA

res.aov <- PlantGrowth %>% anova_test(weight ~ group)
## Coefficient covariances computed by hccm()
res.aov
## ANOVA Table (type II tests)
## 
##   Effect DFn DFd     F     p p<.05   ges
## 1  group   2  27 4.846 0.016     * 0.264

Dans le tableau ci-dessus, la colonne ges correspond l’eta-carré généralisé (taille de l’effet). Il mesure la proportion de la variabilité de la variable-réponse (ici weight pour poids des plantes) qui peut être expliquée par le prédicteur (ici group pour groupe de traitement). Une valeur de l’effet de 0,26 (26 %) signifie que 26 % de la variation du poids (weight) peut être attribuable aux conditions de traitement.

Comment faire une ANOVA

Une ANOVA, à un facteur, significative est généralement suivie de tests post-hoc de Tukey pour effectuer de multiples comparaisons par paires entre les groupes. Fonction R clé: tukey_hsd() [rstatix].

# Comparaisons par paires
pwc <- PlantGrowth %>% tukey_hsd(weight ~ group)
pwc
## # A tibble: 3 x 9
##   term  group1 group2 null.value estimate conf.low conf.high p.adj p.adj.signif
## * <chr> <chr>  <chr>       <dbl>    <dbl>    <dbl>     <dbl> <dbl> <chr>       
## 1 group ctrl   trt1            0   -0.371   -1.06      0.320 0.391 ns          
## 2 group ctrl   trt2            0    0.494   -0.197     1.19  0.198 ns          
## 3 group trt1   trt2            0    0.865    0.174     1.56  0.012 *
# Visualisation : Boxplots avec p-values
pwc <- pwc %>% add_xy_position(x = "group")
ggboxplot(PlantGrowth, x = "group", y = "weight") +
  stat_pvalue_manual(pwc, hide.ns = TRUE) +
  labs(
    subtitle = get_test_label(res.aov, detailed = TRUE),
    caption = get_pwc_label(pwc)
    )