Kapitel 74 Mittelwerte und Standardabweichungen von Gruppen kombinieren

In diesem Kapitel lernen Sie folgendes:

  • Mittelwerte und Standardabweichungen für die gesamte Gruppe berechnen, wenn wir nur Mittelwerte und Standardabweichungen von Subgruppen haben
  • Die Formel zur Berechnung der Standardabweichung von kombinierten Gruppen ist nicht die gleiche wie die Formel zur Berechnung der Standardabweichung von Differenzen oder Summen
  • Die Standardabweichung von kombinierten Gruppen ist auch nicht gleich wie die gepoolte Standardabweichung

Es gibt immer wieder Situationen, in denen wir die einzelnen Werte der Studienteilnehmenden nicht haben, sondern nur N, Mittelwerte und Standardabweichungen. Wenn wir hier Gruppen kombinieren möchten und da den Mittelwert und die Standardabweichung der kombinierten Gruppe berechnen wollen, müssen wir eine relativ komplizierte Formel kennen.

74.0.1 Pakete für dieses Kapitel

Wir benötigen folgende Pakete:

library(dplyr)
library(Statamarkdown)
library(vtable)

74.1 Beispiel Meta-Analysen

In einer Meta-Analyse möchten wir manchmal Gruppen kombinieren, zum Beispiel für die Beschreibung der Stichproben möchten wir Mittelwert und Standardabweichung des Alters angeben. Geben die Autoren jedoch das Alter nur getrennt für Männer und Frauen an, müssen wir dies kombinieren.

Erstellen wir zuerst ein paar Daten

set.seed(666)
Gender<-sample(c("Men", "Women"), size=76, rep=TRUE, prob=c(0.3,0.7))
id<-factor(1:length(Gender))
data<-data.frame(id, Gender) %>% 
  mutate(Age=case_when(
    Gender=="Men"~rnorm(length(Gender), 55, 6), 
    Gender=="Women"~rnorm(length(Gender),60, 7 )))

data %>%
  split(.$Gender) %>%
  purrr::map(~ Hmisc::describe(.x$Age)) 
$Men
.x$Age 
       n  missing distinct     Info     Mean      Gmd      .05      .10 
      26        0       26        1    55.74    6.273    47.14    48.45 
     .25      .50      .75      .90      .95 
   51.78    56.07    59.02    61.96    65.45 

lowest : 46.85330 47.09062 47.29992 49.60023 50.07506
highest: 59.35361 60.32583 63.59505 66.07356 66.91349

$Women
.x$Age 
       n  missing distinct     Info     Mean      Gmd      .05      .10 
      50        0       50        1    60.04    8.464    48.70    50.40 
     .25      .50      .75      .90      .95 
   56.52    60.94    64.77    68.38    69.00 

lowest : 37.95849 40.50623 48.04480 49.50717 49.70524
highest: 68.46813 68.63470 69.29544 70.58526 78.05247
rio::export(data, "grouped_sd.dta")

In einer Studie kann es sein, dass das Alter nur separat für die Männer und Frauen angebeben wird:

vtable::st(data[,-1], group="Gender") # [,1] weil wir die ID natürlich nicht zusammenfassen möchten. Alternativ könnten wir auch st(data, vars="Age", group="Gender") schreiben.
Table 22.1: Summary Statistics
Gender
Men
Women
Variable N Mean SD N Mean SD
Age 26 55.741 5.448 50 60.039 7.636

Wir möchten nun den Mittelwert und die Standardabweichung für die gesamte Gruppe berechnen. Hier haben wir ja die Daten für alle Teilnehmer:innen, somit wäre das ja kein Problem, wenn wir aus einer Studie nur Mittelwert und Standardabweichung haben, müssen wir eine Formel benutzen.

