Zunächst installieren wir Pakete, die wir benötigen, um die folgenden Analysen durchzuführen.

if (!require('rstudioapi')) install.packages('rstudioapi')
if (!require('dplyr')) install.packages('dplyr')

Jetzt laden wir die installierten Pakete. Das Paket “rstudioapi” enthält die Funktion getActiveDocumentContext(), die es uns später erleichtert, das Working Directory zu setzen. Das Paket “dplyr” benötigen wir, da wir mit der dort enthaltenen Funktion recode() Variablen einfach umkodieren können.

library(rstudioapi)
library(dplyr)

Nun schalten wir die wissenschaftliche Notation ab, um möglichst viele Nachkommastellen im Output zu erhalten (das kann vor allem für p-Werte wichtig sein, die sonst schwer zu interpretieren sind).

options(scipen=999)

Hier setzen wir das Working Directory auf den Pfad, in dem sich auch dieses Notebook befindet. Dadurch findet R alle nötigen Dateien, so lange sich diese im selben Ordner wie dieses Notebook auf Ihrem Rechner befinden.

setwd(dirname(getActiveDocumentContext()$path))

Der Mittelwertsvergleich zweier Stichproben

Wir laden den Datensatz “ttest.RData” ein (erste Zeile) und lassen ihn uns ausgeben (zweite Zeile), um ihn zu inspizieren.

load('ttest.RData')
ttest

Wir rechnen zunächst einen t-Test für unabhängige Stichproben, um zu überprüfen, ob sich die Therapie- und Kontrollgruppe signifikant in ihrem Selbstwert unterscheiden. Dazu nutzen wir die R-Basisfunktion t.test(). Diese Funktion ist vielseitig einsetzbar und kann neben t-Tests für unabhängige Stichproben, auch t-Tests für abhängige Stichproben und Einstichproben t-Tests durchführen. Um einen t-Test für unabhängige Stichproben für die uns vorliegenden Daten durchzuführen, übergeben wir der Funktion die folgenden Argumente:

t.test(formula = SW ~ gruppe, data = ttest, var.equal = TRUE)
## 
##  Two Sample t-test
## 
## data:  SW by gruppe
## t = -3.2627, df = 18, p-value = 0.004323
## alternative hypothesis: true difference in means between group Kontrollgruppe and group Therapiegruppe is not equal to 0
## 95 percent confidence interval:
##  -5.377292 -1.164708
## sample estimates:
## mean in group Kontrollgruppe mean in group Therapiegruppe 
##                        6.049                        9.320

Nun wollen wir die gleiche Analyse mittels einer linearen Regression replizieren. Wie Sie im untenstehenden Code sehen können, rechnet R anstandslos eine Regression von SW auf gruppe. Wie funktioniert das, wo doch die Variable “gruppe” eindeutig nicht intervallskaliert ist (sie nimmt nur die Werte “Kontrollgruppe” und “Therapiegruppe” an)? Offenbar kodiert R die Variable Gruppe im Hintergrund um, so dass die Kontrollgruppe den Wert 0 und die Therapiegruppe den Wert 1 erhält. Es handelt sich hierbei um eine sogenannte Dummy-Kodierung (dazu später mehr).

ttest_reg <- lm(formula = SW ~ gruppe, data = ttest)
summary(ttest_reg)
## 
## Call:
## lm(formula = SW ~ gruppe, data = ttest)
## 
## Residuals:
##     Min      1Q  Median      3Q     Max 
## -4.2300 -1.2450  0.2755  1.4828  2.9400 
## 
## Coefficients:
##                      Estimate Std. Error t value     Pr(>|t|)    
## (Intercept)            6.0490     0.7089   8.533 0.0000000967 ***
## gruppeTherapiegruppe   3.2710     1.0026   3.263      0.00432 ** 
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 2.242 on 18 degrees of freedom
## Multiple R-squared:  0.3716, Adjusted R-squared:  0.3367 
## F-statistic: 10.64 on 1 and 18 DF,  p-value: 0.004323

Was sagen die Werte dieser Regression nun aus? Wie Sie sehen ist der t-Test des Prädiktors identisch zum oben gerechneten t-Test für unabhängige Stichproben. Das Regressionsgewicht des Prädiktors entspricht, wie Sie anhand des obigen t-Tests für unabhängige Stichproben sehen können, der Mittelwertsdifferenz der beiden Gruppen. Das Regressionsgewicht der Konstante entspricht in diesem Fall dem Gruppenmittelwert der Gruppe, die mit 0 kodiert wurde, also der Kontrollgruppe.

