Erforderliche Pakete laden

library(afex)    # ANOVA
library(lsr)     # Umwandlung des Datensatzes von wide in long
library(emmeans) # Berechnung der Least–Square-Mittelwerte bzw. Rand-Mittelwerte

Datensatz einlesen und Variablen spezifizieren

# Beispiel mit einem Within-Faktor und zwei between Faktoren
# Eingabe in der Wide-Version anlog SPSS, d.h. pro Proband eine Zeile.
# Aufbau der Variablennamen der Within-Faktoren: Name.AV_Stufe.wsFaktor1_Stufe.wsFaktor2
Nachhilfe <- rep(c("ja","nein"),c(5,6))
Geschlecht <- rep(c("männlich","weiblich","männlich","weiblich"), c(3,2,3,3))
Note_vorher <- c(5,4,5,4,5,4,4,5,5,4,5)
Note_nachher <- c(4,2,3,4,3,3,4,5,4,5,4)
Note_nach.halbem.Jahr <- c(4,3,4,4,3,3,4,5,4,4,4)
data <- data.frame(Nachhilfe, Geschlecht, Note_vorher, Note_nachher, Note_nach.halbem.Jahr)

# Variablen spezifizieren
Spaltennummern <- c(1,2,3,4,5)          # Spaltennummern der für die Analyse benötiten Variablen
between <- c("Nachhilfe","Geschlecht")  # Between-Faktoren: gleich wie im Datensatz. Falls keine: between <- NULL
within <- c("Messzeitpunkt")            # Within-Faktoren: Abfolge gemäss Variabennamen im Datensatz!
AV <- "Note"                            # Abhängige Variable: gleich wie im Datensatz

Deskriptive Statistik, Signifikanztest, Effektstärke und Teststärke

# Listwise Deletion
data2 <- na.omit(data[, Spaltennummern, drop=FALSE])
# Der Datensatz muss eine Spalte "Block" mit den Probanden-IDs enthalten.
data2$Block <- as.factor(1:nrow(data2))
# Umwandlung des Datensatzes von wide in long
library(lsr)
data.long <- wideToLong(data2, within=within)

# Deskriptive Statistik
Kennwerte <- function(x) c(n=length(x), mean=mean(x), sd=sd(x), se=sd(x)/sqrt(length(x)))
if (is.null(between)) {
  Formel <- as.formula(paste(".~", paste(paste(within, collapse="+"))))
} else {
Formel <- as.formula(paste(".~", paste(paste(within, collapse="+"), paste(between, collapse="+"), sep="+")))
}
deskriptive.statistik <- aggregate(Formel, data.long[,c(within, between, AV)], Kennwerte)

# Univariate Tests mit Greenhouse-Geisser und Huynh-Feldt-Korrekturen
# Für Within-Effekte mit df1=1 werden keine GG- und HF-Korrekturen gerechnet!
library(afex)
TAB <- aov_ez(id="Block", dv=AV, data=data.long, between=between, within=within, return="univariate")


# Partielles Eta-Quadrat und Power (univariat, ohne Sphärizitätskorrektur)
Effekte <- length(TAB$ univariate.tests[,1])-1
Power <- vector(length=Effekte)
eta.sq <- vector(length=Effekte)
for (i in 1:Effekte) {
df1 <- TAB$univariate.tests [,2][i+1]
df2 <- TAB$ univariate.tests[,4][i+1]
eta.sq[i] <- TAB$ univariate.tests[,5][i+1]*df1/(TAB$ univariate.tests[,5][i+1]*df1+df2)
ncp<- TAB$ univariate.tests[,5][i+1]*df1 # Analog SPSS: ncp=f^2*df2=(F*df1/df2)*df2; (G*Power: ncp=f^2*N)
Fk<- qf(1-0.05,df1,df2)
Power[i]<- 1-pf(Fk, df1=df1, df2=df2, ncp=ncp)}
# Tabelle mit EtaQuadrat und Power
eta.sq.Power <- data.frame(eta.sq, Power)
rownames(eta.sq.Power) <- rownames(TAB$univariate.tests)[-1]

# Berechnung der Least–Square-Mittelwerte bzw. Rand-Mittelwerte
library(emmeans)
if(is.null(between)){
Faktoren <- within
} else {
Faktoren <- as.formula(paste("~", paste(between, collapse="*"), "*", paste(within, collapse="*")))}
TAB2 <- aov_ez(id="Block", dv=AV, data=data.long, between=between, within=within)
ls.means <- lsmeans(TAB2, Faktoren)
  
