library(tidyverse)
library(easystats)
library(rstanarm)
diamonds <- read_csv("https://vincentarelbundock.github.io/Rdatasets/csv/ggplot2/diamonds.csv")adjustieren2_var1
Aufgabe
Betrachten Sie folgendes Modell, das den Zusammenhang des Preises (price) und dem Gewicht (carat) von Diamanten untersucht (Datensatz diamonds).
Aber zuerst zentrieren wir den metrischen Prädiktor carat, um den Achsenabschnitt besser interpretieren zu können.
diamonds2 <-
diamonds %>%
mutate(carat_z = carat - mean(carat, na.rm = TRUE))Dann berechnen wir ein (bayesianisches) Regressionsmodell, wobei wir auf die Standardwerte der Prior zurückgreifen.
library(rstanarm)
lm1 <- stan_glm(price ~ carat_z, data = diamonds2,
refresh = 0)
parameters(lm1)| Parameter | Median | CI | CI_low | CI_high | pd | Rhat | ESS | Prior_Distribution | Prior_Location | Prior_Scale |
|---|---|---|---|---|---|---|---|---|---|---|
| (Intercept) | 3933.103 | 0.95 | 3919.932 | 3945.329 | 1 | 1.0007236 | 1337.926 | normal | 3932.8 | 9973.599 |
| carat_z | 7756.757 | 0.95 | 7728.920 | 7784.542 | 1 | 0.9999506 | 4482.262 | normal | 0.0 | 21040.850 |
Zur Verdeutlichung ein Diagramm zum Modell:
diamonds2 %>%
ggplot() +
aes(x = carat_z, y = price) +
geom_point() +
geom_smooth(method = "lm")
Oder so:
estimate_relation(lm1) |> plot()
Aufgabe:
Geben Sie eine Regressionsformel an, die lm1 ergänzt, so dass die Schliffart (cut) des Diamanten kontrolliert (adjustiert) wird. Anders gesagt: Das Modell soll die mittleren Preise für jede der fünf Schliffarten angeben.
Hinweis:
- Geben Sie nur die Regressionsformel an.
- Lassen Sie zwischen Termen der Regressionsformel jeweils ein Leerzeichen Abstand.
- Beziehen Sie sich auf das Modell bzw. die Angaben oben.
- Es gibt (laut Datensatz) folgende Schliffarten (und zwar in der folgenden Reihenfolge):
diamonds %>%
distinct(cut)| cut |
|---|
| Ideal |
| Premium |
| Good |
| Very Good |
| Fair |
Lösung
Die richtige Antwort lautet: price ~ carat_z + cut
Das Modell könnten wir so berechnen:
lm2 <- stan_glm(price ~ carat_z + cut, data = diamonds2,
refresh = 0) # verhindert einen Haufen unnötigen Output
parameters(lm2)| Parameter | Median | CI | CI_low | CI_high | pd | Rhat | ESS | Prior_Distribution | Prior_Location | Prior_Scale |
|---|---|---|---|---|---|---|---|---|---|---|
| (Intercept) | 2403.533 | 0.95 | 2328.352 | 2474.815 | 1 | 1.001242 | 1766.022 | normal | 3932.8 | 9973.599 |
| carat_z | 7870.523 | 0.95 | 7843.157 | 7897.570 | 1 | 1.000339 | 4271.289 | normal | 0.0 | 21040.850 |
| cutGood | 1122.273 | 0.95 | 1040.951 | 1206.763 | 1 | 1.000233 | 2115.490 | normal | 0.0 | 34685.376 |
| cutIdeal | 1802.437 | 0.95 | 1727.233 | 1878.867 | 1 | 1.000457 | 1845.860 | normal | 0.0 | 20362.277 |
| cutPremium | 1440.937 | 0.95 | 1362.846 | 1519.823 | 1 | 1.000445 | 1875.457 | normal | 0.0 | 22862.493 |
| cutVery Good | 1511.725 | 0.95 | 1433.968 | 1589.377 | 1 | 1.000600 | 1886.521 | normal | 0.0 | 23922.148 |
Oder auch so, mit der klassischen Regression:
lm(price ~ carat_z + cut, data = diamonds2)
Call:
lm(formula = price ~ carat_z + cut, data = diamonds2)
Coefficients:
(Intercept) carat_z cutGood cutIdeal cutPremium
2405 7871 1120 1801 1439
cutVery Good
1510
Das führt zu ähnlichen Ergebnissen.
Man könnte hier noch einen Interaktionseffekt ergänzen.
Categories:
- lm
- regression
- bayes
- adjust
- string