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:

data_s$sDurLog <- log(data_s$sDur)

Modell-Erstellung

Nun erstellen wir das Modell:

lineares.modell1 <- lm(sDurLog ~ speakingRate, data = data_s)

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:

lineares.modell2 <- lm(sDurLog ~ location, data = data_s)

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?

  1. Besprecht in der Gruppe, ob euch Probleme bzgl. Einfacher Linearer Regression auffallen. (Tipp: einfach ist nicht immer besser)
  2. Wie könnte man - ganz theoretisch - diese Probleme lösen? Denkt dabei abseits der Mathematik, hört auf eure Intuition.
  3. Experimentiert und erstellt weitere Modelle, gerne auch zu den anderen Datensätzen aus dem SfL Package.