vtable::st(data[,-1]) # ,-1 weil wir die ID natürlich nicht zusammefassen möchten
Table 43.1: Summary Statistics
Variable N Mean Std. Dev. Min Pctl. 25 Pctl. 75 Max
Gender 76
… Men 26 34.2%
… Women 50 65.8%
Age 76 58.569 7.225 37.958 53.685 64.158 78.052

Die Formel lautet wie folgt:

Siehe hier https://math.stackexchange.com/questions/2971315/how-do-i-combine-standard-deviations-of-two-groups für eine Erklärung.

Wir finden auch hier https://handbook-5-1.cochrane.org/chapter_7/table_7_7_a_formulae_for_combining_groups.htm die Formel (etwas anders formuliert).

\[\begin{equation} s^2 = \frac{(n_1-1)\cdot s^2+(n_2-1)\cdot s^2}{n_1+n_2-1} + \frac{n_1\cdot n_2 \cdot(mean_1 - mean_2)^2 }{(n_1+n_2) \cdot (n_1 +n_2-1)} \tag{74.1} \end{equation}\]

Und die kombinierte Standardabweichung wäre dann:

\[\begin{equation} sd = \sqrt{s^2} \tag{74.2} \end{equation}\]

In unserem Beispiel ergäbe dies:

\[\begin{equation} s^2 = \frac{(26-1)\cdot 5.448^2+(50-1)\cdot 7.636^2}{26+50-1} + \frac{26\cdot 50 \cdot(55.741 - 60.039)^2 }{(26+50) \cdot (26 +50-1)} \tag{74.3} \end{equation}\]

und in R:

var_combined<-((26-1)*5.448^2 + (50-1)*7.636^2)/(26+50-1) + ((26*50)*(55.741-60.039)^2)/((26+50)*(26+50-1))
sd_combined<-var_combined^0.5
sd_combined
[1] 7.225064

Oder so:

n1<-26
n2<-50

m1<-55.741
m2<-60.039

sd1<-5.448
sd2<-7.636

var_combined2<-((n1-1)*sd1^2 + (n2-1)*sd2^2)/(n1+n2-1) + ((n1*n2)*(m1-m2)^2)/((n1+n2)*(n1+n2-1))
sd_combined2<-sqrt(var_combined2)
sd_combined2
[1] 7.225064

Übrigens: Stata gibt einfach die schöneren Outputs, deswegen hier ein wenig Werbung für Stata. Der Befehl ttest in Stata erlaubt uns auf einen Blick zu kontrollieren, ob die Berechnung mit unseren simulierten Daten stimmt: Hier die Erklärung: https://www.statstodo.com/CombineMeansSDs.php.

use grouped_sd.dta
ttest Age, by(Gender)
Two-sample t test with equal variances
------------------------------------------------------------------------------
   Group |     Obs        Mean    Std. err.   Std. dev.   [95% conf. interval]
---------+--------------------------------------------------------------------
     Men |      26    55.74112     1.06844    5.447995    53.54063    57.94161
   Women |      50    60.03907    1.079943    7.636347    57.86885     62.2093
---------+--------------------------------------------------------------------
Combined |      76    58.56872    .8287983    7.225296    56.91767    60.21977
---------+--------------------------------------------------------------------
    diff |           -4.297955    1.686296               -7.657974   -.9379368
------------------------------------------------------------------------------
    diff = mean(Men) - mean(Women)                                t =  -2.5488
H0: diff = 0                                     Degrees of freedom =       74

    Ha: diff < 0                 Ha: diff != 0                 Ha: diff > 0
 Pr(T < t) = 0.0064         Pr(|T| > |t|) = 0.0129          Pr(T > t) = 0.9936

74.2 Kombinieren von mehr als zwei Gruppen

Falls wir mehr als zwei Gruppen haben, ist der folgende Ansatz etwas einfacher:

Wir benötigen die folgenden drei Komponenten.

Für jede Gruppe berechnen wir folgendes:

  • \(\sum x\) = Das Produkt von Mittelwert und Stichprobengrösse
  • \(\sum {x}^2\) = SD2(n-1)+((Σx)^2/n)