list(Deskriptive.Statistik = deskriptive.statistik, ANOVA = TAB, Eta.Sq.Power=eta.sq.Power, "Geschätzte Randmittelwerte"=ls.means)
## $Deskriptive.Statistik
##       Messzeitpunkt Nachhilfe Geschlecht    Note.n Note.mean   Note.sd
## 1  nach.halbem.Jahr        ja   männlich 3.0000000 3.6666667 0.5773503
## 2           nachher        ja   männlich 3.0000000 3.0000000 1.0000000
## 3            vorher        ja   männlich 3.0000000 4.6666667 0.5773503
## 4  nach.halbem.Jahr      nein   männlich 3.0000000 4.0000000 1.0000000
## 5           nachher      nein   männlich 3.0000000 4.0000000 1.0000000
## 6            vorher      nein   männlich 3.0000000 4.3333333 0.5773503
## 7  nach.halbem.Jahr        ja   weiblich 2.0000000 3.5000000 0.7071068
## 8           nachher        ja   weiblich 2.0000000 3.5000000 0.7071068
## 9            vorher        ja   weiblich 2.0000000 4.5000000 0.7071068
## 10 nach.halbem.Jahr      nein   weiblich 3.0000000 4.0000000 0.0000000
## 11          nachher      nein   weiblich 3.0000000 4.3333333 0.5773503
## 12           vorher      nein   weiblich 3.0000000 4.6666667 0.5773503
##      Note.se
## 1  0.3333333
## 2  0.5773503
## 3  0.3333333
## 4  0.5773503
## 5  0.5773503
## 6  0.3333333
## 7  0.5000000
## 8  0.5000000
## 9  0.5000000
## 10 0.0000000
## 11 0.3333333
## 12 0.3333333
## 
## $ANOVA
## 
## Univariate Type III Repeated-Measures ANOVA Assuming Sphericity
## 
##                                    Sum Sq num Df Error SS den Df  F value
## (Intercept)                        515.56      1   7.2778      7 495.8838
## Nachhilfe                            1.39      1   7.2778      7   1.3359
## Geschlecht                           0.15      1   7.2778      7   0.1484
## Nachhilfe:Geschlecht                 0.06      1   7.2778      7   0.0534
## Messzeitpunkt                        4.49      2   3.5556     14   8.8472
## Nachhilfe:Messzeitpunkt              1.33      2   3.5556     14   2.6250
## Geschlecht:Messzeitpunkt             0.35      2   3.5556     14   0.6806
## Nachhilfe:Geschlecht:Messzeitpunkt   0.15      2   3.5556     14   0.2917
##                                       Pr(>F)    
## (Intercept)                        9.311e-08 ***
## Nachhilfe                           0.285683    
## Geschlecht                          0.711479    
## Nachhilfe:Geschlecht                0.823802    
## Messzeitpunkt                       0.003281 ** 
## Nachhilfe:Messzeitpunkt             0.107617    
## Geschlecht:Messzeitpunkt            0.522321    
## Nachhilfe:Geschlecht:Messzeitpunkt  0.751447    
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## 
## Mauchly Tests for Sphericity
## 
##                                    Test statistic  p-value
## Messzeitpunkt                             0.42187 0.075085
## Nachhilfe:Messzeitpunkt                   0.42187 0.075085
## Geschlecht:Messzeitpunkt                  0.42187 0.075085
## Nachhilfe:Geschlecht:Messzeitpunkt        0.42187 0.075085
## 
## 
## Greenhouse-Geisser and Huynh-Feldt Corrections
##  for Departure from Sphericity
## 
##                                     GG eps Pr(>F[GG])  
## Messzeitpunkt                      0.63366    0.01255 *
## Nachhilfe:Messzeitpunkt            0.63366    0.13721  
## Geschlecht:Messzeitpunkt           0.63366    0.46567  
## Nachhilfe:Geschlecht:Messzeitpunkt 0.63366    0.65590  
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
##                                       HF eps  Pr(>F[HF])
## Messzeitpunkt                      0.7098446 0.009467578
## Nachhilfe:Messzeitpunkt            0.7098446 0.130558517
## Geschlecht:Messzeitpunkt           0.7098446 0.479684744
## Nachhilfe:Geschlecht:Messzeitpunkt 0.7098446 0.679911971
## 
## $Eta.Sq.Power
##                                         eta.sq      Power
## Nachhilfe                          0.160256410 0.17084470
## Geschlecht                         0.020764120 0.06299155
## Nachhilfe:Geschlecht               0.007575758 0.05465780
## Messzeitpunkt                      0.558282209 0.93004974
## Nachhilfe:Messzeitpunkt            0.272727273 0.43648194
## Geschlecht:Messzeitpunkt           0.088607595 0.14198931
## Nachhilfe:Geschlecht:Messzeitpunkt 0.040000000 0.08741333
## 
## $`Geschätzte Randmittelwerte`
##  Nachhilfe Geschlecht Messzeitpunkt    lsmean    SE   df lower.CL upper.CL
##  ja        männlich   nach.halbem.Jahr   3.68 0.422 13.5     2.77     4.59
##  nein      männlich   nach.halbem.Jahr   4.02 0.422 13.5     3.11     4.92
##  ja        weiblich   nach.halbem.Jahr   3.52 0.485 14.8     2.48     4.55
##  nein      weiblich   nach.halbem.Jahr   4.02 0.422 13.5     3.11     4.92
##  ja        männlich   nachher            3.02 0.422 13.5     2.11     3.92
##  nein      männlich   nachher            4.02 0.422 13.5     3.11     4.92
##  ja        weiblich   nachher            3.52 0.485 14.8     2.48     4.55
##  nein      weiblich   nachher            4.35 0.422 13.5     3.44     5.26
##  ja        männlich   vorher             4.68 0.422 13.5     3.77     5.59
##  nein      männlich   vorher             4.35 0.422 13.5     3.44     5.26
##  ja        weiblich   vorher             4.52 0.485 14.8     3.48     5.55
##  nein      weiblich   vorher             4.68 0.422 13.5     3.77     5.59
## 
## Warning: EMMs are biased unless design is perfectly balanced 
## Confidence level used: 0.95