Wie wir im vorherigen Kapitel zu Moderatoranalysen gelernt haben (und wie wir später noch sehen werden!), macht es oft Sinn, Prädiktorvariablen um 0 zu zentrieren. Wir nutzen die praktische Funktion recode() aus dem Paket dplyr, um unsere Variable umzukodieren. Diese Funktion erwartet als Argumente, welche Variable umkodiert werden soll und wie die alten Werte den neuen Werten zugeordnet werden sollen.

ttest$gruppe_num <- recode(ttest$gruppe, 'Kontrollgruppe' = -1, 'Therapiegruppe' = 1)

Wir rechnen nun die obige Regression noch einmal mit der neuen Variable “gruppe_num” als Prädiktor.

ttest_reg_kodiert <- lm(formula = SW ~ gruppe_num, data = ttest)
summary(ttest_reg_kodiert)
## 
## Call:
## lm(formula = SW ~ gruppe_num, data = ttest)
## 
## Residuals:
##     Min      1Q  Median      3Q     Max 
## -4.2300 -1.2450  0.2755  1.4828  2.9400 
## 
## Coefficients:
##             Estimate Std. Error t value         Pr(>|t|)    
## (Intercept)   7.6845     0.5013  15.330 0.00000000000895 ***
## gruppe_num    1.6355     0.5013   3.263          0.00432 ** 
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 2.242 on 18 degrees of freedom
## Multiple R-squared:  0.3716, Adjusted R-squared:  0.3367 
## F-statistic: 10.64 on 1 and 18 DF,  p-value: 0.004323

Betrachten wir nun zunächst einmal das Regressionsgewicht des Prädiktors. Wie wir sehen, bleibt der t-Test und das entsprechende p-Niveau identisch zur vorherigen Regression. Das Gewicht selbst wurde allerdings halbiert. Dies liegt daran, dass der Abstand zwischen Kontroll- und Therapiegruppe sich verdoppelt hat. Bei der vorherigen Kodierung (Kontrollgruppe = 0, Therapiegruppe = 1) betrug der Abstand zwischen den beiden Gruppen 1. Nach der neuen Kodierung (Kontrollgruppe = -1, Therapiegruppe = 1) beträgt der Abstand zwischen den beiden Gruppen nun 2. Multiplizieren wir also das Regressionsgewicht des Prädiktors aus der zweiten Analyse mit dem Faktor 2, erhalten wir wieder den Mittelwertsunterschied zwischen den beiden Gruppen. Hätten wir die beiden Gruppen mit -0.5 und 0.5 kodiert, wäre der Abstand wiederum 1 und wir erhielten wieder die Mittelwertsdifferenz der beiden Gruppen als Regressionsgewicht des Prädiktors.

Wenn wir nun das Regressionsgewicht der Konstante (intercept) betrachten, stellen wir fest, dass sich hier nicht nur die Größe des Gewichts, sondern auch der assoziierte t-Test (inklusive p-Niveau) verändert hat. Um uns klar zu machen, woran das liegt, lassen wir uns ein Streudiagramm mit den Werten für gruppe_num auf der X-Achse und den Werten für SW auf der Y-Achse ausgeben. Außerdem lassen wir uns die Regressionsgerade aus der zweiten Regression einzeichnen.

plot(ttest$gruppe_num, ttest$SW)
abline(ttest_reg_kodiert)

Wir sehen, dass die Regressionsgerade durch die Gruppenmittelwerte der beiden Gruppen läuft, die um 0 zentriert sind. Das Gewicht der Konstante zeigt uns nun an, welchen Wert auf der Y-Achse die Regressionsgerade bei einem Wert von 0 auf der X-Achse annimmt. Im Fall der Zentrierung der Gruppenvariable um 0 ist das der Wert 7.6845. Da beide Gruppen gleich groß sind und gleich weit vom 0-Punkt der X-Achse entfernt sind, entspricht dieser Wert dem Gesamtmittelwert unserer Stichprobe (also beider Gruppen zusammengenommen).

