Kapitel 19 Standardfehler bei Differenzen oder Summen zweier Gruppen

Merkt euch diesen Satz des Pythagoras, ihr werdet ihn noch brauchen.
19.1 Standardabweichung der Differenz von zwei Stichproben (Gruppen)
In verschiedenen Situationen möchten wir die Standardabweichung oder den Standardfehler (für das Konfidenzintervall) der Differenz von zwei Gruppen berechnen.Zum Glück ist das relativ einfach, denn wir alle haben ja im Unterricht den Satz des Pythagoras gelernt.
Wenn wir zwei unabhängige Gruppen haben, die gleich gross sind, so ist der Standardfehler der Differenz ganz einfach zu berechnen: \(se~diff^{2}=se_1^{2} + se_2^{2}\).
\(Se^{2}\) ist die Varianz des Mittelwertes.Bei unabhängigen Gruppen können wir analog zum nicht-rechtwinkligen Dreieck vorgehen. Ist nämlich der Winkel zwischen a und b nicht rechtwinklig, gilt die Formel \(a^{2}+b^{2}=c^{2}\) nicht mehr, es muss der Kosinussatz benutzt werden, mit der Formel: \(a^{2}+b^{2} - 2ab * cos~Winkel~a~b\).
Wenn wir nicht unabhängige Gruppen haben, müssen wir die Korrelation zwischen diesen beiden Gruppen kennen, und dann analog zum Kosinussatz die Standardabweichung der Differenz berechnen.
\[SD~_{diff~t1t0}=\sqrt{SD_{t0}^{2}+SD_{t1}^{2} - (2*Corr_{t0t1}*SD_{t0}*SD_{t1})}\]
Zurück zum Beispiel mit unabhängigen Gruppen.
Wir simulieren Daten für zwei Gruppen.
- Gruppe 1 mit n = 100, Mittelwert = 50 und Standardabweichung = 20
- Gruppe 2 mit n = 100, Mittelwert = 40 und Standardabweichung = 20
set.seed(1234)
<-rnorm(100, 50,20)
Gruppe_1
<-rnorm(100, 40, 20) Gruppe_2
Nun berechnen wir die Differenz der Gruppen. Da die beiden Gruppen jedoch nicht die gleichen Personen beinhalten, können wir folgendes ja nicht tun. Wären in beiden Gruppen die selben Personen, könnten wir ja einfach von Person 1 den Wert 1 vom Wert 2 subtrahieren, etc. Aber hier macht das ja keinen Sinn, da wir ja keine Paare haben.
# Das macht keinen Sinn:
= Gruppe_1 - Gruppe_2 # ! Macht keinen Sinn!!!!
Differenz_1_minus_2 mean(Differenz_1_minus_2, na.rm=TRUE) # Macht keinen Sinn!!!!!
[1] 6.039902
sd(Differenz_1_minus_2, na.rm=TRUE) # Macht keinen Sinn!!!!
[1] 29.16759
Das einzige was wir tun können ist folgendes:
<-mean(Gruppe_1, na.rm=TRUE)-mean(Gruppe_2, na.rm=TRUE) diff_gr1_gr2
Wir können aber jetzt die Standardabweichung der Differenz nicht direkt aus der Differenz berechnen, da wir ja da nur einen Wert haben.
Die Berechnung der Standardabweichung ist nur mit folgender Formel möglich: Wir wissen dass die Varianz einer Summe oder einer Differenz die Summe Varianzen der beiden Gruppen sind (so lange die Gruppen unabhängig sind, sonst müssen wir für die Covarianz korrigieren). Die Varianz die hier gemeint ist, ist jedoch die Varianz der Mittelwerte, nicht die Varianz in der Stichprobe. Die Varianz eines Mittelwertes ist das Quadrat der Standardabweichung des Mittelwertes (und wir nennen ja die Standardabweichung der Stichprobenmittelwerte den Standardfehler). So können wir entweder den Standardfehler der beiden Gruppen quadrieren und zusammenzählen. Der Standardfehler des Mittelwertes einer Gruppe ist ja sigma (=Standardabweichung der Population) geteilt durch die Wurzel der Stichprobengrösse. Da wir die Populationsstandardabweichung nicht kennen, müssen wir als Ersatz die Standardabweichung der Stichprobe nehmen.
=sd(Gruppe_1)/length(Gruppe_1)^0.5
Standard_Error_of_the_Mean_Gruppe_1 Standard_Error_of_the_Mean_Gruppe_1
[1] 2.008811
=sd(Gruppe_2)/length(Gruppe_2)^0.5
Standard_Error_of_the_Mean_Gruppe_2 Standard_Error_of_the_Mean_Gruppe_2
[1] 2.064375
Falls ihr dieser Formel nicht traut, können wir das ja noch mit einem Befehl aus einem Paket berechen, z.B. se aus neatStats Happy now?
se(Gruppe_1)
[1] 2.008811
se(Gruppe_2)
[1] 2.064375
Die Varianz des Mittelwertes ist das Quadrat des Standarderrors of the Mean:
<-Standard_Error_of_the_Mean_Gruppe_1^2) (VarMean_Gruppe_1
[1] 4.03532
<-Standard_Error_of_the_Mean_Gruppe_2^2) (VarMean_Gruppe_2
[1] 4.261643
Die Varianz der Differenzen der Mittelwerte ist die Summe davon:
<-VarMean_Gruppe_1 +VarMean_Gruppe_2
VarDiffMean VarDiffMean
[1] 8.296963
Die Wurzel davon wird in der Literatur oft als Standardabweichung der Differenz bezeichnet, für uns ist es jedoch der Standardfehler der Differenz. Warum ist dies so? Es war ja nicht die Varianz der einzelnen Werte, sondern die Varianz der Mittelwerte. Und wir bezeichnen ja nun die Standardabweichung der Mittelwerte als Standardfehler der Mittelwerte (Standard Error of the Mean, SEM).
<-VarDiffMean^0.5
SE_Diff SE_Diff
[1] 2.880445
Das war jetzt etwas umständlich und mit unseren grossartigen Mathe-Kenntnissen (Räusper - Google-Kenntnissen) können wir das auch etwas einfacher rechnen:
<-sd(Gruppe_1)^2/length(Gruppe_1) + sd(Gruppe_2)^2/length(Gruppe_2)
VarDiffMean_Variante2 VarDiffMean_Variante2
[1] 8.296963
Und auch hier wieder: Die Wurzel davon ist unser Standardfehler der Differenz
<-VarDiffMean_Variante2^0.5
SE_Diff_Variante2 SE_Diff_Variante2
[1] 2.880445
Theoretisch könnten wir die Standardabweichung der Differenz wie folgt berechnen: Wir müssen die ungleiche Gruppengrösse berücksichtigen, falls die Gruppen nicht gleich gross sind.
# Diese Formel ist nur korrekt, wenn die Gruppengrösse gleich ist.
=(sd(Gruppe_1)^2 + sd(Gruppe_2)^2)^0.5
sd_Differenz sd_Differenz
[1] 28.80445
=sd_Differenz/(length(c(Gruppe_1,Gruppe_2)/2)^0.5)
se_Differenz se_Differenz
[1] 2.036782
Hier berücksichtigen wir die Gruppengrösse:
=((sd(Gruppe_1)^2*length(Gruppe_1) + sd(Gruppe_2)^2*length(Gruppe_2))/((length(Gruppe_1)+length(Gruppe_2))/2))^0.5
sd_Differenz sd_Differenz
[1] 28.80445
=sd_Differenz/((mean(c(length(Gruppe_1),length(Gruppe_2))))^0.5)
se_Differenz se_Differenz
[1] 2.880445
Aber konzeptionell ergibt dies eigentlich keinen Sinn, da es ja in unabhängigen Gruppen keine Standardabweichung der Differenzen gibt. Deswegen gibt es z.B. beim Stata-Output zum T-Test auch keine Standardabweichung der Differenz, sondern nur den Standardfehler.
Auch rechnerisch ist es einfacher, den Standardfehler der Differenz direkt aus den Standardfehlern beider Gruppen zu berechnen. Dazu muss man einfach die Standardfehler quadrieren (so erhalten wir ja wieder die Varianz der Mittelwerte, wie oben gesehen). Die Varianz der Differenz der Mittelwerte ist die Summe der beiden Varianzen, und der Standardfehler der Differenz die Wurzel davon.
<-((sd(Gruppe_1)/length(Gruppe_1)^0.5)^2 + (sd(Gruppe_2)/length(Gruppe_2)^0.5)^2)^0.5
se_diff2 se_diff2
[1] 2.880445
Damit ihr die ganzen Berechnungen noch überprüfen könnt, zeige ich euch hier noch den folgenden output eines T-Testes, der die Standardabweichungen und Standardfehler aufzeigt. (R hat keinen so schönen output, deswegen zeige ich den Output von Stata - Stata ist ein kostenpflichtiges Statistikprogramm und der folgende Code wird auf eurem Computer nur laufen, wenn ihr Stata installiert habt, eine gültige Lizenz besitzt und das Paket StataMarkdown (https://github.com/Hemken/Statamarkdown)) installiert habt.
# @Studierende: Die nächsten Zeilen braucht ihr nicht zu beachten.
# The code below is just to combine the variables in a dataframe to export to stata - i just wanted to have this example also ready for Stata
<- max(length(Gruppe_1), length(Gruppe_2))
n length(Gruppe_1) <- n
length(Gruppe_2) <- n
<-data.frame(Gruppe_1, Gruppe_2)
data::export(data, "example_sd_diff_stata.dta") rio
Wenn wir nicht die Voraussetzung gleiche Varianzen annehmen:
use example_sd_diff_stata.dta
ttest Gruppe_1==Gruppe_2, unpaired uneq
Two-sample t test with unequal variances
------------------------------------------------------------------------------
Variable | Obs Mean Std. err. Std. dev. [95% conf. interval]
---------+--------------------------------------------------------------------
Gruppe_1 | 100 46.86477 2.008811 20.08811 42.87885 50.85068
Gruppe_2 | 100 40.82486 2.064375 20.64375 36.7287 44.92103
---------+--------------------------------------------------------------------
Combined | 200 43.84481 1.452462 20.54092 40.98062 46.70901
---------+--------------------------------------------------------------------
diff | 6.039902 2.880445 .3595878 11.72022
------------------------------------------------------------------------------
diff = mean(Gruppe_1) - mean(Gruppe_2) t = 2.0969
H0: diff = 0 Satterthwaite's degrees of freedom = 197.853
Ha: diff < 0 Ha: diff != 0 Ha: diff > 0
Pr(T < t) = 0.9814 Pr(|T| > |t|) = 0.0373 Pr(T > t) = 0.0186
Wenn wir nicht zwei gleichgrosse Gruppen haben, funktioniert die Formel mit der Standardabweichung nicht mehr.
set.seed(1234)
<-rnorm(100, 50,20)
Gruppe_1
<-rnorm(20, 40, 20) Gruppe_2
Hier berücksichtigen wir die Gruppengrösse:
=((sd(Gruppe_1)^2*length(Gruppe_1) + sd(Gruppe_2)^2*length(Gruppe_2))/((length(Gruppe_1)+length(Gruppe_2))/2))^0.5
sd_Differenz sd_Differenz
[1] 26.89057
=sd_Differenz/((mean(c(length(Gruppe_1),length(Gruppe_2))))^0.5)
se_Differenz se_Differenz
[1] 3.471558
Aber wir sehen, dass hier das Result mit der obigen Formel nicht stimmt. Das Problem ist die Stichprobengrösse: Da wir ja keine Paare haben und hier zwei ungleichgrosse Gruppen vorhanden sind, können wir die korrekte Stichprobengrösse für die Berechnung des Standardfehlers aus der Standardabweichung nicht bestimmen. Deswegen müssen wir die folgende Formel benutzen:
<-((sd(Gruppe_1)/length(Gruppe_1)^0.5)^2 + (sd(Gruppe_2)/length(Gruppe_2)^0.5)^2)^0.5
se_diff2 se_diff2
[1] 3.408481
# @Studierende: Die nächsten Zeilen braucht ihr nicht zu beachten.
# The code below is just to combine the variables in a dataframe to export to stata - i just wanted to have this example also ready for Stata
<- max(length(Gruppe_1), length(Gruppe_2))
n length(Gruppe_1) <- n
length(Gruppe_2) <- n
<-data.frame(Gruppe_1, Gruppe_2)
data::export(data, "example_sd_diff_stata_unequalGroupSize.dta") rio
Wenn wir nicht die Voraussetzung gleiche Varianzen annehmen:
use example_sd_diff_stata_unequalGroupSize.dta
ttest Gruppe_1==Gruppe_2, unpaired uneq
Two-sample t test with unequal variances
------------------------------------------------------------------------------
Variable | Obs Mean Std. err. Std. dev. [95% conf. interval]
---------+--------------------------------------------------------------------
Gruppe_1 | 100 46.86477 2.008811 20.08811 42.87885 50.85068
Gruppe_2 | 20 37.73873 2.753621 12.31457 31.97534 43.50212
---------+--------------------------------------------------------------------
Combined | 120 45.34376 1.759708 19.27664 41.85936 48.82816
---------+--------------------------------------------------------------------
diff | 9.126036 3.408481 2.248911 16.00316
------------------------------------------------------------------------------
diff = mean(Gruppe_1) - mean(Gruppe_2) t = 2.6774
H0: diff = 0 Satterthwaite's degrees of freedom = 42.3051
Ha: diff < 0 Ha: diff != 0 Ha: diff > 0
Pr(T < t) = 0.9947 Pr(|T| > |t|) = 0.0105 Pr(T > t) = 0.0053
- Varianten T-Test: Für die ganz interessierten: Es gibt zwei Varianten des T-Testes für unabhängige Gruppen. Eine Version setzt voraus, dass die Varianzen beider Gruppen gleich sind (Version hier weiter unten). Die oben benutzte Variante nimmt nicht an, dass die Varianzen gleich sind. Deswegen ist auch der Standardfehler der Differenz anders.
use example_sd_diff_stata.dta
ttest Gruppe_1==Gruppe_2, unpaired
Two-sample t test with equal variances
------------------------------------------------------------------------------
Variable | Obs Mean Std. err. Std. dev. [95% conf. interval]
---------+--------------------------------------------------------------------
Gruppe_1 | 100 46.86477 2.008811 20.08811 42.87885 50.85068
Gruppe_2 | 100 40.82486 2.064375 20.64375 36.7287 44.92103
---------+--------------------------------------------------------------------
Combined | 200 43.84481 1.452462 20.54092 40.98062 46.70901
---------+--------------------------------------------------------------------
diff | 6.039902 2.880445 .3596138 11.72019
------------------------------------------------------------------------------
diff = mean(Gruppe_1) - mean(Gruppe_2) t = 2.0969
H0: diff = 0 Degrees of freedom = 198
Ha: diff < 0 Ha: diff != 0 Ha: diff > 0
Pr(T < t) = 0.9814 Pr(|T| > |t|) = 0.0373 Pr(T > t) = 0.0186
In R ist der Standard-T-Test die Variante der Welch Two Sample t-test, der nicht annimmt, dass die Varianzen gleich sind.
t.test(Gruppe_1, Gruppe_2)
Welch Two Sample t-test
data: Gruppe_1 and Gruppe_2
t = 2.6774, df = 42.305, p-value = 0.01051
alternative hypothesis: true difference in means is not equal to 0
95 percent confidence interval:
2.248911 16.003160
sample estimates:
mean of x mean of y
46.86477 37.73873
Wir können aber die Option var.equal=TRUE angeben, um den Test unter der Voraussetzung gleicher Varianzen durchzuführen.
t.test(Gruppe_1, Gruppe_2,paired=FALSE, var.equal = TRUE )
Two Sample t-test
data: Gruppe_1 and Gruppe_2
t = 1.9555, df = 118, p-value = 0.05288
alternative hypothesis: true difference in means is not equal to 0
95 percent confidence interval:
-0.1153818 18.3674528
sample estimates:
mean of x mean of y
46.86477 37.73873
- BTW: hier noch eine nette Variante aus dem Paket neatStats: (Variante Welch-Test, d.h. Varianzen müssen nicht gleich sein.)
::t_neat(Gruppe_1, Gruppe_2, plots=TRUE) neatStats
NA values omitted.
––– Normality –––
Shapiro–Wilk test: W = 0.97, p = .011 (1st var.); W = 0.96, p = .563 (2nd var.)
D'Agostino test: K2 = 6.08, p = .048 (1st var.); K2 = 0.87, p = .647 (2nd var.)
Anderson–Darling test: A2 = 1.24, p = .003 (1st var.); A2 = 0.28, p = .597 (2nd var.)
Jarque–Bera test: JB = 5.93, p = .052 (1st var.); JB = 0.79, p = .674 (2nd var.)
––– t–test –––
Mean difference (var1–var2): 9.13, 95% CI [2.25, 16.00] (Mean±SD = 46.86±20.09 vs. 37.74±12.31; Median±MAD = 42.31±18.96 vs. 39.96±13.18), t(42.3) = 2.68, p = .011, d = 0.48, 95% CI [–0.01, 0.96].
19.2 Was wenn nun die Stichproben nicht unabhängig sind?
Eigentlich auch kein Problem, solange wir die Korrelation zwischen den beiden Stichproben kennen. Als Beispiel können wir eine longitudinale Studie nehmen, wo die gleichen 50 Personen vor Beginn der Therapie (t0) gemessen werden und am Ende der Therapie (t1) wieder. Wir können nun die Differenz von t1 und t0 berechnen (t1 - t0). Wenn wir die Daten der einzelnen Patienten haben, können wir natürlich die Standardabweichung oder den Standardfehler der Differenz sehr einfach berechnen. Wenn wir aber nur die Mittelwerte und Standardabweichungen bei t0 und bei t1 haben, könnnen wir zwar die Differenz, nicht jedoch die Standardabweichung der Differenz berechnen, ohne die Korrelation zwischen den Messungen zu kennen. Kennen wir die Korrelation, können wir die folgende Formel anwenden:
Wir simulieren zuerst ein paar Daten.
library(dplyr)
set.seed(1234)
<-1:50
id<-rnorm(50, 60, 12)
t0<-t0+rnorm(50, -2, 20 )
t1<-data.frame(id, t0, t1)
data
<-data %>%
datamutate(diff_t1_t0 = t0 - t1)
mean(data$diff_t1_t0)
[1] -0.7905905
sd(data$diff_t1_t0)
[1] 20.74402
::se(data$diff_t1_t0) neatStats
[1] 2.933648
<-sd(data$diff_t1_t0)/length(data$t1)^0.5) (se
[1] 2.933648
cor(data$t0, data$t1)
[1] 0.4105887
<-sd(data$t0)
sd_t0<-sd(data$t1) sd_t1
Nehmen wir jetzt an, dass wir die Daten der einzelnen Patient:innen nicht zur Verfügung haben, sondern nur den Mittelwert der Differenz (-0.7905905), die Standardabweichungen der t0 10.6205222 und der t1 22.7055391 Messungen, plus die Korrelation zwischen beiden Messungen haben 0.4105887.
varDiff = sd_t0^2/length(data$t0) + sd_t1^2/length(data$t1) - (2*cor(data$t0,data$t1)*sd_t0/length(data$t0)^0.5*sd_t1/length(data$t1)^0.5)) (
[1] 8.606289
seDiff = varDiff^0.5) (
[1] 2.933648
Wir können uns das wieder mit dem netten Stata Output anschauen.
::export(data, "diff_dependent.dta") rio
use diff_dependent.dta
ttest t0==t1
Paired t test
------------------------------------------------------------------------------
Variable | Obs Mean Std. err. Std. dev. [95% conf. interval]
---------+--------------------------------------------------------------------
t0 | 50 54.56336 1.501969 10.62052 51.54504 57.58168
t1 | 50 55.35395 3.211048 22.70554 48.90111 61.8068
---------+--------------------------------------------------------------------
diff | 50 -.7905905 2.933648 20.74402 -6.685976 5.104795
------------------------------------------------------------------------------
mean(diff) = mean(t0 - t1) t = -0.2695
H0: mean(diff) = 0 Degrees of freedom = 49
Ha: mean(diff) < 0 Ha: mean(diff) != 0 Ha: mean(diff) > 0
Pr(T < t) = 0.3943 Pr(|T| > |t|) = 0.7887 Pr(T > t) = 0.6057
Wenn wir systematische Literatuübersichten mit einer Meta-Analyse durchführen, haben wir oft das Problem, dass die Studien die Standardabweichung für die Differenz Pre-Post nicht angeben. Siehe auch.
Sie geben folgende Formel an für die Berechnung der Standardabweichung der Differenz:
SD_diff=(sd_t0^2 + sd_t1^2 - (2*cor(data$t0, data$t1)*sd_t0*sd_t1))^0.5) (
[1] 20.74402
Wir sehen, dass das Resultat mit dem Output des gepaarten T-Tests (Stata Output) übereinstimmt. Warum stimmt hier das Resulat, wenn wir direkt die Varianz der Stichproben benutzen, wo doch beim Beispiel der unabhängigen Gruppen dieser Ansatz nicht funktioniert hat?.
Schauen wir noch einmal den Stata Output für den ungepaarten T-Test an. Wir sehen hier unten, dass Stata auch keine Standardabweichung für die Differenz angibt. Warum wohl? Die Standardabweichung der gepaarten Gruppen wird mit der Differenz der einzelnen Paare berechnent. Bei der Situation mit den ungepaarten (d.h. unabhängigen) Gruppen, haben wir ja keine Paare und können somit ja auch keine Standardabweichung der einzelnen Differenzen berechnen.
use example_sd_diff_stata.dta
ttest Gruppe_1==Gruppe_2, unpaired uneq
Two-sample t test with unequal variances
------------------------------------------------------------------------------
Variable | Obs Mean Std. err. Std. dev. [95% conf. interval]
---------+--------------------------------------------------------------------
Gruppe_1 | 100 46.86477 2.008811 20.08811 42.87885 50.85068
Gruppe_2 | 100 40.82486 2.064375 20.64375 36.7287 44.92103
---------+--------------------------------------------------------------------
Combined | 200 43.84481 1.452462 20.54092 40.98062 46.70901
---------+--------------------------------------------------------------------
diff | 6.039902 2.880445 .3595878 11.72022
------------------------------------------------------------------------------
diff = mean(Gruppe_1) - mean(Gruppe_2) t = 2.0969
H0: diff = 0 Satterthwaite's degrees of freedom = 197.853
Ha: diff < 0 Ha: diff != 0 Ha: diff > 0
Pr(T < t) = 0.9814 Pr(|T| > |t|) = 0.0373 Pr(T > t) = 0.0186