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)
Gruppe_1<-rnorm(100, 50,20)


Gruppe_2<-rnorm(100, 40, 20)

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: 
Differenz_1_minus_2 = Gruppe_1 - Gruppe_2 # ! Macht keinen Sinn!!!!
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:

diff_gr1_gr2<-mean(Gruppe_1, na.rm=TRUE)-mean(Gruppe_2, na.rm=TRUE)

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.

Standard_Error_of_the_Mean_Gruppe_1=sd(Gruppe_1)/length(Gruppe_1)^0.5 
Standard_Error_of_the_Mean_Gruppe_1
[1] 2.008811
Standard_Error_of_the_Mean_Gruppe_2=sd(Gruppe_2)/length(Gruppe_2)^0.5 
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:

(VarMean_Gruppe_1<-Standard_Error_of_the_Mean_Gruppe_1^2)
[1] 4.03532
(VarMean_Gruppe_2<-Standard_Error_of_the_Mean_Gruppe_2^2)
[1] 4.261643

Die Varianz der Differenzen der Mittelwerte ist die Summe davon:

VarDiffMean<-VarMean_Gruppe_1 +VarMean_Gruppe_2
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).

SE_Diff<-VarDiffMean^0.5
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:

VarDiffMean_Variante2<-sd(Gruppe_1)^2/length(Gruppe_1) + sd(Gruppe_2)^2/length(Gruppe_2)
VarDiffMean_Variante2
[1] 8.296963

Und auch hier wieder: Die Wurzel davon ist unser Standardfehler der Differenz

SE_Diff_Variante2<-VarDiffMean_Variante2^0.5
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_Differenz=(sd(Gruppe_1)^2 + sd(Gruppe_2)^2)^0.5
sd_Differenz
[1] 28.80445
se_Differenz=sd_Differenz/(length(c(Gruppe_1,Gruppe_2)/2)^0.5)
se_Differenz
[1] 2.036782

Hier berücksichtigen wir die Gruppengrösse:

sd_Differenz=((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
[1] 28.80445
se_Differenz=sd_Differenz/((mean(c(length(Gruppe_1),length(Gruppe_2))))^0.5)
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.

se_diff2<-((sd(Gruppe_1)/length(Gruppe_1)^0.5)^2 + (sd(Gruppe_2)/length(Gruppe_2)^0.5)^2)^0.5 
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
n <- max(length(Gruppe_1), length(Gruppe_2))
length(Gruppe_1) <- n                      
length(Gruppe_2) <- n
data<-data.frame(Gruppe_1, Gruppe_2)
rio::export(data, "example_sd_diff_stata.dta")

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)
Gruppe_1<-rnorm(100, 50,20)


Gruppe_2<-rnorm(20, 40, 20)

Hier berücksichtigen wir die Gruppengrösse:

sd_Differenz=((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
[1] 26.89057
se_Differenz=sd_Differenz/((mean(c(length(Gruppe_1),length(Gruppe_2))))^0.5)
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:

se_diff2<-((sd(Gruppe_1)/length(Gruppe_1)^0.5)^2 + (sd(Gruppe_2)/length(Gruppe_2)^0.5)^2)^0.5 
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
n <- max(length(Gruppe_1), length(Gruppe_2))
length(Gruppe_1) <- n                      
length(Gruppe_2) <- n
data<-data.frame(Gruppe_1, Gruppe_2)
rio::export(data, "example_sd_diff_stata_unequalGroupSize.dta")

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.)
neatStats::t_neat(Gruppe_1, Gruppe_2, plots=TRUE)
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)
id<-1:50
t0<-rnorm(50, 60, 12)
t1<-t0+rnorm(50, -2, 20 )
data<-data.frame(id, t0, t1)

data<-data %>% 
  mutate(diff_t1_t0 = t0 - t1)

mean(data$diff_t1_t0)
[1] -0.7905905
sd(data$diff_t1_t0)
[1] 20.74402
neatStats::se(data$diff_t1_t0)
[1] 2.933648
(se<-sd(data$diff_t1_t0)/length(data$t1)^0.5)
[1] 2.933648
cor(data$t0, data$t1)
[1] 0.4105887
sd_t0<-sd(data$t0)
sd_t1<-sd(data$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.

rio::export(data, "diff_dependent.dta")
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