In der vorherigen Kodierung (Kontrollgruppe = 0, Therapiegruppe = 1), entsprach der Y-Wert, den die Regressionsgerade für den Wert X = 0 annahm logischerweise dem Mittelwert der Kontrollgruppe. Da der Mittelwert der Kontrollgruppe nur 6.0490 beträgt, ist auch der t-Test, der testet, ob sich dieser Wert von 0 unterscheidet, kleiner.

Kodierung von einfaktoriellen Plänen mit mehr als zwei Gruppen.

Nun wollen wir uns den Datensatz “dreigr” anschauen, der insgesamt drei Gruppen (Warte-KG, Therapie und Placebo-KG) enthält (es ist reiner Zufall, dass bei der unten ausgegebenen Anzeige jede Gruppe eine “Seite” hat).

load('dreigr.RData')
dreigr

Zunächst rechnen wir eine einfache Varianzanalyse, um zu sehen, ob es ingesamt Unterschiede zwischen den drei Gruppen gibt. Wir nutzen dazu die R-Basisfunktion aov(), die ähnlich zu t.test() und lm() die Argumente formula und data erwartet.1

anova_results <- aov(formula = SW ~ gruppe, data = dreigr)
summary (anova_results)
##             Df Sum Sq Mean Sq F value  Pr(>F)   
## gruppe       2  73.15   36.57    8.42 0.00144 **
## Residuals   27 117.28    4.34                   
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1

Wie können wir nun eine Regression mit einer dreigestuften unabhängigen Variable rechnen? Man könnte nun auf die Idee kommen (es sei gleich vorweggenommen, dass es sich um eine schlechte Idee handelt), einfach die nominalskalierte Variable in eine intervallskalierte Variable umzukodieren, so dass eine der beiden Gruppen “in der Mitte” zwischen den beiden anderen Gruppen liegt, also z.B. nach folgendem Schema:

Wir machen das nun einmal zu Demonstrationszwecken (obwohl es eine schlechte Idee ist). Dazu nutzen wir wieder die Funktion recode(), aus dem Paket “dplyr”.

dreigr$gruppe_num <- recode(dreigr$gruppe, 'Warte-KG' = -1, 'Therapie' = 0, 'Placebo-KG' = 1)

Rechnen wir nur eine Regression mit dieser neu kreierten Variable, erhalten wir zwar ein Ergebnis, aber dieses Ergebnis stimmt nicht mit dem Signifikanztest der unabhängigen Variable in der obigen Varianzanalyse überein:

bad_idea_reg <- lm(formula = SW ~ gruppe_num, data = dreigr)
summary(bad_idea_reg)
## 
## Call:
## lm(formula = SW ~ gruppe_num, data = dreigr)
## 
## Residuals:
##     Min      1Q  Median      3Q     Max 
## -4.1329 -1.6839 -0.4133  1.2238  5.1478 
## 
## Coefficients:
##             Estimate Std. Error t value            Pr(>|t|)    
## (Intercept)  7.11225    0.47608   14.94 0.00000000000000722 ***
## gruppe_num  -0.04063    0.58308   -0.07               0.945    
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 2.608 on 28 degrees of freedom
## Multiple R-squared:  0.0001734,  Adjusted R-squared:  -0.03553 
## F-statistic: 0.004855 on 1 and 28 DF,  p-value: 0.9449

Was ist hier passiert? Auch das können wir uns klarer machen, wenn wir uns ein Streudiagramm ausgeben lassen, bei dem die Werte von “gruppe_num” auf der X-Achse liegen und die Werte von “SW” auf der Y-Achse. Wieder lassen wir uns eine Regressionsgerade einzeichnen.

plot(dreigr$gruppe_num, dreigr$SW)
abline(bad_idea_reg)

Wir sehen, dass die Regressionsgerade versucht, die Residuen zu minimieren. Grafisch gesprochen bedeutet das, dass die Abstände zwischen den Punkten zur Gerade minimiert werden sollen. Die Regressionsgerade erfüllt diese Aufgabe zwar, aber weil die beiden äußeren Gruppen in etwa auf dem gleichen Niveau liegen und nur die mittlere Gruppe höher liegt, fällt der Unterschied der mittleren Gruppe zu den beiden anderen Gruppen bei der Berechnung der Regressionsgerade kaum ins Gewicht. Man sollte noch hinzufügen, dass die Regressionsgerade zwar eine höhere Steigung (bzw. einen höheren Abfall) hätte, wenn man die Therapie-Gruppe ganz nach links (bzw. ganz nach rechts) setzten würde (wenn wir also unsere Kodierung anders gemacht hätten). Trotzdem wäre die resultierende Analyse nicht richtig gewesen.

