Table of Content
- 1 Introduction
- 2 Preparation
- 3 Essential requirements
- 3.1 Normal distribution
- 3.2 Sampling size
- 3.3 Homogeneity of variance
- 4 MANOVA
- 5 Interaction diagram
- 6 Post-hoc-method
- 7 Effect size
- 8 Conclusion
1 Introduction
Aufbauend auf den Post “ANOVA”, in dem es um die Funktionsweise der einfaktoriellen Varianzanalyse ging, soll nachfolgend das Prinzip der mehrfaktoriellen Varianzanalyse ohne Messwiederholung, kurz MANOVA (multivariate analysis of variance), näher erläutert werden. Im Gegensatz zur einfaktoriellen Varianzanalyse werden bei der MANOVA nicht nur eine, sondern mehrere unabhängige Variablen betrachtet.
Für diesen Post wurde der Datensatz World Happiness Report von der Statistik Plattform “Kaggle” verwendet. Eine Kopie des Datensatzes ist unter https://drive.google.com/open?id=1DLZ_gVFhsT0dBROLE79h2Y5_6NXRF2Br abrufbar.
library(tidyverse)
library(psych)
library(sjstats)
library(nortest)
library(car)
library(gplots)
library(MBESS)
Happiness <- read_csv("World_Happiness_Report.csv")
2 Preparation
Anhand des Datensatzes World Happiness Report soll eine zweifaktorielle Varianzanalyse durchgeführt werden. Dafür kreieren wir im ersten Schritt zwei unabhängige kategoriale Variablen (zwei Faktoren).
Happiness$Family.new <- ifelse(Happiness$Family >= 1.254, "viele.Familien", "weniger.Familien")
Happiness$Freedom.new <- ifelse(Happiness$Freedom >= 0.4375, "viel.Freiheit", "weniger.Freiheit")
Für das folgende Beispiel wurden die Faktoren Family.new
und Freedom.new
erstellt. Die Variable Family.new
beschreibt nun die Länder im Datensatz mit den beiden Ausprägungen “viele.Familien” und “weniger.Familien” und die Variable Freedom.new
mit den beiden Ausprägungen “viel.Freiheit” und “weniger.Freiheit”. Aufgeteilt wurden die beiden Variablen jeweils nach ihrem Median.
median(Happiness$Family)
## [1] 1.253918
median(Happiness$Freedom)
## [1] 0.4374543
Die abhängige Variable für die MANOVA soll der Happiness.Score
sein.
glimpse(Happiness)
## Observations: 155
## Variables: 14
## $ Country <chr> "Norway", "Denmark", "Iceland", ...
## $ Happiness.Rank <int> 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 1...
## $ Happiness.Score <dbl> 7.537, 7.522, 7.504, 7.494, 7.46...
## $ Whisker.high <dbl> 7.594445, 7.581728, 7.622030, 7....
## $ Whisker.low <dbl> 7.479556, 7.462272, 7.385970, 7....
## $ Economy..GDP.per.Capita. <dbl> 1.616463, 1.482383, 1.480633, 1....
## $ Family <dbl> 1.533524, 1.551122, 1.610574, 1....
## $ Health..Life.Expectancy. <dbl> 0.7966665, 0.7925655, 0.8335521,...
## $ Freedom <dbl> 0.6354226, 0.6260067, 0.6271626,...
## $ Generosity <dbl> 0.36201224, 0.35528049, 0.475540...
## $ Trust..Government.Corruption. <dbl> 0.31596383, 0.40077007, 0.153526...
## $ Dystopia.Residual <dbl> 2.277027, 2.313707, 2.322715, 2....
## $ Family.new <chr> "viele.Familien", "viele.Familie...
## $ Freedom.new <chr> "viel.Freiheit", "viel.Freiheit"...
table(Happiness$Family.new)
##
## viele.Familien weniger.Familien
## 77 78
table(Happiness$Freedom.new)
##
## viel.Freiheit weniger.Freiheit
## 77 78
3 Essential requirements
Die Voraussetzungen für die MANOVA sind die gleichen wie bei der einfaktoriellen Varianzanalyse. Diese waren:
- Unabhängigkeit der Messungen. Kein Teilnehmer aus einer Gruppe darf auch in einer anderen Gruppe vorkommen.
- Die abhängige Variable ist metrisch skaliert.
- Die unabhängige Variable ist unabhängig und nominalskaliert.
- Normalverteilung der abhängigen Variablen in allen Populationen, wenn gilt N < 30 in jeder Population.
- Varianzhomogenität der abhängigen Variablen in allen Populationen.
3.1 Normal distribution
Für die Überprüfung der Normalverteilung der abhängigen Variable, wird wie gewohnt der Lilliefors-Test angewendet.
lillie.test(Happiness$Happiness.Score)
##
## Lilliefors (Kolmogorov-Smirnov) normality test
##
## data: Happiness$Happiness.Score
## D = 0.050105, p-value = 0.4458
Mit p > .446 ist die Variable Happiness.Score
normalverteilt.
3.2 Sampling size
desc.Hauptfaktor1 <- describeBy(Happiness$Happiness.Score, Happiness$Family.new, mat = TRUE)
desc.Hauptfaktor2 <- describeBy(Happiness$Happiness.Score, Happiness$Freedom.new, mat = TRUE)
desc.Hauptfaktor1
## item group1 vars n mean sd median trimmed
## X11 1 viele.Familien 1 77 6.110429 0.8677820 6.0980 6.139175
## X12 2 weniger.Familien 1 78 4.607308 0.8240891 4.5515 4.602781
## mad min max range skew kurtosis se
## X11 0.896973 4.096 7.537 3.441 -0.26249300 -0.6588109 0.09889293
## X12 1.002238 2.693 6.578 3.885 0.03968612 -0.7186485 0.09330972
desc.Hauptfaktor2
## item group1 vars n mean sd median trimmed
## X11 1 viel.Freiheit 1 77 5.860519 1.0493845 5.956 5.890317
## X12 2 weniger.Freiheit 1 78 4.854013 0.9811528 4.790 4.838563
## mad min max range skew kurtosis se
## X11 1.128258 3.471 7.537 4.066 -0.2165218 -0.9094135 0.1195885
## X12 1.088228 2.693 7.213 4.520 0.0696700 -0.7288668 0.1110937
Da die beiden unabhängigen Variablen Family.new
und Freedom.new
jeweils nach ihrem Median aufgeteilt wurden, sind die 4 Gruppen fast gleich groß.
3.3 Homogeneity of variance
leveneTest(Happiness$Happiness.Score ~ Happiness$Family.new * Happiness$Freedom.new)
## Levene's Test for Homogeneity of Variance (center = median)
## Df F value Pr(>F)
## group 3 0.2885 0.8337
## 151
Mit p > .834 ist Varianzhomogenität innerhalb der Gruppen gegeben.
4 MANOVA
Auch die mehrfaktorielle Varianzanalyse wird mit dem aov Befehl angefordert. Für unser Beispiel sieht die Syntax folgendermaßen aus:
MANOVA <- aov(Happiness$Happiness.Score ~ Happiness$Family.new * Happiness$Freedom.new)
Wie auch bei der ANOVA wird als erstes Argument die abhängige Variable genannt. Nach der Tilde kommt/kommen die unabhängige/n Variable/n. Alternativ könnte man auch folgende (etwas längere) Syntax verwenden:
alternative.Syntax <- aov(Happiness$Happiness.Score ~ Happiness$Family.new + Happiness$Freedom.new + Happiness$Family.new:Happiness$Freedom.new)
Beschreibung der unterschiedlichen Mittelwerte
Für die Ausgabe der unterschiedlichen Mittelwerte kann erneut die model.tables Funktion angewendet werden.
model.tables(MANOVA, "means")
## Tables of means
## Grand mean
##
## 5.354019
##
## Happiness$Family.new
## viele.Familien weniger.Familien
## 6.11 4.607
## rep 77.00 78.000
##
## Happiness$Freedom.new
## viel.Freiheit weniger.Freiheit
## 5.553 5.157
## rep 77.000 78.000
##
## Happiness$Family.new:Happiness$Freedom.new
## Happiness$Freedom.new
## Happiness$Family.new viel.Freiheit weniger.Freiheit
## viele.Familien 6.30 5.66
## rep 54.00 23.00
## weniger.Familien 4.82 4.52
## rep 23.00 55.00
Grand mean beschreibt wieder den Gesamtmittelwert. Die Tabelle Happiness.Family.new zeigt die Mittelwerte (der Variable Happiness.Score
) für alle Länder mit vielen und wenigen Familien, umabhängig davon, ob diese einen hohen oder niedrigen “Freedom”-Grad haben. Die Zeile rep nennt uns die Stichprobengröße. In der Tabelle Happiness.Freedom.new erhalten wir die Mittelwerte und Stichprobengrößen für alle Länder (aufgeteilt nach den beiden Kategorien “viel.Freiheit” und “weniger.Freiheit”), unabhängig davon, ob diese einen hohen oder niedrigen “Family”-Grad haben. Schließlich werden in der Tabelle Happiness.Family.new:Happiness.Freedom.new die Stichprobengrößen und Mittelwerte für jede der einzelnen Kombinationen ausgegeben.
Verschiedene Quadratsummentypen
Das Ergebnis der ANOVA wurde mit der summary Funktion angefordert (siehe Post “ANOVA” Punkt 4). Mittels dieser Funktion wird in R automatisch Typ-I-Quadratsummen berechnet. Die Typ-III-Quadratsummen gelten als besser interpretierbar, weshalb sie in diesem Beispiel auch speziell angefordert werden. Dies ist mit der Funktion Anova und dem Zusatzargument typ = 3) möglich. Beim Typ-III-Modell wird der Interaktionseffekt von Anfang an bei der Evaluierung mitberücksichtigt.
Anova(MANOVA, type=3)
## Anova Table (Type III tests)
##
## Response: Happiness$Happiness.Score
## Sum Sq Df F value Pr(>F)
## (Intercept) 2145.67 1 3198.336 < 2.2e-16
## Happiness$Family.new 35.48 1 52.888 1.781e-11
## Happiness$Freedom.new 6.74 1 10.049 0.001846
## Happiness$Family.new:Happiness$Freedom.new 0.96 1 1.429 0.233806
## Residuals 101.30 151
##
## (Intercept) ***
## Happiness$Family.new ***
## Happiness$Freedom.new **
## Happiness$Family.new:Happiness$Freedom.new
## Residuals
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
Die Bedeutung der einzelnen Spalten wurde bereits im Post “ANOVA” (unter Punkt 4) genau erklärt. Wir erhalten ein höchst signifikantes Ergebnis für den Haupteffekt des Faktors Family.new
(p < .001) und ein hoch signifikantes Ergebnis für den Haupteffekt des Faktors Freedom.new
(p = .002). Das Ergebnis für den Interaktionseffekt ist mit p = .23 nicht signifikant.
Die Spalte “Residuals” beinhaltet die Quadratsummen und Freiheitsgrade für den Nenner, beziehungsweise die Unterschiede innerhalb der Gruppen.
5 Interaction diagram
Interaktionseffekte (auch Wechselwirkungseffekte genannt) betrachten die Wirkung eines Faktors (hier Family.new
) in Abhängigkeit von einem anderen Faktor (hier Freedom.new
). Interaktionseffekte treten dann auf, wenn sich die Wirkung eines Faktors A unterscheidet, je nachdem unter welcher Stufe eines zweiten Faktors B man diesen untersucht. Liegt ein Interaktionseffekt vor bedeutet dies, dass die Wirkung der Faktoren in Kombination über die Summe aus den Einzelwirkungen der Faktoren hinausgeht. Deckt man in einem statistischen Test Wechselwirkungseffekte auf, sollte man diese auch interpretieren. Am einfachsten lassen sich Interaktionen interpretieren, indem man in einem Interaktionsdiagramm die Mittelwerte graphisch darstellt.
Visualisierung der Haupteffekte
Happiness$Family.new.kurz <- ifelse(Happiness$Family.new == "viele.Familien", "viele", "weniger")
Happiness$Freedom.new.kurz <- ifelse(Happiness$Freedom.new == "viel.Freiheit", "viel", "weniger")
par(mfrow=c(1,2))
plotmeans(Happiness$Happiness.Score ~ Happiness$Family.new.kurz, xlab="Familien",
ylab="Glücklichkeitsgrad", main="Interaktionsplot Faktor Family")
plotmeans(Happiness$Happiness.Score ~ Happiness$Freedom.new.kurz, xlab="Freiheit",
ylab="Glücklichkeitsgrad", main="Interaktionsplot Faktor Freedom")
In diesen beiden Diagrammen, werden die Haupteffekte für die Faktoren Family.new
und Freedom.new
veranschaulicht. Man sieht, dass sich beide Haupteffekte in ihrem mittleren Glücklichkeitsgrad (innerhalb ihrer beiden Ausprägungen viele/weniger Familien und viel/weniger Freiheit) deutlich unterscheiden.
Visualisierung des Interaktionseffekts
Für die graphische Darstellung des Interaktionseffektes wird ein eigener Dataframe, mit den Werten für jede Kombination der Haupteffekte (abzulesen aus der Tabelle Happiness.Family.new:Happiness.Freedom.new), erstellt und in zwei Diagrammen graphisch dargestellt.
model.tables(MANOVA, "means")
## Tables of means
## Grand mean
##
## 5.354019
##
## Happiness$Family.new
## viele.Familien weniger.Familien
## 6.11 4.607
## rep 77.00 78.000
##
## Happiness$Freedom.new
## viel.Freiheit weniger.Freiheit
## 5.553 5.157
## rep 77.000 78.000
##
## Happiness$Family.new:Happiness$Freedom.new
## Happiness$Freedom.new
## Happiness$Family.new viel.Freiheit weniger.Freiheit
## viele.Familien 6.30 5.66
## rep 54.00 23.00
## weniger.Familien 4.82 4.52
## rep 23.00 55.00
par(mfrow=c(1,1))
Freiheit <- c("viel.Freiheit", "weniger.Freiheit", "viel.Freiheit", "weniger.Freiheit")
Gluecklichkeitsgrad <- c(6.30, 4.52, 4.82, 5.66)
Familien <- c("viele.Familien", "weniger.Familien", "weniger.Familien", "viele.Familien")
Datensatz1 <- data.frame(Freiheit, Gluecklichkeitsgrad, Familien)
colnames(Datensatz1) <- c("Freiheit", "Glücklichkeitsgrad", "Familien")
Datensatz1
## Freiheit Glücklichkeitsgrad Familien
## 1 viel.Freiheit 6.30 viele.Familien
## 2 weniger.Freiheit 4.52 weniger.Familien
## 3 viel.Freiheit 4.82 weniger.Familien
## 4 weniger.Freiheit 5.66 viele.Familien
Sicht1 <- ggplot(Datensatz1, aes(x = Freiheit, y = Glücklichkeitsgrad, color = Familien)) +
geom_line(aes(group = Familien)) +
geom_point() +
ggtitle("Interaktionseffekt Sicht 1")
Sicht2 <- ggplot(Datensatz1, aes(x = Familien, y = Glücklichkeitsgrad, color = Freiheit)) +
geom_line(aes(group = Freiheit)) +
geom_point() +
ggtitle("Interaktionseffekt Sicht 2")
Sicht1
Sicht2
Bei beiden Diagrammen (Sicht1 und Sicht 2) handelt es sich um die selben adjustierten Mittelwerte. Der Unterschied zwischen den Diagrammen ist, dass beim ersten Diagramm (“Interaktionseffekt Sicht 1”) der Faktor “Freiheit” auf der x-Achse abgetragen ist und beim zweiten Diagramm (“Interaktionseffekt Sicht 2”) der Faktor “Familien”.
6 Post-hoc-method
Bei der einfaktoriellen Varianzanalyse ohne Messwiederholung wurde die pairwise.t.test Funktion angewendet, um multiple Paarvergleiche durchzuführen (Post “ANOVA” Punkt 6). Für eine mehrdimensionale Varianzanalyse funktioniert dieser Befehl nicht mehr. Stattdessen, kann die TukeyHSD Funktion verwendet werden.
TukeyHSD(MANOVA)
## Tukey multiple comparisons of means
## 95% family-wise confidence level
##
## Fit: aov(formula = Happiness$Happiness.Score ~ Happiness$Family.new * Happiness$Freedom.new)
##
## $`Happiness$Family.new`
## diff lwr upr p adj
## weniger.Familien-viele.Familien -1.503121 -1.763098 -1.243144 0
##
## $`Happiness$Freedom.new`
## diff lwr upr p adj
## weniger.Freiheit-viel.Freiheit -0.3955979 -0.655575 -0.1356208 0.0030961
##
## $`Happiness$Family.new:Happiness$Freedom.new`
## diff
## weniger.Familien:viel.Freiheit-viele.Familien:viel.Freiheit -1.4831458
## viele.Familien:weniger.Freiheit-viele.Familien:viel.Freiheit -0.6464936
## weniger.Familien:weniger.Freiheit-viele.Familien:viel.Freiheit -1.7853370
## viele.Familien:weniger.Freiheit-weniger.Familien:viel.Freiheit 0.8366522
## weniger.Familien:weniger.Freiheit-weniger.Familien:viel.Freiheit -0.3021913
## weniger.Familien:weniger.Freiheit-viele.Familien:weniger.Freiheit -1.1388434
## lwr
## weniger.Familien:viel.Freiheit-viele.Familien:viel.Freiheit -2.0129571
## viele.Familien:weniger.Freiheit-viele.Familien:viel.Freiheit -1.1763049
## weniger.Familien:weniger.Freiheit-viele.Familien:viel.Freiheit -2.1929722
## viele.Familien:weniger.Freiheit-weniger.Familien:viel.Freiheit 0.2091898
## weniger.Familien:weniger.Freiheit-weniger.Familien:viel.Freiheit -0.8305619
## weniger.Familien:weniger.Freiheit-viele.Familien:weniger.Freiheit -1.6672141
## upr
## weniger.Familien:viel.Freiheit-viele.Familien:viel.Freiheit -0.9533345
## viele.Familien:weniger.Freiheit-viele.Familien:viel.Freiheit -0.1166823
## weniger.Familien:weniger.Freiheit-viele.Familien:viel.Freiheit -1.3777018
## viele.Familien:weniger.Freiheit-weniger.Familien:viel.Freiheit 1.4641146
## weniger.Familien:weniger.Freiheit-weniger.Familien:viel.Freiheit 0.2261794
## weniger.Familien:weniger.Freiheit-viele.Familien:weniger.Freiheit -0.6104728
## p adj
## weniger.Familien:viel.Freiheit-viele.Familien:viel.Freiheit 0.0000000
## viele.Familien:weniger.Freiheit-viele.Familien:viel.Freiheit 0.0098774
## weniger.Familien:weniger.Freiheit-viele.Familien:viel.Freiheit 0.0000000
## viele.Familien:weniger.Freiheit-weniger.Familien:viel.Freiheit 0.0038300
## weniger.Familien:weniger.Freiheit-weniger.Familien:viel.Freiheit 0.4485891
## weniger.Familien:weniger.Freiheit-viele.Familien:weniger.Freiheit 0.0000006
Es werden drei Tabellen, mit identischen Spalten ausgegeben.
Die Spalte diff enthält die Mittelwertsdifferenz für den jeweiligen Gruppenvergleich. Die Spalten lwr und upr enthalten die untere bzw. obere Grenze des Konfidenzintervalls für diese Mittelwertsdifferenz. In der Spalte p adj sind die adjustierten p-Werte aufgeführt. Die ersten beiden Tabellen “Happiness.Family.new” und “Happiness.Freedom.new” enthalten die Post-hoc Vergleiche für die beiden Haupteffekte. In der Tabelle “Happiness.Family.new:Happiness.Freedom.new” werden alle vier Einzelgruppen miteinander verglichen (6 paarweise Vergleiche).
7 Effect size
Bei der einfaktoriellen Varianzanalyse wurde die Effektgröße eta2 berechnet. Sie drückt den gesamten Anteil der durch alle Effekte erklärten Varianz an der Gesamtvarianz aus. Da wir bei der MANOVA den Beitrag eines bestimmten Effekts zur Gesamtvarianz berechnen wollen, brauchen wir hierfür das partielle eta2.
Die Formel für das partielle eta2 lautet: \[partielles.eta^2 = \frac{\mathrm{QS}_\mathrm{Effekt}}{\mathrm{QS}_\mathrm{Effekt}+\mathrm{QS}_\mathrm{Fehler}}\]
QS-Effekt steht für die Quadratsummen des Effekts und QS-Fehler für die Quadratsummen des Fehlers. Diese beiden Werte können wieder der Varianzanalysetabelle entnommen werden. Als Beispiel soll nachfolgend das partielle eta2 für den Interaktionseffekt berechnet werden.
Anova(MANOVA, type=3)
## Anova Table (Type III tests)
##
## Response: Happiness$Happiness.Score
## Sum Sq Df F value Pr(>F)
## (Intercept) 2145.67 1 3198.336 < 2.2e-16
## Happiness$Family.new 35.48 1 52.888 1.781e-11
## Happiness$Freedom.new 6.74 1 10.049 0.001846
## Happiness$Family.new:Happiness$Freedom.new 0.96 1 1.429 0.233806
## Residuals 101.30 151
##
## (Intercept) ***
## Happiness$Family.new ***
## Happiness$Freedom.new **
## Happiness$Family.new:Happiness$Freedom.new
## Residuals
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
\[partielles.eta^2 = \frac{\mathrm{QS}_\mathrm{Effekt}}{\mathrm{QS}_\mathrm{Effekt}+\mathrm{QS}_\mathrm{Fehler}} = \frac{0{,}96}{0{,}96 + 101{,}30} \approx 0{,}009\]
Alternativ kann auch wieder die eta_sq Funktion mit dem Zusatzargument partial = TRUE verwendet werden.
eta_sq(MANOVA, partial = TRUE)
## term partial.etasq
## 1 Happiness$Family.new 0.464
## 2 Happiness$Freedom.new 0.067
## 3 Happiness$Family.new:Happiness$Freedom.new 0.009
Da die Effektgröße eta2 dazu neigt, immer etwas zu groß auszufallen, ist es daher sinnvoll, das Konfidenzintervall für den durch den Faktor erklärten Varianzanteil zu berechnen. Für die Funktion ci.pvaf ist dabei der F-Wert, die Zählerfreiheitsgrade, die Nennerfreiheitsgrade sowie die Stichprobengröße notwendig. Diese Werte können erneut der Varianzanalysetabelle und den durchgeführten describeBy-Befehlen entnommen werden.
Anova(MANOVA, type=3)
## Anova Table (Type III tests)
##
## Response: Happiness$Happiness.Score
## Sum Sq Df F value Pr(>F)
## (Intercept) 2145.67 1 3198.336 < 2.2e-16
## Happiness$Family.new 35.48 1 52.888 1.781e-11
## Happiness$Freedom.new 6.74 1 10.049 0.001846
## Happiness$Family.new:Happiness$Freedom.new 0.96 1 1.429 0.233806
## Residuals 101.30 151
##
## (Intercept) ***
## Happiness$Family.new ***
## Happiness$Freedom.new **
## Happiness$Family.new:Happiness$Freedom.new
## Residuals
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
sum(desc.Hauptfaktor1$n)
## [1] 155
Im Falle des Haupteffekts für Family.new
erhält man folgendes Ergebnis.
ci.pvaf(F.value = 52.888, df.1 = 1, df.2 = 151, N=155)
## $Lower.Limit.Proportion.of.Variance.Accounted.for
## [1] 0.1455151
##
## $Probability.Less.Lower.Limit
## [1] 0.025
##
## $Upper.Limit.Proportion.of.Variance.Accounted.for
## [1] 0.3624183
##
## $Probability.Greater.Upper.Limit
## [1] 0.025
##
## $Actual.Coverage
## [1] 0.95
Das untere Limit liegt bei 14,55% erklärten Varianzanteil und das obere Limit bei 36,24%.
8 Conclusion
In diesem Post wurde die Funktionsweise der zweifaktoriellen Varianzanalyse dargelegt. Es wurden auf die Unterschiede zur ANOVA eingegangen sowie auf die graphische Darstellung von Haupt- und Interaktionseffekte.
Source
Luhmann, M. (2011). R für Einsteiger.