Kapitel 37 Bland Altman Plot

In diesem Kapitel werden wir den Bland Altman Plot genauer anschauen.

37.0.1 Wir benötigen folgende Pakte

library(BlandAltmanLeh)
library(dplyr)
library(tidyr)
library(ggplot2)
library(MethComp)

37.1 Bland-Altman Plot erklärt

Wir haben ja scon ICC und Standard Error of Measurement (SEM) besprochen. Eine andere Form die Unterschiede in den Messungen zu zeigen, ist der Bland-Altman Plot. Wir werden auch sehen, dass der SEM auch im Bland-Altman Plot versteckt ist.

Wir sehen hier ein Beispiel von 10 Personen, die mit zwei Methoden gemessen wurden. Die Tabelle zeigt die beiden Messungen und die Differenz zweischen den beiden Messungen.

data<-rio::import("http://www.pt-wissen.ch/examples.xlsx", range="D3:G13")

# because i did not prepare the data "nicely", we have to specify the range where the data are
data<-janitor::clean_names(data) # Just to remove spaces from the variable (column) names. 

data<-data%>% 
  mutate(difference_m2_m1=round(difference_m2_m1,3))

DT::datatable(data)
# Method 2 as shown on page 111 of Measurement in Medicine (Orange Cosmin Book)
# Standard deviation of the difference between the two raters
sd_diff<-sd(data$difference_m2_m1) 
SEM <- sd_diff/sqrt(2) # you could also write the square root like this: 2^0.5

Der SEM ist: 0.1600347.

arrows <- # Nur für die Pfeile in der Graphik 
  tibble(
    x1 = 83,
    x2 = 78.5,
    y1 = 0.3,
    y2=0.22, 
  )

arrows
## # A tibble: 1 × 4
##      x1    x2    y1    y2
##   <dbl> <dbl> <dbl> <dbl>
## 1    83  78.5   0.3  0.22
plot<-BlandAltmanLeh::bland.altman.plot(data$measurement_2, data$measurement_1,graph.sys = "ggplot2", geom_count=FALSE,
                  main="Das ist ein Bland-Altman Plot",
                  sub="Die äusseren gestrichelten Linien zeigen die Limits of Agreement an und werden wie folgt berechnet: 1.96 x die Standardabweichung der Differenzen",
                  xlab="Durschnitt von Messung 1 und Messung 2",
                  ylab="Differences:  Messung 2 -  Messung 1")+
  geom_point(colour="#AA00E5", size=4)+
  theme_classic()+
  annotate("text", x = 88, y = -0.05,colour="#A30026", label = "Systematischer Fehler (Bias): Differenz zwischen beiden Messungen ")+
  annotate("text", x = 88, y = 0.45,colour="red", label = "Bias + 1.96 * Standardabweichung der Differenzen")+
  annotate("text", x = 88, y = -0.45,colour="red", label = "Bias - 1.96 * Standardabweichung der Differenzen")+
  annotate("text", x = 95, y = 0.30,colour="gray20", label = "Differenz der Messungen mit zwei Methoden")+
    geom_curve(
    data = arrows, aes(x = x1, y = y1, xend = x2, yend = y2),
    arrow = arrow(length = unit(0.08, "inch")), size = 0.5,
    color = "gray20", curvature = 0.3)+

  labs(x="(Messung 1 + Messung 2)/2", y="Differenz Messung 2 - Messung 1")
## Warning: Using `size` aesthetic for lines was deprecated in ggplot2 3.4.0.
## ℹ Please use `linewidth` instead.
q <- ggplot_build(plot)
q$data[[2]][2,]$colour <- "#A30026"
q$data[[2]][2,]$linetype <- 4
q$data[[2]][c(1,3),]$colour <- "red"
q <- ggplot_gtable(q)
plot(q)
Bland-Altman Plot mit Erklärungen in der Graphik.

Abbildung 5.5: Bland-Altman Plot mit Erklärungen in der Graphik.

