adjustieren2_var1

lm
regression
bayes
adjust
string
Published

November 8, 2023

Aufgabe

Betrachten Sie folgendes Modell, das den Zusammenhang des Preises (price) und dem Gewicht (carat) von Diamanten untersucht (Datensatz diamonds).

library(tidyverse)
library(easystats)
library(rstanarm)
diamonds <- read_csv("https://vincentarelbundock.github.io/Rdatasets/csv/ggplot2/diamonds.csv")

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_tail Prior_Distribution Prior_Location Prior_Scale
(Intercept) 3932.930 0.95 3920.009 3945.713 1 1.0013369 1454 normal 3932.8 9973.599
carat_z 7756.395 0.95 7728.068 7784.774 1 0.9992856 3209 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_tail Prior_Distribution Prior_Location Prior_Scale
(Intercept) 2404.855 0.95 2331.665 2479.651 1 1.0014235 2033 normal 3932.8 9973.599
carat_z 7871.052 0.95 7844.355 7898.588 1 0.9999394 3044 normal 0.0 21040.850
cutGood 1120.035 0.95 1034.153 1204.921 1 1.0021151 2264 normal 0.0 34685.376
cutIdeal 1801.174 0.95 1723.801 1879.438 1 1.0013182 2224 normal 0.0 20362.277
cutPremium 1438.300 0.95 1358.807 1518.774 1 1.0011926 2017 normal 0.0 22862.493
cutVery Good 1510.270 0.95 1430.763 1589.740 1 1.0019732 2114 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