Kapitel 36 ICC Beispiel Seite 106 COSMIN Buch

Wir werden hier im Kapitel 5 Reliabilität die Beispiele ab Seite 106 nachrechnen. Die Daten haben haben wir mit dem Programm Webplotdigitizer extrahiert. Deswegen haben wir nicht exakt die gleichen Daten wie im Buch. Aus Urheberrechtlichen Gründen können wir natürlich das Kapitel des Buches hier auch nicht abbilden. Mit einem Konto der HES-SO Valais-Wallis haben Sie jedoch gratis Zugang zu diesem Buch und Kapitel. Klicken Sie hier um zum Kapitel zu gelangen

# load packages ####
library(psych)
library(irr)
library(tidyverse)
library(janitor)
library(BlandAltmanLeh)
data<-rio::import("http://www.pt-wissen.ch/Statistik_BSc_Physiotherapie_Leukerbad/Cosmin_Beispiel_Mary_and_Peter_vorbereitet.csv", encoding="UTF-8")
head(data)
##   Mean_Score_M_P Difference_Scores_M_minus_P     Mary    Peter
## 1       17.07444                  -13.966817 10.09103 24.05785
## 2       31.93380                   -5.897436 28.98508 34.88251
## 3       28.92141                    2.096531 29.96968 27.87315
## 4       29.39883                   21.025641 39.91165 18.88601
## 5       41.94620                   -1.900452 40.99597 42.89643
## 6       48.37391                  -12.911011 41.91840 54.82941
data<-data %>% 
  mutate(id=row_number()) %>% 
  select(id, Mary, Peter)
head(data)
##   id     Mary    Peter
## 1  1 10.09103 24.05785
## 2  2 28.98508 34.88251
## 3  3 29.96968 27.87315
## 4  4 39.91165 18.88601
## 5  5 40.99597 42.89643
## 6  6 41.91840 54.82941

36.1 Reproduktion Tabelle 5.2 Seite 106 Cosmin Buch

Zuerst berechnen wir die Varianzkomponenten mit dem Paket psych und dem Befehl ICC.

out<-psych::ICC(data[c("Mary", "Peter")])
out
## Call: psych::ICC(x = data[c("Mary", "Peter")])
## 
## Intraclass correlation coefficients 
##                          type  ICC   F df1 df2       p lower bound upper bound
## Single_raters_absolute   ICC1 0.76 7.4  49  50 2.9e-11        0.62        0.86
## Single_random_raters     ICC2 0.77 9.7  49  49 2.3e-13        0.53        0.88
## Single_fixed_raters      ICC3 0.81 9.7  49  49 2.3e-13        0.69        0.89
## Average_raters_absolute ICC1k 0.86 7.4  49  50 2.9e-11        0.76        0.92
## Average_random_raters   ICC2k 0.87 9.7  49  49 2.3e-13        0.69        0.94
## Average_fixed_raters    ICC3k 0.90 9.7  49  49 2.3e-13        0.82        0.94
## 
##  Number of subjects = 50     Number of Judges =  2
## See the help file for a discussion of the other 4 McGraw and Wong estimates,
out$stats
##           subjects       Judges   Residual
## df    4.900000e+01 1.000000e+00   49.00000
## SumSq 2.599615e+04 8.923263e+02 2691.08189
## MS    5.305336e+02 8.923263e+02   54.92004
## F     9.660110e+00 1.624774e+01         NA
## p     2.300150e-13 1.935028e-04         NA
out$MSW
## [1] 71.66816
numberOfPatients=nrow(data)
numberOfRaters=2

Wir extrahieren die Komponenten.

varBetweenPatients<-out$stats[3,1]
varResidual<-out$stats[3,3]
varTrueBetweenPatients<-(varBetweenPatients-varResidual)/numberOfRaters
varBetweenRaters<-out$stats[3,2]
varTrueBetweenRaters<-(varBetweenRaters-varResidual)/numberOfPatients

Hier die Zahlen, die der Tabelle im Buch entsprechen:

# Tabelle Output 5.2 Seite 106 
(Var_p = varTrueBetweenPatients)
## [1] 237.8068
(Var_o = varTrueBetweenRaters)
## [1] 16.74812
(var_residual = varResidual)
## [1] 54.92004
(var_total = Var_p+Var_o+var_residual)
## [1] 309.475

Vergleichen wir unsere Resultate mit den Resultaten im Buch. Die Zahlen sind nicht exakt gleich, weil wir nicht die originalen Daten haben, sondern die Daten aus einer Graphik extrahiert haben.

Tabelle mit dem Vergleich der Werte aus dem Buch und unseren Werten

36.2 Im Buch werden zwei ICCs beschrieben:

    1. ICC agreement
    1. ICC consistency

36.2.1 Erklärung

Wir sehen im Scatterplot als auch im Bland Altman Plot, dass es einen systematischen Fehler zwischen den Messungen von Peter und Mary gibt.

plot(data$Peter, data$Mary, xlim=c(0,100), ylim=c(0,100))
abline(lm(data$Mary~data$Peter), col="red")

BlandAltmanLeh::bland.altman.plot(data$Peter, data$Mary)

## NULL

Ein Korrelationskoeffizient berücksichtigt diesen systematischen Fehler nicht:

