\(~\)
-> Ce TD va se focaliser sur la partie analyse quantitative
Selon Philibert et al., 2012 (voir aussi Beillouin et al., 2019), l’analyse quantitative se décompose en plusieurs parties:
#install.packages("KenSyn")
library(KenSyn) # <- pour le jeu de données
library(ggplot2) # <- pour les représentations graphiques
library(psych) # <- pour les représentations graphiques
library(gmodels) # Compléments
library(metafor) # Package pour la méta-analyse
library(tidyverse) # Pour coder plus facilement
Les données ont été récupérées à partir de la littérature pour une méta-analyse visant à comparer le rendement des cultures en système biologique au système conventionnel effectuée par Seufert et al (2012). Il contient 65 études. Chaque étude contient des valeurs de rendement des systèmes biologique et conventionnel comparées dans le cadre d’expériences sur le terrain. Les études couvrent différents lieux géographiques, années et cultures.
Data <- organic
library(pastecs)
describe(Data)
p<-ggplot(Data, aes(Yield_conv, Yield_org,, color=Crop_species)) +
geom_point() +
theme_classic()
ggExtra::ggMarginal(p, type = "histogram")
ggplot(Data, aes(lnR)) +
geom_vline(aes(xintercept=0), linetype=2, color= "gray50")+
geom_histogram(color="black", fill="gray80")+
geom_density(alpha=.2, fill="#FF6666")
## `stat_bin()` using `bins = 30`. Pick better value with `binwidth`.
p<-ggplot(Data) +
geom_hline(aes(yintercept=0), linetype=2, color= "gray50")+
geom_point(aes(reorder(Study, lnR),lnR, size= N_conv,color=Crop_species), fill="gray80")+
geom_errorbar(aes(reorder(Study, lnR),ymin = lnR-1.96*Var_lnR, ymax = lnR+Var_lnR), width = 0.2)+
coord_flip()+
geom_text(aes(Study,-1.5, label= paste("n = ", N_conv)))
p
Data_NUM <- Data %>% dplyr::select_if(is.numeric)
pairs.panels(Data_NUM,
method = "pearson", # correlation method
hist.col = "#00AFBB",
density = TRUE, # show density plots
ellipses = FALSE # NOT show correlation ellipses
)
library(ranger) Data_RF <- Data %>% dplyr:: select(-Study,-Yield_conv,-SD_conv,-N_conv,-Yield_org,-SD_org,-N_org, -Yield_unit, -yi, -vi,-Var_lnR) data=organic library(ranger) mod<-ranger(lnR~., data=Data_RF,importance = “permutation”) library(vip) vip(mod)
On va utiliser la fonction metafor. Une description complete de la fonction est accéssible en tapant dans la console ?metafor ou vignette(“metafor”)
ma_model_1 <- rma(lnR, Var_lnR, method="FE", data = organic)
summary(ma_model_1)
##
## Fixed-Effects Model (k = 65)
##
## logLik deviance AIC BIC AICc
## -922.5790 1982.3103 1847.1579 1849.3323 1847.2214
##
## Test for Heterogeneity:
## Q(df = 64) = 1982.3103, p-val < .0001
##
## Model Results:
##
## estimate se zval pval ci.lb ci.ub
## -0.2528 0.0082 -30.7315 <.0001 -0.2690 -0.2367 ***
##
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
-> Interpretation des sorties du modèle
AIC, BIC, …. : Indicateur de la qualité d’ajustement du modèle. Peux servir à comparer d’autres modèles, mais sur la même base de données
Test for Heterogeneity:
Q = ∑ (Wi(Yi-θ)^2, with Wi : Weight, Yi: observed effect-size, θ: estimated effect size Q is the weighted deviations about the summary effect size. Larger values of Q reflect greater between-study heterogeneity. Q-test has low power (<0.80) when the number of studies and/or sample sizes is small.
p-value:
pchisq(Q, df = df, lower = FALSE)
how likely under null hypothesis (H0:θ1= θ2= …)
p-val < .0001 -> rejet H0.
Model results estimate: -0.2528. le log ratio de rendement BIO/CONV est -0.24 <-> le ratio de rendement est exp(-0.25)= 0.7766 <-> le Bio produit 100-77= 22.4% de moins que le conventionnel A quel point ce résultat est précis? on regarde les confidence intervals la moyenne de perte de Rdt en Bio se situe entre 21.02- et 23.58% par rapport au conventionnel
-> Représentation graphique
directement avec la fonction metafor
forest(ma_model_1)
ou avec le package ggplot2
RES<-summary(ma_model_1)
Data["MA_fixed", "lnR"]<- RES$beta
Data["MA_fixed", "Var_lnR"]<- RES$se^2
Data["MA_fixed", "Study"]<- "Fixed_effect summary"
p<-ggplot(Data) +
geom_hline(aes(yintercept=0), linetype=2, color= "gray50")+
geom_point(aes(reorder(Study, lnR),lnR, size= N_conv,color=Crop_species), fill="gray80")+
geom_errorbar(aes(reorder(Study, lnR),ymin = lnR-1.96*Var_lnR, ymax = lnR+Var_lnR), width = 0.2)+
coord_flip()+
geom_text(aes(Study,-1.5, label= paste("n = ", N_conv)))
p
## Warning: Removed 1 rows containing missing values (geom_point).
Il existe différentes façon d’écrire les modèles mixtes (avec metafor)
ma_model_3<-rma.mv(lnR, Var_lnR, random = ~ 1 | Study, data=organic)
summary(ma_model_3)
##
## Multivariate Meta-Analysis Model (k = 65; method: REML)
##
## logLik Deviance AIC BIC AICc
## -20.0769 40.1539 44.1539 48.4717 44.3506
##
## Variance Components:
##
## estim sqrt nlvls fixed factor
## sigma^2 0.0724 0.2690 65 no Study
##
## Test for Heterogeneity:
## Q(df = 64) = 1982.3103, p-val < .0001
##
## Model Results:
##
## estimate se zval pval ci.lb ci.ub
## -0.2429 0.0398 -6.1004 <.0001 -0.3209 -0.1649 ***
##
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
ma_model_2<- rma(lnR, Var_lnR, data=organic)
summary(ma_model_2)
##
## Random-Effects Model (k = 65; tau^2 estimator: REML)
##
## logLik deviance AIC BIC AICc
## -20.0769 40.1539 44.1539 48.4717 44.3506
##
## tau^2 (estimated amount of total heterogeneity): 0.0724 (SE = 0.0171)
## tau (square root of estimated tau^2 value): 0.2690
## I^2 (total heterogeneity / total variability): 93.47%
## H^2 (total variability / sampling variability): 15.31
##
## Test for Heterogeneity:
## Q(df = 64) = 1982.3103, p-val < .0001
##
## Model Results:
##
## estimate se zval pval ci.lb ci.ub
## -0.2429 0.0398 -6.1004 <.0001 -0.3209 -0.1649 ***
##
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
-> Interpretation des sorties du modèle
Les résultats indiquent que le rapport logarithmique moyen estimé est égal à μˆ = -0,2429 (IC 95 % : -0,3203 à -0,1655). Pour faciliter l’interprétation, il peut être utile de retransformer ces valeurs à l’échelle des ratios par exponentiation (c.-à-d. exp(μˆ) = 0,78 avec IC à 95 % : 0,73 à 0,84). L’hypothèse nulle H0 : μ = 0 peut être clairement rejetée (z = -6,1503, p < 0,0001).
Intéressant de remarquer que ces ratios sont un peu différent de ceux de l’article Seufert et al., 2012. Les auteurs se basent sur 316 points, tandisque nous en avons 346. Ils ont du sélectioner les données et pondérer les études? (voir plus bas)
La statistique I2 estime (en pourcentage) quelle part de la variabilité totale des estimations de la valeur de l’effet (qui se compose de l’hétérogénéité et de la variabilité d’échantillonnage) peut être attribuée à l’hétérogénéité des effets réels (τˆ2 = 0 implique donc I2 = 0%).
La statistique H2 est le rapport entre la variabilité totale des résultats observés et la variabilité de l’échantillonnage (τˆ2 = 0 implique donc H2 = 1).
Il est important de comprendre, cependant, que τˆ2, I2 et H2 sont souvent estimés de façon imprécise, surtout lorsque le nombre d’études est faible. On peut calculer les intervalles des confiances sur ces indicateurs
confint(ma_model_2)
##
## estimate ci.lb ci.ub
## tau^2 0.0724 0.0437 0.1136
## tau 0.2690 0.2091 0.3370
## I^2(%) 93.4694 89.6327 95.7382
## H^2 15.3125 9.6457 23.4641
Pour ajuster les poids des études dans le modèle, on utilise la fonction weights de metafor
ma_model_4<- rma(lnR, Var_lnR, data=organic, weights= 1/Var_lnR)
summary(ma_model_4)
##
## Random-Effects Model (k = 65; tau^2 estimator: REML)
##
## logLik deviance AIC BIC AICc
## -20.1081 40.2162 44.2162 48.5340 44.4129
##
## tau^2 (estimated amount of total heterogeneity): 0.0724 (SE = 0.0171)
## tau (square root of estimated tau^2 value): 0.2690
## I^2 (total heterogeneity / total variability): 93.47%
## H^2 (total variability / sampling variability): 15.31
##
## Test for Heterogeneity:
## Q(df = 64) = 1982.3103, p-val < .0001
##
## Model Results:
##
## estimate se zval pval ci.lb ci.ub
## -0.2528 0.1021 -2.4764 0.0133 -0.4529 -0.0527 *
##
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
-> Interpretation des sorties du modèle
Avec le modèle 2, l’estimateur le plus efficace de mu est donné par
mu-hat = somme(wi * yi) / somme(wi)
où wi = 1/(tau^2 + vi), c’est-à-dire l’inverse des variances marginales
Dans certains cas, il se peut que nous voulions nous écarter de l’utilisation de ces poids. Supposons, par exemple, que l’on s’inquiète de la précision des études. . Si tau^2 est grand, alors mu-hat est presque comme une moyenne non pondérée et les études plus petites et plus grandes reçoivent presque le même poids dans le calcul mu-hat. Cela peut conduire à un biais substantiel dans le mu-hat. Au lieu de cela, nous pouvons estimer mu avec wi = 1/vi, de sorte que les petites études reçoivent peu de poids et les grandes études plus de poids. Par conséquent, le chapeau mu peut avoir beaucoup moins de biais.
Pour cela on utilise l’argument mods de la fonction metafor
exemple en utilisant Crop_type, comme dans Seufert et al., 2012, Figure 1a.
ma_model_5 <- rma(lnR, Var_lnR, weights = 1/ Var_lnR, mods= ~Crop_type-1, data = organic)
summary(ma_model_5)
##
## Mixed-Effects Model (k = 65; tau^2 estimator: REML)
##
## logLik deviance AIC BIC AICc
## -35.0465 70.0930 94.0930 117.9608 101.7028
##
## tau^2 (estimated amount of residual heterogeneity): 0.0809 (SE = 0.0204)
## tau (square root of estimated tau^2 value): 0.2845
## I^2 (residual heterogeneity / unaccounted variability): 93.26%
## H^2 (unaccounted variability / sampling variability): 14.83
##
## Test for Residual Heterogeneity:
## QE(df = 54) = 1180.7318, p-val < .0001
##
## Test of Moderators (coefficients 1:11):
## QM(df = 11) = 28.2389, p-val = 0.0030
##
## Model Results:
##
## estimate se zval pval ci.lb
## Crop_typecereals -0.1114 0.1622 -0.6867 0.4923 -0.4293
## Crop_typefiber -0.4032 0.2804 -1.4376 0.1506 -0.9528
## Crop_typeforage 0.0436 0.2957 0.1474 0.8828 -0.5360
## Crop_typefruits -0.3208 0.1941 -1.6530 0.0983 -0.7012
## Crop_typeoil crops -0.1187 0.2164 -0.5484 0.5834 -0.5429
## Crop_typeother -0.3419 0.2333 -1.4655 0.1428 -0.7991
## Crop_typepulses -0.4518 0.5815 -0.7770 0.4372 -1.5915
## Crop_typeroots & tubers -0.4865 0.2916 -1.6683 0.0953 -1.0582
## Crop_typesugar crops -0.2930 0.4055 -0.7225 0.4700 -1.0878
## Crop_typetree nuts -0.0484 0.3560 -0.1360 0.8919 -0.7462
## Crop_typevegetables -0.6748 0.1658 -4.0707 <.0001 -0.9997
## ci.ub
## Crop_typecereals 0.2065
## Crop_typefiber 0.1465
## Crop_typeforage 0.6232
## Crop_typefruits 0.0596 .
## Crop_typeoil crops 0.3055
## Crop_typeother 0.1154
## Crop_typepulses 0.6879
## Crop_typeroots & tubers 0.0851 .
## Crop_typesugar crops 0.5018
## Crop_typetree nuts 0.6494
## Crop_typevegetables -0.3499 ***
##
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
-> Interpretation des sorties du modèle
Nous n’expliquons pas une large part de la variabilité (cf. comparaison τˆ2 dans les modèles 5 et 4). Probablement parce que le nombre d’individus dans certains groupes est faible -> mauvaise qualité des estimations.
Test des modérateurs :
On peut rejeter H0 : β1 = β2 = 0 basé sur le test (QM = 28.2389, df = 11, p < 0.0030) : Les légumes de type crop_type semblent avoir une influence significative sur le rapport logarithmique (c.-à-d., pour H0 : β1 = 0, on trouve z=–4.0707 <0.01).
Test d’hétérogénéité résiduelle :
Le test d’hétérogénéité résiduelle est significatif (QE = 1180, df = 54, p < 0,0001), ce qui indique peut-être que d’autres modérateurs non considérés dans le modèle influencent le rapport logarithmique.
-> représentation graphique
RES<-summary(ma_model_5)
SUMMARY <- data.frame(b=exp(RES$beta))
SUMMARY$se<- RES$se
SUMMARY$low_CI<- exp(RES$b-RES$se)
SUMMARY$up_CI<- exp(RES$b+RES$se)
SUMMARY$Crop_type<- row.names(SUMMARY)
ggplot(data=SUMMARY)+
geom_point(aes(reorder(Crop_type,b), b))+
geom_errorbar(aes(Crop_type, ymin= low_CI, ymax=up_CI))+
geom_hline(aes(yintercept=1), color= "gray80", linetype=2)+
coord_flip()
Il existe de nombreuses méthodes pour analyser la sensibilité des résultats aux études inclues dans la base de données. En pratiques ces méthodes ne sont que rarement mise en oeuvre dans les méta-analyses.
On va utiliser la fonction influence qui permet de réaliser rapidement une série de diagnostic
inf<-influence(ma_model_5)
plot(inf)
-> Interprétation des sorties
dffits: The DIFFITS value of a study indicates in standard deviations how much the predicted pooled effect changes after excluding this study.
cook’s distance: même idée, mais indicateur un peu différent.
cov.r: déterminant de la matrice de variance-covariance des estimations des paramètres lorsque l’étude est supprimée, divisé par le déterminant de la matrice de variance-covariance des estimations des paramètres lorsque l’ensemble des données est considéré. Il est important de noter que les valeurs de cov.r < 1 indiquent que la suppression de l’étude conduira à une estimation plus précise de la taille de l’effet (c.-à-d. moins hétérogénéité).
autre variables: voir Viechtbauer, W., & Cheung, M. W.-L. (2010). Outlier and influence diagnostics for meta-analysis. Research Synthesis Methods, 1, 112–125
L’élimination de ces études réduirait considérablement l’hétérogénéité et augmenterait la précision du résultat moyen estimé (c.-à-d. la corrélation transformée r-to-z.) du modèle à effets aléatoires. Cependant, au lieu de simplement supprimer ces études, on devrait les examiner en détail pour déterminer la raison de leurs résultats inhabituels.
Une méthode complémentaire a éré proposéepar Baujat et al: Voir papier Baujat B, Mahé C, Pignon JP, Hill C (2002): A graphical method for exploring heterogeneity in meta-analyses: Application to a meta-analysis of 65 trials. Statistics in Medicine, 30, 2641–52
baujat(ma_model_5)
-> Interprétation des sorties
L’axe X représente la contribution de l’essai au test Cochran Q global pour l’hétérogénéité
L’axe des Y représente l’influence de l’essai, définie comme la différence quadratique normalisée entre les effets du traitement estimés avec et sans l’essai.
on va retirer une à une les études présentes dans la base de données et re-calculer le summary effect size. On va pouvoir ainsi déterminer si certaines des études ont une large influence sur le modèle global.
LOO<-data.frame(leave1out(ma_model_4))
LOO$study<-row.names(LOO)
ggplot(LOO)+ geom_point(aes(study,estimate))+
geom_errorbar(aes(study,ymin=ci.lb ,ymax=ci.ub ))+
coord_flip()+
theme_bw()
-> Interprétation des sorties
On remarque que 2 etudes impactent très fortement les résultats de la méta-analyse. Etudes à vérifier précisément.
Un biais de publication désigne en science le fait que les chercheurs et les revues scientifiques ont bien plus tendance à publier des expériences ayant obtenu un résultat positif (statistiquement significatif) que des expériences ayant obtenu un résultat négatif (soutenant l’hypothèse nulle). Ce biais de publication donne aux lecteurs une perception biaisée (vers le positif) de l’état de la recherche Il est possible d’identifier dans un ensemble d’études, s’il y a présence ou pas de biais de publication
La présence d’un biais de publication (ou plus exactement, l’asymétrie de la courbe en entonnoir (funnel plot) ou les “effets de petites études”) et son impact potentiel sur les résultats peuvent être examinés par diverses méthodes, notamment :
Nous allons focaliser dans ce TD sur deux méthodes.
Il suppose que les petites études sont plus susceptibles d’être sujettes à un biais de publication que les grandes, et c’est cette différence qui est détectable. Si un chercheur termine un essai randomisé de grande envergure, il est probable qu’il voudra le voir publié même si le résultat est négatif en raison de l’effort requis. Pour les petits procès, cependant, la situation peut être différente. S’il existe un biais de publication, il est fort probable qu’il soit dû au fait que de petits essais négatifs n’ont pas été publiés.
Le diagramme en entonnoir est une représentation graphique de la taille des essais par rapport à l’ampleur de l’effet qu’ils rapportent. Comme la taille de l’essai augmente, les essais sont susceptibles de converger vers la taille réelle de l’effet sous-jacent. On s’attendrait à voir une dispersion égale des essais de part et d’autre de cet effet sous-jacent réel. Lorsqu’il y a eu biais de publication, on s’attend à une asymétrie dans la dispersion des petites études, davantage d’études ayant donné un résultat positif que celles ayant donné un résultat négatif.
funnel(ma_model_1)
-> interprétation des résultats
Il ne semble pas y avoir de biais depublication dans les études de ce jeu de données
res.tf <- trimfill(ma_model_4)
funnel(res.tf, legend=TRUE, cex=1.2)
-> interprétation des résultats
Etant donné l’absence de biais de publication, cette analyse n’aboutit pas.