opts_chunk$set(fig.path = 'pics/s6-', # path for calculated figures
opts_chunk$set(#fig.path = 'pics/s6-', # path for calculated figures
fig.align = 'center', # alignment of figure (also possible right, left, default)
fig.align = 'center', # alignment of figure (also possible right, left, default)
fig.show = 'hold', # how to show figures: hold -> direct at the end of code chunk; animate: all plots in an animation
fig.show = 'hold', # how to show figures: hold -> direct at the end of code chunk; animate: all plots in an animation
fig.width = 6, # figure width
fig.width = 6, # figure width
...
@@ -507,4 +507,202 @@ gg_miss_fct(x = uniMis,
...
@@ -507,4 +507,202 @@ gg_miss_fct(x = uniMis,
labs(title = "NA in Uni-df nach Studienfach")
labs(title = "NA in Uni-df nach Studienfach")
```
```
## Darstellungen von Regressionsmodellen
Oftmals ist es nicht nur das Ziel Regressionsmodelle in Tabellen darzustellen, sondern auch spezifische Effekte grafisch darzustellen. Dazu stellen wir hier zwei Möglichkeiten vor:
1. mithilfe des *packages* ```ggiraphExtra```
2. Manuell über eigene **predictions**
Das *package* ```ggiraphExtra``` ist noch im Developer-Status und muss daher mithilfe des *packages* ```devtools``` geladen werden.
Im bivariaten Trainingsfall kann man ganz einfach ```ggplot``` und die Funktion ```stat_smooth()``` verwenden (```model1```):
```{r bivariat, eval=TRUE}
ggplot(pss,
aes(x = stfeco, y = stfdem)) +
geom_jitter(color = "darkblue") + # observations
stat_smooth(method = "lm", # regression line
color = "tomato") +
labs(title = "Regression stfdem on stfeco", # titles
x = "stfeco",
y = "stfdem")
```
Sobald wir aber ein multivariates Modell haben, ist dies nicht mehr direkt so möglich. Da wir die anderen Effekte konstanthalten müssen, um die Abbildung korrekt darzustellen. Aber es ist immer noch leicht umzusetzen, sobald man versteht, was **Konstanthalten** bedeutet.
Wir möchten den Effekt von ```stfeco``` auf ```stfdem``` plotten, im ```model2``` haben wir aber zusätzlich noch die Variable ```lrscale``. Daher ist dieser Effekt immer mit dem weiteren Effekt zu interpretieren. Um den Effekt plotten zu können, halten wir den (oder die) weiteren Effekt(e) konstant.
Daher bilden wir nun eine neue Matrix (Schätzungs-Datensatz). Diese beinhaltet am Ende die Vorhersage unseres Schätzmodells. Zuvor müssen wir aber fiktive Werte der zwei Variablen generieren. Wir möchten den Effekt von ```stfeco``` plotten, daher halten wir term konstant (bei metrischen Variablen oftmals der *mean*). Mit der Funktion ```list()``` schaffen wir eine Liste mit zwei Objekten (```stfeco``` und ```lrscale```). Die Funktion ```expand.grid()``` macht aus dieser liste dann ein ```data frame```:
``` {r expand grid, eval=TRUE}
fakeDf <- expand.grid(list(stfeco = seq(0,
10,
1),
lrscale = mean(pss$lrscale, na.rm = TRUE),
agea = mean(pss$agea, na.rm = TRUE)))
fakeDf
```
Anschließend wenden wir das lineare Modell auf diese Daten an:
``` {r prediction, eval=TRUE}
predFakeDf <- predict(model2,
newdata = fakeDf, # der fiktive Datensatz
se = TRUE)
```
- Das Objekt ist eine Liste, die ```fit``` (*fitted values*), ```se.fit``` (*standard errors*), ```df``` (*degrees of freedom*) und ```residual.scale``` beinhaltet.
- Wir sind an den ersten beiden Werten interessiert, die wir für das Plotten benötigen. Diese Werte binden wir im nächsten Schritt nun an die Anfangsmatrix.
Jetzt übertragen wir die vorhergesagten Werte an die geschaffene Datenmatrix.
```{r adding-prediction, eval=TRUE}
fakeDf$pred <- predFakeDf$fit
fakeDf$pred_se <- predFakeDf$se.fit
```
Nun können wir den Plot erstellen, wir haben alle Werte in einem Datenobjekt:
```{r predggplot, eval=TRUE}
ggplot(fakeDf,
aes(x = stfeco,
y = pred)) +
geom_line(color = "darkgreen") +
geom_line(data = fakeDf,
aes(x = stfeco,
y = pred - 1.96 * pred_se),
linetype = 3) +
geom_line(data = fakeDf,
aes(x = stfeco,
y = pred + 1.96 * pred_se),
linetype = 3) +
labs(title = "Linear relationship between stfeco and stfdem (others constant)",
y = "Predicted value of stfdem",
x = "stfeco")
```
Als nächstes fahren wir genauso fort mit ```model3```. Hier haben wir allerdings eine kategorielle Variable (```gndr```) und diese lässt sich nicht konstant halten. Daher machen wir zwei fake-Datensätze, die wir dann zusammenfügen (einen für jede Kategorie in ```gndr```). Beginnen wir mit dem ```female``` Datensatz:
``` {r gndr-regression, eval=TRUE}
fakeDfFemale <- expand.grid(list(stfeco = seq(0,
10,
1),
lrscale = mean(pss$lrscale, na.rm = TRUE),
agea = mean(pss$agea, na.rm = TRUE),
gndr = "female"))
predFakeDfFemale <- predict(model3,
newdata = fakeDfFemale,
se = TRUE)
fakeDfFemale$pred <- predFakeDfFemale$fit
fakeDfFemale$pred_se <- predFakeDfFemale$se.fit
ggplot(fakeDfFemale,
aes(x = stfeco,
y = pred)) +
geom_line(color = "darkblue") +
geom_line(data = fakeDfFemale,
aes(x = stfeco,
y = pred - 1.96 * pred_se),
linetype = 3) +
geom_line(data = fakeDfFemale,
aes(x = stfeco,
y = pred + 1.96 * pred_se),
linetype = 3) +
ylab("Predicted value of stfdem") +
xlab("stfeco") +
labs(title = "Linear relationship between stfeco and stfdem (others constant)")
```
Somit haben wir die Regressionslinie zwischen ```stfeco``` und ```stfdem``` unter Konstanthalten von Alter, Links-Rechts-Selbsteinschätung und Geschlecht. Jetzt erstellen wir die zweite Linie für männliche Befragte.
``` {r gndr2-regression, eval=TRUE}
fakeDfMale <- expand.grid(list(stfeco = seq(0,
10,
1),
lrscale = mean(pss$lrscale, na.rm = TRUE),
agea = mean(pss$agea, na.rm = TRUE),
gndr = "male"))
predFakeDfMale <- predict(model3,
newdata = fakeDfMale,
se = TRUE)
fakeDfMale$pred <- predFakeDfMale$fit
fakeDfMale$pred_se <- predFakeDfMale$se.fit
ggplot(fakeDfMale,
aes(x = stfeco,
y = pred)) +
geom_line(color = "darkgreen") +
geom_line(data = fakeDfMale,
aes(x = stfeco,
y = pred - 1.96 * pred_se),
linetype = 3) +
geom_line(data = fakeDfMale,
aes(x = stfeco,
y = pred + 1.96 * pred_se),
linetype = 3) +
ylab("Predicted value of stfdem") +
xlab("stfeco") +
labs(title = "Linear relationship between stfeco and stfdem (others constant)")
```
Um nun beide Linien in einer Grafik zu haben, fügen wir die Layer einfach zusammen und machen zur besseren Lesbarkeit noch eine Legende.