sd_diff
## [1] 0.2263233
(1.96*sd_diff)/2.77
## [1] 0.1601421
SEM
## [1] 0.1600347
BlandAltmanLeh::bland.altman.stats(data$measurement_2, data$measurement_1)
## $means
##  [1]  65.35  59.00  78.10  89.45 105.00  57.85  73.60  93.10  66.50  69.90
## 
## $diffs
##  [1]  0.1 -0.2  0.2 -0.3 -0.4  0.1  0.0 -0.2  0.2  0.2
## 
## $groups
##    group1 group2
## 1    65.4   65.3
## 2    58.9   59.1
## 3    78.2   78.0
## 4    89.3   89.6
## 5   104.8  105.2
## 6    57.9   57.8
## 7    73.6   73.6
## 8    93.0   93.2
## 9    66.6   66.4
## 10   70.0   69.8
## 
## $based.on
## [1] 10
## 
## $lower.limit
## [1] -0.4735936
## 
## $mean.diffs
## [1] -0.03
## 
## $upper.limit
## [1] 0.4135936
## 
## $lines
## lower.limit  mean.diffs upper.limit 
##  -0.4735936  -0.0300000   0.4135936 
## 
## $CI.lines
## lower.limit.ci.lower lower.limit.ci.upper   mean.diff.ci.lower 
##           -0.7540159           -0.1931713           -0.1919019 
##   mean.diff.ci.upper upper.limit.ci.lower upper.limit.ci.upper 
##            0.1319019            0.1331713            0.6940159 
## 
## $two
## [1] 1.96
## 
## $critical.diff
## [1] 0.4435936

Hier unten sehen wir die Daten zur Graphik. Noch etwas interessantes: Wir Physiotherapeut:innen berechnen ja gerne den kleinsten entdeckbaren Unterschied (Smallest Detectable Change / Minimal Detectable Change) mit der Formel 1.96Wurzel(2)SEM. In unserem Beispiel sieht das ja so aus:

