Simple Lineare Regression
Auf dieser Seite findest du Übungen zu Einfacher 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
Einfache Lineare Regression wird in R mit dem lm()
Befehl umgesetzt. Dieser wird genutzt, um zu definieren, welche zwei Variablen voneinander abhängig modelliert werden sollen.
Hierbei orientiert man sich am besten an 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. \(\beta_1\) ist der Y-Achsenabschnitt, d.h. das Intercept, unserer Regressionsgeraden, und \(\beta_2\) ist die Steigung, d.h. der Slope, der Regressionsgeraden.
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. 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, data = data_s) lineares.modell1
Regressionsmodelle sollten immer als Objekt gespeichert werden. Daher nennen wir dieses erste Modell lineares.modell1
. 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:
lineares.modell1
Call:
lm(formula = sDurLog ~ speakingRate, data = data_s)
Coefficients:
(Intercept) speakingRate
-1.694 -0.121
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
: die Steigung der Regressionsgeraden
Beachte die folgende Darstellung, um (Intercept)
- und speakingRate
-Coefficients ungefähr wiederzufinden:
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 modelliert wird. Dies finden wir mit der anova()
Funktion heraus:
anova(lineares.modell1)
Analysis of Variance Table
Response: sDurLog
Df Sum Sq Mean Sq F value Pr(>F)
speakingRate 1 1.8858 1.88579 12.108 0.0006598 ***
Residuals 148 23.0506 0.15575
---
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.
Summary
Auch die summary()
Funktion kann mit Einfachen Linearen Modellen genutzt werden:
summary(lineares.modell1)
Call:
lm(formula = sDurLog ~ speakingRate, data = data_s)
Residuals:
Min 1Q Median 3Q Max
-0.9830 -0.2663 -0.0456 0.3001 0.9196
Coefficients:
Estimate Std. Error t value Pr(>|t|)
(Intercept) -1.69351 0.12418 -13.64 < 2e-16 ***
speakingRate -0.12096 0.03476 -3.48 0.00066 ***
---
Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
Residual standard error: 0.3946 on 148 degrees of freedom
Multiple R-squared: 0.07562, Adjusted R-squared: 0.06938
F-statistic: 12.11 on 1 and 148 DF, p-value: 0.0006598
Hier erhalten wir unter Call
zunächst wieder das Modell, welches wir zuvor erstellt haben.
Außerdem erhalten wir die Residuals
des Modells, welche einige statistische Messwerte beinhalten: Median, Mean, 1. und 3. Quartil, sowie den kleinsten und größten Wert.
Unter Coefficients
erhalten wir nun ausführlichere Informationen als zuvor. Erneut enthalten sind die Estimates
für (Intercept)
und speakingRate
. Außerdem erhalten wir nun auch den Standardfehler sowie t-Wert und p-Wert. Der t-Wert wird zur Berechnung des p-Wertes genutzt; der p-Wert gibt an, ob eine Variable (in diesem Fall speakingRate
) einen signifikanten Unterschied macht.
Die letzten drei Zeilen der summary()
sind für uns nicht so wichtig.
Kategorische Prediktoren
Aber nicht nur kontinuierliche Variablen wie Sprechgeschwindigkeit können in Einfacher Linearer Regression als vorhersagende Variable genutzt werden. Das folgende Modell nutzt die kategorische Variable location
:
<- lm(sDurLog ~ location, data = data_s) lineares.modell2
Schauen wir uns nun die ANOVA zu diesem Modell an, sieht diese wie folgt aus:
anova(lineares.modell2)
Analysis of Variance Table
Response: sDurLog
Df Sum Sq Mean Sq F value Pr(>F)
location 1 0.0165 0.016544 0.0983 0.7544
Residuals 148 24.9198 0.168377
Wir stellen fest: location
erhält keinen p-Wert unter \(0.05\), d.h. location
macht keine signifikanten Vorhersagen über die abhängige Variable, d.h. die Dauer von /s/.
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(lineares.modell1))
OK: Error variance appears to be homoscedastic (p = 0.439).
The line should be horizontal and flat.
Homoscedasticity
library(performance)
plot(check_heteroscedasticity(lineares.modell1))
OK: Error variance appears to be homoscedastic (p = 0.439).
Data points should be spread equally around the line, with no obvious patterns visible.
Normality
library(performance)
plot(check_normality(lineares.modell1))
OK: residuals appear as normally distributed (p = 0.296).
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
~gender
sDurLog
~typeOfS
sDurLog
~baseDurLog
sDurLog
~biphoneProbSumBin
sDurLog
~monoMultilingual
sDurLog
~pauseBin
sDurLog
~folType
sDurLog
~preC
Aus data_a
:
height
~gender
height
~hair
height
~eyes
Aus data_v
:
duration
~vowel
duration
~structure
duration
~rate
06 Extra
Schon fertig?
- Besprecht in der Gruppe, ob euch Probleme bzgl. Einfacher Linearer Regression auffallen. (Tipp: einfach ist nicht immer besser)
- Wie könnte man - ganz theoretisch - diese Probleme lösen? Denkt dabei abseits der Mathematik, hört auf eure Intuition.
- Experimentiert und erstellt weitere Modelle, gerne auch zu den anderen Datensätzen aus dem
SfL
Package.