install.packages("metafor")
library("metafor")
Etre capable d’extraire les tailles d’effets à partir des informations disponibles dans un article
Connaître les différentes sortes de tailles d’effet.
Nous avons vu jusqu’à présent ce qu’était une taille d’effet et comment les obtenir à partir des informations qui pouvaient être disponibles dans les articles scientifiques. L’étape suivante consiste à pouvoir combiner ces tailles d’effet. Cependant, nous sommes confrontés à deux problèmes :
2)nous ne pouvons pas comparer directement les tailles d’effet en faisant simplement une moyenne car l’estimation de certaines tailles d’effet ont été obtenues sur de plus gros échantillons que d’autres, ce qui implique que les premières sont plus précises que les secondes.
Ansi, toute chose étant égale par ailleurs, une taille d’effet avec une plus petite estimation de son erreur sera plus précise. Les méta-analyses se doivent de prendre en compte cet aspect en accordant plus de poids à des tailles d’effets plus précises (Hedges & Olkin, 1985). un autre aspect qui va avoir un impact sur la précision est le design utilisé : avec une même taille d’échantillon, un échantillon apparié sera plus précis que deux échantillons indépendants, du moins si la corrélation entre les deux mesures n’est pas nulle (Borenstein et al., 2009). Á l’inverse, dans des modèles linéaires mixtes, le fait d’avoir des cluster augmente l’erreur-type, et donc diminue la précision, du moins si le coefficient intraclass n’est pas égal à 0.
Dans cette section, nous allons aborder la manière de prendre en compte les erreurs d’estimation dans les tailles d’effet lorsque nous faisons des méta-analyses en opposant deux logiques pour estimer ces erreurs d’estimation : les modèles à effets fixes et les modèles à effets aléatoires.
Dans les modèles à effet fixe, nous faisons l’hypothèse que toutes les études inclues dans la méta-analyse partage une taille d’effet commune (Borenstein et al., 2009). Cela signifie que tous les facteurs qui ont un impact sur l’estimation de la taille d’effet sont identiques entre les études, ce qui implique que la taille d’effet est la même dans toutes les études, d’où l’appelation ‘fixe’. Cet effet fixe sera appelé \(\theta\).
Dans ce cas, les variations qui existent dans l’estimation de la taille d’effet s’explique simplement par une erreur aléatoire inhérente à chaque étude. Si chaque étude avait une taille d’échantillon énorme, l’erreur de mesure vaudrait 0. Il est évident que les tailles d’échantillons dans les études ne sont jamais suffisamment grandes pour pouvoir avoir une erreur d’estimation qui soit nulle.
Le graphique 1 est une représentation graphique de ce que nous venons de décrire. Dans ce graphique, les rectangle rouges représentent la taille d’effet réelle tandis que les point noirs repréentent la taille d’effet observée. Les tailles d’effet réelles sont parfaitement alignées sur l’axe vertical tandis que les points noirs se dispersent de manière aléatoire autour de ces points rouges. L’écart entre chaque point rouge et chaque point noir, représenté par les flèches, est l’erreur d’estimation de la taille d’effet dans notre modèle.
Dans ce cas, l’idée est que, même si l’erreur se distribue de manière aléatoire, il est possible d’estimer la distribution d’échantillonnage de ces erreurs.
Le problème est que nous n’avons pas accès à la taille d’effet de la population, mais seulement à la taille d’effet observée dans chacune des étude. Il faut donc pouvoir estimer la taille d’effet de la population à partir de ces données. Pour obtenir l’estimation la plus précise possible de la taille d’effet, il faut calculer une moyenne pondérée de la taille d’effet ou le poids attribué à chaque étude doit être inversément proportionnel à l’erreur de mesure de la taille d’effet 1.
\[W_i = \frac{1}{V_{y_i}}\text{ (1)}\]
où \(V_yi\) est la variance la variance de chaque étude. On peut donc calculer la moyenne pondérée grâce à l’équation 2:
\[M = \frac{\displaystyle \sum_{i=1}^k W_i\times Y_i}{\displaystyle \sum_{i=1}^k W_i}\text{ (2)}\] où le \(W_i\times Y_i\) est le produit entre la taille d’effet et son poids, et \(W_i\) est le poids des études.
Cette taille d’effet globale est également associée à une erreur de mesure. La variance autour de la taille d’effet globale est obtenue par l’équation 3:
\[V_M = \frac{1}{\displaystyle \sum_{i=1}^k W_i}\text{ (3)}\]
l’erreur-type est donc obtenue en faisant la racine carrée de \(V_M\).
\[SE_M = \sqrt{V_M} \text{ (4)}\]
Á partir de là, il est très facile d’obtenir les limites supérieures et inférieures de l’intervalle de confiance autour de la taille d’effet réelle :
\[IC_{2.5} = M-1.96\times SE_M \text{ ET } IC_{97.5} = M+1.96\times SE_M\text{ (5)}\] On peut également tester la significativité de la taille d’effet, c’est-à-dire déterminer si la valeur de la taille d’effet est significativement différente de 0, grâce à un test Z :
\[Z =\frac{M}{SE_M}\text{ (6)}\]
La valeur de cette statistique se distribue en suivant une distribution normale.
Dans le smodèles fixes, l’hypothèse qui est faites est que la taille d’effet est identique entre les études. Cependant, cette hypothèse est généralement peu plausible. Une hypothèse plus raisonnable est de considérer que les études ont suffisamment de choses en commun pour que cela fasse sens de les synthétiser, sans qu’on puisse pour autant faire l’hypopthèse que la taille d’effet est identique entre les études.
Les choix méthodologiques, les outils utilisés, les caractéristiques de la population testée … peuvent varier d’une étude à l’autre, et ces différences peuvent consécutivement impacter l’estimation de la taille d’effet. Par ailleurs, il peut y avoir toute une série de caractéstiques environnementales qui peuvent avoir un impact sur la taille d’effet.
Par exemple, si on s’intéresse à la pertinence d’une nouvelle approche pédagogique, d’une classe à l’autre, d’une école à l’autre, il peut y avoir des ressources qui varient et il est tout à fait vraisemblable que ces ressources n’aient pas été examinées d’une étude à l’autre.
Pour prendre en compte l’ensemble des facteurs qui peuvent impacter l’estimation de la taille d’effet, on peut réaliser une méta-analyse en choisissant un effet aléatoire. L’hypothèse sous-jacente est que la taille d’effet est distribuée en suivante un distribution normale entre les études.
Le graphique 2 est une représentation graphique de ce que nous venons de décrire. Dans ce graphique, les rectangle rouges représentent la moyenne des taille d’effet réelle pour l’ensemble des études, les triangles verts représentent la taille d’effet réelle pour chacune des études et les points noirs représentent les tailles d’effet observées.
Cette Figure illustre le fait que la distance entre la taille d’effet commune et les tailles d’effet observées se répartit en deux parties : les variations de taille d’effet entre les études \(\zeta_i\) représenté par les flèches noires, et les erreurs d’échantillonnage, représentées par les flèches bleues.
D’un point de vue mathématique, on peut donc représenter cette conception par l’équation
\[Y_i =\mu + \zeta_i+\epsilon_i\text{ (7)}\]
Nous devons donc non seulement évaluer la variance d’erreur, comme dans le modèle fixe, mais également la variance dans la distribution des tailles d’effet réelle.
La distance entre la taille d’effet moyenne commune \(\mu\) et la taille d’effet réelle spécifique à chaque étude dépend de l’écart-type de la distribution des tailles d’effet est appelée \(\tau\), et sa variance est \(\tau^2\). Cette valeur s’applique pour l’ensemble des études inclues dans la méta-analyse.
La distance entre chacune des tailles d’effet réelle \(\theta_i\) et la taille d’effet observée \(Y_i\) dépend de la variance \(V_i\) qui va varier être spécifique à chacune des études.
Á partir des tailles d’effet observée, nous voulons estimer la taille d’effet commune \(\mu\). Tout comme dans les modèles à effet fixe, nous commençons par calculer une moyenne pondérée des tailles d’effet, où la pondération est l’inverse de la variance de chaque étude.
Pour calculer les variances dans les modèles à effet aléatoire, on va appliquer le principe de décomposition de la variance : la variance totale est la somme de la variance spécifique à chaque étude et de la variance des effets réels \(\tau^2\).
Pour estimer \(\tau^2\), nous devons utiliser la méthode des moments (ou la méthode DerSimonian) (Borenstein et al., 2009) présentée dans l’équation 8.
\[\tau^2 =\frac{Q-df}{c} \text{ (8)}\]
où Q vaut :
\[ Q =\displaystyle \sum_{i=1}^k W_i\times Y_i^2 - \frac{(\displaystyle \sum_{i=1}^k W_i\times Y_i)^2}{\displaystyle \sum_{i=1}^k W_i} \text{ (9)}\]
Les degrés de liberté (df) correspondent au nombre d’études moins 1 et C vaut :
\[ C =\sum W_i\ - \frac{\sum W_i^2}{ \sum W_i} \text{ (10)}\]
Pour estimer la taille d’effet commune, on va appliquer, comme dans les modèles fixes, une pondération à la moyenne 11. L’astérisque signifie que nous sommes dans un modèle aléatoire.
\[W^*_i=\frac{1}{V^*_{Yi}} \text{ (11)}\]
où \(V^*_{Yi}\) est la somme de la variance intra-étude et entre les études.
\[V^*_{Yi}= V_{Yi}+\tau^2 \text{ (12)}\]
On obtient donc la moyenne pondérée par
\[M^* = \frac{\displaystyle \sum_{i=1}^k W^*_i\times Y_i}{\displaystyle \sum_{i=1}^k W^*_i}\text{ (13)}\]
La variance sera estimée par la récuproque de la somme des pondérations.
\[V_{M^*} = \frac{1}{\displaystyle \sum_{i=1}^k W^*_i}\text{ (14)}\]
l’erreur-type est donc obtenue en faisant la racine carrée de \(V_{M^*}\).
\[SE_{M^*} = \sqrt{V_{M^*}} \text{ (15)}\]
Á partir de là, il est très facile d’obtenir les limites supérieures et inférieures de l’intervalle de confiance autour de la taille d’effet réelle :
\[IC_{2.5} = M^*-1.96\times SE_{M^*} \text{ ET } IC_{97.5} = M^*+1.96\times SE_{M^*}\text{ (16)}\] On peut également tester la significativité de la taille d’effet, c’est-à-dire déterminer si la valeur de la taille d’effet est significativement différente de 0, grâce à un test Z :
\[Z^* =\frac{M^*}{SE_{M^*}}\text{ (17)}\]
La valeur de cette statistique se distribue en suivant une distribution normale.
Une différence concrète quand on choisit entre un modèle fixe et un modèle aléatoire est que, lorsque nous faisons un modèle à effet fixe, nous pouvons largement ignorer l’effet des plus petites études étant donné que nous allons avoir une meilleure appréciation de l’information dans les études avec de plus gros échantillons. Dans les modèles à effet aléatoire, nous ne souhaitons pas représenter un effet mais la moyenne de la distribution des vrais effets. Il faut donc que toutes les tailles d’effet soient représentées. Cela signifie qu’on ne peut ignorer une petite étude en lui attribuant un tout petit poids, puisque même si cette taille d’effet est imprécise, c’est l’estimation d’une taille d’effet qu’aucune autre étude n’a estimé. Á l’inverse, on ne peut pas donner un poids prépondérant à une étude avec un très gros échantillon. Cela signifie donc que dans les modèle aléatoires, les poids entre les études seront beaucoup plus restreints que dans un modèle à effet fixes. Lorsque nous réaliserons les analyses avec le logiciel, je vous encourage à comparer le poids des études selon que le modèle est à effet fixe ou à effet aléatoire.
En d’autres termes, il y aura un équilibre plus marqué entre les études dans un modèle à effet aléatoire. Donc, les grandes études vont perdre de leur influence alors que les petites vont en gagner. Cela est donc d’autant plus vraies pour les études qui ont des valeurs extrêmes.
Une autre conséquence est que la variance d’erreur sera systématique plus large pour les modèles à effets aléatoires que pour les modèles à effets fixes. Ceci s’explique assez aisément : imaginez que la taille de votre échantillon soit extrêmement grande, la variance d’erreur va tendre vers 0. Dans un modèle à effet fixe, cette variance de la taille d’effet sera donc de 0. En revanche, dans les modèles à effet aléatoire, si la variance pour chaque étude va tendre vers 0, la variation entre les études continuera à persister. Pour que la variance entre les études soit proche de 0, il faudrait que le nombre d’études inclues dans la méta-analyse tende vers l’infini.
Lorsque nous réalisons un modèle à effet fixe, l’erreur-type vaut :
\[SE_M=\sqrt{\frac{\sigma^2}{k \times n}}\] où k est le nombre d’études et n est le nombres de participants. Ainsi, quand n grandit, \(SE_M\) diminue pour tendre vers 0 quand n tend vers l’infini.
Dans un modèle à effet aléatoire, l’erreur-type est obtenue de la manière suivante :
\[SE_M=\sqrt{\frac{\sigma^2}{k \times n}+\frac{\tau^2}{k}} \]
Ainsi, il faut non seulement que n tend vers l’infini mais aussi que le nombre d’études tend vers l’infini puisque, si la première partie est identique à ce qui se passe dans les modèles à effet fixe, la seconde partie réflète la variance entre les études.
Les deux types de modèles se distinguent également sur l’hypothèse nulle où l’hypothèse nulle des modèles à effets fixes est que la taille d’effet moyenne est égale à 0, alors que dans les modèles à effets aléatoires, l’hypothèse nulle est que la moyenne des tailles d’effet vaut 0, ce qui signifie que les vraies tailles d’effet des études individuelles peuvent être différentes de 0.
Alors comment choisir entre effets fixes ou effets aléatoires ? On peut choisir des modèles à effets fixes si nous avons la conviction que toutes les études inclues dans la méta-analyse sont identiques et que notre objectif est de calculer la taille d’effet commune que nous ne souhaitons pas généraliser à une autre population que celle investiguée. Si les études ont été réalisées par des chercheurs qui ont mené des études de manière indépendante, il est peu vraisemblable que toutes les études soient fonctionnellement équivalentes (Borenstein et al., 2009). En d’autres termes, si on considère que les tailles d’effet comme ayant été échantillonnées à partir d’une distribution de taille d’effet, les modèles aléatoires doivent être préférés.
De plus, si la variance entre les études et importantes, et significative, les modèles à effets fixes sont inappropriés.
En psychologie, il semble y avoir peu de cas où il serait raisonnable d’utiliser des modèles à effets fixes plutôt que des modèles à effet aléatoire. En effet, même si nous avons été attentif à choisir des études parfaitement homogènes en utilisant la méthodologie PICO, c’est peu vraisemblables que les études soient parfaitement homogènes. Il est donc concentionnel de toujours utiliser des modèles aléatoires (Harrer et al., 2021). Les effets fixes n’auraient de sens que dans les situations où il s’agit d’études reproduites à l’identique, ce qui est rarement le caS.
Si les modèles à effets aléatoires semblent naturels en psychologie, le fait que les petites études reçoivent plus de poids dans des modèles à effets aléatoires que dans des modèles à effets fixes peut être problématique car elles sont plus susceptibles d’être empreintes de biais (Borenstein et al., 2009; Schwarzer et al., 2015). C’est pourquoi certains avancent qu’il est parfois préférable d’utilser des modèles à effets fixes (Furukawa et al., 2003; Poole & Greenland, 1999) ou des modèles basés sur la méthode des moindres carré pondéré sans restriction (en anglais : unrestricted weighted least squares - UWLS)(Stanley et al., 2022).
Les données pour les exemples de travail sont présentées dans le fichier excel ci-joint.
{{% attachments style="grey" pattern=".*\.xlsx$" %}}Dans R, il existe plusieurs packages en mesure de réaliser des méta-analyses. Parmi ces packages, il y a :
Ces trois packages sont très bien faits et fournissent des résultats sensiblement identiques. Le choix pour le package ‘metafor’ a été fait pour la présentation principale des analyses dans le cadre de ce document. La raison de ce choix est que ‘metafor’ est le plus complet des packages, et en particulier que ‘meta’. Par ailleurs, ‘dmetar’ n’est pas un package officiel de R. Il n’a donc pas de documentation pour chaque ligne de commande comme c’est le cas pour les packages officiels de R.
Pour les personnes qui estimeraient que l’utilisation de ces fonctions sont compliquées, vous pouvez envisager les alternatives qui sont présentées.
Pour la mise en application, il est nécessaire que les packages ‘readxl’ et ‘metafor’ soient installés et chargés.
install.packages("readxl") # à ne faire que si ce package n'est pas déjà installé
install.packages("metafor")# à ne faire que si ce package n'est pas déjà installé
require(readxl)
require(metafor)
Ensuite, on choisit le répertoire de travail dans lequel nous souhaitons travailler. Ce répertoire doit nécessaire être celui dans lequel se situe le fichier de données.
getwd() # obtenir le répertoire de travail
setwd("C:/Mon_Répertoire")
Pour éviter de devoir spécifier le répertoire de travail, au lieu de commencer en créant un script, vous pouvez commencer en créant un nouveau projet. Vous enregistrez le projet dans le dossier dans lequel se trouve les données et Rstudio fixera par défaut le répertoire de travail dans le répertoire sélectionné.
On importe les données avec la fonction read_excel. Les
données pour cet exercice sont présentées dans la feuille “ex1”.
L’exercice est tiré de Borenstein et al. (Borenstein et al., 2009). Cet
exemple permet d’illustrer une méta-analyse sur des différences de
moyennes. Borestein et al. ne fournissent pas plus d’informations sur
ces données.
dat <- read_excel("Exercices.xlsx", sheet="ex1")
Les données sont présentées dans le jeu de données ci-dessous.
study | mean1 | sd1 | n1 | mean2 | sd2 | n2 |
|---|---|---|---|---|---|---|
Carroll | 94 | 22 | 60 | 92 | 20 | 60 |
Grant | 98 | 21 | 65 | 92 | 22 | 65 |
Peck | 98 | 28 | 40 | 88 | 26 | 40 |
Donat | 94 | 19 | 200 | 82 | 17 | 200 |
Stewart | 98 | 21 | 50 | 88 | 22 | 45 |
Young | 96 | 21 | 85 | 92 | 22 | 85 |
Dans ce jeu de données, nous avons dans la première colonne le nom
des études, ensuite les moyennes, écart-type, et taille d’échantillon
pour chacun des groupes. Les tailles d’effet ne sont pas disponibles. La
première étape va consister à ajouter les tailles d’effet à notre jeu de
données. Pour obtenir les tailles d’effet, nous pouvons utiliser la
fonction esclc. Pour obtenir les tailles d’effet, un
certain nombre d’arguments vont devoir être précisés.
measure : il s’agit de la mesure que nous désirons.
Pour des différences de moyennes, nous pouvons vouloir comparer :m1i : la variable dans le jeu de données où se situe la
moyenne du groupe 1sd1i : la variable dans le jeu de données où se
situel’écart-type du groupe 1n1i : la variable dans le jeu de données où se situe la
taille de l’échantillon du groupe 1m2i : la variable dans le jeu de données où se situe la
moyenne du groupe 2sd2i : la variable dans le jeu de données où se situe
l’étcart-type du groupe 2n2i : la variable dans le jeu de données où se situe la
taille de l’échantillon du groupe 2slab : la variable dans le jeu de données où se situe
l’identifiant des études (cet argument est accessoire)data : le nom du jeu de donnéesDans notre exemple, nous souhaitons réaliser une méta-analyse sur des différences de moyennes standardisées. Remarquez qu’après l’exécution de la fonction, il y a 2 nouvelles variables, yi et vi, qui sont respectivement les tailles d’effets et les erreur-types pour ces tailles d’effet.
dat <- escalc(measure= "SMD", m1i=mean1, sd1i=sd1, n1i=n1, m2i=mean2, sd2i=sd2, n2i=n2,
slab=study, data=dat)
Remarquez à présent que les tailles d’effet et les erreurs-types ont été intégrées au jeu de données
study | mean1 | sd1 | n1 | mean2 | sd2 | n2 | yi | vi |
|---|---|---|---|---|---|---|---|---|
Carroll | 94 | 22 | 60 | 92 | 20 | 60 | 0.09452416 | 0.03337056 |
Grant | 98 | 21 | 65 | 92 | 22 | 65 | 0.27735587 | 0.03106510 |
Peck | 98 | 28 | 40 | 88 | 26 | 40 | 0.36654443 | 0.05083972 |
Donat | 94 | 19 | 200 | 82 | 17 | 200 | 0.66438497 | 0.01055176 |
Stewart | 98 | 21 | 50 | 88 | 22 | 45 | 0.46180628 | 0.04334467 |
Young | 96 | 21 | 85 | 92 | 22 | 85 | 0.18516444 | 0.02363025 |
Nous voulons à présent réaliser la méta-analyse en tant que telle. On
réalise cette méta-analyse avec la fonction rma. Cette
fonction requiert 4 arguments :
yi : la colonne avec la taille d’effetvi : la colonne avec la variance de la taille
d’effetdata : le jeu de données où on trouve les variables
précisée pour yi et vimethod : la méthode à devoir utiliser. Plusieurs
possibilités existent :
method = “EE” : les modèles à effets égaux ;method = “FE” : les modèles à effets fixes ;method = “DL” : modèle à effets aléatoires en utilisant
la méthode DerSimonian-Laird pour réaliser l’estimation ;method = “HE” : modèle à effets aléatoires en utilisant
la méthode de Hedges pour réaliser l’estimation ;method = “HSK” : modèle à effets aléatoires en
utilisant lla méthode de Hunter-Schmidt spécifiquement adaptée pour les
petits échantillons pour réaliser l’estimation ;method = “SJ” : modèle à effets aléatoires en utilisant
la méthode de Sidik-Jonkman pour réaliser l’estimation ;method = “ML” : modèle à effets aléatoires en utilisant
le maximum de vraisemblance pour réaliser l’estimation ;method = “REML” : modèle à effets aléatoires en
utilisant le maximum de vraisemblance restreint pour réaliser
l’estimation ;method = “EB” : modèle à effets aléatoires en utilisant
l’estimateur empirique de Bayes ;method = “PM” : modèle à effets aléatoires en utilisant
la méthode Paule-Mandel pour réaliser l’estimation ;method = “GENQ” : modèle à effets aléatoires en
utilisant la statistique Q généralisée pour réaliser l’estimation ;method = “PMM” : modèle à effets aléatoires en
utilisant la méthode de Paule-Mandel basée sur la médiane non biaisée
pour réaliser l’estimation ;method = “GENQM” : modèle à effets aléatoires en
utilisant la médiane non biaisée de la statistique Q généralisée pour
réaliser l’estimation ;method = “HS” : modèle à effets aléatoires en utilisant
de Hunter-Schmidt pour réaliser l’estimation.Le méthdodes c à m sont des algorithmes qui réaliser des modèles à effets aléatoires. Parmi ces méthodes, la méthode de Paule-Mandel est la meilleur pour les variables dichotomiques et continues alors que le maximum de vraisemblance restreint est la meilleure pour les variable quantitatives. La méthode la plus adaptée pour obtenir l’intervalle de confiance est la méthode “GENQ” (Veroniki et al., 2015).
Il faut noter que les modèles à effets égaux et les modèles à effets fixes s’appuient sur les mêmes algorithmes. Ce qui les distingue, c’est que l’hypothèse qui sous-tend les deux modèles. Pour les modèles à effets égaux fait l’hypothèse que l’effet réel est homogène. Si nous rejetons l’hypothèse d’homogénéité, alors on doit rejeter le modèle dans son ensemble. Dans les modèles à effets fixes on ne fait pas l’hypothèse d’homogénéité mais on in interprète l’estimation comme une moyenne pondérée de l’effet réel des études Laird & Mosteller (1990).
Nous allons commencer par réaliser un modèle à effet fixe.
model_EE <- rma(yi = yi, # la colonne dans le jeu de données où on trouve la taille d'effet
vi = vi, # la colonne où on trouve l'erreur de mesure
data=dat, # le nom du jeu de données
method="EE", # la méthode permet de déterminer si c'est un effet fixe ou aléatoire. L'option "EE" renvoie à un effet fixe
digits=2) # le nombre de décimale à imprimer dans la sortie de résultats
summary(model_EE)
##
## Equal-Effects Model (k = 6)
##
## logLik deviance AIC BIC AICc
## -0.83 11.91 3.66 3.45 4.66
##
## I^2 (total heterogeneity / total variability): 58.03%
## H^2 (total variability / sampling variability): 2.38
##
## Test for Heterogeneity:
## Q(df = 5) = 11.91, p-val = 0.04
##
## Model Results:
##
## estimate se zval pval ci.lb ci.ub
## 0.42 0.06 6.46 <.01 0.29 0.54 ***
##
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
Dans cette sortie de résultats, nous pouvons déjà focaliser notre attention sur l’estimate qui est la taille d’effet moyenne. Elle vaut 0.42 et la statistique Z qui lui est associée vaut 6.46, ce qui est significatif. Notre vraie taille d’effet se situe quelque part entre 0.29 et 0.54.
Remarquez que la pondération dont nous avons parlé dans la partie théorique est disponible de la manière suivante :
weights(model_EE)
## Carroll Grant Peck Donat Stewart Young
## 12.383524 13.302553 8.128392 39.163627 9.533933 17.487971
Habituellement, on représente les méta-analyses sous la forme d’un
graphique en forêt (forest plot en anglais). On obtient ce type de
graphique avec la fonction forest Pour ce forest plot, nous
souhaiterions afficher le poids des études dans le graphique.Nous venons
de voir que les pondérations sont des nombres sans le symbole “%”, et
qu’il ne sont pas arrondi. On va commencer par préparer la présentation
des poids pour avoir des nombres arrondis suivi du symbole “%”. Pour
cela, on va utiliser la fonction round pour faire l’arrondi
et la fonction paste0 pour concatener les informations.
dat$weights <- paste0(round(weights(model_EE)), "%") # weights in % (rounded)
dat$weights
## [1] "12%" "13%" "8%" "39%" "10%" "17%"
Pour réaliser un forest plot, plusieurs étape sont nécessaires. Chacune des étapes va être commentée dans le code.
# paramètres des graphiques. Les 4 valeurs indiquent les marges à appliquer au grpahique
# Dans l'ordre le bas, gauche, haut et droite
par(mar=c(4,4,2,2))
forest(model_EE, # le graphique en forêt doit être fait sur la sortie de la méta-analyse
xlim=c(-2,3), # les limites horizontales de la région du graphique. 0,0 est le centre du graphique
header=TRUE, # faut-il ou non afficher le nom des colonnes au graphique
top=2, # le nombre de ligne à laisser blanche en haut du graphique (pour pouvoir y ajouter des choses ensuite)
mlab="Summary", # le nom à afficher pour la la ligne de synthèse des tailles d'effet
ilab=dat$weights, # les colonnes qu'on veut rajouter dans le graphique et qui ne sont pas présentes par défaut. On rajoute le poids des études ici.
ilab.xpos=1.6, # la position où il faut rajouter les colonnes supplémentaires. Pour rappel 0 est le centre du graphique
ilab.pos=2) # l'alignement souhaité. Si on ne le précise pas, c'est centré. 2 = aligné à gauche
text(x=1.6, y= -1, "100%", pos=2) # on rajoute en position x = 1.6, y = -1, la valeur 100%
text(x= 1.6, y= 8, "Weight", pos=2, font=2) # on rajoute le mot "weight" en position x=1.6 et y = 8
Pour exporter ce graphique avec une qualité d’image suffisante pour
un article scientifique, on peut utiliser la fonction png.
Le premier argument est le nom du fichier dans lequel l’image sera
enregistrée. Dans cette fonction, on peut préciser la hauteur et la
largeur de l’image, ainsi que la résolution. Pour un article
scientifique, il faut une résolution minimale de 300 dpi (dot per inch -
point par pouce). En l’occurrence, 400 dpi a été choisi.
png(file='forestplot.png',width= 3000, height=1500, res = 400 ) # Open PNG device with specific file name
par(mar=c(4,4,2,2))
dat$weights <- paste0(round(weights(model_EE)), "%") # weights in % (rounded)
forest(model_EE, xlim=c(-2,3), header=TRUE, top=2, mlab="Summary",
ilab=dat$weights, ilab.xpos=1.6, ilab.pos=2)
text(1.6, -1, "100%", pos=2)
text(1.6, 8, "Weight", pos=2, font=2)
dev.off()
Exercice 1
Le Syndrome d’Apnées Obstructives du Sommeil (SAOS) occasionne, par ses mécanismes de pression thoracique et de désaturation en oxygène, de plus grands efforts de la part du cœur pour maintenir les fonctions vitales lors des différentes phases du sommeil. Cette charge mécanique entraine une plus grande fragilité de cet organe. À long terme, on peut s’attendre à une augmentation significative des risques cardiovasculaires chez les personnes souffrant de SAOS.
Les auteurs se sont demandés si la propagation des marqueurs de l’inflammation immunitaire au sein de l’organisme était un facteur de risque d’un trouble cardiovasculaire. Les auteurs se demandent si la réaction inflammatoire était significativement réduite chez les personnes qui ont bénéficié d’un traitement par Pression Positive Continue (PPC) puisque cette thérapeutique réduit le risque de trouble cardiovasculaire.
Les données sont disponibles sur la feuille ‘ex4’. Importez les données, calculez les tailles d’effet, réaliser la méta-analyse et présentez les résultats sous la forme d’un forest plot (en ayant exporté le fichier png). Faites cet exercice en réalisant l’analyse avec un effet fixe, ensuite avec un effet aléatoire et comparer les résultats.
dat <- read_excel("Exercices.xlsx", sheet="ex4")
Les données sont présentées ci-dessous.
study | inf_index_baseline | sd_baseline | n_baseline | inf_index_ttmt | sd_ttmt | n_ttmt |
|---|---|---|---|---|---|---|
Blue et al., 2020 | 80.2 | 5.21 | 136 | 83.0 | 3.85 | 136 |
Gulia et al., 2018 | 79.5 | 7.32 | 103 | 74.6 | 6.24 | 100 |
Jackson et al., 2019 | 87.6 | 2.01 | 128 | 85.7 | 2.05 | 126 |
Jonas et al., 2017 | 85.1 | 5.11 | 34 | 81.0 | 4.16 | 34 |
Leng et al., 2022 | 82.0 | 6.58 | 92 | 79.2 | 6.50 | 87 |
Schroeder et al., 2019 | 70.6 | 2.30 | 76 | 72.4 | 6.49 | 74 |
Thompson et al., 2022 | 73.9 | 7.69 | 120 | 70.3 | 5.60 | 119 |
Wolf et al., 2019 | 70.1 | 2.35 | 100 | 72.5 | 2.14 | 98 |
Zhunik et al., 2017 | 76.9 | 3.08 | 87 | 73.2 | 4.02 | 87 |
##### > Étape n° 4 : Calcul des variances et des tailles d'effet
dat <- escalc("SMD", m1i=inf_index_baseline, sd1i=sd_baseline, n1i=n_baseline,
m2i=inf_index_ttmt, sd2i=sd_ttmt, n2i=n_ttmt,
slab=study, data=dat)
dat
##
## study inf_index_baseline sd_baseline n_baseline
## 1 Blue et al., 2020 80.2 5.21 136
## 2 Gulia et al., 2018 79.5 7.32 103
## 3 Jackson et al., 2019 87.6 2.01 128
## 4 Jonas et al., 2017 85.1 5.11 34
## 5 Leng et al., 2022 82.0 6.58 92
## 6 Schroeder et al., 2019 70.6 2.30 76
## 7 Thompson et al., 2022 73.9 7.69 120
## 8 Wolf et al., 2019 70.1 2.35 100
## 9 Zhunik et al., 2017 76.9 3.08 87
## inf_index_ttmt sd_ttmt n_ttmt yi vi
## 1 83.0 3.85 136 -0.6096 0.0154
## 2 74.6 6.24 100 0.7169 0.0210
## 3 85.7 2.05 126 0.9332 0.0175
## 4 81.0 4.16 34 0.8699 0.0644
## 5 79.2 6.50 87 0.4262 0.0229
## 6 72.4 6.49 74 -0.3698 0.0271
## 7 70.3 5.60 119 0.5331 0.0173
## 8 72.5 2.14 98 -1.0633 0.0231
## 9 73.2 4.02 87 1.0287 0.0260
##### > Étape n° 5.a : réalisation du modèle à effet fixe (Equal Effect model)
model_EE <- rma(yi, vi, data=dat, method="EE", digits=2)
model_EE
##
## Equal-Effects Model (k = 9)
##
## I^2 (total heterogeneity / total variability): 96.17%
## H^2 (total variability / sampling variability): 26.13
##
## Test for Heterogeneity:
## Q(df = 8) = 209.05, p-val < .01
##
## Model Results:
##
## estimate se zval pval ci.lb ci.ub
## 0.22 0.05 4.50 <.01 0.13 0.32 ***
##
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## Traduction des résultats en un "forestplot", incluant le poids ("weights")
## de chaque article dans les résultats
par(mar=c(4,4,2,2))
dat$weights <- paste0(round(weights(model_EE)), "%") # weights en % (arrondis)
forest(model_EE, xlim=c(-4,4), header=TRUE, top=2, mlab="Summary",
ilab=dat$weights, ilab.xpos=2.2, ilab.pos=2)
text(2.2, -1, "100%", pos=2)
text(2.2, 11, "Weight", pos=2, font=2)
Nous pouvons à présent réaliser un modèle avec un effet aléatoire.
##### > Étape n° 4 : Calcul des variances et des tailles d'effet
dat <- escalc("SMD", m1i=inf_index_baseline, sd1i=sd_baseline, n1i=n_baseline,
m2i=inf_index_ttmt, sd2i=sd_ttmt, n2i=n_ttmt,
slab=study, data=dat)
dat
##
## study inf_index_baseline sd_baseline n_baseline
## 1 Blue et al., 2020 80.2 5.21 136
## 2 Gulia et al., 2018 79.5 7.32 103
## 3 Jackson et al., 2019 87.6 2.01 128
## 4 Jonas et al., 2017 85.1 5.11 34
## 5 Leng et al., 2022 82.0 6.58 92
## 6 Schroeder et al., 2019 70.6 2.30 76
## 7 Thompson et al., 2022 73.9 7.69 120
## 8 Wolf et al., 2019 70.1 2.35 100
## 9 Zhunik et al., 2017 76.9 3.08 87
## inf_index_ttmt sd_ttmt n_ttmt yi vi weights
## 1 83.0 3.85 136 -0.6096 0.0154 16%
## 2 74.6 6.24 100 0.7169 0.0210 12%
## 3 85.7 2.05 126 0.9332 0.0175 14%
## 4 81.0 4.16 34 0.8699 0.0644 4%
## 5 79.2 6.50 87 0.4262 0.0229 11%
## 6 72.4 6.49 74 -0.3698 0.0271 9%
## 7 70.3 5.60 119 0.5331 0.0173 14%
## 8 72.5 2.14 98 -1.0633 0.0231 11%
## 9 73.2 4.02 87 1.0287 0.0260 9%
##### > Étape n° 5.a : réalisation du modèle à effet fixe (Equal Effect model)
model_EE <- rma(yi, vi, data=dat, method="PM", digits=2)
model_EE
##
## Random-Effects Model (k = 9; tau^2 estimator: PM)
##
## tau^2 (estimated amount of total heterogeneity): 0.55 (SE = 0.29)
## tau (square root of estimated tau^2 value): 0.74
## I^2 (total heterogeneity / total variability): 96.10%
## H^2 (total variability / sampling variability): 25.67
##
## Test for Heterogeneity:
## Q(df = 8) = 209.05, p-val < .01
##
## Model Results:
##
## estimate se zval pval ci.lb ci.ub
## 0.27 0.25 1.06 0.29 -0.23 0.77
##
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## Traduction des résultats en un "forestplot", incluant le poids ("weights")
## de chaque article dans les résultats
par(mar=c(4,4,2,2))
dat$weights <- paste0(round(weights(model_EE)), "%") # weights en % (arrondis)
forest(model_EE, xlim=c(-4,4), header=TRUE, top=2, mlab="Summary",
ilab=dat$weights, ilab.xpos=2.2, ilab.pos=2)
text(2.2, -1, "100%", pos=2)
text(2.2, 11, "Weight", pos=2, font=2)
On observe que le poids de l’étude de Blue était de 16% dans un modèle à effets fixes et il est de 11% dans le modèle à effets aléatoires. Á l’inverse, l’étude de Jonas avait un poids de 4% dans le modèle à effets fixes alors que son poids est de 10% dans ke modèle à effets aléatoires. Ces résultats permettent d’identifier la manière dont les modèles à effets aléatoires rééquilibrent le poids accordé à chacune des études.
Des chercheurs se sont intéressés à l’efficacité du vaccin BCG contre la tuberculose. Trois études ont été inclues. Les données peuvent être chargées dans la mémoire de R en utilisant la commande
data(dat.bcg)
Les données sont présentées ci-dessous.
trial | author | year | tpos | tneg | cpos | cneg | ablat | alloc |
|---|---|---|---|---|---|---|---|---|
1 | Aronson | 1,948 | 4 | 119 | 11 | 128 | 44 | random |
2 | Ferguson & Simes | 1,949 | 6 | 300 | 29 | 274 | 55 | random |
3 | Rosenthal et al | 1,960 | 3 | 228 | 11 | 209 | 42 | random |
4 | Hart & Sutherland | 1,977 | 62 | 13,536 | 248 | 12,619 | 52 | random |
5 | Frimodt-Moller et al | 1,973 | 33 | 5,036 | 47 | 5,761 | 13 | alternate |
6 | Stein & Aronson | 1,953 | 180 | 1,361 | 372 | 1,079 | 44 | alternate |
7 | Vandiviere et al | 1,973 | 8 | 2,537 | 10 | 619 | 19 | random |
8 | TPT Madras | 1,980 | 505 | 87,886 | 499 | 87,892 | 13 | random |
9 | Coetzee & Berjak | 1,968 | 29 | 7,470 | 45 | 7,232 | 27 | random |
10 | Rosenthal et al | 1,961 | 17 | 1,699 | 65 | 1,600 | 42 | systematic |
11 | Comstock et al | 1,974 | 186 | 50,448 | 141 | 27,197 | 18 | systematic |
12 | Comstock & Webster | 1,969 | 5 | 2,493 | 3 | 2,338 | 33 | systematic |
13 | Comstock et al | 1,976 | 27 | 16,886 | 29 | 17,825 | 33 | systematic |
Dans ce tableau, les variables correspondent à :
Nous n’avons pas besoin des autres variables pour le moment.
Nous commençons par calculer les tailles d’effet et leur variance
avec la fonction escalc. Pour cela, on précise : -
measure= “OR” : pour indiquer que nous souhaitons le
rapport de cotes - ai= “tpos” : pour indiquer le nombre de
personnes traitées positives - bi= “tneg” : pour indiquer
le nombre de personnes traitées négatives - ci= “cpos” :
pour indiquer le nombre de contrôles positifs - di= “cneg”
: pour indiquer le nombre de contrôles négatifs
Il est à noter qu’il aurait été possible d’utiliser la méthode de
Peto (Yusuf et al.,
1985) pour cette situation en préciant l’argument
measure= “PETO”. Cette méthode est adaptées pour les
rapports de cotes. Cette méthode est adaptée pour les intervention ayant
de petite tailles d’effets et les événements plutôt rares. En revanche,
dans les autres situations, cette méthode est biaisée, c’est pourquoi
cette méthode ne peut être recommandée comme approche par défaut dans
les méta-analyses. Un des avantages de cette méthode est qu’il n’est pas
nécessaire d’appliquer une correction dans les situations où des
cellules valent 0 (Higgins et al., 2019).
dat <- escalc(measure="OR", ai=tpos, bi=tneg, ci=cpos, di=cneg, data=dat.bcg)
Nous observons que le logarithme des rapports de cotes ont été ajoutés au jeu de données.
trial | author | year | tpos | tneg | cpos | cneg | ablat | alloc | yi | vi |
|---|---|---|---|---|---|---|---|---|---|---|
1 | Aronson | 1,948 | 4 | 119 | 11 | 128 | 44 | random | -0.93869414 | 0.357124952 |
2 | Ferguson & Simes | 1,949 | 6 | 300 | 29 | 274 | 55 | random | -1.66619073 | 0.208132394 |
3 | Rosenthal et al | 1,960 | 3 | 228 | 11 | 209 | 42 | random | -1.38629436 | 0.433413078 |
4 | Hart & Sutherland | 1,977 | 62 | 13,536 | 248 | 12,619 | 52 | random | -1.45644355 | 0.020314413 |
5 | Frimodt-Moller et al | 1,973 | 33 | 5,036 | 47 | 5,761 | 13 | alternate | -0.21914109 | 0.051951777 |
6 | Stein & Aronson | 1,953 | 180 | 1,361 | 372 | 1,079 | 44 | alternate | -0.95812204 | 0.009905266 |
7 | Vandiviere et al | 1,973 | 8 | 2,537 | 10 | 619 | 19 | random | -1.63377584 | 0.227009675 |
8 | TPT Madras | 1,980 | 505 | 87,886 | 499 | 87,892 | 13 | random | 0.01202060 | 0.004006962 |
9 | Coetzee & Berjak | 1,968 | 29 | 7,470 | 45 | 7,232 | 27 | random | -0.47174604 | 0.056977124 |
10 | Rosenthal et al | 1,961 | 17 | 1,699 | 65 | 1,600 | 42 | systematic | -1.40121014 | 0.075421726 |
11 | Comstock et al | 1,974 | 186 | 50,448 | 141 | 27,197 | 18 | systematic | -0.34084965 | 0.012525134 |
12 | Comstock & Webster | 1,969 | 5 | 2,493 | 3 | 2,338 | 33 | systematic | 0.44663468 | 0.534162172 |
13 | Comstock et al | 1,976 | 27 | 16,886 | 29 | 17,825 | 33 | systematic | -0.01734187 | 0.071635117 |
Nous pouvons à présent réaliser un modèle à effet aléatoire en utilisant l’algorithme Paule-Mandel en accord avec les recommandatons de Veroniki et al. (2015).
rma.out <- rma(yi = yi, # la colonne dans le jeu de données où on trouve la taille d'effet
vi = vi, # la colonne où on trouve l'erreur de mesure
data=dat, # le nom du jeu de données
method="PM", # utiliser la méthode de Paule-Mandel
digits=2) # le nombre de décimale à imprimer dans la sortie de résultats
summary(rma.out)
##
## Random-Effects Model (k = 13; tau^2 estimator: PM)
##
## logLik deviance AIC BIC AICc
## -13.10 37.31 30.20 31.33 31.40
##
## tau^2 (estimated amount of total heterogeneity): 0.34 (SE = 0.19)
## tau (square root of estimated tau^2 value): 0.58
## I^2 (total heterogeneity / total variability): 92.15%
## H^2 (total variability / sampling variability): 12.73
##
## Test for Heterogeneity:
## Q(df = 12) = 163.16, p-val < .01
##
## Model Results:
##
## estimate se zval pval ci.lb ci.ub
## -0.75 0.19 -3.99 <.01 -1.11 -0.38 ***
##
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
Rappelez-vous que pour les OR, les valeurs calculées avaient subi une
transformation logarithmique. Dès lors pour pouvoir un rapport de cote
interprétable, il faut appliquer un exponentiel sur la valeur moyenne
obtenue dans la sortie de la méta-analyse. On obtient cette valeur,
ainsi que l’intervalle de confiance, grâce à la fonction
predict. Deux arguments doivent être précisés :
object : le modèle de la méta-analysetransf : la transformation à devoir opérer. En
l’occurence nous souhaitons un exponentiel. on va préciser “exp”.Cela nous fournit le rapport de cote moyen obtenu, l’intervalle de confiance à 95% pour la vraie valeur du rapport de cotes moyen et l’intervalle de prédiction.
L’intervalle de confiance correspond aux limites entre lesquelles la taille d’effet moyenne réelle est censée se situer. Concrètement, nous avons 95% de chances que la vraie valeur du rapport de cotes se situe entre ces deux limites.
L’intervalle de prédiction représente l’intervalle à 95% dans lequel nous avons 95% de chances qu’une nouvelle observation se site. L’intervalle de prédiction est généralement plus large que l’intervalle de confiance.
predict(object = rma.out, transf=exp)
##
## pred ci.lb ci.ub pi.lb pi.ub
## 0.47 0.33 0.68 0.14 1.58
Il ne reste plus qu’à faire le forest plot (voir plus haut pour une description détaillée).
Exercice 2
Réalisez le forest plot en vous appuyant sur celui réalisé dans la partie consacrée aux différences de moyennes standardisées.
par(mar=c(4,4,2,2))
dat$weights <- paste0(round(weights(rma.out)), "%") # weights in % (rounded)
forest(rma.out, xlim=c(-4,4.5), header=TRUE, top=2, mlab="Summary",
ilab=dat$weights, ilab.xpos=2.6, ilab.pos=2.6)
text(2.6, -1, "100%", pos=2)
text(2.6, 15 , "Weight", pos=2, font=2)
Exercice 3
Le Syndrome d’Apnées Obstructives du Sommeil (SAOS) occasionne, par ses mécanismes de pression thoracique et de désaturation en oxygène, de plus grands efforts de la part du cœur pour maintenir les fonctions vitales lors des phases du sommeil. Cette charge mécanique entraine une plus grande fragilité de cet organe. À long terme, on peut s’attendre à une augmentation significative des risques cardiovasculaires chez les personnes souffrant de SAOS.
Des auteurs ont souhaité mesurer l’ampleur de ce phénomène en évaluant la survenue d’Accidents Vasculaires Cérébraux (AVC) sur 10 ans après diagnostic de SAOS, ce en comparaison à un échantillon contrôle. Note* : les données présentées dans cet exemple sont fictives
Les données sont présentées dans la feuille “ex2” du fichier excel fourni précédemment.
Réalisez la méta-analyse sur les rapports de cotes et faites le forest plot. Utilisez l’algorithme adapté.
dat <- read_excel("Exercices.xlsx", sheet="ex2")
Les données sont présentées ci-dessous.
study | AVC_SAOS | Safe_SAOS | n_SAOS | AVC_GC | Safe_GC | n_GC |
|---|---|---|---|---|---|---|
Bae et al., 2021 | 101 | 86 | 187 | 47 | 153 | 200 |
Heilbrunn et al., 2021 | 15 | 6 | 21 | 2 | 15 | 17 |
Mashagi et al., 2020 | 35 | 37 | 72 | 35 | 50 | 85 |
Ottaviani et al., 2020 | 24 | 26 | 50 | 16 | 34 | 50 |
Xie et al., 2017 | 12 | 8 | 20 | 5 | 14 | 19 |
Yaggi et al., 2022 | 17 | 12 | 29 | 8 | 28 | 36 |
##### > Étape n° 4 : Calcul des variances et des tailles d'effet
dat <- escalc("OR", ai=AVC_SAOS, n1i=n_SAOS, ci=AVC_GC, n2i=n_GC, slab=study, data=dat)
dat
##
## study AVC_SAOS Safe_SAOS n_SAOS AVC_GC Safe_GC n_GC yi
## 1 Bae et al., 2021 101 86 187 47 153 200 1.3411
## 2 Heilbrunn et al., 2021 15 6 21 2 15 17 2.9312
## 3 Mashagi et al., 2020 35 37 72 35 50 85 0.3011
## 4 Ottaviani et al., 2020 24 26 50 16 34 50 0.6737
## 5 Xie et al., 2017 12 8 20 5 14 19 1.4351
## 6 Yaggi et al., 2022 17 12 29 8 28 36 1.6011
## vi
## 1 0.0493
## 2 0.8000
## 3 0.1042
## 4 0.1720
## 5 0.4798
## 6 0.3029
# Modèle à effet fixe (Equal Effect model)
model_RE <- rma(yi, vi, data=dat, method="PM", digits=2)
model_RE
##
## Random-Effects Model (k = 6; tau^2 estimator: PM)
##
## tau^2 (estimated amount of total heterogeneity): 0.39 (SE = 0.40)
## tau (square root of estimated tau^2 value): 0.62
## I^2 (total heterogeneity / total variability): 69.40%
## H^2 (total variability / sampling variability): 3.27
##
## Test for Heterogeneity:
## Q(df = 5) = 13.61, p-val = 0.02
##
## Model Results:
##
## estimate se zval pval ci.lb ci.ub
## 1.19 0.32 3.66 <.01 0.55 1.82 ***
##
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
# transformation des données catégorielles via la fonction exponentielle
# pour s'ajuster au modèle de régression logistique
# À utiliser ++ dans un EE model
predict(model_RE, transf=exp)
##
## pred ci.lb ci.ub pi.lb pi.ub
## 3.27 1.74 6.17 0.83 12.95
par(mar=c(4,4,2,2))
dat$weights <- paste0(round(weights(model_RE)), "%") # weights in % (rounded)
forest(model_RE, xlim=c(-3.5,5), header=TRUE, top=2, mlab="Summary",
atransf=exp, at=log(c(0.125, 0.25, 0.5, 1, 2, 4)), digits=c(2L,3L),
ilab=dat$weights, ilab.xpos=2.5, ilab.pos=2)
text(2.5, -1, "100%", pos=2)
text(2.5, 8, "Weight", pos=2, font=2)
Des chercheurs (McDaniel et al., 1994) se sont intéressés à la pertinence des entretiens d’embauche. Plus spécifiquement, ils se sont demandés si la qualité de l’évaluation lors de l’entretien d’embauche était un bon prédicteur de l’adéquation aux tâches professionnelles réalisées par la personne.
Pour obtenir les données, vous pouvez tapez
data(dat.mcdaniel1994)
Les 20 premières lignes du jeu de données sont présentées ci-dessous.
study | ni | ri | type | struct |
|---|---|---|---|---|
1 | 123 | 0.00 | j | s |
2 | 95 | 0.06 | p | u |
3 | 69 | 0.36 | j | s |
4 | 1,832 | 0.15 | j | s |
5 | 78 | 0.14 | j | s |
6 | 329 | 0.06 | j | s |
7 | 153 | 0.09 | j | s |
8 | 29 | 0.40 | j | s |
9 | 29 | 0.39 | s | s |
10 | 157 | 0.14 | s | s |
11 | 149 | 0.36 | s | s |
12 | 92 | 0.28 | j | u |
13 | 15 | 0.62 | j | s |
14 | 15 | 0.07 | j | u |
15 | 170 | 0.18 | j | u |
16 | 19 | 0.42 | j | s |
17 | 19 | 0.08 | j | u |
18 | 68 | 0.18 | p | u |
19 | 93 | 0.43 | j | u |
20 | 57 | 0.04 | j | u |
Dans ce jeu de données, les variables sont :
Il est possible d’obtenir la distribution autour de la corrélation en
utilisant la fonction escalc. Il faut dans ce cas préciser
que l’argument measure vaut “COR”.
dat <- escalc(measure="COR", ri=ri, ni=ni, slab=study, data=dat.mcdaniel1994)
head(dat)
##
## study ni ri type struct yi vi
## 1 1 123 0.00 j s 0.0000 0.0082
## 2 2 95 0.06 p u 0.0600 0.0106
## 3 3 69 0.36 j s 0.3600 0.0111
## 4 4 1832 0.15 j s 0.1500 0.0005
## 5 5 78 0.14 j s 0.1400 0.0125
## 6 6 329 0.06 j s 0.0600 0.0030
Sachant que les corrélations sont biaisées, il est préférable
d’utiliser une transformation z de Fisher avant de réaliser la
méta-analyse Fisher & Filon (1898). Appliquez la transformation de
Fisher sur les données. Pour cela, l’argument measure doit
être “ZCOR”.
Exercice 4
Réalisez la transformation de z de Fisher sur les corrélations des données de McDaniel et al. (1994).Comparez les valeurs des corrélations avec celles des transformations de Fisher.
dat <- escalc(measure="ZCOR", ri=ri, ni=ni, slab=study, data=dat, var.names=c("z.yi", "z.vi"))
head(dat)
##
## study ni ri type struct yi vi z.yi z.vi
## 1 1 123 0.00 j s 0.0000 0.0082 0.0000 0.0083
## 2 2 95 0.06 p u 0.0600 0.0106 0.0601 0.0109
## 3 3 69 0.36 j s 0.3600 0.0111 0.3769 0.0152
## 4 4 1832 0.15 j s 0.1500 0.0005 0.1511 0.0005
## 5 5 78 0.14 j s 0.1400 0.0125 0.1409 0.0133
## 6 6 329 0.06 j s 0.0600 0.0030 0.0601 0.0031
L’étape suivante consiste à faire la méta-analyse. Il est techniquement possible de faire la méta-analyse sur les corrélations ou sur les tansformations z de Fisher. Étant donné que la transformation z est moins biaisé, il est préférable d’utiliser la transformation z et d’obtenir le coefficient de corrélation moyen après analyse. Nous avons vu que la méthode la plus adaptée pour des données quantitatives était le maximum de vraisemblance restreint. Nous allons donc utiliser cet algorithme.
model_RE <- rma(yi=z.yi, vi=z.vi, data=dat, method="REML", digits=2)
summary(model_RE)
##
## Random-Effects Model (k = 160; tau^2 estimator: REML)
##
## logLik deviance AIC BIC AICc
## 5.75 -11.50 -7.50 -1.36 -7.42
##
## tau^2 (estimated amount of total heterogeneity): 0.03 (SE = 0.00)
## tau (square root of estimated tau^2 value): 0.17
## I^2 (total heterogeneity / total variability): 81.29%
## H^2 (total variability / sampling variability): 5.35
##
## Test for Heterogeneity:
## Q(df = 159) = 789.73, p-val < .01
##
## Model Results:
##
## estimate se zval pval ci.lb ci.ub
## 0.24 0.02 14.00 <.01 0.20 0.27 ***
##
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
La valeur 0.24 est le z de Fisher mais nous souhaiterions plutôt la
valeur de la corrélation. Nous pouvons obtenir cette valeur grâce à la
fonction predict. Il faut préciser le type de
transformation souhaitée dans l’argument transf. En
l’occurrence, il s’agit de transformer le z en r ‘transf.ztor’
predict(model_RE, transf=transf.ztor)
##
## pred ci.lb ci.ub pi.lb pi.ub
## 0.23 0.20 0.26 -0.10 0.52
La suite consiste à réaliser le forest plot comme précédemment. La difficulté ici est que le nombre d’études est particulièrement important (càd. 160).
Quand la méta-analyse inclut un grand nombre d’études, il existe plusieurs difficultés pour réaliser le forest plot.
la fonction forest renverra un graphique
difficilement lisible si vous essayez de le faire directement dans R. Il
faut donc l’exporter, par exemple en png.
Il faut trouver les bons ajustements de tailles, à la fois la haut et la largeur. Pour la hauteur, il faut compter au moins 100 pixels par ligne et ajouter une petite marge de manoeuvre. En l’occurrence, nous avons décidé d’opter pour 25000 pour la hauteur. Pour la largeur, il faut qu’elle ne soit pas trop petite pour ne pas que cela paraisse bizarre par rapport à la hauteur. Avoir une largeur de 40% de la taille de la hauteur est un minimum. Nous optons pour 10 000.
Si on réalise le forest plot avec la paramètres ci-dessus sans changer les autres paramètres, on constate qu’il y a superposition entre les intervalles de confiance et le texte. Il faut donc ajuster la position du texte.
png(file='forestplot.png',width= 10000, height=25000, res = 400 ) # Open PNG device with specific file name
par(mar=c(4,4,2,2))
dat$weights <- paste0(round(weights(model_RE)), "%")
forest(model_RE, xlim=c(-3.5,5), header=TRUE, top=2, mlab="Summary", digits=c(2L,3L),
ilab=dat$weights, ilab.xpos=4.2, ilab.pos=2)
text(4.2, -1, "100%", pos=2)
text(4.2, 162, "Weight", pos=2, font=2)
dev.off()
Exercice 5
D’autres chercheurs se sont intéressés à la relation qui existe entre le nombre d’apnées du sommeil durant la nuit et la qualité de vie des personnes. Des corrélations ont pu être établies entre ces deux variables, mais la littérature demeure encore jeune, avec un risque d’inconsistance majeur : une méta-analyse pourrait permettre d’y voir plus clair dans ces premières données.
Note : les données présentées dans cet exemple sont fictives
Les données sont présentées dans le fichier “Exercice.xlsx” sur la feuille “ex3”. Réalisez un modèle à effet fixe, obtenez la corrélation moyenne, faites le forest plot. Refaites cet exercice en réalisant un modèle aléatoire qui utilise la méthode DerSimonian-Laird.
dat <- read_excel("Exercices.xlsx", sheet="ex3")
Les données sont présentées ci-dessous.
study | corr_dep | n |
|---|---|---|
Gottlieb et al., 2019 | 0.49 | 4,422 |
Young et al., 2017 | 0.60 | 1,522 |
Punjabi et al., 2018 | 0.63 | 6,294 |
Yaggi et al., 2005 | 0.69 | 1,022 |
Leao et al., 2016 | 0.52 | 73 |
# Ajout des transformation z de Fisher pour les corrélations et la variance associée
dat <- escalc("ZCOR", ri=corr_dep, ni=n, slab=study, data=dat)
dat
##
## study corr_dep n yi vi
## 1 Gottlieb et al., 2019 0.49 4422 0.5361 0.0002
## 2 Young et al., 2017 0.60 1522 0.6931 0.0007
## 3 Punjabi et al., 2018 0.63 6294 0.7414 0.0002
## 4 Yaggi et al., 2005 0.69 1022 0.8480 0.0010
## 5 Leao et al., 2016 0.52 73 0.5763 0.0143
# Réalisation d'un modèle à effets fixes
model_EE <- rma(yi, vi, data=dat, method="EE", digits=2)
model_EE
##
## Equal-Effects Model (k = 5)
##
## I^2 (total heterogeneity / total variability): 97.24%
## H^2 (total variability / sampling variability): 36.18
##
## Test for Heterogeneity:
## Q(df = 4) = 144.72, p-val < .01
##
## Model Results:
##
## estimate se zval pval ci.lb ci.ub
## 0.68 0.01 77.90 <.01 0.66 0.69 ***
##
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
# Transformation du z de Fisher en coefficient de corrélation
# calcul de l'intervalle de confiance et de l'intervalle de prédiction
predict(model_EE, transf=transf.ztor)
##
## pred ci.lb ci.ub
## 0.59 0.58 0.60
# Réalisation du forest plot
par(mar=c(4,4,2,2))
dat$weights <- paste0(round(weights(model_EE)), "%") # weights in % (rounded)
forest(model_EE, xlim=c(-2,4), header=TRUE, top=2, mlab="Summary",
atransf=transf.ztor, at=transf.rtoz(c(-0.5, 0, 0.5, 0.85)),
ilab=dat$weights, ilab.xpos=2.2, ilab.pos=2)
text(2.2, -1, "100%", pos=2)
text(2.2, 7, "Weight", pos=2, font=2)
# Modèle aléatorisé (Random Effect model) avec la méthode DerSimonian-Laird
model_RE <- rma(yi, vi, data=dat, method="DL", digits=2)
model_RE
##
## Random-Effects Model (k = 5; tau^2 estimator: DL)
##
## tau^2 (estimated amount of total heterogeneity): 0.02 (SE = 0.02)
## tau (square root of estimated tau^2 value): 0.13
## I^2 (total heterogeneity / total variability): 97.24%
## H^2 (total variability / sampling variability): 36.18
##
## Test for Heterogeneity:
## Q(df = 4) = 144.72, p-val < .01
##
## Model Results:
##
## estimate se zval pval ci.lb ci.ub
## 0.69 0.06 11.32 <.01 0.57 0.81 ***
##
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
predict(model_RE, transf=transf.ztor)
##
## pred ci.lb ci.ub pi.lb pi.ub
## 0.60 0.51 0.67 0.39 0.75
par(mar=c(4,4,2,2))
dat$weights <- paste0(round(weights(model_RE)), "%") # weights in % (rounded)
forest(model_RE, xlim=c(-2,4), header=TRUE, top=2, mlab="Summary",
atransf=transf.ztor, at=transf.rtoz(c(-0.5, 0, 0.5, 0.85)),
ilab=dat$weights, ilab.xpos=2.2, ilab.pos=2)
text(2.2, -1, "100%", pos=2)
text(2.2, 7, "Weight", pos=2, font=2)