Regression mit studentisierten Daten

Bei einer einfachen linearen Regression versuchen wir zu vorgegebenen Datenpunkten \((x_1, y_1), \cdots (x_n, y_n)\) die Parameter einer möglichst passenden Gerade \(g(x)=\beta_0 + \beta_1 \cdot x\) zu schätzen.

Die Schätzung des y-Achsenabschnitts \(\hat\beta_0\) und der Steigung \(\hat\beta_1\) erfolgt dabei algebraisch exakt mittels:

\[\hat\beta_0 = \bar{y} - \hat\beta_1 \cdot \bar{x} \quad\text{und}\quad \hat\beta_1 = \frac{s_x}{s_y}\cdot r_{x,y}\]

Dabei sind \(\bar{x}\) bzw. \(\bar{y}\) die Mittelwerte und \(s_x\) bzw. \(s_y\) die Standardabweichungen der Datenpunkte \(x_i\) bzw. \(y_i\); darüberhinaus ist \(r_{x,y}\) der Korrelationskoeffizient der Datenpunkte.

Beim studentisieren werden die Datenpunkte bzgl. des Mittelwertes zentriert und bzgl der Standardabweichung normiert:

\[x_i^{\text{stud}} = \frac{x_i-\bar{x}}{s_x} \quad\text{bzw.}\quad y_i^{\text{stud}} = \frac{y_i-\bar{y}}{s_y}\]

Was passiert nun durch eine solche Studentisierung (oft auch z-Transformation genannt) mit den geschätzen Parametern?

Die Mittelwerte \(\bar{x}^{stud}\) und \(\bar{y}^{stud}\) werden zu Null. Die Standardabweichungen \(s_{x^{stud}}\) und \(s_{y^stud}\) werden zur Eins:

\[\bar{x}^{stud}=0=\bar{y}^{stud} \qquad s_{x^{stud}}= 1 = s_{y^{stud}}\]

Der y-Achsenabschnitt wird nun durch

\[\hat\beta_0^{stud} = \bar{y}^{stud} - \hat\beta_1^{stud} \cdot \bar{x}^{stud} = 0 - \hat\beta_1^{stud} \cdot 0 = 0\]

und die Steigung durch

\[ \hat\beta_1^{stud} = \frac{s_{x^{stud}}}{s_{y^{stud}}}\cdot r_{x^{stud},y^{stud}} = \frac{1}{1}\cdot r_{x^{stud},y^{stud}} = r_{x^{stud},y^{stud}} \]

geschätzt.

Für den Korrelationskoeffienten gilt nun \[ r_{x^{stud},y^{stud}} = \frac{s_{x^{stud},y^{stud}}}{s_{x^{stud}}\cdot_{y^{stud}}} = \frac{s_{x^{stud},y^{stud}}}{1 \cdot 1} = s_{x^{stud},y^{stud}}. \]

Damit Schätzen wir unsere Steigung \(\hat\beta_1^{stud}\) direkt aus der Kovarianz \(s_{x^{stud},y^{stud}}\).

Damit gilt:

\[\hat\beta_1^{stud} = r_{x^{stud},y^{stud}} = s_{x^{stud},y^{stud}} \in [-1, 1]\]

In Worten zusammengefasst: Im studentisierten Fall ist

  • der y-Achsenabschnitt immer 0 und
  • die Steigung immer ein Wert zwischen -1 und 1

Beispiel: mtcars- Daten

Auf Grundlage der Datentabelle mtcars wollen wir den linearer Zusammenhang zwischen dem Verbrauch (in Meilen pro Gallone mpg) und der Leistung (Pferdestärke hp) modellieren.1

library(mosaic)

# Wir nehmen die Datentabelle 'mtcars':
mtcars %>%
  select(hp, mpg) -> dt

# Ein kurzer Blick aus die Daten:
df_stats( ~ hp + mpg, mean, sd, data = dt)
#>   response      mean        sd
#> 1       hp 146.68750 68.562868
#> 2      mpg  20.09062  6.026948

# Wir vergleichen den Verbrauch (mpg, miles per gallon) 
# mit den Pferdestärken (hp) mit Hilfe eines Streudiagramms.
# Dazu berechnen wir vorab die Mittelwerte
mean_hp <- mean(~ hp, data = dt)
mean_mpg <- mean(~ mpg, data = dt)

# und berechnen nun die Schätzwerte für die Regressionsgerade
beta_1 <- cov(mpg ~ hp, data = dt) / var(~ hp, data = dt)
beta_0 <- mean_mpg - beta_1 * mean_hp

# schliesslich zeichnen alles in das Streudiagramm ein:
gf_point(mpg ~ hp, data = dt) %>%
  gf_hline(yintercept = ~ mean_mpg, 
           color = "grey60", linetype = "dashed") %>%
  gf_vline(xintercept = ~ mean_hp, 
           color = "grey60", linetype = "dashed") %>%
  gf_point(mean_mpg ~ mean_hp, 
           color = "red", size = 5, alpha = 0.2) %>%
  gf_abline(slope = ~ beta_1, intercept = ~beta_0, 
            color = "dodgerblue") %>%
  gf_lims(y = c(5,35))