\[\begin{equation} 1.96 \cdot \sqrt{2} \cdot SEM = 2.771859 \cdot 0.1600347 = 0.4435937 (\#eq:SEM_1) \end{equation}\]

Wir sehen nun, dass dieses SEM ist die Distanz vom Bias (Differenz zwischen den Methoden) und einer Limit of Agreement (diese Distanz sieht man hier unten als $critical.diff)

  • Wir lernen also: Standard Error of Measurement ist die halbe Distanz zwischen beiden Limits of Agreement, oder anders ausgedrückt, die Distanz zwischen Bias und einer Limite of Agreement.
BlandAltmanLeh::bland.altman.stats(data$measurement_2, data$measurement_1)
## $means
##  [1]  65.35  59.00  78.10  89.45 105.00  57.85  73.60  93.10  66.50  69.90
## 
## $diffs
##  [1]  0.1 -0.2  0.2 -0.3 -0.4  0.1  0.0 -0.2  0.2  0.2
## 
## $groups
##    group1 group2
## 1    65.4   65.3
## 2    58.9   59.1
## 3    78.2   78.0
## 4    89.3   89.6
## 5   104.8  105.2
## 6    57.9   57.8
## 7    73.6   73.6
## 8    93.0   93.2
## 9    66.6   66.4
## 10   70.0   69.8
## 
## $based.on
## [1] 10
## 
## $lower.limit
## [1] -0.4735936
## 
## $mean.diffs
## [1] -0.03
## 
## $upper.limit
## [1] 0.4135936
## 
## $lines
## lower.limit  mean.diffs upper.limit 
##  -0.4735936  -0.0300000   0.4135936 
## 
## $CI.lines
## lower.limit.ci.lower lower.limit.ci.upper   mean.diff.ci.lower 
##           -0.7540159           -0.1931713           -0.1919019 
##   mean.diff.ci.upper upper.limit.ci.lower upper.limit.ci.upper 
##            0.1319019            0.1331713            0.6940159 
## 
## $two
## [1] 1.96
## 
## $critical.diff
## [1] 0.4435936

37.2 Beispiel aus der Literatur

data<-rio::import("https://ndownloader.figstatic.com/files/28201834", format="csv") 

Wir benutzen die frei erhältlicen Daten des folgenden Artikels Bai, Y., Tompkins, C., Gell, N., Dione, D., Zhang, T., & Byun, W. (2021). Comprehensive comparison of Apple Watch and Fitbit monitors in a free-living setting. PLoS One, 16(5), e0251975..

Wir schauen die Messung der Anzahl Schritte an, gemessen mit einer Apple Watch und einem anderen Messinstrument.

plot <- bland.altman.plot(data$Apple_step, data$AGHIP_step, graph.sys = "ggplot2")+
 xlab("Mittelwert der Messungen") + 
  ylab("Mittelwertdifferenz") +
        ggtitle("Bland-Altman-Plot")+
        theme_classic()+
        theme(plot.title=element_text(hjust = 0.5))

plot
Bland-Altman Plot. Differenz zwischen zwei Messmethoden über die Mittelwerte beider Messmethoden.

Abbildung 22.1: Bland-Altman Plot. Differenz zwischen zwei Messmethoden über die Mittelwerte beider Messmethoden.

Wir sind hier nicht sicher, ob es einen Trend des systematischen Fehlers über den Bereich der Mittelwerte gibt. Ein Trend bedeutet, dass die Differenz zwischen den beiden Messungen vom Wert der Messung abhängt. Zum Beispiel, wenn grössere Werte in der Messung auch grössere Differenzen zwischen den Messmethoden aufweisen.

Damit wir dies besser analysieren können, benutzen wir ein anderes Paket, das MethComp Paket von Professor Carstensen.

Wir müssen folgende Schritte durchführen:

    1. Daten in das Long Format transforieren
    1. Tibble in data frame umwandeln
    1. Transformation der Daten in ein Format, das MethComp benutzen kann (meth=die Variable, die den Namen der Methode enthält, item = die Variable, die die Identifikation der Teilnehmenden enthält, rep = die Variable mit dem Index für die Wiederholungsnummer, y = die Werte der Messungen).
data<-data %>% 
  mutate(id=row_number())

df.tmp<-data[,c("id", "Apple_step", "AGHIP_step")]


df.tmp<-data.frame(df.tmp %>%  # das data.frame ist für Schritt 2
  pivot_longer(cols=-id) %>%  # pivot_longer ist für Schritt 1
  group_by(id) %>% 
  mutate(rep=row_number()))

df<-MethComp::Meth(df.tmp, meth="name",item="id", rep="rep", y="value" ) # Schritt 3
## The following variables from the dataframe
## "df.tmp" are used as the Meth variables:
## meth: name 
## item: id 
## repl: rep 
##    y: value 
##              #Replicates
## Method                1 #Items #Obs: 96 Values:  min     med   max
##   AGHIP_step         48     48       48         1111 10459.0 28439
##   Apple_step         48     48       48         2872 11250.5 29705

37.2.1 Bland-Altman Plot ohne Trend

BA.plot(df)
## Warning in reshapeWide(data, idvar = idvar, timevar = timevar, varying =
## varying, : some constant variables (repl) are really varying

## Warning in reshapeWide(data, idvar = idvar, timevar = timevar, varying =
## varying, : some constant variables (repl) are really varying
Bland-Altman Plot. Differenz zwischen zwei Messmethoden über die Mittelwerte beider Messmethoden. In diesem Beispiel gibt es keinen Trend der Differenz über den Mittelwert der Messungen.

Abbildung 1.3: Bland-Altman Plot. Differenz zwischen zwei Messmethoden über die Mittelwerte beider Messmethoden. In diesem Beispiel gibt es keinen Trend der Differenz über den Mittelwert der Messungen.

37.3 Bland-Altman mit Trend und variierender Varianz

Jetzt können wir den Bland-Altman Plot mit einer Trendlinie und mit nicht-homogener Varianz abbilden. Somit ist der systematische Fehler (Bias) nicht konstant und auch die Limits of Agreement sind nicht konstant.

In diesem Beispiel ist der Trend nicht stark.

BA.plot(df, pl.type="BA", model=NULL, sd.type="lin", dif.type="lin", meth.names = methm, repl.conn=TRUE)
## Warning in reshapeWide(data, idvar = idvar, timevar = timevar, varying =
## varying, : some constant variables (repl) are really varying

## Warning in reshapeWide(data, idvar = idvar, timevar = timevar, varying =
## varying, : some constant variables (repl) are really varying

## Warning in reshapeWide(data, idvar = idvar, timevar = timevar, varying =
## varying, : some constant variables (repl) are really varying
Bland-Altman Plot mit Trend und nicht-homogener Varianz.

Abbildung 21.6: Bland-Altman Plot mit Trend und nicht-homogener Varianz.

Schauen wir uns ein zweites Beispiel an.

df.tmp<-data[,c("id", "Apple_step", "Charge2_step")]


df.tmp<-data.frame(df.tmp %>%  # das data.frame ist für Schritt 2
  pivot_longer(cols=-id) %>%  # pivot_longer ist für Schritt 1
  group_by(id) %>% 
  mutate(rep=row_number()))

df<-MethComp::Meth(df.tmp, meth="name",item="id", rep="rep", y="value" ) # Schritt 3
## The following variables from the dataframe
## "df.tmp" are used as the Meth variables:
## meth: name 
## item: id 
## repl: rep 
##    y: value 
##                #Replicates
## Method                  1 #Items #Obs: 96 Values:  min     med   max
##   Apple_step           48     48       48         2872 11250.5 29705
##   Charge2_step         48     48       48         2709 11123.0 31252

37.3.1 Bland-Altman Plot ohne Trend

BA.plot(df)
## Warning in reshapeWide(data, idvar = idvar, timevar = timevar, varying =
## varying, : some constant variables (repl) are really varying

## Warning in reshapeWide(data, idvar = idvar, timevar = timevar, varying =
## varying, : some constant variables (repl) are really varying
Bland-Altman Plot. Differenz zwischen zwei Messmethoden über die Mittelwerte beider Messmethoden.

Abbildung 37.1: Bland-Altman Plot. Differenz zwischen zwei Messmethoden über die Mittelwerte beider Messmethoden.

Wir können nun wieder den Bland-Altman mit Trend anschauen und auch die Formeln für die Limits of Agreements und den systematischen Fehler anzeigen lassen.

BA.plot(df, pl.type="BA", model=NULL, sd.type="lin", dif.type="lin", meth.names = methm, repl.conn=TRUE, eqn=TRUE)
## Warning in reshapeWide(data, idvar = idvar, timevar = timevar, varying =
## varying, : some constant variables (repl) are really varying
## Relationships between methods:
##  Apple_step-Charge2_step = 180.37-0.03(Apple_step+Charge2_step)/2 (602.17+0.03Avg.) 
##  Apple_step = 177.60+0.97Charge2_step (605.86+0.03Charge2_step) 
##  Charge2_step = -183.24+1.03Apple_step (-598.39-0.03Apple_step)
## Warning in reshapeWide(data, idvar = idvar, timevar = timevar, varying =
## varying, : some constant variables (repl) are really varying

## Warning in reshapeWide(data, idvar = idvar, timevar = timevar, varying =
## varying, : some constant variables (repl) are really varying
Bland-Altman Plot mit Trend und nicht-homogener Varianz.

Abbildung 22.3: Bland-Altman Plot mit Trend und nicht-homogener Varianz.

37.4 Bland-Altman mit wiederholten Messungen

Wenn wir pro Messmethode mehr als eine Messung pro Patient haben, müssen wir diese Abhängigkeit der Daten berücksichtigen. Mit dem Paket MethComp können wir dies tun.

Wir schauen uns ein Beispiel an, in dem zwei Methoden getestet wurden, um die Sprunghöhe zu quantifizieren. Die Daten sind aus der Publikation Rogan, S., Radlinger, L., Imhasly, C., Kneubuehler, A., & Hilfiker, R. (2015). Validity study of a jump mat compared to the reference standard force plate. Asian Journal of Sports Medicine, 6(4). Rogan et al. (2015).

data<-rio::import("BlandAltmanReshapedLong.dta")

Im nächsten Schritt bereiten wir die Daten für das MethComp Paket vor.

df<-Meth(data=data, meth="meth", item="ID",repl="i", y="cmmethod")
## The following variables from the dataframe
## "data" are used as the Meth variables:
## meth: meth 
## item: ID 
## repl: i 
##    y: cmmethod 
##        #Replicates
## Method         15 #Items #Obs: 300 Values:  min   med   max
##      1         10     10       150         3.59 16.83 23.74
##      2         10     10       150         5.31 18.55 25.30

Bland Altman Plot mit Trend und Verbindung der Punkte, die zu einer Person gehören. Wir sehen, dass es einen Trend des Bias gibt, d.h. die Differenz zwischen den beiden Messmethoden ändert sich je nach Mittelwert der beiden Methoden. Man könnte jetzt diese Abbildung veröffentlichen. Die Autoren der Studie haben jedoch die Daten transformiert (logarithmiert) und die Graphik so präsentiert.

BA.plot( df, pl.type="BA", model=NULL, sd.type="lin",dif.type="lin", meth.names=methm, repl.conn=TRUE, diflim=c(-4,0.5), eqn=TRUE)
## Relationships between methods:
##  1-2 = -1.84+0.02(1+2)/2 (0.42+0.00Avg.) 
##  1 = -1.85+1.022 (0.42+0.002) 
##  2 = 1.82+0.981 (-0.42-0.001)
## Warning in reshapeWide(data, idvar = idvar, timevar = timevar, varying =
## varying, : some constant variables (methods,method) are really varying

## Warning in reshapeWide(data, idvar = idvar, timevar = timevar, varying =
## varying, : some constant variables (methods,method) are really varying
Bland-Altman Plot. Differenz zwischen zwei Messmethoden über die Mittelwerte beider Messmethoden.

Abbildung 11.1: Bland-Altman Plot. Differenz zwischen zwei Messmethoden über die Mittelwerte beider Messmethoden.

Bland-Altman Plot mit transformierten Daten.

Zuerst die Logarithmierung.

df<-df %>% 
  mutate(y=log(y))

Plot:

BA.plot( df, pl.type="BA", model=NULL, sd.type="const",dif.type="const", meth.names=methm, repl.conn=TRUE, diflim=c(-0.5,0.1), eqn=TRUE)
## Relationships between methods:
##  1-2 = -0.11 (0.06) 
##  1 = -0.11+2 (0.06) 
##  2 = 0.11+1 (0.06)
## Warning in reshapeWide(data, idvar = idvar, timevar = timevar, varying =
## varying, : some constant variables (methods,method) are really varying

## Warning in reshapeWide(data, idvar = idvar, timevar = timevar, varying =
## varying, : some constant variables (methods,method) are really varying
Bland-Altman Plot. Differenz zwischen zwei Messmethoden über die Mittelwerte beider Messmethoden.

Abbildung 11.2: Bland-Altman Plot. Differenz zwischen zwei Messmethoden über die Mittelwerte beider Messmethoden.

Das Logarithmieren hat hier nichts geholfen. Wir haben ja auch einfach auf gut Glück logarithmiert, was eine schlechte Idee war. Wir können jedoch den Befehl gladder benutzen, um die verschiedenen Transformationen anzuschauen und danach eine bessere Wahl zu treffen.

df<-df %>% 
  mutate(y=exp(y))

describedata::gladder(df$y)
## Warning: The dot-dot notation (`..density..`) was deprecated in ggplot2 3.4.0.
## ℹ Please use `after_stat(density)` instead.
## ℹ The deprecated feature was likely used in the describedata package.
##   Please report the issue to the authors.
Verteilungen mit verschiedenen Transformationen der Daten

Abbildung 11.3: Verteilungen mit verschiedenen Transformationen der Daten

df<-df %>% 
  mutate(y=y^2)

https://analyse-it.com/docs/tutorials/bland-altman/estimating-loa-tranformed

Wir sehen, dass das Quadrieren der Daten nun zu einer Verteilung führt, die näher an der Normalverteilung ist. Leider löst dies unser Problem mit dem Bland-Altman Plot nicht. Warum nicht?

BA.plot( df, pl.type="BA", model=NULL, sd.type="lin",dif.type="lin", meth.names=methm, repl.conn=TRUE,  eqn=TRUE)
## Relationships between methods:
##  1-2 = -25.13-0.09(1+2)/2 (8.86+0.03Avg.) 
##  1 = -24.09+0.922 (8.31+0.022) 
##  2 = 26.26+1.091 (-9.48-0.031)
## Warning in reshapeWide(data, idvar = idvar, timevar = timevar, varying =
## varying, : some constant variables (methods,method) are really varying

## Warning in reshapeWide(data, idvar = idvar, timevar = timevar, varying =
## varying, : some constant variables (methods,method) are really varying
Bland-Altman Plot. Differenz zwischen zwei Messmethoden über die Mittelwerte beider Messmethoden.

Abbildung 11.4: Bland-Altman Plot. Differenz zwischen zwei Messmethoden über die Mittelwerte beider Messmethoden.

  • Das Logarithmieren macht, dass die Differenz annähernd einer prozentualen Differenz des Mittelwertes entspricht. Das hat nicht gehlfen, da in den Daten die Differenz der Messungen beider Methoden nicht prozentual zum Mittelwert war. Deswegen gab es mit den logarithmierten Werten immer noch einen Trend.
  • Das Quadrieren macht zwar die Daten annähernd normalverteilt (was gut ist für den Bland-Altman Plot), aber es korrigiert leider nicht den Trend der Mittelwertsdifferenz.

Hier bleibt uns nichts anderes übrig, als den Bland-Altman Plot in einer modifizierten Version zu benutzen und den Trend und die nicht-homogene Varianz zu modelieren.

37.5 Beispiel bei dem das Logarithmieren der Daten den Trend korrigiert.

Wir benutzen Daten zweier Kraftmessplatten, mit denen die Sprungkraft von 15 Teilnehmenden gemessen wurde. Zuerst müssen wir die Daten wieder für das Paket MethComp vorbereiten. Zur Erinnerung: wir müssen die Daten explizit in ein data.frame Format umwandeln (da wir mit dplyr arbeiten, sind die Daten ein tibble). Das machen wir mit dem Befehl data.frame(…).

data<-rio::import("nm.csv") %>% 
  group_by(ID) %>% 
  mutate(rep=row_number()) %>% 
  dplyr::select(-id)

data_long<-data.frame(data %>% 
  pivot_longer(cols=-c("rep", "ID"), 
               values_to="nm", 
               names_to="method"))


df<-Meth(data=data_long, meth="method", item="ID",repl="rep", y="nm") 
## The following variables from the dataframe
## "data_long" are used as the Meth variables:
## meth: method 
## item: ID 
## repl: rep 
##    y: nm 
##        #Replicates
## Method         15 #Items #Obs: 300 Values:  min   med max
##    kmp         10     10       150          153 198.5 309
##    nm          10     10       150          141 182.0 283

Jetzt zuerst der Bland-Altman Plot ohne Transformation der Werte:

BA.plot( df, pl.type="BA", model=NULL, sd.type="lin",dif.type="lin", meth.names=methm, repl.conn=TRUE,  eqn=TRUE)
Bland-Altman Plot. Differenz zwischen zwei Messmethoden über die Mittelwerte beider Messmethoden.

Abbildung 1.11: Bland-Altman Plot. Differenz zwischen zwei Messmethoden über die Mittelwerte beider Messmethoden.

## Relationships between methods:
##  kmp-nm = 1.63+0.09(kmp+nm)/2 (0.30+0.03Avg.) 
##  kmp = 1.70+1.09nm (0.35+0.03nm) 
##  nm = -1.56+0.91kmp (-0.26-0.03kmp)

Nun logarithmieren wir die Werte.

df<-df %>% 
  mutate(y=log(y))

Und jetzt der Bland-Altman Plot mit den transformierten Werten,

BA.plot( df, pl.type="BA", model=NULL, sd.type="lin",dif.type="lin", meth.names=methm, repl.conn=TRUE,  eqn=TRUE)
Bland-Altman Plot. Differenz zwischen zwei Messmethoden über die Mittelwerte beider Messmethoden.

Abbildung 1.13: Bland-Altman Plot. Differenz zwischen zwei Messmethoden über die Mittelwerte beider Messmethoden.

## Relationships between methods:
##  kmp-nm = 0.13-0.01(kmp+nm)/2 (0.02+0.00Avg.) 
##  kmp = 0.13+0.99nm (0.02+0.00nm) 
##  nm = -0.13+1.01kmp (-0.02-0.00kmp)

Der Trend ist jetzt so gering, dass wir mit guten Gewissen den normalen Bland-Altman Plot (ohne Modelierung des Trends und der inhomogenen Varianz) darstellen können:

BA.plot( df, pl.type="BA", dif.type = "const", sd.type="const", model=NULL, meth.names=methm, repl.conn=TRUE,  eqn=FALSE, diflim=c(-0.2,0.2))
Bland-Altman Plot. Differenz zwischen zwei Messmethoden über die Mittelwerte beider Messmethoden.

Abbildung 4.8: Bland-Altman Plot. Differenz zwischen zwei Messmethoden über die Mittelwerte beider Messmethoden.

37.6 Referenzen

Aebischer B et al. (2015) German Translation and Cross-Cultural Adaptation of the STarT Back Screening Tool. PLoS One 10, e0132068.
Gils MJ van et al. (2022) Antibody Responses Against SARS-CoV-2 Variants Induced by Four Different SARS-CoV-2 Vaccines in Health Care Workers in the Netherlands: A Prospective Cohort Study. PLoS medicine 19, e1003991.
Reverberi R (2008) The Statistical Analysis of Immunohaematological Data. Blood Transfusion 6, 37.
Rogan S et al. (2015) Validity Study of a Jump Mat Compared to the Reference Standard Force Plate. Asian J Sports Med 6, e25561.