Multivariate Tests (Phillai)

library(afex)
TAB <- aov_ez(id="Block", dv=AV, data=data.long, between=between, within=within, return="Anova")
TAB
## 
## Type III Repeated Measures MANOVA Tests: Pillai test statistic
##                                    Df test stat approx F num Df den Df
## (Intercept)                         1   0.98608   495.88      1      7
## Nachhilfe                           1   0.16026     1.34      1      7
## Geschlecht                          1   0.02076     0.15      1      7
## Nachhilfe:Geschlecht                1   0.00758     0.05      1      7
## Messzeitpunkt                       1   0.64783     5.52      2      6
## Nachhilfe:Messzeitpunkt             1   0.35714     1.67      2      6
## Geschlecht:Messzeitpunkt            1   0.39552     1.96      2      6
## Nachhilfe:Geschlecht:Messzeitpunkt  1   0.05814     0.19      2      6
##                                       Pr(>F)    
## (Intercept)                        9.311e-08 ***
## Nachhilfe                            0.28568    
## Geschlecht                           0.71148    
## Nachhilfe:Geschlecht                 0.82380    
## Messzeitpunkt                        0.04368 *  
## Nachhilfe:Messzeitpunkt              0.26567    
## Geschlecht:Messzeitpunkt             0.22087    
## Nachhilfe:Geschlecht:Messzeitpunkt   0.83553    
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1

Geplante Vergleiche

Die unten verwendete Funktion contrast() berechnet die Prüfgrösse t wie folgt:

# Means <- summary(M)$lsmean; Contrast <- unlist(C); t <- sum(Contrast*Means)/sqrt(QSe/(n*dfe)*sum(Contrast^2))
# Means = Geschätzte Randmittelwerte, Contrast = Kontraskoefizienten
# QSe = Fehlerquadratsumme, dfe= Fehlerfreiheitsgrade, n = Zellgrösse
# QSe und dfe können aus der ANOVA-Tabelle beim entsprechnednen Effekt abgelesen werden.
# Falls die Sphärizitätsbedingung verletzt ist sollte man den p-Werte für within-Effekte
# mit korrigierten Freiheitsgraden berechnen: pf(t^2, GG.eps, dfe*GG.eps, lower.tail=FALSE)


Beispiel 1: Haupteffektkontrast Messzeitpunkt (vorher vs. nachher und nach.halbem.Jahr)
Die Abfolge der Kontrastkoeffizienten muss derjenigen der Stufen entsprechen.

C <- list(c(-1,-1,2))                 # Messzeitpunkt (vorher vs. nachher und nach.halbem.Jahr)
M <- lsmeans(TAB2, ~Messzeitpunkt)    # Least–Square-Mittelwerte
## NOTE: Results may be misleading due to involvement in interactions
contrast(M, C)
##  contrast     estimate    SE df t.ratio p.value
##  c(-1, -1, 2)     1.58 0.378 14 4.189   0.0009 
## 
## Results are averaged over the levels of: Nachhilfe, Geschlecht
# p-Wert mit "GG eps" korrigierten Freiheitsgraden:
pf(4.189^2, 0.634, 14*0.634, lower.tail=FALSE)
## [1] 0.004640286


