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.774 0.95 3919.331 3945.597 1 1.0027694 1366.737 normal 3932.8 9973.599
carat_z 7756.760 0.95 7728.571 7785.547 1 0.9995923 4282.044 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) 2402.845 0.95 2330.341 2480.649 1 1.0011386 1240.141 normal 3932.8 9973.599
carat_z 7871.387 0.95 7843.914 7898.616 1 0.9998284 4633.253 normal 0.0 21040.850
cutGood 1120.845 0.95 1035.017 1206.208 1 1.0008772 1446.493 normal 0.0 34685.376
cutIdeal 1803.027 0.95 1725.059 1878.681 1 1.0007797 1259.647 normal 0.0 20362.277
cutPremium 1440.758 0.95 1360.296 1516.996 1 1.0009339 1293.270 normal 0.0 22862.493
cutVery Good 1511.497 0.95 1430.846 1590.443 1 1.0009240 1290.454 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