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) 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