Kapitel 75 Simulieren von Daten

Daten simulieren kann sehr hilfreich sein, um wichtige Aspekte der Statistik zu verstehen. Simulieren kann auch helfen, für komplexere Analysen die Stichprobengrösse zu bestimmen. Eigentlich sollte man vor jedem Projekt alle Daten simulieren und die geplanten Analysen programmieren und laufen lassen. So kann erkannt werden, ob man die benötigten Variablen auch wirklich alle im gewünschten Format geplant hat, so dass alle Hypothesen wie geplant analysiert werden können. Mir ist es mehr als einmal passiert, dass ich eine Hypothese nicht korrekt beantworten konnte, weil eine Variable fehlte oder falsch kodiert war.

75.0.1 Pakete für dieses Kapitel

Wir benötigen folgende Pakete:

library(tidyverse)
library(ggplot2)
library(BlandAltmanLeh)
library(emo) # nur für ein paar smileys

75.1 Beispiel Bland-Altman Plot

Etwas Lustiges ist mir bei der Simulation der Daten für die Bland-Altman Plots passiert. Wenn ich hier sage “etwas Lustiges”, dann meine ich meistens, dass es etwas war, das ich nicht vestanden habe. 😄

Schauen wir uns das einmal an.

Ich wollte ein Beispiel simulieren, bei dem ein systematischer Fehler zwischen zwei Messmethoden vorhanden war.

  • Ich simulierte die Werte der Messungen mit der Methode 1
  • Ich nahm diese Werte der Methode 1 und fügte einen zufälligen Fehler plus einen systematischen Fehler hinzu. Das definierte ich als die Werte der Messungen mit methode 2
set.seed(123445)
Methode_1<-rnorm(5000, 50, 12)
Methode_2<-Methode_1+rnorm(5000, 10,10)

cor.test(Methode_1, Methode_2)
## 
##  Pearson's product-moment correlation
## 
## data:  Methode_1 and Methode_2
## t = 85.28, df = 4998, p-value < 2.2e-16
## alternative hypothesis: true correlation is not equal to 0
## 95 percent confidence interval:
##  0.7583268 0.7809178
## sample estimates:
##       cor 
## 0.7698634
psych::describe(Methode_1)
##    vars    n  mean    sd median trimmed   mad  min   max range skew kurtosis
## X1    1 5000 49.92 12.13   49.8   49.85 12.11 8.61 95.14 86.52 0.06     0.02
##      se
## X1 0.17
psych::describe(Methode_2)
##    vars    n  mean   sd median trimmed   mad min    max  range skew kurtosis
## X1    1 5000 59.92 15.9  59.84   59.91 15.94 0.6 125.73 125.12    0    -0.06
##      se
## X1 0.22

So, die Daten wären simuliert und jetzt schauen wir uns den Bland-Altman Plot an. Ich habe die Daten so simuliert, dass es einen systematischen Fehler von -10 gibt. Schauen wir uns den Bland-Altman Plot an:

bland.altman.plot(Methode_1, Methode_2,  xlab="(Methode 1 + Methode 2) / 2 ", ylab="Differenzen Methode 1 - Methode 2")
Bland-Altman Plot der Messungen mit Methode 1 und Methode 2. Die Differenz zeigt einen leichten Trend über die Mittelwerte beider Methoden.