Danach müssen wir folgendes zusammenfügen:

  • Summe_N = Summe aller Stichprobengrössen
  • Summe \(\sum x\) : Summe aller \(\sum x\)
  • Summe \(\sum {x}^2\) : Summer aller \(\sum {x}^2\)

Damit können wir nun die kombinierten Werte berechnen:

  • Kombinierte Stichprobengrösse: Summe_N
  • Kombinierter Mittelwert: Summe \(\sum x\) / Summe_N
  • Kombinierte Varianz: \((\sum {x}^2 -{(\sum x})^2 / (Summe\_N-1)\)
  • Kombinierte Standardabweichung: Quadradtwurzel von Kombinierte Varianz

74.2.1 Beispiel vier Gruppen

Wir können dies an einem Beispiel mit simulierten Daten mit vier Gruppen illustrieren.

set.seed(666)
Group=sample(1:4, rep=TRUE, size=100, prob=c(0.2,0.1, 0.3, 0.4))
id<-1:length(Group)
data<-data.frame(id, Group) %>% 
  mutate(Age=case_when(
    Group==1~rnorm(length(Group), 50, 6), 
    Group==2~rnorm(length(Group), 55, 7), 
    Group==3~rnorm(length(Group), 60, 7.5), 
    Group==4~rnorm(length(Group), 65, 8)))
vtable::st(data[,-1], vars="Age", group="Group")
Table 61.2: Summary Statistics
Group
1
2
3
4
Variable N Mean SD N Mean SD N Mean SD N Mean SD
Age 24 50.202 4.606 12 54.849 5.272 25 58.342 9.12 39 64.265 6.576

Nun die eigene Berechnung:

n1<-24
n2<-12
n3<-25
n4<-39

mean1<-50.202
mean2<-54.849
mean3<-58.342
mean4<-64.265

sd1<-4.606
sd2<-5.272
sd3<-9.12
sd4<-6.576

summe_x1 = mean1 * n1
summe_x2 = mean2 * n2
summe_x3 = mean3 * n3
summe_x4 = mean4 * n4 

summe_xsquared1 = sd1^2*(n1-1) + ((summe_x1)^2/n1) 
summe_xsquared2 = sd2^2*(n2-1) + ((summe_x2)^2/n2) 
summe_xsquared3 = sd3^2*(n3-1) + ((summe_x3)^2/n3) 
summe_xsquared4 = sd4^2*(n4-1) + ((summe_x4)^2/n4) 

summe_n = n1 + n2 + n3 +n4
summe_summenx = summe_x1 + summe_x2 + summe_x3 + summe_x4

summe_summenxsquared= summe_xsquared1 + summe_xsquared2 + summe_xsquared3 + summe_xsquared4


N_total = summe_n
Mean_total = summe_summenx / summe_n
Varianz_total = (summe_summenxsquared-summe_summenx^2/summe_n) / (summe_n-1)
SD_total=Varianz_total^0.5
N_total
[1] 100
Mean_total
[1] 58.27921
SD_total
[1] 8.72566

Wir vergleichen das mit den Daten (und wir sind glücklich, dass unsere Berechnungen übereinstimmen).

vtable::st(data, vars="Age")
Table 58.2: Summary Statistics
Variable N Mean Std. Dev. Min Pctl. 25 Pctl. 75 Max
Age 100 58.279 8.726 40.96 52.133 64.956 74.672

74.3 Warum ist die Berechnung der SD der ganzen Gruppe nicht gleich wie für die SD der Summe oder der Differenz?

Sie können sich vielleicht an die Formel zur Berechnung der Standardabweichung der Differenz oder der Summe zweier Gruppen erinnern. Würden wir jedoch diese Formel anwenden, bekämen wir nicht die korrekte Standardabweichung.

Auch wenn wir die gepoolte Standardabweichung berechnen, wäre dies nicht korrekt