Diagramme de Bland-Altman : étude de la concordance entre 2 mesures

Table des matières

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 concordance de Bland-Altman

Les éléments du diagramme de concordance de Bland-Altman

Le diagramme de Bland-Altman une représentation astucieuse dans laquelle :

  • la moyenne des 2 mesures est rapportée sur l’axe des x
  • la différence des 2 mesures est rapportée sur l’axe des y.
  • le biais (qui est l’écart moyen entre les deux mesures) est matérialisé par une ligne horizontale
  • les limites hautes et basses de concordance (qui délimite un intervalle de valeurs dans lequel 95% des différences se situent) sont également matérialisées par 2 lignes horizontales. On appelle cette zone, la zone d’agrément.

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.

Construction du diagramme de concordance de Bland-Altman en pas à pas

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 

Les axes : moyenne (x) et différence(y)

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 

Le biais

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  

Les limites de concordances et la zone d’agrément

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.

Bland, J. M., & Altman, D. (1986). Statistical methods for assessing agreement between two methods of clinical measurement. The lancet, 327(8476), 307-310.

Comment conclure à la concordance ou non ?

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 :

  • le biais maximum acceptable
  • la zone d’agrément maximale acceptable (la plage de valeurs dans laquelle il est acceptable que la grande majorité (concrètement 95%) des différences soient contenues )

 

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.

Réalisation du digramme de bland Altman avec le package blandr

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  )

 

Réalisation d’un diagramme bland Altman selon une approche non paramétrique

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  

Pourquoi les méthodes classiques ne sont pas satisfaisantes

La corrélation ne permet pas d’évaluer la concordance

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") 

Le test de Student apparié ne parmet pas d’évaluer la concordance

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.

Régression linéaire et évaluation de la concordance

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.

Comment faire un diagramme de Bland et Altman sans R ?

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 ?”

Conclusion

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.👇👇👇

9 Responses

  1. 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 ?

    1. 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

  2. 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é)!

  3. 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

  4. 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

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *

Vous souhaitez vous former à R, ou aux statistiques ?

Retrouver le planning et les programmes de  mes formations ici  👇👇👇 

Vous avez besoin d'un assitance pour analyser vos données ?

Retrouver mes propositions de services ici  👇👇👇 

Vous souhaitez soutenir mon travail ?​

C’est possible en faisant un don  sur la page Tipeee du blog  👇👇👇

Bonjour !

vous venez souvent ?

Identifiez-vous pour avoir accès à toutes les fontionnalités !

Aide mémoire off'R ;)

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.