(#fig:bland_altman1)Bland-Altman Plot der Messungen mit Methode 1 und Methode 2. Die Differenz zeigt einen leichten Trend über die Mittelwerte beider Methoden.

Ok, das stimmt. Aber ich wollte nicht, dass es in den Daten einen Trend gibt. Sie sehen, dass die Punktewolke nach unten driftet. Das sollte nicht so sein.

An was das wohl liegen könnte?

Wir speichern den simulierten systematischen und zufälligen Fehler in ein Objekt Abweichungen und plotten diese Werte gegenüber den Werten von Methode 1:

set.seed(123445)
Methode_1<-rnorm(5000, 50, 12)
Abweichung<-rnorm(5000, 10,10)
Methode_2<-Methode_1+Abweichung
plot(Methode_1, Abweichung)
Streudiagramm der Abweichungen über die Methode 1. Wir sehen keinen Zusammenhang zwischen der Methode 1 und der Abweichung.

Abbildung 75.1: Streudiagramm der Abweichungen über die Methode 1. Wir sehen keinen Zusammenhang zwischen der Methode 1 und der Abweichung.

Wir tun das Gleiche für die Methode 2:

plot(Methode_2, Abweichung)
Streudiagramm der Abweichungen über die Messungen der Methode 2. Es gibt natürlich einen Zusammenhang zwischen den Abweichungen und der Messungen der Methode 2, da ja die Abweichung Bestandteil der Methode 2 ist.

Abbildung 75.2: Streudiagramm der Abweichungen über die Messungen der Methode 2. Es gibt natürlich einen Zusammenhang zwischen den Abweichungen und der Messungen der Methode 2, da ja die Abweichung Bestandteil der Methode 2 ist.

Erstellen wir uns ein Dataframe, damit wir die Daten besser anschauen können. Da ja die Daten der Methode 2 aus den Daten der Methode 1 plus der Abweichung erstellt wurde, sehen wir, dass eine hohe Abweichung tendenziell eben auch zu einem hohen Wert in der Methode 2 führt.

data<-data.frame(Methode_1, Methode_2, Abweichung) %>% 
  arrange(desc(Methode_2))

DT::datatable(data)

Wir schauen uns nun die Differenzen zwischen beiden Methoden und den Zusammenhang mit den Methoden an.

Differenz <- Methode_1 - Methode_2
plot(Methode_1, Differenz)
Streudiagramm der Differenzen über die Messungen mit Methode 1. Wir sehen keinen Zusammenhang zwischen den Messungen mit Methode 1 und den Differenzen.

Abbildung 75.3: Streudiagramm der Differenzen über die Messungen mit Methode 1. Wir sehen keinen Zusammenhang zwischen den Messungen mit Methode 1 und den Differenzen.

plot(Methode_2, Differenz)
Streudiagramm der Differenzen über die Messungen mit Methode 2. Wir sehen einen Zusammenhang zwischen den Messungen mit Methode 2 und den Differenzen.

Abbildung 75.4: Streudiagramm der Differenzen über die Messungen mit Methode 2. Wir sehen einen Zusammenhang zwischen den Messungen mit Methode 2 und den Differenzen.

Somit wird natürlich auch die Differenz einen Zusammenhang mit dem Durchschnitt der Messungen 1 und 2 bestehen, was wir im folgenden Streudiagramm sehen. Dieses Streudiagramm ist übrigens identisch mit dem Bland-Altman Plot, es fehlen nur die Limits of Agreement und der Mittelwert der Differenzen.

Durchschnitt_M1_M2<-(Methode_1+Methode_2)/2
plot(Durchschnitt_M1_M2, Differenz)
Streudiagramm der Differenzen über den Durschnitt der Messungen mit Methode 1 und Methode 2. Wir sehen  einen Zusammenhang zwischen den Werten des Durchschnittes und der Differenz.

Abbildung 75.5: Streudiagramm der Differenzen über den Durschnitt der Messungen mit Methode 1 und Methode 2. Wir sehen einen Zusammenhang zwischen den Werten des Durchschnittes und der Differenz.

Zeigt die Abweichung einen Zusammenhang mit dem Durchschnitt?

plot(Durchschnitt_M1_M2, Abweichung)
Streudiagramm der Abweichungen über den Durchschnitten der Messungen mit Methode 1 und Methode 2. Es gibt einen Zusammenhang zwischen den Abweichungen und den Durchschnitten der beiden Messungen, da ja die Abweichung Bestandteil von der Methode 2 ist.

Abbildung 75.6: Streudiagramm der Abweichungen über den Durchschnitten der Messungen mit Methode 1 und Methode 2. Es gibt einen Zusammenhang zwischen den Abweichungen und den Durchschnitten der beiden Messungen, da ja die Abweichung Bestandteil von der Methode 2 ist.

Fassen wir zusammen:

  • Die Abweichung zeigt keinen Zusammenhang mit Methode 1.
  • Die Abweichung zeigt einen Zusammenhang mt Methode 2.
  • Die Abweichung zeigt einen Zusammenhang mit dem Durchschnitt beider Methoden.
  • Die Differenz beider Methoden zeigt einen Zusammenhang mit dem Durchschnitt der Methoden.

Die Frage ist nun: Ist das ein Problem meiner Simulation oder ein Problem des Bland-Altman Plots?

Nun, wir haben die Daten der Messungen mit der Methode 2 von den Werten der Methode 1 abgeleitet. Das entspricht nicht der Wirklichkeit, da die Methode 2 nicht von den Werten der Methode 1 abhängt. Der systematische und zufällige Fehler der Methode 2 ist in Bezug zur Wahrheit und nicht in Bezug zur Methode 1 - auch wenn wir die Wahrheit in der Praxis nicht kennen und nicht darstellen können.

Für uns bedeutet dies, dass wir die Daten anders simulieren müssen. Wir müssen bei Methoden von der Wahrheit ableiten, d.h. bei beiden Messungen einen zufälligen und (falls wir wollen) einen systematischen Fehler zur Warheit hinzufügen.

Wir werden jetzt die Daten anders simulieren:

  • Die Wahrheit erstellen
  • Für die Methode 1 simulieren wir eine zufällige Abweichung ohne systematischen Fehler von der Wahrheit
  • Für die Methode 2 simulieren wir einee zufällige Abweichung plus einen systematischen Fehler von der Wahrheit
Wahrheit<-rnorm(5000, 50, 10)
Methode_5<-Wahrheit+rnorm(5000,0, 10)
Methode_6<-Wahrheit+rnorm(5000,10,10)
bland.altman.plot(Methode_5, Methode_6,  xlab="(Methode 5 + Methode 6) / 2 ", ylab="Differenzen Methode 5 - Methode 6")
Bland-Altman Plot der Messungen mit der Methode 5 und Methode 6. Die Daten wurden hier anders als zuvor simuliert: Es wurde zuerste eine Wahrheit simuliert und danach die Messungen 5 und die Messungen 6 davon abgeleitet.

(#fig:bland_altman2)Bland-Altman Plot der Messungen mit der Methode 5 und Methode 6. Die Daten wurden hier anders als zuvor simuliert: Es wurde zuerste eine Wahrheit simuliert und danach die Messungen 5 und die Messungen 6 davon abgeleitet.

Nun sehen wir, dass es keinen Trend mehr gibt.