library(tidyverse)
library(easystats)
library(rstanarm)
<- read_csv("https://vincentarelbundock.github.io/Rdatasets/csv/ggplot2/diamonds.csv") diamonds
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)
<- stan_glm(price ~ carat_z, data = diamonds2,
lm1 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:
<- stan_glm(price ~ carat_z + cut, data = diamonds2,
lm2 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