Die Funktionsvorschrift für die (blaue) Regressionsgerade lautet:

\[\begin{aligned} \hat{y} &= \hat\beta_0 + \hat\beta_1 \cdot x \\ &\approx 30.0988605 -0.0682283 \cdot x \\ &\approx 30.099 -0.068 \cdot x \end{aligned}\]

Studentisieren wir nun die mpg und hp Werte. In R können wir das mit der Funktion ‘zscore()’2 wie folgt machen:

dt %>%
  mutate(
    hp_stud = zscore(hp),
    mpg_stud = zscore(mpg)
  ) -> dt

# Ein kurzer Blick aus die Daten:
df_stats( ~ hp_stud + mpg_stud, mean, sd, data = dt)
#>   response         mean sd
#> 1  hp_stud 1.040834e-17  1
#> 2 mpg_stud 7.112366e-17  1

Der Grund für die kleinen Abweichungen von der Null bei den Mittelwerten sind unumgängliche Rundungsfehler, die der Computer macht!

# Wir "berechnen" die Mittelwerte:
mean_hp_stud <- 0 # = mean(~ hp_stud, data = dt)
mean_mpg_stud <- 0 # = mean(~ mpg_stud, data = dt)

# Berechnen wir nun die Schätzwerte für die Regressionsgerade:
beta_1_stud <- cov(mpg_stud ~ hp_stud, data = dt)
beta_0_stud <- 0 # = mean_mpg_stud - beta_1_stud * mean_hp_stud

# und zeichnen diese in unser Streudiagramm ein:
gf_point(mpg_stud ~ hp_stud, data = dt) %>%
  gf_hline(yintercept = ~ mean_mpg_stud, 
           color = "grey60", linetype = "dashed") %>%
  gf_vline(xintercept = ~ mean_hp_stud, 
           color = "grey60", linetype = "dashed") %>%
  gf_point(mean_mpg_stud ~ mean_hp_stud, 
           color = "red", size = 5, alpha = 0.2) %>%
  gf_abline(slope = ~ beta_1_stud, intercept = ~beta_0_stud, 
            color = "dodgerblue") %>%
  gf_lims(y = c(-2,2))

Die Regressionsgerade im studentisierten Problem lautet nun:

\[ \begin{aligned} \hat{y}^{stud} &= \hat\beta^{stud}_0 + \hat\beta_1^{stud} \cdot x^{stud} \\ &\approx 0 - 0.7761684 \cdot x^{stud} \\ &\approx 0 -0.776 \cdot x^{stud} \end{aligned} \]

Direkt mit ‘R’

Wir erhalten unsere Ergebnisse natürlich auch direkt in R, ohne selber die Werte auszurechnen:

# Ursprüngliches Modell:
erglm <- lm(mpg ~ hp, data = dt)
coef(erglm)
#> (Intercept)          hp 
#> 30.09886054 -0.06822828

# Studentisiertes Modell:
erglm_stud <- lm(mpg_stud ~ hp_stud, data = dt)
coef(erglm_stud)
#>   (Intercept)       hp_stud 
#> -3.149357e-17 -7.761684e-01

Zurückrechnen der studentisierten Werte in das ursprüngliche Problem

Aus dem Ergebnis des studentisierten Modells können wir die Koeffizenten des ursprünglichen Modells wie folgt berechnen:

\[\hat\beta_1 = \hat\beta_1^{stud} \cdot \frac{s_y}{s_x}\] und

\[\hat\beta_0 = \bar{y} - \hat\beta_1 \cdot \bar{x}\]

In R geht das wie folgt:

mean_mpg <- mean( ~ mpg, data = dt)
sd_mpg <- sd( ~ mpg, data = dt)
mean_hp <- mean( ~ hp, data = dt)
sd_hp <- sd( ~ hp, data = dt)

(beta_1 <- beta_1_stud * sd_mpg / sd_hp)
#> [1] -0.06822828
(beta_0 <- mean_mpg - beta_1 * mean_hp)
#> [1] 30.09886

### Fazit

...

## Reproduzierbarkeitsinformationen

#> R version 4.1.2 (2021-11-01) #> Platform: x86_64-apple-darwin17.0 (64-bit) #> Running under: macOS Catalina 10.15.7 #> #> Locale: de_DE.UTF-8 / de_DE.UTF-8 / de_DE.UTF-8 / C / de_DE.UTF-8 / de_DE.UTF-8 #> #> Package version: #> mosaic_1.8.3 tidyr_1.1.4 xfun_0.29 ```


  1. Das “Cookbook” zur Datentabelle können Sie mit Hilfe von help("mtcars") aufrufen!↩︎

  2. Sie können hier auch die Funktion scale() verwenden!↩︎

Norman Markgraf
Norman Markgraf
Diplom-Mathematiker

Norman Markgraf ist freiberuflicher Dozent für Mathematik, Statistik, Data Science und Informatik, sowie freiberuflicher Programmierer.

Ähnliches