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 Prior_Distribution Prior_Location Prior_Scale
(Intercept) 3932.836 0.95 3919.662 3945.896 1 1.0012090 1307.086 normal 3932.8 9973.599
carat_z 7756.533 0.95 7729.792 7783.005 1 0.9998779 4361.380 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) 2404.292 0.95 2333.085 2477.108 1 1.0014459 1922.367 normal 3932.8 9973.599
carat_z 7871.070 0.95 7843.116 7897.803 1 0.9991393 4966.613 normal 0.0 21040.850
cutGood 1121.664 0.95 1038.770 1204.131 1 1.0007301 2337.973 normal 0.0 34685.376
cutIdeal 1801.190 0.95 1726.744 1875.413 1 1.0012217 1996.284 normal 0.0 20362.277
cutPremium 1439.777 0.95 1360.840 1513.990 1 1.0010467 2116.470 normal 0.0 22862.493
cutVery Good 1511.756 0.95 1431.784 1586.575 1 1.0010996 2079.444 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