Beispiel 2: Interaktionskontrast
Messzeitpunkt (vorher vs. nachher und nach.halbem.Jahr) * Nachhilfe (ja vs. nein) * Geschlecht (männlich vs. weiblich)

Messzeitpunkt <- c(-1,-1,2)           # Messzeitpunkt (vorher vs. nachher und nach.halbem.Jahr)
Nachhilfe <- c(-1,1)                  # Nachhilfe (ja vs. nein)
Geschlecht <- c(-1,1)                 # Geschlecht (männlich vs. weiblich)
C <- list(as.numeric(Messzeitpunkt %o% Nachhilfe %o% Geschlecht))   # Interaktion
M <- lsmeans(TAB2, ~Messzeitpunkt+Nachhilfe+Geschlecht)         # Least–Square-Mittelwerte
contrast(M, C)
##  contrast                                    estimate   SE df t.ratio p.value
##  c(-1, -1, 2, 1, 1, -2, 1, 1, -2, -1, -1, 2)        1 1.51 14 0.661   0.5191
# p-Wert mit "GG eps" korrigierten Freiheitsgraden:
pf(0.661^2, 0.634, 14*0.634, lower.tail=FALSE)
## [1] 0.4373113


Beispiel 3: Interaktionskontrast
Messzeitpunkt (vorher vs. nachher und nach.halbem.Jahr) * Nachhilfe (ja vs. nein) * Geschlecht (männlich vs. weiblich)

Messzeitpunkt <- c(-1,-1,2)           # Messzeitpunkt (vorher vs. nachher und nach.halbem.Jahr)
Nachhilfe <- c(-1,1)                  # Nachhilfe (ja vs. nein)
C <- list(as.numeric(Messzeitpunkt %o% Nachhilfe))   # Interaktion
M <- lsmeans(TAB2, ~Messzeitpunkt+Nachhilfe)         # Least–Square-Mittelwerte
## NOTE: Results may be misleading due to involvement in interactions
contrast(M, C)
##  contrast               estimate    SE df t.ratio p.value
##  c(1, 1, -2, -1, -1, 2)     -1.5 0.756 14 -1.984  0.0672 
## 
## Results are averaged over the levels of: Geschlecht
# p-Wert mit "GG eps" korrigierten Freiheitsgraden:
pf(1.984^2, 0.634, 14*0.634, lower.tail=FALSE)
## [1] 0.08765818


Post-hoc-Vergleiche nach Tukey

# M <- lsmeans(TAB2, ~Messzeitpunkt+Nachhilfe+Geschlecht)
# contrast(M, method="pairwise")


Grafiken

Für Boxplots, Histogramme und Liniendiagramme (Interaktionsplots) müssen Sie den Datensatz “data.long” verwenden!
Speichern Sie Ihren Originaldatensatz unter data4: data4 <- data
Setzen Sie data <- data.long
Spezifizieren Sie die Variablen gemäss Vorlage des gewünschten Plots.
Beispiel für den Interaktionsplot:

data4 <- data                 # Originaldatensatz unter data4 speichern
data <- data.long
# Variablen spezifizieren
Faktor1 <- "Messzeitpunkt"  # Name des ersten Faktors eingeben (Abszisse)
Faktor2 <- "Nachhilfe"      # Name des zweiten Faktors eingeben (Farbe)
Faktor3 <- "Geschlecht"     # Unterteilung der Plots
AV <- "Note"                # Name der abhängigen Variable eingeben
CI <- .95                   # gewünschtes Konfidenzintervall eingeben. Kein Konfidenzintervall: CI  <- 0
# Anschliessend alle Befehle nach 'Variablen spezifizieren' ausführen.

Hinweis: Interaktionsplot mit den geschätzten Randmittelwerten

# Faktornamen spezifizieren
Faktor1 <- "Messzeitpunkt"  # Name des ersten Faktors eingeben (Abszisse)
Faktor2 <- "Nachhilfe"      # Name des zweiten Faktors eingeben (Farbe)
Faktor3 <- "Geschlecht"     # Unterteilung der Plots
AV <- "Note"                # Name der abhängigen Variable eingeben
CI <- .95                   # gewünschtes Konfidenzintervall eingeben. Kein Konfidenzintervall: CI  <- 0
data.aggr <- summary(ls.means)  # Datensatz mit Mittelwerten und KI generieren

# "Liniendiagramm für Mittelwerte" aufrufen
# Den Code für die "Schwarzweissversion" oder die "Farbige Version" des entsprechenden Designs laufen lassen.
# Es werden die Mittelwerte mit 95%-Konfidenzintervallen dargestellt.