Lassen Sie uns nun versuchen, herauszufinden, was R macht, wenn man einfach die ursprüngliche Variable “gruppe” als Prädiktor in die Regression aufnimmt.

dummy_reg <- lm(formula = SW ~ gruppe, data = dreigr)
summary (dummy_reg)
## 
## Call:
## lm(formula = SW ~ gruppe, data = dreigr)
## 
## Residuals:
##     Min      1Q  Median      3Q     Max 
## -4.2300 -1.1231  0.2755  1.3352  2.9400 
## 
## Coefficients:
##                  Estimate Std. Error t value           Pr(>|t|)    
## (Intercept)        9.3200     0.6591  14.141 0.0000000000000531 ***
## gruppeWarte-KG    -3.2710     0.9320  -3.509            0.00159 ** 
## gruppePlacebo-KG  -3.3523     0.9320  -3.597            0.00127 ** 
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 2.084 on 27 degrees of freedom
## Multiple R-squared:  0.3841, Adjusted R-squared:  0.3385 
## F-statistic:  8.42 on 2 and 27 DF,  p-value: 0.001439

Wie Sie sehen können, entspricht der F-Test der globalen Varianzaufklärung exakt dem F-Test der Variable “gruppe” aus der obenstehenden Varianzanalyse. Offenbar war R also trotz der Nominalskalierung der Variable “gruppe” smart genug zu erkennen, wie es die Regression sinnvoll berechnen kann (damit ist R smarter als so manches kommerzielle Statistikprogramm). Was genau hat R hier gemacht? Es hat die im Buch beschriebene Dummy-Kodierung verwendet. Dabei wird eine Gruppe zur Referenzgruppe erklärt und alle anderen Gruppen werden jeweils mit dieser Referenzgruppe verglichen. In unserem Beispiel wurde die Therapie-Gruppe zur Referenzgruppe gemacht. Dementsprechend entspricht das Intercept in unserer Ausgabe dem Mittelwert von SW in der Therapiegruppe. Das Regressionsgewicht des Prädiktors “gruppeWarte-KG” entspricht nun der Mittelwertsdifferenz zwischen der Gruppe “Warte-KG” und der Referenzgruppe “Therapie”. Dementsprechend ist der Mittelwert der Warte-KG \(9.32 - 3.271 = 6.049\). Wie uns der assoziierte t-Test mitteilt, ist dieser Unterschied zwischen Warte-KG und Therapiegruppe signifikant. Analog kann das Regressionsgewicht des Prädiktors “gruppePlacebo-KG” interpretiert werden.

Wie hat R jedoch entschieden, welche Gruppe die Referenzgruppe sein soll? Dazu muss man sich klar machen, dass R weiß, dass es sich bei der Variable “gruppe” um eine nominalskalierte Variable handelt. Dadurch behandelt R diese Variable als Faktorvariable (factor). Jede Ausprägung einer Faktorvariable bildet dabei automatisch eine Faktorstufe (level). Man kann sich die Faktorstufen, mit der Funktion levels() anzeigen lassen, wie der folgende Code zeigt.

levels(dreigr$gruppe)
## [1] "Therapie"   "Warte-KG"   "Placebo-KG"

Wie man sieht, werden die Faktorstufen in einer bestimmten Reihenfolge ausgegeben. R macht nun einfach automatisch die erste Faktorstufe zur Referenzgruppe für die Dummy-Kodierung. Möchten Sie aus inhaltlichen Gründen die Dummy-Kodierung für ihre Regression ändern, können Sie das mittels der Funktion factor() tun, wie der untenstehende Code zeigt. Wir definieren uns hier eine neue Variable namens “gruppe_andere_reihenfolge”, bei der die Reihenfolge der Faktorstufen eine andere ist.

dreigr$gruppe_andere_reihenfolge <- factor(dreigr$gruppe, levels = c('Warte-KG', 'Placebo-KG', 'Therapie'))

Wir können nun mittels levels() sehen, dass die neue Variable eine andere Sortierung der Faktorstufen aufweist, bei der die Warte-KG im Rahmen einer Dummy-Kodierung automatisch zur Referenzgruppe gemacht werden würde.

levels(dreigr$gruppe_andere_reihenfolge)
## [1] "Warte-KG"   "Placebo-KG" "Therapie"

