Multiple Lineare Regression
Auf dieser Seite findest du Übungen zu Multipler Linearer Regression in R.
Der gesamte Code, den du hier findest, kann von dir 1:1 in R umgesetzt werden. Die größte Lernwirkung hat diese Einführung, wenn du möglichst alles einmal selbst in R durchführst.
01 Vorbereitungen
Bevor wir loslegen können, müssen wir die Packages laden, die wir für unser Vorhaben benötigen. Zunächst ist das nur das SfL
Package. Falls du dieses noch nicht geladen hast, hole dies nun nach:
library(SfL)
Nun laden wir die Datensätze, die wir nutzen werden:
data(data_a)
data(data_c)
data(data_s)
data(data_t)
data(data_v)
02 Einführung
Multiple Lineare Regression wird ebenso wie Einfache Lineare Regression wird in R mit dem lm()
Befehl umgesetzt. Dieser wird genutzt, um zu definieren, welche Variablen voneinander abhängig modelliert werden sollen.
Multiple Lineare Regression ist eine Erweiterung der allgemeinen Formel für Einfache Lineare Regression:
\[Y=\beta_1+\beta_2X+\epsilon\]
Hierbei beschreibt \(Y\) die Variable, welche wir modellieren, d.h. vorhersagen, möchten. \(X\) ist die Variable mit welcher wir \(Y\) vorhersagen möchten.
Hier nun die allgemeine Formel für Multiple Lineare Regression:
\[Y=\beta_{0}+\beta_{1}X_{1}+\beta_{2}X_{2}+...+\beta_{i}X_{i}+\epsilon\]
Wie zuvor ist auch hier \(Y\) die Variable, welche wir modellieren möchten. Anders als zuvor haben wir nun mehrere - multiple - \(X\) Variablen im Modell. All diese Variablen werden genutzt, um \(Y\) vorherzusagen. Jede dieser \(X\) Variablen verfügt über einen eigenen eigenen Slope: \(\beta_{i}\). Der Intercept des Modells ist durch \(\beta_{0}\) angegeben. \(\epsilon\) ist wie zuvor auch der Fehlerterm des Modells.
03 Modelling
Als Beispiel erstellen wir nun ein Einfaches Lineares Modell für die Dauer von /s/. Vorhergesagt werden soll die Dauer durch die Sprechgeschwindigkeit und die log-transformierte Dauer der Base. Wichtig ist auch bei Regressionsmodellen, dass die abhängige Variable möglichst normalverteilt ist. Daher überprüfen wir dies im nächsten Schritt.
Distribution Check
Wie wir bereits in vorherigen Sessions gesehen haben, ist sDur
nicht normalverteilt:
shapiro.test(data_s$sDur)
Shapiro-Wilk normality test
data: data_s$sDur
W = 0.93622, p-value = 2.761e-06
Wir nutzen daher eine log-transformierte Version der Variable als abhängige Variable im weiteren Vorgehen:
$sDurLog <- log(data_s$sDur) data_s
Modell-Erstellung
Nun erstellen wir das Modell:
<- lm(sDurLog ~ speakingRate + baseDurLog, data = data_s) lm_02
Regressionsmodelle sollten immer als Objekt gespeichert werden. Daher nennen wir dieses erste Modell lm_02
. So ist sichergestellt, dass wir das Modell auch mit weiteren Funktionen nutzen können.
Koeffizienten
Nun schauen wir uns zunächst an, was R ausgibt, wenn wir das erstellte Modell abfragen:
lm_02
Call:
lm(formula = sDurLog ~ speakingRate + baseDurLog, data = data_s)
Coefficients:
(Intercept) speakingRate baseDurLog
-1.03540 -0.03138 0.82203
Hier finden wir erneut die Formel zu unserem Modell sowie das genutze Datenset. Außerdem erhalten wir die Coefficients. Doch was beudeuten diese Angaben?
(Intercept)
: der Y-Achsenabschnitt unserer Regressionsgeraden, d.h. die durchschnittliche vorhergesagte Dauer eines /s/ bei niedrigster Sprechgeschwindigkeit.speakingRate
: Entspricht \(X_{1}\) in der generellen Formel; dies ist der Regressionskoeffizient der Variable.baseDurLog
: Entspricht \(X_{2}\) in der generellen Formel; dies ist der Regressionskoeffizient der Variable.
Signifikanz
Interessant nach dem Erstellen eines Modells ist natürlich die Frage, ob \(Y\) wirklich von \(X\) vorhergesagt werden kann, also ob im vorliegenden Fall die Dauer von /s/ durch die Sprechgeschwindigkeit und/oder die Base Duration modelliert wird. Dies finden wir mit der anova()
Funktion heraus:
anova(lm_02)
Analysis of Variance Table
Response: sDurLog
Df Sum Sq Mean Sq F value Pr(>F)
speakingRate 1 1.8858 1.8858 15.921 0.0001038 ***
baseDurLog 1 5.6391 5.6391 47.609 1.442e-10 ***
Residuals 147 17.4115 0.1184
---
Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
Hier erhalten wir einige Werte zu den Bestandteilen des Modells. Für uns interessant ist der p-Wert (Pr(>F)
): liegt dieser unter \(0.05\), so können wir davon ausgehen, dass \(X\) tatsächlich \(Y\) beeinflusst, d.h. modelliert.
Finding the Best Model
Nutzen wir Simple Lineare Regression, so ist jedes Modell ein finales Modell. Da wir nur eine Variable als vorhersagende Variable nutzen können, gibt es auch keine Auswahl zu treffen bzgl. der Variablenwahl.
Arbeiten wir allerdings mit Multipler Linearer Regression, so können wir theoretisch unendlich viele Variablen in ein Modell aufnehmen. Allerdings stellt sich oftmals heraus, dass das Behalten von Variablen ohne signifikante Effekte ein Modell insgesamt verschlechtert. Daher stellen sich die Fragen: Welche Variablen haben einen Effekt? Welche Variablen schaffen es in mein finales Modell?
Um diese Fragen zu beantworten, nehmen wir folgende zwei Punkte an:
- Wir haben erneut vor, sDurLog zu modellieren
- Wir haben Daten zu folgenden Dingen: speech rate, type of /s/, base duration, following pause, and biological sex
Mit diesen zwei Punkten können wir ein s.g. volles Modell erstellen:
<- lm(sDurLog ~ speakingRate + typeOfS + baseDurLog + pauseBin + bsex, data = data_s) lm_full
Schauen wir uns das volle Modell genauer an:
anova(lm_full)
Analysis of Variance Table
Response: sDurLog
Df Sum Sq Mean Sq F value Pr(>F)
speakingRate 1 1.8858 1.8858 21.7477 7.068e-06 ***
typeOfS 2 3.8115 1.9058 21.9779 4.755e-09 ***
baseDurLog 1 4.6265 4.6265 53.3544 1.790e-11 ***
pauseBin 1 1.9002 1.9002 21.9138 6.557e-06 ***
bsex 1 0.3126 0.3126 3.6049 0.05962 .
Residuals 143 12.3998 0.0867
---
Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
Anscheinend sind alle Variablen außer bsex
signifikante Prediktoren für sDurLog
.
Nun zurück zum eigentlichen Problem: Wie finden wir das beste Modell? Eine Möglichkeit wäre es, manuell einzelne Variablen zu entfernen und sich dabei an aufgestellten Kriterien zu orientieren. Diese Möglichkeit ist allerdings zeitaufwendig und fehleranfällig. Zum Glück stellt uns R eine viel bequemere Möglichkeit zur Verfügung:
step(lm_full)
Start: AIC=-359.94
sDurLog ~ speakingRate + typeOfS + baseDurLog + pauseBin + bsex
Df Sum of Sq RSS AIC
- speakingRate 1 0.14962 12.549 -360.14
<none> 12.400 -359.94
- bsex 1 0.31259 12.712 -358.21
- pauseBin 1 1.75782 14.158 -342.06
- typeOfS 2 2.81457 15.214 -333.26
- baseDurLog 1 2.67066 15.070 -332.68
Step: AIC=-360.14
sDurLog ~ typeOfS + baseDurLog + pauseBin + bsex
Df Sum of Sq RSS AIC
<none> 12.549 -360.14
- bsex 1 0.3856 12.935 -357.60
- pauseBin 1 1.7686 14.318 -342.37
- typeOfS 2 2.7324 15.282 -334.60
- baseDurLog 1 3.7772 16.327 -322.68
Call:
lm(formula = sDurLog ~ typeOfS + baseDurLog + pauseBin + bsex,
data = data_s)
Coefficients:
(Intercept) typeOfSnm typeOfSpl baseDurLog pauseBinpause bsexm
-1.5954 0.3266 0.1015 0.6665 0.2390 0.1148
Die erste Reihe des Outputs zeigt den AIC-Wert des vollen Modells an: \(-359.94\). Mit dem AIC-Wert kann man die Güte eines Modells angeben: Je kleiner der Wert, desto besser das Modell.
Darunter finden wir die Formel des vollen Modells: sDurLog ~ speakingRate + typeOfS + baseDurLog + pauseBin + bsex
.
Es folgt eine Tabelle, die alle Variablen des vollen Modells beinhaltet. Für jede Variable erstellt die step()
Funktion ein Modell ohne eben diese Variable. Beispiel: Ein Modell mit allen Variablen außer bsex hat einen AIC-Wert von \(-358.21\).
Anhand dieses Vorehens findet die step() Funktion schließlich das Modell mit der besten Variablenkombination, d.h. das Modell mit dem niedrigsten AIC-Wert. Die Formel dieses Modells ist unter Call
angegeben: sDurLog ~ typeOfS + baseDurLog + pauseBin + bsex
.
Zusätzlich wird uns der AIC-Wert des gefundenen Modells mitgeteilt; so können wir diesen direkt mit dem Ausgangswert vergleichen.
Zuletzt werden die Koeffizienten des neuen Modells gegeben.
Mit der gefundenen Formel können wir nun das finale Modell erstellen:
<- lm(formula = sDurLog ~ typeOfS + baseDurLog + pauseBin + bsex, data = data_s) lm_final
Summary
Wie auch bei Simpler Linearer Regression kann auch hier die summary()
Funktion genutzt werden:
summary(lm_final)
Call:
lm(formula = sDurLog ~ typeOfS + baseDurLog + pauseBin + bsex,
data = data_s)
Residuals:
Min 1Q Median 3Q Max
-0.77731 -0.17999 0.01121 0.20711 0.79500
Coefficients:
Estimate Std. Error t value Pr(>|t|)
(Intercept) -1.59544 0.13904 -11.475 < 2e-16 ***
typeOfSnm 0.32658 0.05984 5.458 2.05e-07 ***
typeOfSpl 0.10147 0.05997 1.692 0.0928 .
baseDurLog 0.66652 0.10124 6.583 8.00e-10 ***
pauseBinpause 0.23899 0.05305 4.505 1.36e-05 ***
bsexm 0.11482 0.05459 2.103 0.0372 *
---
Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
Residual standard error: 0.2952 on 144 degrees of freedom
Multiple R-squared: 0.4967, Adjusted R-squared: 0.4793
F-statistic: 28.43 on 5 and 144 DF, p-value: < 2.2e-16
Tukey Contrasts
Tukey Contrasts werden genutzt um die Level von kategorischen Prediktoren zu untersuchen, d.h. um zu schauen, ob diese signifikant verschieden zueinander sind.
library(SfL)
tukey(model = lm_final, predictor = typeOfS)
Simultaneous Tests for General Linear Hypotheses
Multiple Comparisons of Means: Tukey Contrasts
Fit: lm(formula = sDurLog ~ typeOfS + baseDurLog + pauseBin + bsex,
data = data_s)
Linear Hypotheses:
Estimate Std. Error t value Pr(>|t|)
nm - is == 0 0.32658 0.05984 5.458 < 1e-04 ***
pl - is == 0 0.10147 0.05997 1.692 0.211759
pl - nm == 0 -0.22512 0.05945 -3.787 0.000662 ***
---
Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
(Adjusted p values reported -- single-step method)
tukey(model = lm_final, predictor = pauseBin)
Simultaneous Tests for General Linear Hypotheses
Multiple Comparisons of Means: Tukey Contrasts
Fit: lm(formula = sDurLog ~ typeOfS + baseDurLog + pauseBin + bsex,
data = data_s)
Linear Hypotheses:
Estimate Std. Error t value Pr(>|t|)
pause - no_pause == 0 0.23899 0.05305 4.505 1.36e-05 ***
---
Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
(Adjusted p values reported -- single-step method)
tukey(model = lm_final, predictor = bsex)
Simultaneous Tests for General Linear Hypotheses
Multiple Comparisons of Means: Tukey Contrasts
Fit: lm(formula = sDurLog ~ typeOfS + baseDurLog + pauseBin + bsex,
data = data_s)
Linear Hypotheses:
Estimate Std. Error t value Pr(>|t|)
m - f == 0 0.11482 0.05459 2.103 0.0372 *
---
Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
(Adjusted p values reported -- single-step method)
04 Diagnostik
Wie wir bereits im Theorieteil gelernt haben, sind lineare Modelle nicht verlässlich, wenn ihre Annahmen (assumptions) verletzt sind. Daher checken wir diese in den folgenden Abschnitten.
Linearity
library(performance)
plot(check_heteroscedasticity(lm_final))
OK: Error variance appears to be homoscedastic (p = 0.294).
The line should be horizontal and flat.
Homoscedasticity
library(performance)
plot(check_heteroscedasticity(lm_final))
OK: Error variance appears to be homoscedastic (p = 0.294).
Data points should be spread equally around the line, with no obvious patterns visible.
Normality
library(performance)
plot(check_normality(lm_final))
OK: residuals appear as normally distributed (p = 0.374).
The distribution of a linear model’s residuals should be normally distributed as indicated by the greenish/blueish curve.
Independence
Independence cannot be checked visually. It is an assumption that you can test by examining the study design.
05 Aufgaben
Erstelle nun Einfache Lineare Modelle für die folgenden \(X\)- und \(Y\)-Variablen. Sei dir bei jedem Modell darüber im Klaren, ob die vorhersagende Variable kontinuierlich oder kategorisch ist.
Aus data_s
:
sDurLog
~bsex
+age
+location
sDurLog
~typeOfS
+pauseBin
sDurLog
~baseDurLog
+speakingRate
sDurLog
~biphoneProbSumBin
+folType
+preC
sDurLog
~bsex
+age
+location
+typeOfS
+pauseBin
+baseDurLog
+speakingRate
+biphoneProbSumBin
+folType
+preC
Aus data_a
:
height
~bsex
+hair
height
~hair
+eyes
height
~bsex
+hair
+hair
+eyes
Aus data_v
:
duration
~ vowel
+ structure
+ rate