Dans le secteur de la santé, la problématique de l’évaluation de l’accord entre deux méthodes de mesure est relativement fréquente. Exprimée autrement, il s’agit d’évaluer si deux méthodes de mesures, ou deux dispositifs médicaux différent(e)s fournissent des résultats similaires lorsqu’ils mesurent une même variable.
En termes biostatistiques, cette problématique de l’accord entre deux méthodes de mesure s’appelle la concordance (agreement en anglais).
Quand on y est confronté pour la première fois, le premier réflexe est souvent d’envisager une analyse de corrélation linéaire, ou un test de comparaison de moyennes appariées (Student ou Wilcoxon) . En réalité, toutes ces approches ne sont pas adéquates (je vous explique pourquoi dans cet article).
L’approche la plus fréquemment employée pour étudier la concordance entre deux méthodes de mesure est le diagramme de Bland-Altman. Dans cet article, je vous explique en détail les éléments qui le composent, comment l’interpréter, et comment le réaliser facilement avec R.
Le diagramme de Bland-Altman une représentation astucieuse dans laquelle :
Cette approche permet ainsi de visualiser comment évoluent les écarts entre les deux méthodes en fonction de la valeur moyenne des deux mesures. Est-ce que l’écart est constant Quelle que soit la valeur de la mesure, ou est-ce qu’il croit avec la mesure ?
Si l’écart est constant, on pourra recalibrer l’une des méthodes en le retranchant à celle-ci. S’il croît avec la mesure, il faudra probablement utiliser une transformation log.
Vous retrouverez des exemples dans la publication originale de Bland et Altman : Bland, J. M., & Altman, D. (1986). Statistical methods for assessing agreement between two methods of clinical measurement. The lancet, 327(8476), 307-310.
Pour illustrer la construction du graphique, nous allons employer les données blandr.dataset.o2sats
disponible dans le package blandr
(je vous montre plus bas comment utiliser ce package pour réaliser le graphique de Bland-Altman avec une fonction)
Il s’agit de mesure de la saturation en oxygene (%) réalisé avec deux dispositifs différents, l’un nommé “pos” pour pulsed oximeter saturation et l’autre nommé “osm” pour oxygen saturation monitor.
# création du dataset de données
library(blandr)
library(tidyverse)
sat <- blandr.dataset.o2sats() %>%
set_names(c("subject","pos", "osm"))
head(sat)
subject pos osm
1 1 100 99.7
2 2 100 99.8
3 3 99 99.1
4 4 99 99.7
5 5 99 98.5
6 6 98 97.2
Comme expliqué précédemment, l’axe des x représente la moyenne des deux mesures et l’axe des y la différence entre les deux mesures. Nous allons donc calculer ces deux valeurs.
# calcul de la moyenne et de la différence des 2 mesures
sat <- sat %>%
mutate(moy = (pos + osm)/2,
diff = (pos - osm))
# premier graphique
g1 <- ggplot(sat, aes(x=moy, y=diff))+
geom_point()+
geom_hline(yintercept=0, colour="black", linetype="solid")
g1
Nous pouvons ensuite calculer le bais, c’est-à-dire l’écart moyen entre les deux séries de mesure, et le reporter sur le graphique :
biais <- mean(sat$diff)
biais
[1] -0.4125
g2 <- g1+
geom_hline(yintercept=0, colour="black", linetype="solid")+
geom_hline(yintercept=biais, colour="blue", linetype="dashed")+
annotate("text", x=110,y=-0.2,label= "biais", color="blue")
g2
Le biais permet de quantifier l’écart moyen de mesure entre les deux méthodes.
Ici le biais = -0.41%. Cela signifie qu’en moyenne la méthode “pos” fournit une valeur plus faible de 0.41 unité (%) par rapport à la méthode “osm”. Cela semble négligeable
Le biais correspond à la moyenne des différences des paires de mesures, que l’on peut obtenir avec un test t apparié. Et l’intervalle de confiance à 95% de cette moyenne des différences correspond à l’intervalle de confiance du biais.
t.test(sat$pos, sat$osm, paired=TRUE)
Paired t-test
data: sat$pos and sat$osm
t = -2.8907, df = 71, p-value = 0.005097
alternative hypothesis: true mean difference is not equal to 0
95 percent confidence interval:
-0.6970379 -0.1279621
sample estimates:
mean difference
-0.4125
Deux limites sont encore ajoutées au graphique. Il s’agit des limites de concordance haute et basse. Leur calcul repose sur l’hypothèse d’une distribution normale des différences, de moyenne égale au biais et d’écart type égal à l’écart type des différences. En effet, si les données suivent une loi normale, une des “propriétés” est que 95% des valeurs sont comprises dans l’intervalle moyenne +/- 2 écart types.
moy_diff <- biais
sd_diff <- sd(sat$diff)
limite_haute_concordance <- moy_diff + 1.96*sd_diff
limite_haute_concordance
[1] 1.960784
limite_basse_concordance <- moy_diff - 1.96*sd_diff
limite_basse_concordance
[1] -2.785784
Ici la limite haute de concordance est égale à 1.96% et la limite basse de concordance est égale à -2.79%. Cela signifie que la plupart (en pratique 95%) des différences de valeurs entre les deux méthodes sont contenues entre -2.76% et 1.96%. Cela semble également plutôt faible.
g3 <- g2+
geom_hline(yintercept = limite_haute_concordance , col="red", linetype="dashed") +
geom_hline(yintercept = limite_basse_concordance , col="red", linetype="dashed")+
geom_segment(aes(x = 60, y =limite_basse_concordance , xend = 60, yend = limite_haute_concordance),
arrow = arrow(type = "open", ends = "last", length = unit(0.1, "inches")),colour="magenta")+
annotate("text", x=65,y=0,label= "Zone d'agrément", color="magenta", angle=90)
g3
Les points au-delà des limites de concordances sont des alors outliers. Ils permettent de visualiser un écart plus important qu’attendu en théorie. Ici, il n’y en a qu’un seul.
Puisque les calculs des limites de concordance sont basés sur la loi normale, on peut vérifier si la distribution des différences est bien compatible avec une distribution gaussienne :
library(car)
qqPlot(sat$diff)
Ici, c’est bien le cas. Sinon, on peut employer une approche non paramétrique du diagramme de Bland-Altman (voir plus loin)
Remarque : comme le biais et les limites de concordance ne sont que des estimations (avec un autre échantillon, nous obtiendrions d’autres valeurs), ces paramètres sont généralement présentés avec un intervalle de confiance à 95%, comme ceci :
Si vous souhaitez plus de précisions sur le calcul de l’intervalle de confiance du biais et des limites de concordance, vous pouvez consulter la publication originale de Bland et Altman, ils y sont très bien décrits.
Pour conclure à la concordance, plusieurs étapes doivent être réalisées au préalable.
D’abord s’assurer de la répétabilité des deux méthodes de mesures parce que si les valeurs fournies sont très différentes d’une mesure à l’autre, cela va être compliqué d’évaluer la concordance ! La répétabilité peut être évaluée en réalisant plusieurs mesures de manière identique pour chaque méthode, puis en calculant le coefficient de Variation (CV), qui est le rapport de l’écart-type à la moyenne des mesures, exprimé en pourcentage. Un CV faible indique une bonne répétabilité. Pour les mesures biomédicales, par exemple, un CV de moins de 10% est souvent considéré comme acceptable, mais cela peut dépendre des domaines d’application.
À noter que dans leur publication, Bland et Altman évoquent la possibilité, pour chacune des méthodes, de réaliser deux mesures sur plusieurs individus, et de réaliser le graphique des différences en fonction des moyennes.
Si les deux méthodes ont une bonne répétabilité, il est, ensuite, nécessaire de définir, a priori, c’est-à-dire avant de réaliser le graphique de Bland et Altman, deux critères cliniques :
Enfin, le biais observé est comparé avec le biais maximum acceptable, et l’intervalle de valeurs défini par les bornes de concordance observées avec la zone d’agrément maximale acceptable.
La concordance est acceptée si le biais observé est inférieur au biais maximal acceptable et si la zone d’agrément estimée dans l’échantillon est incluse dans la zone d’agrément maximale acceptable.
Et oui, il y a un peu de subjectivité !
Ici, je ne connais pas ces paramètres, il m’est donc difficile d’interpréter de manière plus approfondie le diagramme. Dans tous les cas, il s’agit d’un avis d’experts, qui dépend des situations.
Pour étudier la concordance entre deux mesures, avec R, vous pouvez employer le package blandr
, et notamment ses fonctions blandr.output.text()
et blandr.draw()
.
La fonction blandr.output.text()
permet d’obtenir tous les éléments du graphique décrits précédemment :
blandr.output.text ( sat$pos, sat$osm , sig.level=0.95 )
Number of comparisons: 72
Maximum value for average measures: 99.9
Minimum value for average measures: 70.9
Maximum value for difference in measures: 2.5
Minimum value for difference in measures: -2.3
Bias: -0.4125
Standard deviation of bias: 1.210859
Standard error of bias: 0.1427011
Standard error for limits of agreement: 0.245005
Bias: -0.4125
Bias- upper 95% CI: -0.1279621
Bias- lower 95% CI: -0.6970379
Upper limit of agreement: 1.960784
Upper LOA- upper 95% CI: 2.44931
Upper LOA- lower 95% CI: 1.472258
Lower limit of agreement: -2.785784
Lower LOA- upper 95% CI: -2.297258
Lower LOA- lower 95% CI: -3.27431
Derived measures:
Mean of differences/means: -0.4711187
Point estimate of bias as proportion of lowest average: -0.5818054
Point estimate of bias as proportion of highest average -0.4129129
Spread of data between lower and upper LoAs: 4.746567
Bias as proportion of LoA spread: -8.690491
Bias:
-0.4125 ( -0.6970379 to -0.1279621 )
ULoA:
1.960784 ( 1.472258 to 2.44931 )
LLoA:
-2.785784 ( -3.27431 to -2.297258 )
Et la fonction blandr.draw()
permet d’afficher le graphique :
blandr.draw( sat$pos, sat$osm , sig.level=0.95 )
En écrivant cet article, je suis tombée sur le package MKinfer
qui permet de réaliser un diagramme de Bland-Altman non paramétrique, avec la médiane des différences et des quantiles empiriques de 2,5 % et 97,5 % comme limites inférieure et supérieure d’accord :
## nonparametric Bland-Altman plot with exact confidence intervals
library(MKinfer)
## nonparametric Bland-Altman plot with exact confidence intervals
## sur les données de saturation en oxygène
baplot(x = sat$pos, y = sat$osm, type = "nonparametric",
xlab = "Mean of pos and osm",
ylab = "Difference (pos - osm)",
title = "Nonparametric Bland-Altman Plot")
$`median of differences`
estimate 2.5 % 97.5 %
-0.6 -1.0 -0.1
$`lower LoA (2.5 %)`
estimate.2.5% 2.5 % 97.5 %
-2.2 -2.3 -1.4
$`upper LoA (97.5 %)`
estimate.97.5% 2.5 % 97.5 %
1.5675 0.3000 2.5000
Souvent, la première idée face à cette problématique de l’évaluation de l’accord entre deux méthodes, c’est d’envisager la corrélation de Pearson, en pensant que si le coefficient de corrélation est élevé et que la p-value est significative, alors cela démontre que les mesures sont similaires. En fait, ce n’est pas une bonne idée parce que, par exemple, si la deuxième méthode fournit exactement une valeur 2 fois plus élevée que la première, les mesures ne sont pas concordantes mais la corrélation sera parfaite (r=1 ,pval <0.001).
set.seed(123)
m1 <- rnorm(15, 20, 5)
m2 <- 2*m1
mydata1 <- data.frame(m1, m2)
cor.test(mydata1$m1, mydata1$m2)
Pearson's product-moment correlation
data: mydata1$m1 and mydata1$m2
t = Inf, df = 13, p-value < 2.2e-16
alternative hypothesis: true correlation is not equal to 0
95 percent confidence interval:
1 1
sample estimates:
cor
1
library(ggplot2)
ggplot(mydata1, aes(x=m1, y=m2))+
geom_point(size=2)+
geom_smooth(method="lm", se=FALSE)+
annotate("text", x=25,y=30,label= " r = 1 - pval <0.0001", color="magenta")
Autre idée tentante, c’est d’envisager le test de Student apparié (ou le test de Wilcoxon apparié) et de se dire que si la pvalue est > 0.05 on pourra conclure que les mesures sont similaires.
Là encore, ce n’est pas une bonne idée ! D’abord parce que ne pas rejeter l’hypothèse nulle ne permet pas de conclure à l’égalité des moyennes. Et ensuite parce qu’en moyenne les écarts peuvent se compenser.
Imaginons, par exemple, que sur la première partie de la gamme des valeurs possibles, la méthode 1 fournit des valeurs systématiquement deux fois supérieure à celle de la méthode 1. Et que sur l’autre partie de la gamme, c’est l’inverse.
set.seed(123)
m11 <- rnorm(15, 20, 5)
m21 <- 2*m11
m12 <- rnorm(15, 60, 5)
m22 <- m12/2
m1 <- round(c(m11, m12),2)
m2 <- round(c(m21, m22),2)
mydata2 <- data.frame(m1, m2)
mydata2$diff <- mydata2$m2 - mydata2$m1
mydata2
m1 m2 diff
1 17.20 34.40 17.20
2 18.85 37.70 18.85
3 27.79 55.59 27.80
4 20.35 40.71 20.36
5 20.65 41.29 20.64
6 28.58 57.15 28.57
7 22.30 44.61 22.31
8 13.67 27.35 13.68
9 16.57 33.13 16.56
10 17.77 35.54 17.77
11 26.12 52.24 26.12
12 21.80 43.60 21.80
13 22.00 44.01 22.01
14 20.55 41.11 20.56
15 17.22 34.44 17.22
16 68.93 34.47 -34.46
17 62.49 31.24 -31.25
18 50.17 25.08 -25.09
19 63.51 31.75 -31.76
20 57.64 28.82 -28.82
21 54.66 27.33 -27.33
22 58.91 29.46 -29.45
23 54.87 27.43 -27.44
24 56.36 28.18 -28.18
25 56.87 28.44 -28.43
26 51.57 25.78 -25.79
27 64.19 32.09 -32.10
28 60.77 30.38 -30.39
29 54.31 27.15 -27.16
30 66.27 33.13 -33.14
library(ggpubr)
ggpaired(mydata2, cond1 = "m1", cond2 = "m2", fill=c("orange", "blue"))
t.test(mydata2$m1, mydata2$m2, paired=TRUE)
Paired t-test
data: mydata2$m1 and mydata2$m2
t = 0.91734, df = 29, p-value = 0.3665
alternative hypothesis: true mean difference is not equal to 0
95 percent confidence interval:
-5.300832 13.923499
sample estimates:
mean difference
4.311333
Ici, la pvalue n’est pas significative, l’hypothèse nulle n’est pas rejetée, donc “rien ne nous permet d’affirmer que la moyenne des mesures de la méthode 1 est différente de celles de la méthode2” ! Et pourtant, comme nous le montre le graph, les deux mesures ne sont pas du tout concordantes.
Une approche intéressante pourrait consister à réaliser une régression linéaire entre les deux mesures et à tester l’égalité à 0 de l’intercept. L’intercept représente la différence systématique entre les deux méthodes de mesure lorsque la valeur mesurée est à zéro. Si l’intercept est significativement différent de zéro, cela indique qu’il y a un biais constant entre les deux méthodes, indépendamment de la grandeur mesurée.
De la même façon, nous pourrions tester l’égalité de la pente à 1. La pente indique la relation proportionnelle entre les deux méthodes. Une pente égale à 1 signifie que les deux méthodes sont proportionnellement équivalentes. Si la pente est significativement différente de 1, cela suggère une différence de proportionnalité entre les méthodes, c’est-à-dire que l’une mesure systématiquement plus ou moins que l’autre en fonction de la grandeur de la mesure.
En pratique, c’est une régression linéaire non paramétrique qui est généralement employée, celle de Passin-Bablock. Je vous la présenterai dans un prochain article.
Le logiciel JAMOVI (logiciel de statistique libre d’accès) dispose d’un module complémentaire blandr
qui permet de réaliser les mêmes graphiques que sous R :
Pour en savoir plus sur le logiciel de statistique JAMOVI (librement téléchargeable), consultez mon article “Jamovi : une alternative à R pour les statistiques ?”
Nous avons exploré ensemble l’approche de Bland-Altman pour évaluer la concordance entre deux méthodes de mesure dans cet article. L’idée était de vous présenter à la fois les bases théoriques de cette méthode et ses composantes, ainsi que des éléments pratiques en effectuant une analyse sous R avec le package blandr
.
J’espère avoir réussi à vous démontrer que la corrélation et les tests de comparaison de moyennes ne sont pas appropriés pour aborder la problématique de l’accord entre deux méthodes de mesure.
Vos retours d’expérience, questions ou observations concernant l’application de cette méthode sont très importants pour notre communauté. Alors, n’hésitez pas à partager vos réflexions ou à poser des questions dans les commentaires ci-dessous pour approfondir notre discussion et améliorer notre compréhension commune.👇👇👇
Retrouver le planning et les programmes de mes formations ici 👇👇👇
Retrouver mes propositions de services ici 👇👇👇
C’est possible en faisant un don sur la page Tipeee du blog
Enregistrez vous pour recevoir gratuitement mes fiches “aide mémoire” (ou cheat sheets) qui vous permettront de réaliser facilement les principales analyses biostatistiques avec le logiciel R et pour être informés des mises à jour du site.
9 Responses
Merci beaucoup pour cet article fort intéressant
Merci pour ce post très instructif qui tombe à pic ! Pour la concordance entre des notes données par des juges (échelle ordinale de 3 à 4 niveaux), l’approche sera tout à fait différente n’est-ce pas ? Recommandez-vous les index Kappa/Gwet ou plutôt autre chose ?
Bonjour Marie,
Oui, c’est différent. Dans la situation que vous citez, on parle d’accord inter-juge et il me semble qu’on utilise le Kappa pondéré.
J’espère que cela vous aide un peu.
Bonne continuation
Bonjour
Encore un très bon article que j’ai pourtant lu à reculons car j’ai eu peur que vous ne disiez que les test de pente et d’ordonnée à l’origine (respectivement 1 et 0) ne soient pas la bonne méthode! Dans ce dernier cas, j’ajouterai l’étude graphique des résidus en fonction de la valeur mesurée.
Merci pour vos démonstrations par l’exemple qui marche pas (corrélation et test apparié)!
Bonjour,
J’ai découvert le schéma de Bland et Altman, lorsque j’ai eu à comparer deux méthodes de correction de l’intervalle QT de l’électrocardiogramme. Dans votre tutoriel j’ai apprécié les paragraphes sur l’estimation du biais et des limites de concordance.
Cordialement
Bonjour et merci beaucoup pour ce super article.
Il y a deux packages en R qui permettent de calculer et de tracer ce diagramme :
https://cran.r-project.org/web/packages/BlandAltmanLeh/vignettes/Intro.html
et
https://cran.r-project.org/web/packages/blandr/vignettes/introduction.html
As-tu une préférence, un conseil de l’un par rapport à l’autre ?
Merci
E.
Bonjour,
je ne connais que le package blandr, que je trouve très complet.
Bonjour Claire,
Encore un article très intéressant et toujours aussi bien présenté. Merci à vous pour cette bibliothèque d’informations statistiques.
Vous allez bientôt parler de la régression de Passing et Bablok dans un prochain article comme approche de concordance non paramétrique entre deux méthodes. Je ne sais si vous connaissez également la régression de Deming dont le but est identique mais dans une approche paramétrique ?
J’attends ces articles avec impatience 😉
Cordialement
Philippe
Bonjour Philippe,
Non, je ne connais pas la régression de Deming, je vais aller voir.
Merci beaucoup.