Nun wollen wir noch die Kontrastkodierung anwenden, die gegenüber der Dummy-Kodierung den Vorteil hat, dass die resultierenden Variablen unkorreliert voneinander sind. Details, wie die Kontrastkodierung zu bilden ist, können Sie dem Buchkapitel entnehmen. Wir bilden hier die Kontrastvariable K1, die den Unterschied zwischen der Therapiegruppe und den zwei Kontrollgruppen abbildet, und die Kontrastvariable K2, die den Unterschied zwischen den beiden Kontrollgruppen abbildet. Wir nutzen wieder die Funktion recode() aus dem Paket dplyr, um die Kodierungen vorzunehmen.

dreigr$K1 <- recode(dreigr$gruppe, 'Therapie' = 1, 'Warte-KG' = -0.5, 'Placebo-KG' = -0.5)
dreigr$K2 <- recode(dreigr$gruppe, 'Therapie' = 0, 'Warte-KG' = 1, 'Placebo-KG' = -1)

Nun rechnen wir eine Regression von SW auf die beiden neu gebildeten Kontrastvariablen.

kontrast_reg <- lm(formula = SW ~ K1 + K2, data = dreigr)
summary(kontrast_reg)
## 
## Call:
## lm(formula = SW ~ K1 + K2, data = dreigr)
## 
## Residuals:
##     Min      1Q  Median      3Q     Max 
## -4.2300 -1.1231  0.2755  1.3353  2.9400 
## 
## Coefficients:
##             Estimate Std. Error t value             Pr(>|t|)    
## (Intercept)  7.11225    0.38051  18.692 < 0.0000000000000002 ***
## K1           2.20775    0.53812   4.103             0.000337 ***
## K2           0.04063    0.46602   0.087             0.931170    
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 2.084 on 27 degrees of freedom
## Multiple R-squared:  0.3841, Adjusted R-squared:  0.3385 
## F-statistic:  8.42 on 2 and 27 DF,  p-value: 0.001439

Wie Sie sehen können, ist das Regressionsgewicht des ersten Kontrasts (der den Unterschied zwischen der Therapiegruppe und den beiden Kontrollgruppen repräsentiert) signifikant. Das Regressionsgewicht des zweiten Kontrasts (der den Unterschied zwischen den beiden Kontrollgruppen repräsentiert) ist nicht signifikant.

Mehrfaktorielle Varianzanalyse via multipler Regression

Nun wollen wir noch anschauen, wie man einen mehrfaktoriellen Versuchsplan mittels multipler Regression analysieren kann. Wir laden zunächst den Datensatz “Varianzanalyse.sav” und lassen ihn uns ausgeben.

load('Varianzanalyse.RData')
Varianzanalyse

Zunächst rechnen wir die “klassische” Analyse, die für derartige Versuchspläne vorgesehen ist, nämlich eine mehrfaktorielle Varianzanalyse.

anova_zweifaktor <- aov(formula = pl ~ Aengstlichkeit * Rueckmeldung, data = Varianzanalyse)
summary (anova_zweifaktor)
##                             Df Sum Sq Mean Sq F value Pr(>F)  
## Aengstlichkeit               1    462   461.7   2.061 0.1553  
## Rueckmeldung                 1     32    32.0   0.143 0.7065  
## Aengstlichkeit:Rueckmeldung  1   1319  1318.8   5.886 0.0176 *
## Residuals                   76  17028   224.1                 
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1

Wie wir sehen, gibt es zwar keine signfikanten Haupteffekte, aber eine signifikante Interaktion zwischen Ängstlichkeit und Rückmeldung. Nun wollen wir die Analyse mittels multipler Regression berechnen. Wir probieren zunächst einmal aus, was passiert, wenn wir einfach beide nominalskalierten Variablen als Prädiktoren in die Regression aufnehmen.

