Skip to content
Snippets Groups Projects
Commit fc9cb5af authored by bpkleer's avatar bpkleer
Browse files

bugfixes

parent 7f12ff82
No related branches found
No related tags found
No related merge requests found
...@@ -27,7 +27,7 @@ library("UpSetR") ...@@ -27,7 +27,7 @@ library("UpSetR")
pss <- readRDS("../datasets/pss.rds") pss <- readRDS("../datasets/pss.rds")
uniMis <- readRDS("../datasets/uniMis.rds") uniMis <- readRDS("../datasets/uniMis.rds")
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.
``` {r devtools}
install.packages("devtools")
devtools::install_github("cardiomoon/ggiraphExtra")
```
Anschließend kann das *package* verwendet werden.
Bevor wir nun verschiedene lineare Modelle berechnen, berechnen wir ein paar Modelle.
``` {r regmodels, eval=TRUE}
model1 <- lm(stfdem ~ 1 + stfeco,
pss)
model2 <- lm(stfdem ~ 1 + stfeco + agea + lrscale,
pss)
model3 <- lm(stfdem ~ 1 + stfeco + agea + lrscale + gndr,
pss)
```
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.
``` {r gndr2-legend, eval=TRUE}
ggplot(fakeDfMale,
aes(x = stfeco,
y = pred)) +
geom_line(color = "red") +
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) +
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) +
scale_color_manual(values = c("female" = "darkblue",
"male" = "red")) +
labs(title = "Linear relationship between stfeco and stfdem (others constant)",
y = "Predicted value of stfdem",
x = "stfeco")
```
## Das war's! ## Das war's!
## Labs
1. Prediciton machen und korrekte Werte mit eintragen.
2. Lineare Regression mit Income als group-Variablen und prediction darstellen
\ No newline at end of file
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment