install.packages("effectsize")
library("effectsize")
install.packages("datasets")
install.packages("psych")
install.packages("emmeans")
install.packages("metafor")
library("metafor")
library("emmeans")
library("datasets")
library("psych")
Dans les métaanalyses, la taille d’effet est la valeur qui mesure la force d’association entre des variables et une population. Ce critère est bien plus important lorqu’on fait une affirmation statistique que d’indiquer que nous sommes face à un effet significatif ou non significatif.
Les tailles d’effet peuvent s’exprimer de manière relative (ou standardisée) ou absolue (ou non standardisée). Bien que les deux ne sont pas mutuellement incompatibles, on priviligiera les tailles d’effets non standardisées lorsque la mesure fait sens en elle-même. Dans le cas contraire, les tailles d’effets standardisées doivent être privilégiées. Par exemple, si on s’intéresse à l’impact d’un procédure d’abstinence chez des personnes alcooliques, le nombre de jours/semaines/mois d’abstinence fait directement sens. En revanche, lorsqu’on a une échelle d’estime de soi, obtenir un score de 17/20 n’est pas informatif sans avoir une connaissance approfondie de l’outil utilisé.
Dans le cadre des métaanalyse, il est possible de faire l’analyse tant avec des tailles d’effets standardisés et non standardisés, mais, pour faire une métaanalyse sur des mesures non standardisées, il faut que l’ensemble des études dans la métaanalyse ait utilisé la même mesure, de la même manière. Dans le cas contraire, on compare des pommes et des poires, ce qui va à l’encontre de l’idée des statistiques.
En termes d’interprétation, il faut être conscient que déterminer ce qu’est une grande ou une petite taille d’effet dépend essentiellement du contexte théorique dans lequel l’effet a été calculé. Dans certains domaines ou pour certaines questions, il est habituel d’avoir des tailles d’effets importantes alors que dans d’autres, c’est le contraire. Par exemple, quand on s’intéresse à des changements cognitifs survenus suite un trouble/une intervention/un accident, il est fréquent de considérer que que le changement est cliniquement significatif, s’il y a un changement supérieur à 1 écart-type par rapport au niveau antérieur (Bruggemans et al., 1997; Collie et al., 2004) alors que les tailles d’effets des prises en charge non médicamenteuses dans le traitement de la dépression, en particulier l’efficacité des TCC par rapport aux groupes de contrôle est de 0.23 (Cuijpers et al., 2014). Ainsi, si on appliquait le même raisonnement pour tester l’efficacité d’un traitement que celui appliqué par Collie pour identifier un changement cognitif, aucun traitement ne serait conidéré comme significatif, même les médicamenteux dont la taille d’effet est de 0.37 (Leucht et al., 2012). De même, en termes de corrélations, dans de nombreux domaines d’études, une corrélation de 0.30 serait considérée comme faible alors que cela représente deux tiers des articles publiés en psychologie présentent des corrélations inférieures à 0.30 (Hemphill, 2003). En résumé, il faut donc connaître le domaine dans lequel on travaille pour interpréter correctement les tailles d’effets. Cependant, cela requiert une grande expertise qui n’est pas toujours compatible avec les premiers résultats qu’on désire interpréter. Pour cette raison, plusieurs auteurs ont proposé des balises pour interpréter ces tailles d’effet. Nous décrirons ces balises dans chaque section correspondant aux différentes mesures de tailles d’effet.
Il est à noter qu’il existe des mesures de tailles d’effet pour pratiquement toutes les analyses. Ces tailles d’effet sont décrites dans les chapitres consacrés à ces analyses ad hoc. De même, il est théoriquement possible de faire une métaanalyse pour pratiquement toutes les sortes de tailles d’effet. Cependant, ce chapitre se focalisera sur les tailles d’effets utilisées le plus souvent dans le cadre des métaanalyses. Il est à noter qu’il est souvent possible de convertir les tailles d’effet pour les rendre compatibles avec celles présentées dans cette section. Autant que possible, ces conversions sont explicités dans le cadre de ces analyses.
Les corrélations sont en elles-mêmes des tailles d’effet puisque leur valeur ne dépend pas de la taille de l’échantillon.
Pour rappel, la formule de la corrélation de Bravais-Pearson (Pearson, 1895) entre les variables x et y est
\[r_{xy} = \frac{cov_{xy}}{s_x \times s_y}\text{ (1)} \]
où \(cov_{xy}\) est la covariance entre x et y et \(s_x\) et \(s_y\) sont les écart-types de x et de y.
On peut également exprimer cette valeur en pourcentage de variance exprimer. Pour cela, on élève la valeur de la corrélation au carré1. On parle aussi parfois de coefficient de détermination.
Dans une régression multiple, il est possible d’estimer la corrélation entre un des prédicteurs avec la variable dépendantes si certaines informations sont disponibles et si certaines conditions sont remplies dont la plus importante est qu’il n’y ait pas une trop forte colinéarité entre les prédicteurs, c’est-à-dire de faibles corrélations entre les prédicteurs. Ainsi, s’il est raisonnable de penser que plusieurs prédicteurs ont de fortes corrélations entre eux, l’estimation sera sensiblement biaisée.
Certains auteurs précisent dans le tableau de régression le \(\Delta R^2\), c’est-à-dire la différence de pourcentage de variance expliquée spécifiquement par une variable dans le modèle, ou pour le formuler autrement le pourcentage de variance du modèle qui n’est plus expliqué dès lors qu’une variable est supprimée. Ce coefficient de corrélation est le coefficient de corrélation partiel élevé au carré. En faisant la racine carrée de cette valeur, on obtient un coefficient de corrélation.
Pour tester la significativité des coefficients de corrélation, une statistique t est calculée. Cette valeur est obtenue par l’équation (2) :
\[t = \frac{r_{xy} \times \sqrt{(N-2)}}{\sqrt{1-r_{xy}^2} }\text{ (2)} \]
où N est la taille d’échantillon et \(r_{xy}^2\) est le coefficient de corrélation au carré. Sachant que dans les tableaux de régression, la valeur du t est fréquemment fournie pour indiquer la significativité de la variable, il est possible de retrouver le coefficient de corrélation partiel à partir de cette valeur. L’équation devient alors (3) :
\[r = \sqrt{\frac{t^2}{t^2+N-2}} \text{ (3)}\]
Á partir de la formule du t, nous pouvons élever le tout au carré pour éviter les racines carrées, ce qui donne : \[t^2 = \frac{r_{xy}^2 \times (N-2)} { (1-r_{xy}^2)} \]
En multipliant le tout par le dénominateur, on peut simplifier la formule.
\[t^2 \times (1-r_{xy}^2) = r_{xy}^2 \times (N-2) \] On peut développer la partie gauche de l’équation :
\[t^2 - (t^2 \times r_{xy}^2) = r_{xy}^2 \times (N-2) \] En additionnant \((t^2 \times r_{xy}^2)\) des deux côtés de l’équation, nous obtenons :
\[t^2 = (r_{xy}^2 \times (N-2))+ (t^2 \times r_{xy}^2) \] Nous pouvons à présent factoriser le \(r^2_{xy}\)
\[t^2 = r_{xy}^2 \times (t^2 +(N-2)) \] En divisant le tout par \((t^2 +(N-2))\), l’équation peut être simplifiée de la manière suivante :
\[\frac{t^2}{(t^2 +(N-2))} = r_{xy}^2\]
On termine en faisant la racine carré du tout :
\[\sqrt{\frac{t^2}{(t^2 +(N-2))}} = r_{xy}\]
Evidemment, il n’est pas nécessaire de calculer cette valeur
manuellement. On peut l’obtenir grâce à la fonction t_to_r
où le premier argument est la valeur du t et le second est le nombre de
degrés de liberté (N-2)
t_to_r(
t = c(7.46, 0.01),
df_error = 27
)
## r | 95% CI
## ------------------------
## 0.82 | [ 0.67, 0.89]
## 1.92e-03 | [-0.35, 0.35]
Cette méthode peut également être utilisée lorsque des modèles linéaires mixtes ont été utilisés.
Exercice 1
Dans le jeu de données “sex appeal”, les participant·es ont communiqué pendant 30 minutes avec une personne correspondant à leur orientation sexuelle. Suite à cette interactions, elles devaient indiquer le sex appeal de cette personne, ainsi que les évaluer sur plusieurs critères, que sont l’humour, l’élégance, l’intelligence et le charme. Les auteurs se demandent quels sont les prédicteurs les plus importants du sex appeal (les données sont fictives).
Voici les résultats que les auteurs obtiennent pour la régression. Le premier tableau fournit les informations relatives à la tolérance et au facteur d’inflation de la variance. Le second et troisième et quatrième tableau de résultats fournissent les résultats de la régression
model<-lm(sex_appeal~charme+humour+intelligence+élégance ,data=sex.appeal)
ols_vif_tol(model)
## Variables Tolerance VIF
## 1 charme 0.1381551 7.238241
## 2 humour 0.1380351 7.244532
## 3 intelligence 0.7255781 1.378211
## 4 élégance 0.9692479 1.031728
ols_regress(model)
## Model Summary
## ---------------------------------------------------------------
## R 0.878 RMSE 8.626
## R-Squared 0.770 MSE 78.330
## Adj. R-Squared 0.761 Coef. Var 8.989
## Pred R-Squared 0.748 AIC 726.751
## MAE 7.146 SBC 742.382
## ---------------------------------------------------------------
## RMSE: Root Mean Square Error
## MSE: Mean Square Error
## MAE: Mean Absolute Error
## AIC: Akaike Information Criteria
## SBC: Schwarz Bayesian Criteria
##
## ANOVA
## ---------------------------------------------------------------------
## Sum of
## Squares DF Mean Square F Sig.
## ---------------------------------------------------------------------
## Regression 24955.532 4 6238.883 79.649 0.0000
## Residual 7441.308 95 78.330
## Total 32396.840 99
## ---------------------------------------------------------------------
##
## Parameter Estimates
## ----------------------------------------------------------------------------------------
## model Beta Std. Error Std. Beta t Sig lower upper
## ----------------------------------------------------------------------------------------
## (Intercept) 17.038 5.808 2.933 0.004 5.507 28.570
## charme 0.149 0.115 0.172 1.298 0.197 -0.079 0.378
## humour 0.567 0.115 0.654 4.944 0.000 0.339 0.794
## intelligence 0.617 0.311 0.115 1.987 0.050 0.001 1.234
## élégance 0.293 0.215 0.068 1.361 0.177 -0.134 0.720
## ----------------------------------------------------------------------------------------
Á partir de la valeur du t, calculez les coefficients de corrélations semi-partiels.
t_to_r(
t = summary(model)$coefficient[2:5,3],
df_error = 95
)
## r | 95% CI
## --------------------
## 0.13 | [-0.07, 0.32]
## 0.45 | [ 0.28, 0.58]
## 0.20 | [ 0.00, 0.38]
## 0.14 | [-0.06, 0.32]
Remarquez que, si on fait le calcul des corrélations partiels, on obtient la même valeur :
p_r<-partial.r(data=sex.appeal[,1:5])
# on arrondit à la seconde décimale
# on ne prend que les corrélations avec la variable dépendante (première ligne)
round(p_r[1,],2)
## sex_appeal charme humour intelligence élégance
## 1.00 0.13 0.45 0.20 0.14
Remarquez aussi comme les corrélations partielles peuvent être considérablement éloignées des vraies corrélations quand la tolérance est faible. Ce problème est moins marqué quand il y a peu de multicolinéarité.
cor(x=sex.appeal[,1:5])[1,]
## sex_appeal charme humour intelligence élégance
## 1.0000000 0.8275873 0.8676102 0.5332901 -0.0103704
Un certain nombre d’auteurs ont proposé des interprétations pour les coefficients de corrélations (Cohen, 1988; Evans, 1996; Funder & Ozer, 2019; Gignac & Szodorai, 2016; Lovakov & Agadullina, 2021 ), qui sont résumées dans le Tableau 1. Si Cohen (1988) est le plus cité, les règles proposées par Gignac (2016) sont justifiées par des données réelles, c’est-à-dire sur la distribution de la magnitude des tailles d’effet dans la littérature.
Interprétation |
|
| Auteurs |
|
|
|---|---|---|---|---|---|
| Funder and Ozer (2019) | Gignac and Szodorai (2016) | Cohen (1988) | Evans (1996) | Lovakov and Agadullina (2021) |
Minuscule | r < .05 |
|
|
|
|
Très faible/négligeable | 0.05 <= r <0.1 | r < 0.1 | r <0.1 | r < 0.2 | r < 0.12 |
Faible | 0.1 <= r <0.2 | 0.1 <= r <0.2 | 0.1 <= r < 0.3 | 0.2 <= r < 0.4 | 0.12 <= r < 0.24 |
Moyenne | 0.2 <= r < 0.3 | 0.2 <= r < 0.3 | 0.3 <= r < 0.5 | 0.4 <= r < 0.6 | 0.24 <= r < 0.4 |
Forte/Large | 0.3 <= r < 0.4 | r > 0.3 | r > 0.5 | 0.6 <= r < 0.8 | r > 0.41 |
Très forte/Très large | r >= 0.4 |
|
| r > 0.8 |
|
Dans R, on peut obtenir facilement ces interprétations grâce à la
fonction interpret_r. Ainsi, pour une corrélation de 0.30,
on obtient :
interpret_r( 0.30, rules = "funder2019")
## [1] "large"
## (Rules: funder2019)
interpret_r( 0.30, rules = "gignac2016")
## [1] "large"
## (Rules: gignac2016)
interpret_r(0.30, rules = "cohen1988")
## [1] "moderate"
## (Rules: cohen1988)
interpret_r(0.30, rules = "evans1996")
## [1] "weak"
## (Rules: evans1996)
interpret_r(0.30, rules = "lovakov2021")
## [1] "medium"
## (Rules: lovakov2021)
Les t de Student permettent de comparer les moyennes de deux groupes, les moyennes mesurées à deux moments différents d’un groupe ou la moyenne d’un groupe comparé à une norme. Dans le premier cas, on parle de t de Student pour échantillons indépendants, dans le second d’un t de Student pour échantillons appariés et dans le dernier d’un t de Student comparaison à une norme. Nous reviendrons un peu plus loin sur les formules de ces différents t de Student mais nous pouvons dès à présent préciser que l’idée générale du t de Student est de diviser une différence de moyenne par l’erreur-type \(\frac{s}{n}\). Il s’ensuit que cette valeur dépend de la taille d’échantillon et ne peut dès lors pas être utilisée comme taille d’effet.
Il existe deux moyens d’obtenir une taille d’effet standardisée. La première, la plus fréquente et la plus adaptée dans le cadre des métaanalyses est de calculer une différence de moyennes standardisée. La seconde est de calculer la corrélation bisérielle de point (ou la corrélation bisérielle). Nous focaliserons ici sur la différence de moyennes standardisée, bien qu’il soit nécessaire de connaitre la corrélation bisérielle de point pour comprendre comment on peut harmoniser les tailles d’effets, entre des t de Student par exemple et les coefficients de corrélations.
Par les différentes mesures de différences de moyennes standardisées, le d de Cohen (1988) est sans doute l’indice le plus connu et le plus cité. Il est obtenu en divisant la différence entre les moyennes par l’écart-type. Remarquez ici la similitude avec le score centré réduit (score z).
\[d=\frac{m_1-m_2}{s} \text{ (4)}\]
où s est est l’écart-type commun aux deux groupes obtenu par la formule (5) :
\[s=\sqrt{\frac{(n_1-1)\times s^2_1 +(n_2-1)\times s^2_2}{n_1+n_2-2}} \text{ (5)}\]
Le problème du d de Cohen est que cette mesure est biaisée parce que cette mesure suit une distribution t plutôt qu’une distribution normale. Pour examiner la différence entre les deux distributions, voir l’illustration présentée par l’Animation 1.
Il est important de comprendre que cette distribution t n’est pas forcément centrée (Lin & Aloe, 2020). C’est ce qu’on appelle un paramètre de non centralité . Ce problème de non centralité s’accentue de manière proportionnelle à la différence entre les moyennes : si la vraie différence est 0, la centralité est respectée mais dès qu’elle s’éloigne de 0, ce n’est plus le cas (Lin & Aloe, 2020).
Si l’approximation de Cohen est tout à fait acceptable pour les grands échantillons, des divergences peuvent s’oberver pour de plus petits échantillons, Hedges et Olkin (1985) ont proposé une correction du d de Cohen qui corrige ce biais. Concrètement, on va multiplier le d de Cohen par facteur de correction.
Il est donc préférable d’utiliser le G de Hedge (L. Hedges & Olkin, 1985). La différence principale entre les deux mesures est que le G de Hedge pondère les écart-types regroupés par un coefficient de correction. Une estimation approximative peut être obtenue grâce à la formule (6)2
\[g \approx\frac{m_1-m_2}{s} \times (1- \frac{3}{4 \times (n_1+n_2)-9}) \text{ (6)}\]
Le \(\delta\) de Glass (L. V. Hedges, 1981) a proposé une petite variante du d de Cohen où l’écart-type utilisé était celui du second groupe (qui doit être compris comme étant le groupe de contrôle). L’idée sous-jacente à son raisonnement est que les méta-analyses sont souvent utilisés dans le contexte d’essais contrôlés randomisés. Le groupe de contrôle doit donc servir de référence de sorte à ce que, si les moyennes sont égales, la taille d’effet ne puisse pas être différente de 0 en raison de variances différences. Cette odée est décrite dans la formule (7).
\[\delta = \frac{m_1-m_2}{s_2} \text{ (7)}\]
Si cet indicateur a le mérite d’exister, il n’est quasiment pas utiliser car l’estimation des variances combinée est plus peécise. C’est pourquoi le g de Hedge doit être privilégié.
Lorsque les données sont appariées, les formules décrites ci-dessus ne valent plus car elles ne prennent pas en compte la corrélation entre les deux moments de mesure. Il est donc nécessaire de la modifier. Si on se rappelle que le t de Student pour échantillons appariés est calculé en faisant la moyenne des différences entre les deux temps de mesure, et que cette moyenne des différences est divisé par l’erreur-type des différences, on arrive aisé à comprendre que la formule du d de Cohen devient dans ce cas la formule (8) :
\[d_z = \frac{m_z}{s_z} \text{ (8)}\]
où \(d_z\) est la taille d’effet pour un échantillon apparié, \(m_z\) est la moyenne des différences et \(s_z\) est l’écart-type des différences. L’indice z indique que les données sur lesquelles nous travaillons ne sont plus les mesures brutes mais les différences de mesure entre les deux temps.
Cependant, cette formule ne prend pas en compte la corrélation entre les deux temps de mesures. Lorsque cette information n’est pas disponible, nous n’avons pas d’autre choix que d’utiliser la formule (6). En revanche, lorsque l’information est disponible, il est préférable de le prendre en compte, en utilisant la formule (9)
\[d = \frac{\frac{m_1-m_2}{s}}{\sqrt{1-r}} \text{ (9)}\]
où la différence entre les deux moyennes est divisée par l’écart-type combiné des deux groupes et où r représente la corrélation entre les deux temps de mesure.
Pour illustrer son utilisation, nous utiliserons le jeu de données ‘mtcars’ inclut directement dans R et présenté dans Jeu de données 1.
Nous nous demandons dans quelle mesure le type de transmission (am) change la consommation de carburant (mpg pour miles per gallon). Pour cela nous désirons obtenir le d de Cohen dans un premier temps.
Dans le package ‘effectsize’, la fonction cohens_d
permet d’obtenir facilement cette valeur.
require(effectsize) # charge le package effectsize
data(mtcars) # permet de charger le jeu de données
mtcars$am <- factor(mtcars$am) # transformation de la variable am en facteur
## note : dans le jeu de données présenté ci-dessus, les 0 ont été transformés en 'automatiques'
## et les 1 en manuel. Dans l'absolu, cela ne change rien
cohens_d(mpg ~ am, # on indique qu'on veut prédire la consommation par la type de transmission
data = mtcars, # on indique le jeu de données sur lequel on veut travailler
pooled_sd = T) # on précise si on calcule un écart-type commun (TRUE) ou séparé (FALSE)
## Cohen's d | 95% CI
## --------------------------
## -1.48 | [-2.27, -0.67]
##
## - Estimated using pooled SD.
# Á titre de comparaison avec des écart-types séparés
cohens_d(mpg ~ am,
data = mtcars,
pooled_sd = F) # le TRUE a été changé en FALSE
## Cohen's d | 95% CI
## --------------------------
## -1.41 | [-2.26, -0.53]
##
## - Estimated using un-pooled SD.
Á présent, nous souhaiterions obtenir le g de Hedge. Sans grande
surprise, nous pouvons également l’obtenir aisément avec le package
‘effectsize’, grâce à la fonction hedges_g qui s’utilise
exactement comme la fonction cohens_d.
hedges_g(mpg ~ am, # on indique qu'on veut prédire la consommation par la type de transmission
data = mtcars, # on indique le jeu de données sur lequel on veut travailler
pooled_sd = T) # on précise si on calcule un écart-type commun (TRUE) ou séparé (FALSE)
## Hedges' g | 95% CI
## --------------------------
## -1.44 | [-2.21, -0.65]
##
## - Estimated using pooled SD.
# Á titre de comparaison avec des écart-types séparés
hedges_g(mpg ~ am,
data = mtcars,
pooled_sd = F) # le TRUE a été changé en FALSE
## Hedges' g | 95% CI
## --------------------------
## -1.35 | [-2.17, -0.51]
##
## - Estimated using un-pooled SD.
Exercice 2
Nous souhaitons comparer le temps nécessaire pour parcourir 1/4 de miles (qsec) pour les moteurs en V par rapport aux moteurs en ligne (variable vs). Calculez le d de Cohen avec une estimation séparée des écart-types. Comparez la valeur au g de Hedge.
mtcars$vs<-ifelse(mtcars$vs==0, "Moteur en V", "Moteur en ligne")
mtcars$vs<-as.factor(mtcars$vs)
cohens_d(qsec ~ vs,
data = mtcars,
pooled_sd = F)
## Cohen's d | 95% CI
## ------------------------
## 2.15 | [1.21, 3.06]
##
## - Estimated using un-pooled SD.
hedges_g(qsec ~ vs,
data = mtcars,
pooled_sd = F)
## Hedges' g | 95% CI
## ------------------------
## 2.08 | [1.17, 2.96]
##
## - Estimated using un-pooled SD.
Pour les cas où les données sont appariées, on peut obtenir la valeur
de la taille d’effet en indiquant l’argumentpaired = T dans
la formule. Il faut noter que nous ne pouvons pas utiliser les données
en format longIl faut donc les utiliser en format large, en utilisant
les arguments ‘x’ et ‘y’ et en indiquant le nom d’un vecteur pour chacun
de ces arguments.
Exercice 3
Dans l’exercice suivant, Stefaniak et al. (2008) se sont intéressé aux capacités d’apprentissage implicite. Ils ont utilisé une tâche de temps de réaction sériel. Dans cette tâche, les participants doivent appuyer le plus rapidement possible sur la touche du clavier correspondant à la localisation du stimulus sur l’écran. Á des participants, les stimulis n’apparaissent pas de manière aléatoire mais suivent un séquence. Quelle est la différence de moyennes standardisées entre les blocs 1 et 2. Calculez le d de Cohen et le g de Hedge. Les données sont présentées dans Jeu de données 2.
{{% attachments style="grey" pattern=".*\.csv$" %}}AI<-read.csv2("AI.csv", sep =";") # on importe les données. Le séparateur des colomnes est le point-virgule.
str(AI)
## 'data.frame': 60 obs. of 16 variables:
## $ TYPE : chr "inc" "inc" "inc" "inc" ...
## $ BLOC1 : chr "426.5" "395" "343" "474.5" ...
## $ BLOC2 : chr "402.5" "369.5" "329" "435.5" ...
## $ BLOC3 : chr "410" "334" "293" "430.5" ...
## $ BLOC4 : chr "438.5" "372.5" "298" "465" ...
## $ BLOC5 : chr "439" "342" "299" "454.5" ...
## $ BLOC6 : chr "399.5" "343" "331" "500.5" ...
## $ BLOC7 : chr "412" "341.5" "291.5" "420.5" ...
## $ BLOC8 : chr "374" "335" "333" "459" ...
## $ BLOC9 : chr "432" "336" "310" "413" ...
## $ BLOC10: chr "385.5" "324" "272" "486" ...
## $ BLOC11: chr "435.5" "325" "305.5" "452" ...
## $ BLOC12: chr "416" "314" "275.5" "476" ...
## $ BLOC13: chr "484.5" "386.5" "322" "502" ...
## $ BLOC14: chr "429.5" "327" "295.5" "535" ...
## $ BLOC15: chr "374" "306.5" "276.5" "564.5" ...
# on remarque que les valeurs dans les blocs sont considérées comme du caractère. On va les transformer en numérique
AI$BLOC1<-as.numeric(AI$BLOC1)
AI$BLOC2<-as.numeric(AI$BLOC2)
cohens_d(x=AI$BLOC1, y=AI$BLOC2,
paired =T)
## Cohen's d | 95% CI
## ------------------------
## 0.89 | [0.58, 1.18]
hedges_g(x=AI$BLOC1, y=AI$BLOC2,
paired =T)
## Hedges' g | 95% CI
## ------------------------
## 0.87 | [0.58, 1.17]
Idéalement, lorsqu’on veut mener une méta-analyse, à défaut d’avoir
l’indice directement fourni dans l’article, on souhaite disposer des
moyennes et des écart-types pour pouvoir calculer facilement les tailles
d’effets. Lorsque cet indice est calculé pour une seule étude, on peut
utiliser la fonction escalc du package ‘metafor’ (Viechtbauer,
2010).
Si nous reprenons l’exemple sur le type de transmission que nous avons évoqué plus haut, nous pouvons calculer les moyennes et écart-types de chacun des groupes.
Nous nous demandons dans quelle mesure le type de transmission (am) change la consommation de carburant (mpg pour miles per gallon). Pour cela nous désirons obtenir le d de Cohen dans un premier temps.
Dans le package ‘effectsize’, la fonction cohens_d
permet d’obtenir facilement cette valeur.
require("metafor")
tapply(mtcars$mpg, mtcars$am, mean) # permet d'obtenir la moyenne de chaque groupe
## 0 1
## 17.14737 24.39231
tapply(mtcars$mpg, mtcars$am, sd) # permet d'obtenir l'écart-type de chaque groupe
## 0 1
## 3.833966 6.166504
table( mtcars$am) # permet d'obtenir le nombre d'observations pour chaque groupe
##
## 0 1
## 19 13
escalc(measure = "SMD", # fournit la différence de moyennes standardisées,
m1i = 17.14737, # moyenne du groupe 1
m2i= 24.39231, # moyenne du groupe 2
sd1i = 3.833966, # écart-type du groupe 1
sd2i =6.166504 ,# écart-type du groupe
n1i = 19, # effectif du groupe 1
n2i = 13, #effectif du groupe 1 2
var.name = c("SMD", "erreur-type SMD")
)
##
## SMD erreur.type.SMD
## 1 -1.4406 0.1620
Remarquez que la valeur obtenue est directement le g de Hedge non biaisé, et que la valeur est identique à celle que nous avions obtenue plus haut.
Exercice 4
Sachant que, dans les données apprentissage implicite, trois groupes ont participé à l’expérimentation : les participants qui n’avaient pas connaissance de la séquence (INC), les participants qui connaissaient la séquence mais pas leurs irrégularités (REG) et les participants qui connaissaient la séquence et la manière dont les irrégularités étaient construites.
Obtenez les indices pertinents et calculer la différence de moyennes standardisée entre le groupe incident et connaissance des régularités de la séquence (mais pas des irrégularités) pour le bloc 12.
Note : n’oubliez pas de transformer la variable bloc 12 en une variable numérique au préalable.
AI$BLOC12<-as.numeric(AI$BLOC12)
M<-tapply(AI$BLOC12, AI$TYPE, mean)
M
## inc irreg reg
## 368.650 341.825 377.325
S<-tapply( AI$BLOC12, AI$TYPE, sd)
S
## inc irreg reg
## 60.06490 48.58695 51.59872
T1<-table( AI$TYPE)
T1
##
## inc irreg reg
## 20 20 20
escalc(measure = "SMD", # fournit la différence de moyennes standardisées,
m1i = M[1], # moyenne du groupe 1
m2i= M[3], # moyenne du groupe 2
sd1i = S[1], # écart-type du groupe 1
sd2i =S[3] ,# écart-type du groupe
n1i = T1[1], # effectif du groupe 1
n2i = T1[3], #effectif du groupe 1 2
var.name = c("SMD", "erreur-type SMD")
)
##
## SMD erreur.type.SMD
## 1 -0.1519 0.1003
Dans les exemples que nous venons d’utiliser, on a utiliser la fonction lorsqu’une seule valeur était présente. Cependant, on peut sans souci le faire pour plusieurs études de manière simultanées. C’est le cas dans l’exemple ci-dessous pour des données permettant de faire une méta-analyse. L’objectif de l’étude était de déterminer la durée à l’hôpital en comparant des personnes ayant été hospitalisées en soins intensifs ou en unité non spécialisée. Les données de Normand (1999) sont présentées dans Jeu de données 3.
On utilise le nom des variables dans la base de données pour indiquer où se trouve l’information (voir Jeu de données 4).
dat1 <- escalc(measure="SMD", m1i=m1i, sd1i=sd1i, n1i=n1i,
m2i=m2i, sd2i=sd2i, n2i=n2i, data=dat.normand1999,
var.name = c("SMD", "erreur-type SMD")
)
titre<-"Jeu de données Normand 1999 avec les tailles d'effets intégrées."
caption<-paste0("Jeu de données", donnees, ". ", titre)
datatable(dat1, caption=caption, rownames =F)
Bien que l’APA recommande de fournir les tailles d’effet et les statistiques descriptives, il est très fréquent que ces informations soient manquantes dans les articles. Fort heureusement, il est possible d’obtenir les tailles d’effet à partir de la valeur de la statistique à la condition de connaitre les degrés de liberté et/ou la taille de l’échantillon.
En effet, si on se rappelle que le t de Student est obtenu par la formule (10)
\[t=\frac{m_1-m_2}{s_p \times \sqrt{\frac{1}{n_1}+\frac{1}{n_2}}} \text{ (10)}\]
où est l’écart-type combiné dont la formule est présentée dans la section intitulée le d de Cohen. On comprend donc qu’en multipliant la valeur du t par (11) \[\sqrt{\frac{1}{n_1}+\frac{1}{n_2}} \text(11)\]
On obtient une bonne approximation de la valeur à partir des degrés de liberté (pour rappel, ils valent \(n_1+n_2-2\)) grâce à la formule suivante :
\[\sqrt{\frac{1}{n_1}+\frac{1}{n_2}} \approx 2 \times \sqrt{\frac{1}{ddl}} \text(12)\]
Il est à noter que cette formule vaut pour les t de Student pour échantillons indépendants. En revanche, comme on travaille sur les différences entre les deux temps pour le t de Student pour échantillons appariés, la formule devient :
\[\sqrt{\frac{1}{n_z}} \approx \sqrt{\frac{1}{ddl}} \text(13)\] où \(n_z\) est le nombre de participants qui ont pris part à l’étude (ou de manière plus générale le nombre d’observations indépendantes)
Il n’est évidemment pas nécessaire de calculer cette valeur
manuellement. On l’obtient grâce à la fonction t_to_d.
Reprenons l’exemple sur la consommation de carburant en fonction du type de transmission. Dans un article, nous aurions pu avoir uniquement la valeur du t avec les degrés de liberté.
Nous allons commencer par calculer ces indicateurs.
t.out<-t.test(mpg~am, data=mtcars, var.equal=T)
t.out
##
## Two Sample t-test
##
## data: mpg by am
## t = -4.1061, df = 30, p-value = 0.000285
## alternative hypothesis: true difference in means between group 0 and group 1 is not equal to 0
## 95 percent confidence interval:
## -10.84837 -3.64151
## sample estimates:
## mean in group 0 mean in group 1
## 17.14737 24.39231
Ma valeur du t est de -4.106127 et les degrés de liberté valent 30
t_to_d(t=4.1061, df_error=30, paired = FALSE, ci = 0.95, alternative = "two.sided")
## d | 95% CI
## -------------------
## 1.50 | [0.68, 2.30]
On remarque que la taille d’effet est légèrement surestimée par rapport au 1.48 calculé initialement mais l’approximation est acceptable. En revanche, si on a les tailles d’échantillon de chacun des groupes, on obtient la même valeur que précédemment
table(mtcars$am) # obtient le nombre d'observations dans chaque groupe
##
## 0 1
## 19 13
En appliquant la formule vue précédemment, on obtient :
4.1061*sqrt(1/19+1/13)
## [1] 1.477937
Pour conclure cette méthode est particulièrement utile dans le cadre des modèles linéaires (ou régressions), des analyses de variances et des modèles linéaires mixtes.
Lorsque l’analyse réalisée était uen analyse de variance, il est également possible d’obtenir des tailles d’effets équivalentes au d de Cohen (1988) et au g de Hedge [-Hedges1985].
Il existe néanmoins différentes alternatives qui dépendent de l’objectif et des informations qui sont disponibles.
La première alternative consite à avoir une taille d’effet global. Pour le formuler autrement, la question qui se pose est de savoir que la différence standardisée moyenne entre les différentes conditions. Cette valeur est obtenue par la formule (14)
\[\psi = \sqrt{\frac{1}{k-1} \sum_{j=1}^{k}(\frac{\mu_j-\mu}{\sigma})^2} \text(14)\] où k est le nombre de groupes dans la comparaison, \(\sigma\) est l’écart-type global, \(\mu_j\) est la moyenne des groupes et \(\mu\) est la grande moyenne.
Il est important de noter que l’écart-type n’est pas toujours fourni mais comme le carré moyen de l’erreur (CMe en français et MSE en anglais) est une bonne estimation de la variance, on peut en faire la racine carrée pour obtenir la valeur souhaitée.
Dans un certain nombre de cas, il n’y a que deux modalités qui sont impliquées.
Par exemple, dans la célèbre expérience de Baddeley (Godden & Baddeley, 1975) où des plongeurs doivent apprendre une liste de mots au bord d’une piscine ou au fond de la piscine et rappeler cette liste de mots, soit au bord, soit au fond, il y a deux variables ayant chacune deux modalités. L’utilisation de l’analyse de variance se justifie par le faire que cela permet d’explorer l’effet d’interaction.
Une autre situation classique est la situation où on a réalisé des contrastes. Les contrastes comparents deux situations.La statistique du contraste peut être une valeur t ou un F. Nous avons déjà vu comment obtenir un d à partir du t. Nous focaliserons à présent sur la manière de l’obtenir à partir du F.
Pour obtenir le d de Cohen (1988), il faut savoir que la valeur du F est le carré de la valeur du t, il devient alors très facile d’obtenir le t, et donc la valeur du d de Cohen grâce à la formule (15).
\[d = \sqrt{F} \times 2 \times \sqrt{\frac{1}{ddl_{erreur}}} \text{(15)} \]
Reprenons l’exemple sur la consommation de carburant en fonction du type de transmission. Nous allons commencer par faire une analyse de variance à la place du t de Student pour échantillons indépendants.
aov.out<-aov(mpg~am, data=mtcars, var.equal=T)
anova.table<-anova(aov.out)
anova.table
## Analysis of Variance Table
##
## Response: mpg
## Df Sum Sq Mean Sq F value Pr(>F)
## am 1 405.15 405.15 16.86 0.000285 ***
## Residuals 30 720.90 24.03
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
Si nous reprenons la valeur du F et que nous en faisons la racine carrée, on obtient exactement la même valeur que la valeur du t.
sqrt(anova.table$`F value` )
## [1] 4.106127 NA
t.test(mpg~am, data=mtcars, var.equal=T)
##
## Two Sample t-test
##
## data: mpg by am
## t = -4.1061, df = 30, p-value = 0.000285
## alternative hypothesis: true difference in means between group 0 and group 1 is not equal to 0
## 95 percent confidence interval:
## -10.84837 -3.64151
## sample estimates:
## mean in group 0 mean in group 1
## 17.14737 24.39231
On peut donc à présent obtenir la valeur du d :
sqrt(anova.table$`F value`[1] )*2*sqrt(1/anova.table$Df[2])
## [1] 1.499346
ce qui nous permet d’obtenir exactement la même valeur que précédemment.
Il est à noter qu’il n’existe pas, à ma connaisance, de fonction qui permet d’obtenir directement la d de Cohen (1988) à partir du F.
Exercice 5
Dans la base de données Apprentissage implicite, voici la table de l’ANOVA pour une analyse comparant les différents groupes sur le bloc 1.
## Analysis of Variance Table
##
## Response: BLOC1
## Df Sum Sq Mean Sq F value Pr(>F)
## TYPE 2 2087.575 1043.7875 0.38796 0.68022
## Residuals 57 153357.137 2690.4761
Par ailleurs, voici les comparaisons 2 à 2 entre les groupes.
## contraste t
## 1 inc - irreg 0.2210005945
## 2 inc - reg -0.6279465168
## 3 irreg - reg -0.8489471113
Ainsi que les moyennes de chacun des groupes
## inc irreg reg
## 398.500 394.875 408.800
Pour rappel, il y a 20 participants par groupe.
Calculez la taille d’effet global, ainsi que les tailles d’effet pour les différents contrastes à partir de la valeur du t. Comparez ces valeurs avec celles que vous obtenez à partir des moyennes et écart-types.
\[\psi = \sqrt{\frac{1}{k-1} \sum_{j=1}^{k}(\frac{\mu_j-\mu}{\sigma})^2} \text(16)\]
# on calcule la grande moyenne
GM<-(398.500*20+ 394.875*20 +408.800*20)/60
psi<-sqrt(1/(3-1) * (((398.500-GM)/sqrt(2690.5))^2+((394.875-GM)/sqrt(2690.5))^2 +((408.800 - GM)/sqrt(2690.5))^2 ))
psi
## [1] 0.1392754434
t_to_d(t=c(.221, .628, .849), df_error=57, paired = FALSE, ci = 0.95, alternative = "two.sided")
## d | 95% CI
## --------------------
## 0.06 | [-0.46, 0.58]
## 0.17 | [-0.35, 0.69]
## 0.22 | [-0.30, 0.74]
M<-tapply(AI$BLOC1, AI$TYPE, mean)
S<-tapply(AI$BLOC1, AI$TYPE, sd)
escalc(measure = "SMD", # fournit la différence de moyennes standardisées,
m1i = M[1], # moyenne du groupe inc
m2i= M[2], # moyenne du groupe reg
sd1i = S[1], # écart-type du groupe 1
sd2i =S[2] ,# écart-type du groupe
n1i = 20, # effectif du groupe 1
n2i = 20, #effectif du groupe 1 2
var.name = c("SMD", "erreur-type SMD")
)
##
## SMD erreur.type.SMD
## 1 0.0755 0.1001
escalc(measure = "SMD", # fournit la différence de moyennes standardisées,
m1i = M[1], # moyenne du groupe inc
m2i= M[3], # moyenne du groupe reg
sd1i = S[1], # écart-type du groupe 1
sd2i =S[3] ,# écart-type du groupe
n1i = 20, # effectif du groupe 1
n2i = 20, #effectif du groupe 1 2
var.name = c("SMD", "erreur-type SMD")
)
##
## SMD erreur.type.SMD
## 1 -0.1879 0.1004
escalc(measure = "SMD", # fournit la différence de moyennes standardisées,
m1i = M[2], # moyenne du groupe inc
m2i= M[3], # moyenne du groupe reg
sd1i = S[2], # écart-type du groupe 1
sd2i =S[3] ,# écart-type du groupe
n1i = 20, # effectif du groupe 1
n2i = 20, #effectif du groupe 1 2
var.name = c("SMD", "erreur-type SMD")
)
##
## SMD erreur.type.SMD
## 1 -0.2504 0.1008
Notez que ces valeurs sont des approximations et qu’il est possible d’obtenir les valeurs précises quand vous faites les analyses de la manière suivante :
aov.out<-aov(BLOC1~TYPE, data=AI, var.equal=T)
anova.table<-anova(aov.out)
anova.table
## Analysis of Variance Table
##
## Response: BLOC1
## Df Sum Sq Mean Sq F value Pr(>F)
## TYPE 2 2087.575 1043.7875 0.38796 0.68022
## Residuals 57 153357.137 2690.4761
require(emmeans)
em.out<-emmeans(aov.out,~TYPE)
p.out<-pairs(em.out)
p.out
## contrast estimate SE df t.ratio p.value
## inc - irreg 3.62 16.4 57 0.221 0.9734
## inc - reg -10.30 16.4 57 -0.628 0.8054
## irreg - reg -13.93 16.4 57 -0.849 0.6744
##
## P value adjustment: tukey method for comparing a family of 3 estimates
eff_size(em.out, sigma = sigma(aov.out), edf = df.residual(aov.out))
## contrast effect.size SE df lower.CL upper.CL
## inc - irreg 0.0699 0.316 57 -0.563 0.703
## inc - reg -0.1986 0.317 57 -0.833 0.436
## irreg - reg -0.2685 0.317 57 -0.904 0.367
##
## sigma used for effect sizes: 51.87
## Confidence level used: 0.95
Bien qu’il faille être très prudent lorsqu’on essaie d’estimer une taille d’effet à partir d’une probabilité car, pour environ la moitié des articles publiés en psychologie, il y a au moins une valeur de la probabilité reportée qui ne correspond pas à la valeur de la statistique (Nuijten et al., 2015), il est néanmoins possible de retrouver la taille d’effet à partir d’une probabilité si nous avons les degrés de liberté ou, à défaut, la taille d’échantillon.
L’idée est que la probabilité d’une valeur t dépend à la
fois de la valeur du t et des degrés de liberté. Il est
possible de récupérer la valeur du t si on a la probabilité et
les degrés de liberté grâce à la fonction qt si et
seulement nous avons à notre disposition la probabilité exacte.
Si nous reprenons l’exemple de la consommation de carburant en fonction du type de transmission, la valeur du t était -4.1061269831, la valeur de la probabilité était 0.0002850207 et les degrés de liberté étaient 30
Il faut se rappeler que, dans la plupart des situations, nous travaillons de manière bilatérale. Cela signifie que la probabilité de dépassement (les zones en bleu dans la Figure 1). Cela signifie que la probabilité qu’on obtient est la somme des deux zones bleues. Pour obtenir la valeur de la statistique, il faut donc diviser cette probabiité par 2.
Représentation graphique de la probabilité de dépassement à un seul alpha de 0,05. On rejete l’hypothèse nulle dans la zone bleue.
Ainsi, on obtient la valeur du t de la manière suivante.
qt(0.000285/2, 30)
## [1] -4.106153327
Á partir d’ici, la procédure est la même que celle décrite précédemment.
De même qu’Un certain nombre d’auteurs ont proposé des interprétations pour les coefficients de corrélations (Cohen, 1988; Evans, 1996; Funder & Ozer, 2019; Gignac & Szodorai, 2016; Lovakov & Agadullina, 2021 ), plusieurs auteurs ont proposé des balises pour interpréter les différences de moyennes standardisées (Cohen, 1988; Gignac & Szodorai, 2016; Lovakov & Agadullina, 2021; Sawilowsky, 2009). Ces interprétations sont résumées dans le Tableau 2.
Nous pouvons réitérer la même remarque que celle que nous avons faite précédemment : si Cohen (1988) est le plus cité, les règles proposées par Gignac (2016) sont justifiées par des données réelles, c’est-à-dire sur la distribution de la magnitude des tailles d’effet dans la littérature.
Interprétation | Auteurs | |||
|---|---|---|---|---|
| Cohen (1988) | Gignac and Szodorai (2016) | Sawilowski (2009) | Lovakov and Agadullina (2021) |
Minuscule |
|
| d <0.1 |
|
Très petite | d < .2 | d < 0.2 | 0.1 <= d < 0.2 | d < 0.15 |
Petite | 0.2 <= d <0.5 | 0.2 <= d <0.41 | 0.2 <= d < 0.5 | 0.15 <= d < 0.36 |
Moyenne | 0.5 <= d <0.8 | 0.41 <= d < 0.63 | 0.5 <= d < 0.8 | 0.36 <= d < 0.65 |
Grande | d > 0.8 | d > 0.63 | 0.8 <= d < 1.2 | d > 0.65 |
Très grande |
|
| 1.2 <= d < 2 |
|
Énorme |
|
| d>= 2 |
|
Dans R, on peut obtenir facilement ces interprétations grâce à les
fonctions interpret_cohens_d,
interpret_hedges_g, et interpret_glass_delta.
Ainsi, pour une corrélation de 0.30, on obtient :
interpret_cohens_d( 0.30, rules = "cohen1988")
## [1] "small"
## (Rules: cohen1988)
interpret_hedges_g( 0.30, rules = "gignac2016")
## [1] "small"
## (Rules: gignac2016)
interpret_glass_delta(0.30, rules = "sawilowsky2009")
## [1] "small"
## (Rules: sawilowsky2009)
interpret_cohens_d(0.30, rules = "lovakov2021")
## [1] "small"
## (Rules: lovakov2021)
Pour les données qualitatives, il existe également deux types de tailles d’effet :
La valeur du V de Cramer (qui n’est qu’une extension du \(\phi\)) peut être obtenue à partir de la formule (17)
\[V_{Cramér} = \sqrt{\frac{\frac{\chi^2}{n}}{min(k-1, r-1)}} \text{ (17)}\]
où le \(\chi^2\) est la valeur du \(\chi2\), n est la taille d’échantillon, k est le nombre de colonnes dans le tableau de contingence et r est le nombre de lignes dans le tableau de contingence. On divise donc par la plus petite valeur entre le nombre de ligne moins 1 et le nombre de colonne moins 1.
Nous reviendrons sur cet indice quand nous reviendrons sur l’harmonisation des tailles d’effet. Dans le cas des méta-analyses, il est plus fréquent d’utiliser le rapport de cotes.
Pour illustrer son calcul,, imaginons une situation où on s’intéresse au fait de savoir si fumer est associé à un plus grand risque de cancer. Nous allons dénoter le fait d’avoir un cancer par la valeur 1 et ne pas l’avoir par la valeur 0. De même, nous allons noter le fait de fumer par la valeur 1 et le fait dd’être on fumeur par la valeur 0. De manière plus générale, le facteur de risque et la présence de la mesure d’intérêt ont une valeur 1 et leur absence a une valeur 0. Ces données peuvent prendre la forme de la Table 3.
| Développement d'un cancer | |
|---|---|---|
Facteur de risque | Cancer (1) | Pas de Cancer (0) |
Fumeur (1) | 11 | 01 |
Non fumeur (0) | 01 | 00 |
On obtient le rapport de cotes, que nous désignons pas son acronyme anglais ‘OR’ pour odd ratio, par la formule (18)3.
\[OR = \frac{11 \times 00}{10 \times 01} \text{ (18)}\]
Concrètement, si notre table avait comme valeurs celles présentées en Table 4 (les données sont factices).
| Développement d'un cancer | |
|---|---|---|
Facteur de risque | Cancer (1) | Pas de Cancer (0) |
Fumeur (1) | 110 | 975 |
Non fumeur (0) | 25 | 1,825 |
On obtient l’OR de la manière suivante :
\[OR = \frac{110 \times 1825}{25 \times 975}= 8.24 \]
Ceci signifie que fumer augmente de 8.24 le risque de développer un cancer.
Un autre intérêt des OR est qu’il s’agit d’indicateurs qui sont fournit dans toute une série d’analyses, comme les régressions logistiques ou les analyses de survie.
On peut obtenir aisément l’OR dans ratio dans R avec la fonction
oddsratio du package “effectsize” (Ben-Shachar et al.,
2020)
T1<-array(c(110, 25,975, 1825), c(2,2))
T1
## [,1] [,2]
## [1,] 110 975
## [2,] 25 1825
effectsize::oddsratio(x= T1)
## Odds ratio | 95% CI
## --------------------------
## 8.24 | [5.30, 12.80]
Dans le cas que nous venons de présenter, le tableau était assez simple puisqu’il s’agissait d’un tableau \(2 \times 2\). Cependant, il arrive fréquemment que les tableaux soient plus grands. La logique pour obtenir le rapport de cotes est assez similaire. Le point critique est d’établir la ligne de base.
Par exemple, si on veut le rapport de cotes dans une étude où les auteurs se sont demandés si le risque de développer une cirrhose dépend du fait de consommer de l’alcool ou d’en consommer au minimum 4 verres par jour. On pourrait obtenir le Tableau 5 (les données sont factices).
| Développement d'une cirrhose | |
|---|---|---|
Facteur de risque | Cirrhose (1) | Pas de cirrhose (0) |
Pas d'alcool | 250 | 4,500 |
<4 verres par jour | 350 | 25,750 |
>4 verres par jour | 918 | 6,322 |
Dans notre exemple, la première question qu’il faut se poser est de savoir quel est le niveau qui représente la ligne de base. Est-ce qu’il s’agit d’une absence de consommation d’alcool ou est-ce que c’est une consommation modérée d’alcool ? Naturellement, on pourrait penser que la ligne de base serait l’absence de consommation d’alcool, mais dans cet exemple (fictif), on se rend compte que les personnes qui n’en consomme jamais sont moins nombreuses que celles qui en consomment modérément. Il pourrait donc être légitime de considérer ce niveau de la variable comme étant notre ligne de base et d’essayer de savoir si ne pas consommer représente un facteur de protection contre le fait de développer une cirrhose. Dans ce cas, nous aurions deux comparaisons :
Calculons l’effet d’un consommation excessive :
\[OR = \frac{918 \times 25750}{350 \times 6322} = 10.683 \]
Nous avons donc 10.6831020925 plus de chances de développer une cirrhose si nous avons consommé de l’alcool de manière excessive.
Nous pouvons à présent calculer l’OR pour l’effet protecteur que pourrait avoir l’absence totale de consommation d’alcool. \[OR = \frac{250\times 25750}{918 \times 4500} = 4.087 \]
D’après ces données (fictives), les personnes qui ne consomment absolument pas d’alcool aurait donc 4.0873015873 de développer une cirrhose
Il n’est à nouveau pas nécessaire de calculer à la main ces valeurs.
Plusieurs packages ont des fonctions qui calculent les OR, notamment le
package ‘epitools’ (Aragon, 2020) avec la fonction
oddsratio. Notez que la fonction s’appelle de manière
identique à celle de ‘effectsize’. Pour être sûr d’utiliser la bonne
fonction, on peut faire précéder le nom de la fonction par le nom du
package suivi de deux fois deux points (voir l’exemple).
Nous allons commencer par créer le jeu de données :
T1<- array(c(250, 350, 918, 4500, 25750,6322), c(3,2))
dimnames(T1)<-list(c("1. pas d'alcool", "0. Consommation modérée", "2. Consommation excessive"),
c("Cirrhose","Pas de cirrhose" ))
T1
## Cirrhose Pas de cirrhose
## 1. pas d'alcool 250 4500
## 0. Consommation modérée 350 25750
## 2. Consommation excessive 918 6322
Le problème auquel on est confronté est que la fonction
oddsratio requiert que le niveau de base soit sur la
première ligne et la première colonne. On va donc réarranger les lignes
et les colonnes.
T1<-T1[ order(c(2,1,3)), order(c(2,1))]
T1
## Pas de cirrhose Cirrhose
## 0. Consommation modérée 25750 350
## 1. pas d'alcool 4500 250
## 2. Consommation excessive 6322 918
Nous pouvons à présent calculer l’OR.
require(epitools)
epitools::oddsratio(T1)$measure
## NA
## odds ratio with 95% C.I. estimate lower upper
## 0. Consommation modérée 1.000000000 NA NA
## 1. pas d'alcool 4.087770576 3.461790198 4.820036484
## 2. Consommation excessive 10.679041290 9.422845316 12.131936089
D’un point de vue statistique, un risque renvoie à la probabilité de survenue d’un événement, ce qui signifie que le risque est la chance que ce qui nous intéresse survienne sur l’ensemble des cas de figures. La cote renvoie à la probabilité qu’un événement survienne sur la probabilité qu’il ne survienne pas. Dans de nombreuses situations, il y a une confusion entre une cote et un risque. Le rapport renvoie quant à lui de la probabilité qu’un événement survienne divisé par le probabilité que cet événement ne survienne pas (Ranganathan et al., 2015).
Si nous reprenons les données du tableau 5:
T1<-array(c(1825,975,25,110 ), c(2,2))
dimnames(T1)<-list(c("Non Fumeur", "Fumeur"), c("Pas de cancer", "Cancer"))
addmargins(T1)
## Pas de cancer Cancer Sum
## Non Fumeur 1825 25 1850
## Fumeur 975 110 1085
## Sum 2800 135 2935
Le risque de développer un cancer est de 135/2935= 0.046 tandis que la cote entre les personnes qui ont un cancer par rapport à celles qui n’en ont pas est de 135/2800 = 0.048. On peut calculer ces risques et rapports par ligne.
Ces deux probabilités sont relativement proches lorsque le risque que l’événement survienne est faible. Généralement, on considère que le risque est fiable s’il est inférieur à 10% (Sedgwick, 2014).
Le risque relatif est le ratio entre le risque qu’un événement survienne dans un groupe comparativement à l’autre groupe tandis que l’OR est le rapport de la cote d’un événement d’un groupe par rapport à la cote de cet événement dans l’autre groupe.
Le risque relatif est donc calculé de la manière suivante : \[RR =\frac{p_{(cancer/fumeur)}}{p_{(cancer/non fumeur)}} =\frac{\frac{110}{(110+975)}}{\frac{25}{(25+1825)}} = 7.502\]
Si les valeurs sont relativement proches quand l’association est faible et quand le phénomène est peu fréquent, l’écart entre les deux peut considérablement augmenter dès lors que l’association entre les deux variables augmente Dans notre exemple, la probabilité du phénomène est faible et l’association est forte, ce qui explique que l’OR vaut 8.236et le RR vaut 7.502.
Le risque relatif doit être utilisé lorsque nous avons le nombre total de personnes à risques. Ainsi, dans les études rétrospectives, où cette information est manquante, on ne peut pas le calculer. Á l’inverse, l’OR peut toujours être calculé.
Si nous disposons du risque à la ligne de base, il est possible de convertir le risque relatif en OR grâce à la formule 19(Grant, 2014)
\[OR = \frac{RR \times(1-p_0)}{(1-(RR \times p_0))} \text{ (19)}\] où p_0 est la ligne de base, c’est-à-dire la probabilité de survenue du phénomène d’intérêt en l’absence total de traitement/facteur de risque/intervention. Dans notre exemple, 25 non fumeurs parmi les 1850 ont développé un cancer, ce qui signifie que la probabilité de développer un cancer chez les non fumeurs est de 0.014
On obtient facilement cette valeur grâce à la fonction
riskratio_to_oddsratio.
riskratio_to_oddsratio(RR=7.5, p0=0.01369863)
## [1] 8.244274801
Il peut parfois arriver que les chercheurs fournissent les coefficients de la régression logistique mais ne fournissent pas l’OR. Sachant que le coefficient de régression est le logarithme de l’OR4, il suffit de faire l’exponentiel du coefficient de régression pour obtenir l’OR. Si nous reprenons notre exemple initial, nous aurions pu faire une régression logistique à la place d’un \(\chi^2\) d’indéepndance. Cela aurait donné les résultats suivants :
df<-data.frame(Cancer = c(rep(1,135), rep(0, 975+1825)), # crée la variable a (1) ou non (0) un cancer
Fumeur = c(rep(1, 110), rep(0,25), rep(1,975), rep(0,1825)))# crée la variable est (1) ou non (0) fumeur
out<-glm(Cancer~Fumeur, data=df, family="binomial") # réalise la régression logistique
summary(out) # permet d'obtenir les résultats de la régression logistique, en particulier les coefficients de régression
##
## Call:
## glm(formula = Cancer ~ Fumeur, family = "binomial", data = df)
##
## Coefficients:
## Estimate Std. Error z value Pr(>|z|)
## (Intercept) -4.2904594 0.2013651 -21.30687 < 0.000000000000000222 ***
## Fumeur 2.1085023 0.2250877 9.36747 < 0.000000000000000222 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## (Dispersion parameter for binomial family taken to be 1)
##
## Null deviance: 1095.07375 on 2934 degrees of freedom
## Residual deviance: 976.86266 on 2933 degrees of freedom
## AIC: 980.86266
##
## Number of Fisher Scoring iterations: 7
exp( 2.1085) # on obtient sensiblement la même valeur d'OR que précédemment
## [1] 8.235878197
Pour les rapport de cotes, on peut s’appuyer sur deux logiques pour interpréter leur valeur. La première, la plus simple, est de s’appuyer sur les heuristiques proposées par les auteurs (Chen et al., 2010). Une autre manière est de s’appuyer sur les règles qui valent pour les autres mesures, en particulier les différences de moyennes standardisées. En effet, il est possible de transformer aisément un OR en d grâce à la formule (20) (Borenstein et al., 2009) :
\[d = log(OR) \times \frac{\sqrt{3}}{\pi} \]
Ces deux types d’interprétations sont résumées dans le Tableau 6.
Interprétation | Auteurs | |
|---|---|---|
| Cohen (1988) | Chen (2010) |
Très petite | 1 <= OR < 1.44 | 1 <= OR < 1.68 |
Petite | 1.44 <= OR < 2.48 | 1.68 <= OR < 3.47 |
Moyenne | 2.48 <= OR < 4.27 | 3.47 <= OR < 6.71 |
Grande | OR > 4.27 | OR > 6.71 |
Dans R, on peut obtenir facilement ces interprétations grâce à la
fonction interpret_oddsratio. Ainsi, pour une corrélation
de 0.30, on obtient :
interpret_oddsratio( 3, rules = "cohen1988")
## [1] "medium"
## (Rules: cohen1988)
interpret_oddsratio( 3, rules = "chen2010")
## [1] "small"
## (Rules: chen2010)
Il faut noter que, lorsque l’OR a une valeur inférieur à 1, l’interprétation est réversible. Si nous reprenons l’exemple sur le risque de développer un cancer quand on fume. Nous avions 8.24 plus de chances de développer un cancer lorsqu’on fume. Cependant, si le codage avait été inversé, nous aurions obtenu un OR de 0.1214. Cela signifie donc que nous avons 8.24 moins de chance de développer un cancer quand on est non fumeur.
\[OR = \frac{25 \times 975}{110 \times 1825}= 0.1214 \] Ceci souligne deux points :
il faut être attentif quand on utilise un logiciel de statistiques à la manière dont les OR ont été calculés. En cas de doute, le plus simple est de faire un tableau \(2 \times 2\), de calculer l’OR à la main et de vérifier ce que le logiciel a fait.
Les interprétations dans le Tableau 6 ont une réciproque qui est présentée dans le Tableau7
Interprétation | Auteurs | |
|---|---|---|
| Cohen (1988) | Chen (2010) |
Très petite | 1 >= OR > 0.6944 | 1 >= OR > 0.5952 |
Petite | 0.6944 >= OR > 0.4032 | 0.5952 >= OR > 0.2882 |
Moyenne | 0.4032 >= OR > 0.2342 | 0.2882 >= OR > 0.149 |
Grande | OR < 0.2342 | OR < 0.149 |
Nous pouvons obtenir un coefficient de corrélation à partir d’un de Cohen grâce l’équation (21) (Borenstein et al., 2009, pp. 48–49) :
\[r =\frac{d}{\sqrt{d^2+a}}\text{ (21)}\]
où a est un facteur de correction qui vaut (22) :
\[a =\frac{(n_1+n_2)^2}{n_1 \times n_2} \text{ (22)}\]
Si les tailles d’échantillons sont égales, alors a = 4. Le package ‘effectsize’ (Ben-Shachar et al., 2020) applique cette logique. L’estimation sera relativement correcte tant que les deux échantillons sont approximativement de même taille mais, en cas d’échantillons de tailles différentes, il est préférable de faire le calcul à la main avec la formule précédente.
\[r \approx \frac {d}{\sqrt{d^2+4}}\text{ (23)}\]
Encore une fois, R fournit la fonction qui fait la conversion pour
vous grâce à la fonction d_to_r du package ‘effectsize’
(Ben-Shachar et al.,
2020).Dans l’exemple sur la consommation de carburant en
fonction du type de transmission, la taille d’effet était de 1.48. Dans
ce cas, la corrélation vaut :
S’il est possible d’obtenir le coefficient de corrélation à partir de la valeur du t (voir la section sur Obtenir le coefficient de corrélation à partir du t), nous allons aborder une autre méthode ici : évaluer le coefficient de corrélation à partir du coefficient de régression.
Il est très fréquent que les régressions soient présentées sous la forme d’un tableau dans lequel on a les coefficients de la droite de régression, avec la probabilité mais sans la valeur du t. Dans cette situation, il est encore possible d’obtenir le coefficient de corrélation.
La valeur du t correspond au rapport entre les coefficient de régression et son erreur-type (voir équation 24)
\[t=\frac{b}{se} \text{ (24)}\]
Il faut donc pouvoir retrouver l’erreur-type. En l’absence de suspicion de multicolinéarité (c’est-à-dire de fortes corrélations entre les variables indépendantes), on peut avoir une approximation relativement précise des valeurs grâce à la formule (25):
\[se\approx\sqrt{\frac{1-R^2}{ddl_{résiduels}}} \times \frac{s_y}{s_x} \text{ (25)}\]
En revanche, s’il y a de multicolinéarité, il est nécessaire d’avoir la valeur de la tolérance. Dans ce cas, la formule devient (26):
\[se=\sqrt{\frac{1-R^2}{Tolérance \times ddl_{résiduels}}} \times \frac{s_y}{s_x} \text{ (26)}\]
Á partir de là, on peut obtenir le t est donc le coefficient de corrélation partiel, comme évoqué précédemment.
Il est à noter que dans le cas particulier de prédicteurs catégoriels (et uniquement des prédicteurs catégoriels), on peut plus facilement la valeur du r en pasant par l’obtention d’un \(d_{partiel}\) de Cohen.
Pour obtenir le d partiel, il faut connaître l’erreur résiduelle, c’est-à-dire le carré moyen de l’erreur du modèle global. Dans ce cas, la formule (27) permet d’obtenir le \(d_{partiel}\) :
\[d_{partiel} = \frac{\text{coefficient de régression}}{\sqrt{\text{Variance résiduelle}}} \text{ (27)}\]
La variance résiduelle est parfois appelée carré moyen de l’erreur, et sa racine carrée l’erreur-standard résiduelle (\(ES_{résiduelle}\)).
Il peut arriver que cette dernière information ne soit pas disponible. Il est néanmoins possible de l’estimer de manière relativement fiable si le \(R^2\) du modèle global et l’écart-type (ou la variance) de la variable dépendante sont fournis. En effet, la variance résiduelle correspond au pourcentage de variance de la variable dépendante qui n’est pas expliqué. Puisque le \(R^2\) est le pourcentage de variance expliqué par le modèle, \(1-R^2\) est le pourcentage de variance résiduelle. On peut donc obtenir l’erreur standard résiduelle grâce à la formule (28) :
\[ES_{résiduelle}= \sqrt{s^2_{vd}\times(1-R^2)}\text{ (28)}\]
où \(ES_{résiduelle}\) est l’erreur standard résiduelle, \(s_{vd}\) est l’écart-type de la variable dépendante et R² est le pourcentage de variance expliquée par le modèle global.
Néanmoins, quand on réalise des régressions, il est plus naturel d’utiliser des coefficients de corrélations que des d partiels. Il est intéressant de savoir que, dès lors que nous disposons de ce \(d_{partiel}\), on peut obtenir la valeur du coefficient de corrélation partiel grâce à la formule (28) présentée dans la section précédente.
On peut à nouveau utiliser la fonction d_to_r du package
effectsize (Ben-Shachar
et al., 2020) pour faire la conversion. Par exemple, si la
taille d’effet vaut 0.72, la corrélation vaut :
d_to_r(0.72)
## [1] 0.3387194683
Exercice 6*
Dans les résultats présentés ci-dessous, nous reprenons les résultats de la régression du jeu de données “sex appeal” présenté précédemment,
ols_vif_tol(model)
## Variables Tolerance VIF
## 1 charme 0.1381551133 7.238240961
## 2 humour 0.1380351452 7.244531810
## 3 intelligence 0.7255780858 1.378211415
## 4 élégance 0.9692479381 1.031727756
ols_regress(model)
## Model Summary
## ---------------------------------------------------------------
## R 0.878 RMSE 8.626
## R-Squared 0.770 MSE 78.330
## Adj. R-Squared 0.761 Coef. Var 8.989
## Pred R-Squared 0.748 AIC 726.751
## MAE 7.146 SBC 742.382
## ---------------------------------------------------------------
## RMSE: Root Mean Square Error
## MSE: Mean Square Error
## MAE: Mean Absolute Error
## AIC: Akaike Information Criteria
## SBC: Schwarz Bayesian Criteria
##
## ANOVA
## ---------------------------------------------------------------------
## Sum of
## Squares DF Mean Square F Sig.
## ---------------------------------------------------------------------
## Regression 24955.532 4 6238.883 79.649 0.0000
## Residual 7441.308 95 78.330
## Total 32396.840 99
## ---------------------------------------------------------------------
##
## Parameter Estimates
## ----------------------------------------------------------------------------------------
## model Beta Std. Error Std. Beta t Sig lower upper
## ----------------------------------------------------------------------------------------
## (Intercept) 17.038 5.808 2.933 0.004 5.507 28.570
## charme 0.149 0.115 0.172 1.298 0.197 -0.079 0.378
## humour 0.567 0.115 0.654 4.944 0.000 0.339 0.794
## intelligence 0.617 0.311 0.115 1.987 0.050 0.001 1.234
## élégance 0.293 0.215 0.068 1.361 0.177 -0.134 0.720
## ----------------------------------------------------------------------------------------
Calculez le se à partir des écart-types (présentés ci-dessous) des différents prédicteurs. Considérez dans un premier temps qu’il n’y a pas de colinéarité entre les prédicteurs et dans un second temps, prenez en compte cette multicolinéarité. Comparez les valeurs avec celles obtenues dans le tableau ci-dessus. Dans un second temps, à partir de la meilleure estimation des erreurs-types calculez les coefficients de corrélation partiels.
sd<-diag(var(sex.appeal[,1:5])^0.5)#écart-type des prédicteurs
sd
## sex_appeal charme humour intelligence élégance
## 18.089798453 20.787389340 20.884589070 3.361261788 4.198737184
se_Q1<-sqrt((1-.77)/ 95) *(sd[1] / sd[2:5])
se_Q1
## charme humour intelligence élégance
## 0.04281893816 0.04261965297 0.26480946583 0.21199086764
se_Q2<-sqrt((1-.77)/ (ols_vif_tol(model)$Tolerance* 95)) *(sd[1] / sd[2:5])
se_Q2
## charme humour intelligence élégance
## 0.1151999821 0.1147136427 0.3108790288 0.2153276048
t<-ols_regress(model)$betas[2:5]/se_Q2
t
## charme humour intelligence élégance
## 1.297171711 4.940912888 1.985844369 1.359915824
t_to_r(t, 95)
## r | 95% CI
## --------------------
## 0.13 | [-0.07, 0.32]
## 0.45 | [ 0.28, 0.58]
## 0.20 | [ 0.00, 0.38]
## 0.14 | [-0.06, 0.32]
Remarquez comme ces valeurs sont proches des coefficients de corrélations partiels que nous avions calculés précédemment
p_r<-partial.r(data=sex.appeal[,1:5])
# on arrondit à la seconde décimale
# on ne prend que les corrélations avec la variable dépendante (première ligne)
round(p_r[1,],2)
## sex_appeal charme humour intelligence élégance
## 1.00 0.13 0.45 0.20 0.14
Nous venons de voir que nous pouvions calculer un coefficient de
corrélation à partir d’un d de Cohen, nous pouvons également l’obtenir à
partir d’un rapport de cote. Nous avons vu dans la section intitulée Interpréter les rapports de
cotes qu’il était possible de transformer un rapport de cotes en
d de Cohen, il apparaît donc qu’il est possible de transformer
un rapport de cotes en coefficient de corrélation. On obtient cette
valeur grâce à la fonction oddsratio_to_r
oddsratio_to_r(8.24, n1 =110+975 , n2 = 25+1825 )
## [1] 0.4895801235
Cette valeur est relativement proche du coefficient de corrélation tétrachorique.
psych::tetrachoric(df)
## Call: psych::tetrachoric(x = df)
## tetrachoric correlation
## Cancr Fumer
## Cancer 1.00
## Fumeur 0.53 1.00
##
## with tau of
## Cancer Fumeur
## 1.68 0.33
Nous avons déjà évoqué la relation qui existe entre le d de Cohen et le g de Hedges. Nous focaliserons ici dans l’obtention du d de Cohen à partir des autres tailles d’effet.
Nous avons évoqué dans la section précédente qu’il était possible de transformer un d de Cohen en coefficient de corrélation. L’inverse est évidemment vrai aussi.
Nous n’adapterons pas la formule mais nous contenterons de présenter
la fonction r_to_d. Pour l’illustrer nous reprenons les
corrélations partielles calculées dans la section précédentes et nous
allons retrouver les coefficients de d partiels que nous avions
obtenus.
r_to_d(c(p_r[1,]))
## sex_appeal charme humour intelligence élégance
## Inf 0.2663521922 1.0145325929 0.4077594328 0.2792356309
Dans la section intitulée Interpréter les rapports de
cotes, nous avions évoqué la formule proposée par Borenstein (2009) qui
permettait d’associer le d de Cohen et le rapport de cote. Dans R, on
peut obtenir la transformation entre un rapport de cote et le d de Cohen
en utilisant la fonction oddsratio_to_d
Si nous reprenons l’OR que nous avions obtenu dans l’exemple sur le fait d’être fumeur et le risque d’attraper un cancer, nous pouvons utiliser la fonction de la manière suivante :
oddsratio_to_d(8.24)
## [1] 1.16275283
Sans grande surprise on peut également obtenir les rapport de cotes à
partir des autres tailles d’effet. Les fonctions qui permettent de le
faire sont d_to_oddsratior_to_oddsratio
Nous ne reviendrons pas sur les formules qui ont déjà été présentées précédemment.
oddsratio_to_r(8.24) # donne le coefficient de corrélation (n1 et N2 sont censés être de même taille dans une corrélation)
## [1] 0.5026082239
r_to_oddsratio(0.5026082) # on obtient 8.24
## [1] 8.239998893
De la même manière, on peut obtenir le rapport de cote à partir du d.
oddsratio_to_d(8.24) # donne le d de Cohen
## [1] 1.16275283
d_to_oddsratio(1.162753) # on obtient 8.24
## [1] 8.24000254
Il est très fréquent que les tailles d’effets ne soient pas homogènes d’un article à l’autre et/ou que les auteurs ne fournissent pas directement une mesure de la taille d’effet, malgré les recommandations de l’APA. Néanmoins, dans de nombreuses situations, les informations fournies suffisent à retrouver les tailles d’effet d’intérêt.
Pour une démonstration mathématique, voir le chapitre consacré aux corrélations↩︎
La formule exacte n’est pas indispensable. Il faut essentiellement comprendre que le G de Hedges est une mesure moins biaisée que le d de Cohen.↩︎
il est à noter qu’il existe plusieurs variantes pour calculer cette mesure mais nous nous contentons de présenter ici la mesure la plus fréquente et la plus simple↩︎
la question du calcul exact, c’est-à-dire comprendre ce qu’est une transformation logit, est développé dans le chapitre consacré aux régressions logistiques mais pas dans ce chapitre↩︎