reg_zweifaktor <- lm(formula = pl ~ Aengstlichkeit * Rueckmeldung, data = Varianzanalyse)
summary(reg_zweifaktor)
## 
## Call:
## lm(formula = pl ~ Aengstlichkeit * Rueckmeldung, data = Varianzanalyse)
## 
## Residuals:
##     Min      1Q  Median      3Q     Max 
## -41.419 -10.916  -1.389   9.138  37.578 
## 
## Coefficients:
##                                           Estimate Std. Error t value
## (Intercept)                                 38.194      3.347  11.411
## Aengstlichkeithoch                          -3.316      4.733  -0.700
## RueckmeldungBestrafung                      -6.855      4.733  -1.448
## Aengstlichkeithoch:RueckmeldungBestrafung   16.241      6.694   2.426
##                                                      Pr(>|t|)    
## (Intercept)                               <0.0000000000000002 ***
## Aengstlichkeithoch                                     0.4858    
## RueckmeldungBestrafung                                 0.1517    
## Aengstlichkeithoch:RueckmeldungBestrafung              0.0176 *  
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 14.97 on 76 degrees of freedom
## Multiple R-squared:  0.0962, Adjusted R-squared:  0.06052 
## F-statistic: 2.696 on 3 and 76 DF,  p-value: 0.05177

Wie wir sehen, entspricht das Ergebnis für den Interaktionsterm dem Ergebnis der Interaktion in der Varianzanalyse, wobei gilt \(t = \sqrt{F}\). Für die Ergebnisse der beiden Haupteffekte gilt das jedoch nicht. Warum ist das so? Wir kennen dieses Problem schon aus dem vorherigen Kapitel zum Thema Moderationsanalyse: Wenn wir einen Interaktionsterm in eine Regression mit aufnehmen, aber die an der Interaktion beteiligten Variablen nicht vorher um 0 zentriert wurden, sind die ausgegebenen Regressionsgewichte für die Haupteffekte nicht sinnvoll interpretierbar. Wir wissen bereits aus den obigen Analysen, dass R nominalskalierte Variablen im Rahmen einer Regression automatisch Dummy-kodiert. Dummy-kodierte Variablen sind aber niemals um 0 zentriert: Wenn eine Faktorstufe den Wert 1 erhält und alle anderen den Wert 0, dann ist der Mittelwert der Dummy-kodierten Variable auf jeden Fall positiv von 0 verschieden.

Sie ahnen bereits: Um eine mehrfaktorielle Varianzanalyse sinnvoll regressionsanalytisch abzubilden, müssen wir die Variablen kontrastkodieren. Dies tun wir im Folgenden wieder mit der Funktion recode() aus dem Paket “dplyr”.

Varianzanalyse$K1 <- recode(Varianzanalyse$Aengstlichkeit, 'niedrig' = -1, 'hoch' = 1)
Varianzanalyse$K2 <- recode(Varianzanalyse$Rueckmeldung, 'Kontrolle' = -1, 'Bestrafung' = 1)

Nun rechnen wir eine Regression von pl auf die neu gebildeten, zentrierten Variablen.

reg_zweifaktor_kodiert <- lm(formula = pl ~ K1 * K2, data = Varianzanalyse)
summary(reg_zweifaktor_kodiert)
## 
## Call:
## lm(formula = pl ~ K1 * K2, data = Varianzanalyse)
## 
## Residuals:
##     Min      1Q  Median      3Q     Max 
## -41.419 -10.916  -1.389   9.138  37.578 
## 
## Coefficients:
##             Estimate Std. Error t value            Pr(>|t|)    
## (Intercept)  37.1690     1.6735  22.210 <0.0000000000000002 ***
## K1            2.4023     1.6735   1.435              0.1553    
## K2            0.6325     1.6735   0.378              0.7065    
## K1:K2         4.0602     1.6735   2.426              0.0176 *  
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 14.97 on 76 degrees of freedom
## Multiple R-squared:  0.0962, Adjusted R-squared:  0.06052 
## F-statistic: 2.696 on 3 and 76 DF,  p-value: 0.05177

Nun entsprechen auch die Ergebnisse der Haupteffekte in der Regression den Ergebnissen der Haupteffekte in der obigen Varianzanalyse.


  1. Wir sollten anmerken, dass wir die Funktion aov() hier nur zu Illustrationszwecken verwenden, da sie sehr leicht anzuwenden ist. Für die meisten Fälle raten wir von der Nutzung dieser Funktion ab, da sie keine within-subjects Analysen erlaubt und bei between-subjects Analysen mit ungleichen Gruppengrößen zu falschen Ergebnissen führt. Daher raten wir generell zur Nutzung von Funktionen aus Paketen, die mit derartigen Daten adäquat umgehen können. In den folgenden Kapiteln werden wir eines dieser Pakete kennenlernen: “car”. Andere geeignete Pakete sind beispielsweise “ez” oder “afex”.↩︎