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))
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:
lm()
anzugeben, nur dass wir logischerweise nur eine
zweigestufte unabhängige Variable haben können: Abhängige Variable ~
unabhängige Variablet.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.
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.
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.
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”.↩︎