cor(data$Mary, data$Peter, method="pearson")
## [1] 0.8156364

Die ICC consistency Formel, berücksichtig diesen systematischen Fehler auch nicht. Im Packet psych mit dem Befehl ICC, wäre dies die dritte Zeile

psych::ICC(data[c("Mary", "Peter")])
## Call: psych::ICC(x = data[c("Mary", "Peter")])
## 
## Intraclass correlation coefficients 
##                          type  ICC   F df1 df2       p lower bound upper bound
## Single_raters_absolute   ICC1 0.76 7.4  49  50 2.9e-11        0.62        0.86
## Single_random_raters     ICC2 0.77 9.7  49  49 2.3e-13        0.53        0.88
## Single_fixed_raters      ICC3 0.81 9.7  49  49 2.3e-13        0.69        0.89
## Average_raters_absolute ICC1k 0.86 7.4  49  50 2.9e-11        0.76        0.92
## Average_random_raters   ICC2k 0.87 9.7  49  49 2.3e-13        0.69        0.94
## Average_fixed_raters    ICC3k 0.90 9.7  49  49 2.3e-13        0.82        0.94
## 
##  Number of subjects = 50     Number of Judges =  2
## See the help file for a discussion of the other 4 McGraw and Wong estimates,

Im Packet irr mit dem Befehl icc wäre dies folgender Befehl:

irr::icc(data[c("Mary", "Peter")], model="twoway", type="consistency")
##  Single Score Intraclass Correlation
## 
##    Model: twoway 
##    Type : consistency 
## 
##    Subjects = 50 
##      Raters = 2 
##    ICC(C,1) = 0.812
## 
##  F-Test, H0: r0 = 0 ; H1: r0 > 0 
##    F(49,49) = 9.66 , p = 2.3e-13 
## 
##  95%-Confidence Interval for ICC Population Values:
##   0.691 < ICC < 0.889

Möchten wir nun den systematischen Fehler berücksichtigen (was wir wohl tun sollten), so entspricht dies der zweiten Zeile im Befehl psych::ICC:

psych::ICC(data[c("Mary", "Peter")])
## Call: psych::ICC(x = data[c("Mary", "Peter")])
## 
## Intraclass correlation coefficients 
##                          type  ICC   F df1 df2       p lower bound upper bound
## Single_raters_absolute   ICC1 0.76 7.4  49  50 2.9e-11        0.62        0.86
## Single_random_raters     ICC2 0.77 9.7  49  49 2.3e-13        0.53        0.88
## Single_fixed_raters      ICC3 0.81 9.7  49  49 2.3e-13        0.69        0.89
## Average_raters_absolute ICC1k 0.86 7.4  49  50 2.9e-11        0.76        0.92
## Average_random_raters   ICC2k 0.87 9.7  49  49 2.3e-13        0.69        0.94
## Average_fixed_raters    ICC3k 0.90 9.7  49  49 2.3e-13        0.82        0.94
## 
##  Number of subjects = 50     Number of Judges =  2
## See the help file for a discussion of the other 4 McGraw and Wong estimates,

Benutzen wir den irr::icc Befehl, siehd dies wie folgt aus:

irr::icc(data[c("Mary", "Peter")], model="twoway", type="agreement")
##  Single Score Intraclass Correlation
## 
##    Model: twoway 
##    Type : agreement 
## 
##    Subjects = 50 
##      Raters = 2 
##    ICC(A,1) = 0.768
## 
##  F-Test, H0: r0 = 0 ; H1: r0 > 0 
##  F(49,16.1) = 9.66 , p = 5.65e-06 
## 
##  95%-Confidence Interval for ICC Population Values:
##   0.527 < ICC < 0.88

Wir sehen, dass die Reliabilität schlechter ist, wenn wir den systematischen Fehler benutzen - was ja korrekt ist, da der systematische Fehler ein Problem ist. Wenn wir ganz motiviert sind, können wir das auch manuell ausrechnen:

ICC_agreement<-varTrueBetweenPatients/(varTrueBetweenPatients+varTrueBetweenRaters+varResidual)
ICC_agreement
## [1] 0.7684202

36.3 Standardmessfehler für die consistency Situation

36.3.1 Variante 1:

SEM_consistency_v1<-sd(data$Mary-data$Peter)/2^0.5
SEM_consistency_v1
## [1] 7.41081

36.3.2 Variante 2:

SEM_consistency_v2 <- sqrt((sd(data$Mary)^2 + sd(data$Peter)^2)/2)*sqrt(1-0.812)
SEM_consistency_v2
## [1] 7.418395

36.4 Standardmessfehler mit Berücksichtigung systematischer Fehler

varError<-varTrueBetweenRaters+varResidual
SEMagreement<-sqrt(varError)
SEMagreement
## [1] 8.465705

Wir sehen, dass wir in etwa die gleichen Resultate erhalten wie im Buch präsentiert. Wie schon erwähnt, die Unterschiede sind nur darauf zurückzuführen, dass wir nicht die genauen Daten zur Verfügung haben, sondern die Daten aus einer Graphik mit dem Programm WebPlotDigitizer extrahiert haben.

Falls Sie sehen möchten, wie die Daten aus der Graphik extrapoliert wurden, finden Sie hier ein Video: