[Courtesy of pxhere](https://pxhere.com/en/photo/411588) Courtesy of pxhere

Einfache Lineare Regression

Kernfragen dieser Lehreinheit

Vorbereitende Schritte

Den Datensatz fb23 haben wir bereits über diesen Link heruntergeladen und können ihn über den lokalen Speicherort einladen oder Sie können Ihn direkt mittels des folgenden Befehls aus dem Internet in das Environment bekommen. Im letzten Tutorial und den dazugehörigen Aufgaben haben wir bereits Änderungen am Datensatz durchgeführt, die hier nochmal aufgeführt sind, um den Datensatz auf dem aktuellen Stand zu haben:

#### Was bisher geschah: ----

# Daten laden
load(url('https://pandar.netlify.app/daten/fb23.rda'))  

# Nominalskalierte Variablen in Faktoren verwandeln
fb23$hand_factor <- factor(fb23$hand,
                             levels = 1:2,
                             labels = c("links", "rechts"))
fb23$fach <- factor(fb23$fach,
                    levels = 1:5,
                    labels = c('Allgemeine', 'Biologische', 'Entwicklung', 'Klinische', 'Diag./Meth.'))
fb23$ziel <- factor(fb23$ziel,
                        levels = 1:4,
                        labels = c("Wirtschaft", "Therapie", "Forschung", "Andere"))

fb23$wohnen <- factor(fb23$wohnen, 
                      levels = 1:4, 
                      labels = c("WG", "bei Eltern", "alleine", "sonstiges"))

fb23$fach_klin <- factor(as.numeric(fb23$fach == "Klinische"),
                         levels = 0:1,
                         labels = c("nicht klinisch", "klinisch"))

fb23$ort <- factor(fb23$ort, levels=c(1,2), labels=c("FFM", "anderer"))

fb23$job <- factor(fb23$job, levels=c(1,2), labels=c("nein", "ja"))


# Rekodierung invertierter Items
fb23$mdbf4_pre_r <- -1 * (fb23$mdbf4_pre - 4 - 1)
fb23$mdbf11_pre_r <- -1 * (fb23$mdbf11_pre - 4 - 1)
fb23$mdbf3_pre_r <-  -1 * (fb23$mdbf3_pre - 4 - 1)
fb23$mdbf9_pre_r <-  -1 * (fb23$mdbf9_pre - 4 - 1)
fb23$mdbf5_pre_r <- -1 * (fb23$mdbf5_pre - 4 - 1)
fb23$mdbf7_pre_r <- -1 * (fb23$mdbf7_pre - 4 - 1)


# Berechnung von Skalenwerten
fb23$wm_pre  <- fb23[, c('mdbf1_pre', 'mdbf5_pre_r', 
                        'mdbf7_pre_r', 'mdbf10_pre')] |> rowMeans()
fb23$gs_pre  <- fb23[, c('mdbf1_pre', 'mdbf4_pre_r', 
                        'mdbf8_pre', 'mdbf11_pre_r')] |> rowMeans()
fb23$ru_pre <-  fb23[, c("mdbf3_pre_r", "mdbf6_pre", 
                         "mdbf9_pre_r", "mdbf12_pre")] |> rowMeans()

# z-Standardisierung
fb23$ru_pre_zstd <- scale(fb23$ru_pre, center = TRUE, scale = TRUE)

Einfache lineare Regression

Nachdem wir mit der Korrelation mit der gemeinsamen Betrachtung von zwei Variablen begonnen haben, werden wir jetzt lineare Modelle erstellen, uns Plots - inklusive Regressionsgerade - für Zusammenhänge anzeigen lassen und Determinationskoeffizienten berechnen. Korrelation und einfache Regression sind beides Verfahren, die sich mit dem Zusammenhang zweier Variablen befassen. Mithilfe einer Korrelation lässt sich die Stärke eines Zusammenhangs quantifizieren. Die einfache Regression hingegen verfolgt das Ziel, eine Variable mithilfe einer anderen Variable vorherzusagen. Die vorhergesagte Variable wird als Kriterium, Regressand oder auch abhängige Variable (AV) bezeichnet und üblicherweise mit $y$ symbolisiert. Die Variablen zur Vorhersage der abhängigen Variablen werden als Prädiktoren, Regressoren oder unabhängige Variablen (UV) bezeichnet und üblicherweise mit $x$ symbolisiert. Auch wenn wir in der Regression gezwungenermaßen einen gerichteten Zusammenhang angeben müssen (sprich, $x$ sagt $y$ vorher), so lässt eine Regression trotzdem keinen Schluss über kausale Zusammenhänge zu! Dies werden wir uns am Ende dieser Sitzung nochmal anschauen.

Modellschätzung

Die Modellgleichung für die lineare Regression, wie sie in der Vorlesung besprochen wurde, lautet: $y_m = b_0 + b_1 x_m + e_m$

In R gibt es eine interne Schreibweise, die sehr eng an diese Form der Notation angelehnt ist. Mit ?formula können Sie sich detailliert ansehen, welche Modelle in welcher Weise mit dieser Notation dargestellt werden können. R verwendet diese Notation für (beinahe) alle Modelle, sodass es sich lohnt, sich mit dieser Schreibweise vertraut zu machen. Die Kernelemente sind im Fall der linearen einfachen Regression:

y ~ 1 + x

Diese Notation enthält fünf Elemente:

  • y: die abhängige Variable
  • ~: die Notation für “regrediert auf” oder “vorhergesagt durch”
  • 1: die Konstante 1
  • +: eine additive Verknüpfung der Elemente auf der rechten Seite der Gleichung
  • x: eine unabhängige Variable

Die Notation beschreibt also die Aussage “$y$ wird regrediert auf die Konstante $1$ und die Variable $x$”. Die zu schätzenden Parameter $b_0$ und $b_1$ werden in dieser Notation nicht erwähnt, weil sie uns unbekannt sind.

R geht generell davon aus, dass immer auch der Achsenabschnitt $b_0$ geschätzt werden soll, sodass y ~ x ausreichend ist, um eine Regression mit einem Achsenabschnitt zu beschreiben. Wenn das Intercept unterdrückt werden soll, muss das mit y ~ 0 + x explizit gemacht werden.

Um nun eine einfache Regression an unserem Datensatz durchführen zu können, betrachten wir folgende Fragestellung:

  • Zeigt die Extraversion (extra) aus dem Selbstbericht einen linearen Zusammenhang mit der selbst eingeschätzten “Nerdiness” (nerd)?

Für gewöhnlich würden Sie nun zuerst einmal die Voraussetzungen überprüfen. Diese werden wir in der kommenden Sitzung ausführlich besprechen. Jetzt schauen wir uns die Daten erst einmal nur an. Dies tun wir mithilfe eines Scatterplots. Wenn wir darin den beobachteten lokalen Zusammenhang abbilden, können wir auch schon visuell beurteilen, ob der Zusammenhang denn auch linear ist.

plot(fb23$extra, fb23$nerd, xlab = "Extraversion", ylab = "Nerdiness", 
     main = "Zusammenhang zwischen Extraversion und Nerdiness", xlim = c(0, 6), ylim = c(1, 5), pch = 19)
lines(loess.smooth(fb23$extra, fb23$nerd), col = 'blue')    #beobachteter, lokaler Zusammenhang

  • pch verändert die Darstellung der Datenpunkte
  • xlim und ylim veränderen die X- bzw. Y-Achse
  • mit cex könnte man noch die Größe der Datenpunkte anpassen

Interpretation: Eine lineare Beziehung scheint den Zusammenhang aus extra und nerd akkurat zu beschreiben. Ein bspw. u-förmiger Zusammenhang ist nicht zu erkennen.

In unserem Beispiel ist $x$ die Extraversion (extra) und $y$ die Nerdiness (nerd). Um das Modell zu schätzen, wird dann der lm() (für linear model) Befehl genutzt:

lm(formula = nerd ~ 1 + extra, data = fb23)
## 
## Call:
## lm(formula = nerd ~ 1 + extra, data = fb23)
## 
## Coefficients:
## (Intercept)        extra  
##      3.7199      -0.2103

So werden die Koeffizienten direkt ausgegeben. Wenn wir mit dem Modell jedoch weitere Analysen durchführen möchten, müssen wir es einem Objekt im Environment zuweisen. Dafür legen wir es im Objekt lin_mod (steht für lineares Modell) ab. Hier in verkürzter Schreibweise (wir lassen die 1 als Repräsentant für den Achsenabschnitt weg):

lin_mod <- lm(nerd ~ extra, fb23)                  #Modell erstellen und Ergebnisse im Objekt lin_mod ablegen

Aus diesem Objekt können mit coef() oder auch lin_mod$coefficients die geschätzten Koeffizienten extrahiert werden:

coef(lin_mod) 
## (Intercept)       extra 
##   3.7198838  -0.2103006
lin_mod$coefficients
## (Intercept)       extra 
##   3.7198838  -0.2103006

Falls man sich unsicher ist, wie dieses Modell zustande gekommen ist, kann man dies ausdrücklich erfragen:

formula(lin_mod)
## nerd ~ extra

Streu-Punktdiagramm mit Regressionsgerade

Das Streudiagramm haben wir zu Beginn schon abbilden lassen. Hier kann nun zusätzlich noch der geschätzte Zusammenhang zwischen den beiden Variablen als Regressiongerade eingefügt werden. Hierzu wird der Befehl plot() durch abline() ergänzt:

# Scatterplot zuvor im Skript beschrieben
plot(fb23$extra, fb23$nerd, 
  xlim = c(0, 6), ylim = c(1, 5), pch = 19)
lines(loess.smooth(fb23$extra, fb23$nerd), col = 'blue')    #beobachteter, lokaler Zusammenhang
# Ergebnisse der Regression als Gerade aufnehmen
abline(lin_mod, col = 'red')

In lin_mod$coefficients stehen die Regressionskoeffizienten $b_0$ unter (Intercept) zur Konstanten gehörend und $b_1$ unter dem Namen der Variable, die wir als Prädiktor nutzen. In diesem Fall also extra. Die Regressionsgleichung hat daher die folgende Gestalt: $y_i = 3.72 + -0.21 \cdot x + e_i$.

Regressionsgleichung (unstandardisiert):

$$\hat{y} = b_0 + b_1*x_m$$ $$\hat{y} = 3.72 + (-0.21)*x_m$$

Interpretation der Regressionskoeffizienten:

  • $b_0$ (Achsenabschnitt): beträgt die Extraversion 0, wird eine Nerdiness von 3.72 vorhergesagt
  • $b_1$ (Regressionsgewicht): mit jeder Steigerung der Extraversion um 1 Einheit wird eine um 0.21 Einheiten niedrigere (!) Nerdiness vorhergesagt

Residuen Werte

Mit dem Befehl lm() werden auch automatisch immer die Residuen ($e_m$) geschätzt, die mit residuals() (oder alternativ: resid()) abgefragt werden können. Die Residuen betragen die Differenzen zu den vorhergesagten Werten bzw. zur Regressionsgeraden.

residuals(lin_mod)
##            1            2            3            4            5            7            8            9 
##  1.182835060 -0.088981917 -0.545347963 -0.255648584  0.954652037  0.559802347  0.182835060  0.349501727 
##           10           11           12           13           14           15           16           17 
##  0.472534439 -0.088981917  0.893135681 -0.606864319  0.244351416 -0.176249825  0.472534439 -0.694132227 
##           18           19           20           21           22           23           24           25 
##  0.744351416  0.682835060  0.762233819  0.349501727 -0.360798894  0.139201106 -0.545347963  0.016168393 
##           26           27           28           29           30           31           32           33 
##  1.911018083 -0.088981917  0.121318704  0.411018083  0.121318704 -0.088981917  0.244351416 -0.273530986 
##           34           35           36           37           38           39           40           41 
## -0.194132227  0.164952658  0.472534439 -0.465949204 -0.299282537 -0.878681296 -0.001714009  0.393135681 
##           42           43           44           45           46           47           48           49 
##  0.639201106 -0.045347963  0.577684750  0.411018083  0.331619324 -0.712014630 -0.799282537  1.139201106 
##           50           51           52           53           54           55           56           57 
## -0.045347963  0.059802347  0.305867773 -0.360798894  0.516168393  0.226469014 -0.273530986  1.349501727 
##           58           59           60           61           62           63           64           65 
## -1.106864319  0.516168393 -0.922315250 -0.422315250  0.393135681  0.559802347 -0.606864319  0.595567152 
##           66           67           68           69           70           71           72           73 
##  0.454652037  0.621318704  0.972534439  0.621318704  0.428900486 -0.799282537 -0.545347963 -0.588981917 
##           74           75           76           77           78           79           80           81 
##  0.244351416 -1.817164940 -0.335047342 -0.817164940 -0.360798894 -0.255648584  0.077684750 -0.650498273 
##           82           83           84           85           86           87           88           89 
## -1.483831607 -0.317164940 -0.378681296 -0.360798894  0.121318704  0.244351416 -0.027465561  0.516168393 
##           90           91           92           93           94           95           96           97 
##  0.182835060  0.911018083  0.534050796 -0.299282537  0.867384129  0.595567152 -0.378681296 -0.440197653 
##           98           99          101          102          103          104          105          106 
##  0.639201106  0.305867773  0.182835060 -0.650498273 -0.255648584 -0.588981917 -0.440197653 -0.527465561 
##          107          108          109          110          111          112          113          114 
## -0.755648584 -0.212014630  0.287985370 -0.150498273  0.744351416 -0.527465561  0.516168393  0.182835060 
##          115          116          117          118          119          120          121          122 
## -0.694132227  0.305867773 -0.212014630  0.621318704 -0.422315250  0.393135681 -0.237766181 -0.106864319 
##          123          124          126          127          128          129          130          131 
## -1.465949204 -0.483831607 -0.299282537  0.349501727  0.700717463  0.639201106  0.454652037 -0.799282537 
##          132          133          134          135          136          137          138          139 
## -0.360798894  0.787985370  0.077684750  0.077684750  0.305867773 -0.527465561 -0.194132227 -0.071099514 
##          140          141          142          143          144          145          146          147 
## -0.027465561 -1.255648584 -0.273530986  0.034050796  0.831619324 -1.045347963  0.016168393  0.182835060 
##          148          149          150          151          152          153          154          155 
##  0.016168393  0.244351416 -0.422315250 -0.299282537  0.972534439 -0.212014630 -0.378681296  1.139201106 
##          156          157          158          159          160          161          162          163 
##  0.287985370 -0.860798894 -0.001714009 -0.527465561 -0.045347963  0.287985370 -0.835047342  1.516168393 
##          164          165          166          167          168          169          170          171 
##  0.059802347  0.121318704 -0.440197653  0.182835060 -0.878681296 -0.755648584 -0.588981917  0.244351416 
##          172          173          174          175          176          177          178          179 
## -0.422315250 -0.360798894  0.831619324  0.657083509  0.954652037 -0.527465561 -0.378681296 -0.817164940 
##          180          181          182 
## -0.212014630  0.472534439 -1.132615871

Die Residuen haben die Bedeutung des “Ausmaßes an Nerdiness, das nicht durch Extraversion vorhergesagt werden kann” - also die Differenz aus vorhergesagtem und tatsächlich beobachtetem Wert der y-Variable (Nerdiness).

Vorhergesagte Werte

Die vorhergesagten Werte $\hat{y}$ können mit predict() ermittelt werden:

predict(lin_mod)
##        1        2        3        4        5        7        8        9       10       11       12       13 
## 2.983832 3.088982 2.878681 3.088982 2.878681 2.773531 2.983832 2.983832 3.194132 3.088982 2.773531 2.773531 
##       14       15       16       17       18       19       20       21       22       23       24       25 
## 3.088982 3.509583 3.194132 3.194132 3.088982 2.983832 3.404433 2.983832 3.194132 3.194132 2.878681 2.983832 
##       26       27       28       29       30       31       32       33       34       35       36       37 
## 3.088982 3.088982 2.878681 3.088982 2.878681 3.088982 3.088982 2.773531 3.194132 2.668381 3.194132 3.299283 
##       38       39       40       41       42       43       44       45       46       47       48       49 
## 3.299283 2.878681 2.668381 2.773531 3.194132 2.878681 3.088982 3.088982 2.668381 2.878681 3.299283 3.194132 
##       50       51       52       53       54       55       56       57       58       59       60       61 
## 2.878681 2.773531 3.194132 3.194132 2.983832 2.773531 2.773531 2.983832 2.773531 2.983832 3.088982 3.088982 
##       62       63       64       65       66       67       68       69       70       71       72       73 
## 2.773531 2.773531 2.773531 3.404433 2.878681 2.878681 3.194132 2.878681 3.404433 3.299283 2.878681 3.088982 
##       74       75       76       77       78       79       80       81       82       83       84       85 
## 3.088982 2.983832 2.668381 2.983832 3.194132 3.088982 3.088982 2.983832 2.983832 2.983832 2.878681 3.194132 
##       86       87       88       89       90       91       92       93       94       95       96       97 
## 2.878681 3.088982 3.194132 2.983832 2.983832 3.088982 3.299283 3.299283 3.299283 3.404433 2.878681 2.773531 
##       98       99      101      102      103      104      105      106      107      108      109      110 
## 3.194132 3.194132 2.983832 2.983832 3.088982 3.088982 2.773531 3.194132 3.088982 2.878681 2.878681 2.983832 
##      111      112      113      114      115      116      117      118      119      120      121      122 
## 3.088982 3.194132 2.983832 2.983832 3.194132 3.194132 2.878681 2.878681 3.088982 2.773531 3.404433 2.773531 
##      123      124      126      127      128      129      130      131      132      133      134      135 
## 3.299283 2.983832 3.299283 2.983832 3.299283 3.194132 2.878681 3.299283 3.194132 2.878681 3.088982 3.088982 
##      136      137      138      139      140      141      142      143      144      145      146      147 
## 3.194132 3.194132 3.194132 3.404433 3.194132 3.088982 2.773531 3.299283 2.668381 2.878681 2.983832 2.983832 
##      148      149      150      151      152      153      154      155      156      157      158      159 
## 2.983832 3.088982 3.088982 3.299283 3.194132 2.878681 2.878681 3.194132 2.878681 3.194132 2.668381 3.194132 
##      160      161      162      163      164      165      166      167      168      169      170      171 
## 2.878681 2.878681 2.668381 2.983832 2.773531 2.878681 2.773531 2.983832 2.878681 3.088982 3.088982 3.088982 
##      172      173      174      175      176      177      178      179      180      181      182 
## 3.088982 3.194132 2.668381 3.509583 2.878681 3.194132 2.878681 2.983832 2.878681 3.194132 3.299283

Per Voreinstellung werden hier die vorhergesagten Werte aus unserem ursprünglichen Datensatz dargestellt. predict() erlaubt uns aber auch Werte von “neuen” Beobachtungen vorherzusagen. Nehmen wir an, wir würden die Extraversion von 5 neuen Personen beobachten (sie haben - vollkommen zufällig - die Werte 1, 2, 3, 4 und 5) und diese Beobachtungen in einem neuem Datensatz extra_neu festhalten:

extra_neu <- data.frame(extra = c(1, 2, 3, 4, 5))

Anhand unseres Modells können wir für diese Personen auch ihre Nerdiness vorhersagen, obwohl wir diese nicht beobachtet haben:

predict(lin_mod, newdata = extra_neu)
##        1        2        3        4        5 
## 3.509583 3.299283 3.088982 2.878681 2.668381

Damit diese Vorhersage funktioniert, muss im neuen Datensatz eine Variable mit dem Namen extra vorliegen. Vorhergesagte Werte liegen immer auf der Regressionsgeraden.


Inferenzstatistische Überprüfung der Regressionsparameter b

Signifikanztestung der Regressionskoeffizienten

Nun möchten wir aber vielleicht wissen, ob der beobachtete Zusammenhang auch statistisch bedeutsam ist oder vielleicht nur durch Zufallen zustande gekommen ist. Zuerst kann die Betrachtung der Konfidenzintervalle helfen. Der Befehl confint() berechnet die Konfidenzintervalle der Regressionsgewichte.

#Konfidenzintervalle der Regressionskoeffizienten
confint(lin_mod)
##                  2.5 %     97.5 %
## (Intercept)  3.3859075  4.0538600
## extra       -0.3087968 -0.1118044

Das Konfidenzintervall von -0.309 und -0.112 ist der Bereich, in dem wir den wahren Wert vermuten können. Zur Erinnerung: das 95% Konfidenzintervall besagt, dass, wenn wir diese Studie mit der selben Stichprobengröße sehr oft wiederholen, 95% aller realisierten Konfidenzintervalle den wahren Wert für $b_1$ enthalten werden. Da die 0 nicht in diesem Intervall enthalten ist, ist 0 ein eher unwahrscheinlicher wahrer Wert für $b_1$.

  • $b_1$

    • H0: $b_1 = 0$, das Regressionsgewicht ist nicht von 0 verschieden.
    • H1: $b_1 \neq 0$, das Regressionsgewicht ist von 0 verschieden.
  • $b_0$ (häufig nicht von Interesse)

    • H0: $b_0 = 0$, der y-Achsenabschnitt ist nicht von 0 verschieden.
    • H1: $b_0 \neq 0$, der y-Achsenabschnitt ist von 0 verschieden.

Für beide Parameter ($b_1$ uns $b_0$) wird die H0 auf einem alpha-Fehler-Niveau von 5% verworfen, da die 0 nicht im jeweiligen 95% Konfidenzintervall enthalten ist.

Eine andere Möglichkeit zur interferenzstatistischen Überprüfung ergibt sich über die p-Werte der Regressionskoeffizienten. Diese werden über die summary()-Funktion ausgegeben. summary() fasst verschiedene Ergebnisse eines Modells zusammen und berichtet unter anderem auch Signifikanzwerte.

#Detaillierte Modellergebnisse
summary(lin_mod)
## 
## Call:
## lm(formula = nerd ~ extra, data = fb23)
## 
## Residuals:
##      Min       1Q   Median       3Q      Max 
## -1.81716 -0.42232 -0.00171  0.41996  1.91102 
## 
## Coefficients:
##             Estimate Std. Error t value Pr(>|t|)    
## (Intercept)  3.71988    0.16923  21.981   <2e-16 ***
## extra       -0.21030    0.04991  -4.214    4e-05 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 0.6033 on 177 degrees of freedom
## Multiple R-squared:  0.09116,	Adjusted R-squared:  0.08603 
## F-statistic: 17.75 on 1 and 177 DF,  p-value: 3.999e-05

Aus summary(): $p < \alpha$ $\rightarrow$ H1: Das Regressionsgewicht für den Prädiktor Extraversion ist signifikant von 0 verschieden. Der Zusammenhang von Extraversion und Nerdiness ist statistisch bedeutsam.

Aus summary(): $p < \alpha$ $\rightarrow$ H1: der Achsenabschnitt ist signifikant von 0 verschieden. Beträgt die Extraversion 0 wird eine von 0 verschiedene Nerdiness vorhergesagt.

Konfidenzinteralle und p-Werte für Regressionskoeffizienten kommen immer zu denselben Schlussfolgerungen in Bezug darauf, ob die H0 beibehalten oder verworfen wird!


Determinationskoeffizient $R^2$

Darüber hinaus können wir uns auch anschauen, wie gut unser aufgestelltes Modell generell zu den Daten passt und Varianz erklärt. Der Determinationskoeffizient $R^2$ ist eine Kennzahl zur Beurteilung der Anpassungsgüte einer Regression. Anhand dessen kann bewertet werden, wie gut Messwerte zu einem Modell passen. Das Bestimmtheitsmaß ist definiert als der Anteil, der durch die Regression erklärten Quadratsumme an der zu erklärenden totalen Quadratsumme. Es gibt somit an, wie viel Streuung in den Daten durch das vorliegende lineare Regressionsmodell „erklärt“ werden kann. Bei einer einfachen Regression entspricht $R^2$ dem Quadrat des Korrelationskoeffizienten, wie wir später noch sehen werden.

Um $R^2$ zu berechnen, gibt es verschiedene Möglichkeiten.

Für die Berechnung per Hand werden die einzelnen Varianzen benötigt:

$R^2 = \frac{s^2_{\hat{Y}}}{s^2_{Y}} = \frac{s^2_{\hat{Y}}}{s^2_{\hat{Y}} + s^2_{E}}$

# Anhand der Varianz von lz
var(predict(lin_mod)) / var(fb23$nerd, use = "na.or.complete")
## [1] 0.09116145
# Anhand der Summe der Varianzen
var(predict(lin_mod)) / (var(predict(lin_mod)) + var(resid(lin_mod)))
## [1] 0.09116145

Jedoch kann dieser umständliche Weg mit der Funktion summary(), die wir vorhin schon kennen gelernt haben, umgangen werden. Anhand des p-Werts kann hier auch die Signifikanz des $R^2$ überprüft werden.

#Detaillierte Modellergebnisse
summary(lin_mod)
## 
## Call:
## lm(formula = nerd ~ extra, data = fb23)
## 
## Residuals:
##      Min       1Q   Median       3Q      Max 
## -1.81716 -0.42232 -0.00171  0.41996  1.91102 
## 
## Coefficients:
##             Estimate Std. Error t value Pr(>|t|)    
## (Intercept)  3.71988    0.16923  21.981   <2e-16 ***
## extra       -0.21030    0.04991  -4.214    4e-05 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 0.6033 on 177 degrees of freedom
## Multiple R-squared:  0.09116,	Adjusted R-squared:  0.08603 
## F-statistic: 17.75 on 1 and 177 DF,  p-value: 3.999e-05

Determinationskoeffizient $R^2$ ist signifikant, da $p < \alpha$.

Der Determinationskoeffizient $R^2$ kann auch direkt über den Befehl summary(lin_mod)$r.squared ausgegeben werden:

summary(lin_mod)$r.squared
## [1] 0.09116145

9.12% der Varianz von nerd können durch extra erklärt werden. Dieser Effekt ist nach Cohens (1988) Konvention als mittelstark zu bewerten, wenn keine Erkenntnisse in dem spezifischen Bereich vorliegen.

Cohens (1988) Konvention zur Interpretation von $R^2$:

Konventionen sind, wie bereits besprochen, heranzuziehen, wenn keine vorherigen Untersuchungen der Fragestellung oder zumindest in dem Forschungsbereich vorliegen. Die vorgeschlagenen Werte von $R^2$ entsprechen dabei dem Quadrat der in der letzten Sitzung genannten Konventionen für $r$.

  • ~ .01: schwacher Effekt
  • ~ .09: mittlerer Effekt
  • ~ .25: starker Effekt

Standardisierte Regressionsgewichte

Bei einer Regression (besonders wenn mehr als ein Prädiktor in das Modell aufgenommen wird wie in der nächsten Sitzung) kann es sinnvoll sein, die standardisierten Regressionskoeffizienten zu betrachten, um die Erklärungs- oder Prognosebeiträge der einzelnen unabhängigen Variablen (unabhängig von den bei der Messung der Variablen gewählten Einheiten) miteinander vergleichen zu können, z. B. um zu sehen, welche Variable den größten Beitrag zur Prognose der abhängigen Variable leistet. Außerdem ist es hierdurch möglich, die Ergebnisse zwischen verschiedenen Studien zu vergleichen, die nerd und extra gemessen haben, jedoch in unterschiedlichen Einheiten. Durch die Standardisierung werden die Regressionskoeffizienten vergleichbar. Die Variablen werden mit scale() standardisiert (z-Transformation; Erwartungswert gleich Null und die Varianz gleich Eins gesetzt). Mit lm() wird das Modell berechnet.

s_lin_mod <- lm(scale(nerd) ~ scale(extra), fb23) # standardisierte Regression
s_lin_mod
## 
## Call:
## lm(formula = scale(nerd) ~ scale(extra), data = fb23)
## 
## Coefficients:
##  (Intercept)  scale(extra)  
##   -1.240e-16    -3.019e-01

Eine andere Variante, bei der die z-Standardisierung automatisch im Hintergrund passiert und nicht von uns manuell durch scale() erfolgen muss, liefert die Funktion lm.beta() aus dem gleichnamigen Paket lm.beta.

Nach der (ggf. nötigen) Installation müssen wir das Paket für die Bearbeitung laden.

# Paket erst installieren (wenn nötig): install.packages("lm.beta")
library(lm.beta)

Die Funktion lm.beta() muss auf ein Ergebnis der normalen lm()-Funktion angewendet werden. Wir haben dieses Ergebnis im Objekt lin_mod hinterlegt. Anschließend wollen wir uns für die Interpretation wieder das summary() ausgeben lassen. Natürlich kann man diese Schritte auch mit der Pipe lösen, was als Kommentar noch aufgeführt ist.

lin_model_beta <- lm.beta(lin_mod)
summary(lin_model_beta) # lin_mod |> lm.beta() |> summary()
## 
## Call:
## lm(formula = nerd ~ extra, data = fb23)
## 
## Residuals:
##      Min       1Q   Median       3Q      Max 
## -1.81716 -0.42232 -0.00171  0.41996  1.91102 
## 
## Coefficients:
##             Estimate Standardized Std. Error t value Pr(>|t|)    
## (Intercept)  3.71988           NA    0.16923  21.981   <2e-16 ***
## extra       -0.21030     -0.30193    0.04991  -4.214    4e-05 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 0.6033 on 177 degrees of freedom
## Multiple R-squared:  0.09116,	Adjusted R-squared:  0.08603 
## F-statistic: 17.75 on 1 and 177 DF,  p-value: 3.999e-05

Wir sehen, dass die ursprüngliche Ausgabe um die Spalte standardized erweitert wurde. An der standardisierten Lösung fällt auf, dass das Intercept als NA angezeigt wird. Dies liegt wie bereits besprochen daran, dass beim Standardisieren die Mittelwerte aller Variablen (Prädiktoren und Kriterium, bzw. unabhängige und abhängige Variable) auf 0 und die Standardabweichungen auf 1 gesetzt werden. Somit muss das Intercept hier genau 0 betragen, weshalb auf eine Schätzung verzichtet werden kann.

Die Interpretation standardisierter Regressionsgewichte weicht leicht von der Interpration unstandardisierter Regressionsgewichte ab. Der Achsenabschnitt ist 0, da die Regressionsgerade durch den Mittelwert beider Variablen geht, die beide auch 0 sind. Das Regressionsgewicht hingegen beinhaltet die erwartete Veränderung von -0.21 Standardabweichungen in Nerdiness bei einer Standardabweichung mehr in Extraversion.


Korrelation vs. Regression

Wie bereits weiter oben angesprochen, gibt es bei der einfachen linearen Regression (1 Prädiktor) einen Zusammenhang zur Produkt-Moment-Korrelation. Dies wollen wir jetzt uns nochmal genauer anschauen.

In diesem Falle ist nämlich das standardisierte Regressionsgewicht identisch zur Produkt-Moment-Korrelation aus Prädiktor (extra) und Kriterium (nerd).

cor(fb23$nerd, fb23$extra)   # Korrelation
## [1] -0.3019295
coef(s_lin_mod)["scale(extra)"] # Regressionsgewicht
## scale(extra) 
##   -0.3019295
round(coef(s_lin_mod)["scale(extra)"],3) == round(cor(fb23$nerd, fb23$extra),3)
## scale(extra) 
##         TRUE

Entsprechend ist das Quadrat der Korrelation identisch zum Determinationskoeffizienten des Modells mit standardisierten Variablen…

cor(fb23$nerd, fb23$extra)^2   # Quadrierte Korrelation
## [1] 0.09116145
summary(s_lin_mod)$r.squared  # Det-Koeffizient Modell mit standardisierten Variablen
## [1] 0.09116145
round((cor(fb23$nerd, fb23$extra)^2),3) == round(summary(s_lin_mod)$r.squared, 3)
## [1] TRUE

… und unstandardisierten Variablen.

cor(fb23$nerd, fb23$extra)^2   # Quadrierte Korrelation
## [1] 0.09116145
summary(lin_mod)$r.squared  # Det-Koeffizient Modell mit unstandardisierten Variablen
## [1] 0.09116145
round((cor(fb23$nerd, fb23$extra)^2),3) == round(summary(lin_mod)$r.squared, 3)
## [1] TRUE

Der standardisierte Korrelationskoeffizient in einer einfachen linearen Regression liefert also dieselben Informationen wie eine Produkt-Moment-Korrelation. Daraus wird auch ersichtlich, dass ein Regressionskoeffizient (genau wie eine Korrelation) nicht zulässt, auf die Richtung des Effekts (Kausalität) zu schließen.

Kai J. Nehler
Kai J. Nehler
Teammitglied