Interaktionseffekte leichter interpretieren durch Transformationen

Einleitung

Bei einer multiplen linearen Regression kann man den Einfluss einer unabhägigen Variable auf das Verhalten einer anderen unabhägigen Variable in Bezug auf die abhägige Variable mit modellieren.

Wir wollen das einmal an dem Beispiel der folgenden Datentabelle Impact of Beauty on Instructor’s Teaching Ratings und der Fragestellung in wie weit das Alter und das Geschlecht einen Einfluss auf das Evaluationsergebnis haben.

Dazu stellen laden wir die Daten aus dem Internet:

library(mosaic)
url <- paste0("https://vincentarelbundock.github.io/Rdatasets/csv/AER/",
              "TeachingRatings.csv")
teacherratings <- read.csv(url)

und betrachten das Streudiagramm:

gf_point(eval ~ age, color = ~gender, data = teacherratings)

Ein lineares Modell

Ein klassisches lineares Modell sieht wie folgt aus:

erglm <- lm(eval ~ age + gender + age:gender, data = teacherratings)
coef(erglm)
#>    (Intercept)            age     gendermale age:gendermale 
#>     4.49018892    -0.01306572    -0.32104348     0.01109285

Doch was bedeuten diese Werte konkret:

  • (Intercept) = 4.4901889: Gibt das (theoretische) Evaluationsergebnis für einer Frau im Alter von 0 Jahren an.

  • age = -0.0130657: Gibt an, um wie viele Punkte im Schnitt sich eine Frau pro Lebensjahr mehr verändert. (Da der Wert negativ ist, also verschlechtert.)

  • gendermale = -0.3210435: Gibt an, um wie viel sich das Startwert bei 0 Jahren verändert, wenn es ein Mann gewesen wäre. Wir kommen damit auf einen Startwert bei 0 Jahren für Männer von 4.1691454

  • age:gendermale = 0.0110928: Gibt an um wie viel sich die Steigung ändert, wenn statt einer Frau ein Mann betrachtet wird. Statt einer Änderung um -0.0130657 bei Frauen beträgt sie bei Männern \(-0.0130657-0.0110928 = -0.0019729\).

coef_female = c(coef(erglm)[1], coef(erglm)[2])
coef_male = c(
  coef(erglm)[1] + coef(erglm)[3],
  coef(erglm)[2] + coef(erglm)[4]
)
gf_point(eval ~ age, color = ~gender, data = teacherratings) %>%
  gf_coefline(coef = coef_female, color = ~"female") %>%
  gf_coefline(coef = coef_male, color = ~"male") 
  

Wir können so die folgenden Modellgleichungen aufstellen:

  1. Für Frauen: \[ \begin{aligned} \widehat{eval}_{\text{female}} & = 4.4901889 - 0.0130657 \cdot age \\ &\approx 4.49 - 0.013 \cdot age \end{aligned} \]

  2. Für Männer: \[ \begin{aligned} \widehat{eval}_{\text{male}} &= 4.1691454 - 0.0019729 \cdot age\\ &\approx 4.169 - 0.002 \cdot age \end{aligned} \]

Besserer Blick durch gute Transformation der Daten

Spannender wäre es aber, wenn die y-Achenabschnitte nicht so weit ausserhalb unseres Betrachungsbereichs (29; 73) liegen würde.

Wir zentrieren daher einmal unsere Altersangaben mit der Transformation:

\[age_i^\text{center} = age_i - \overline{age}\]

In R:

# Mittelwert bestimmen und speichern:
mean_age = mean( ~ age, data = teacherratings)

# Transformation durchführen:
teacherratings %>%
  mutate(
    age_center = age - mean_age
  ) -> teacherratings

# Das Ergebnis kurz zusammenfassen:
df_stats(~ age + age_center, min, mean, sd, max, 
         data = teacherratings)
#>     response       min         mean       sd      max
#> 1        age  29.00000 4.836501e+01 9.802742 73.00000
#> 2 age_center -19.36501 3.514033e-15 9.802742 24.63499

Das der Mittelwert bei den zentrierten Daten nicht exakt Null ist liegt an den numerischen Besonderheiten des Rechners. Kurz: Computer können gar nicht richitg rechnen und haben daher hier einen kleinen Rundungsfehler!

Betrachten wir die gerundeten Werte, so ergibt sich das folgende, etwas übersichtlichere Bild:

# Wir bauen uns gerundete Funktionen:
round_digits <- 3  # Anzahl der Nachkommastellen

mean_r <- function(x) round(mean(x), round_digits)
sd_r <- function(x) round(sd(x), round_digits)
min_r <- function(x) round(min(x), round_digits)
max_r <- function(x) round(max(x), round_digits)

# Wir benutzen nun die gerundeten Werte:
df_stats(~ age + age_center, min_r, mean_r, sd_r, max_r, 
         data = teacherratings)
#>     response   min_r mean_r  sd_r  max_r
#> 1        age  29.000 48.365 9.803 73.000
#> 2 age_center -19.365  0.000 9.803 24.635

Im Mittel sind unsere Lehrer:innen also \(48.365\) alt, die Jüngsten mit 29 etwa \(19.365\) jünger und die Ältesten mit 73 etwa \(24.635\) älter als der Altersdurchschnitt.

Ein Blick auf die Koeffizenten des linearen Modells bzgl. der zentrierten Daten:

erglm_c <- lm(eval ~ age_center + gender + age_center:gender, 
              data = teacherratings)
coef(erglm_c)
#>           (Intercept)            age_center            gendermale 
#>            3.85826543           -0.01306572            0.21546232 
#> age_center:gendermale 
#>            0.01109285

Das dazu passende Streudiagramm mit den Regressionsgeraden:

coef_c_female = c(coef(erglm_c)[1], coef(erglm_c)[2])
coef_c_male = c(
  coef(erglm_c)[1] + coef(erglm_c)[3],
  coef(erglm_c)[2] + coef(erglm_c)[4]
)
gf_point(eval ~ age_center, color = ~gender, 
         data = teacherratings) %>%
  gf_coefline(coef = coef_c_female, color = ~"female") %>%
  gf_coefline(coef = coef_c_male, color = ~"male") 
  

Was bedeuten nun diese Werte konkret:

  • (Intercept) = 3.8582654: Gibt das Evaluationsergebnis für einer Frau mit Durchschnittsalter (48) an.

  • age = -0.0130657: Gibt an, um wie viele Punkte im Schnitt sich eine Frau pro Lebensjahr mehr verändert.

  • gendermale = -0.3210435: Gibt an, um wie viel sich das Evaluationsergebnis eines Mannes im Durchschnittsalter ändert gegenüber dem einer Frau. Für das Durchschnittalter liegen Männer im Schnitt bei 4.0737278

  • age:gendermale = 0.0110928: Gibt an, um wie viel sich die Steigung ändert, wenn statt einer Frau ein Mann betrachtet wird. Statt einer Änderung um -0.0130657 bei Frauen beträgt sie bei Männern \(-0.0130657-0.0110928 = -0.0019729\).

Wir können daher die folgenden Modellgleichungen aufstellen:

  1. Für Frauen: \[ \begin{aligned} \widehat{eval}_{\text{female}} & = 3.8582654 - 0.0130657 \cdot (age - 48.3650108) \\ &\approx 3.858 - 0.013 \cdot (age - 48.365) \end{aligned} \]

  2. Für Männer: \[ \begin{aligned} \widehat{eval}_{\text{male}} &= 4.0737278 - 0.0019729 \cdot (age - 48.3650108) \\ &\approx 4.074 - 0.002 \cdot (age - 48.365) \end{aligned} \]

Zur Interpretation

Im durchschnittlichen Alter ist das erwartete Evaluationsergebnis bei Frauen (\(3.8582654\)) um rund \(0.215\) Punkte schlechter als bei Männern (\(4.0737278\)). Mit jedem Lebensjahr sinkt dabei in beiden Fällen, also sowohl bei Frauen als auch bei Männern, das Evaluationsergbnis. Bei den Frauen aber mit ca. \(-0.013\) deutlich stärker als mit ca. \(-0.002\) bei den Männern .

Fazit

Eine gute Transformation einiger Daten kann, dank der angepassten Modellgleichungen, die Interpretation der Ergebnisse deutlich vereinfachen!

Nachtrag und Danksagung

Die Idee zu diesem Blog-Post verdanke ich dem Blog von Prof. Dr. Sebastian Sauer. Hier der Link zum Orginal-Blog: https://data-se.netlify.app/2021/06/17/beispiel-zur-interpretation-des-interaktionseffekts/

Danke auch für die kritische Durchsicht und die hilfreichen Anmerkungen.

Reproduzierbarkeitsinformationen

#> R version 4.1.0 (2021-05-18)
#> 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 xfun_0.24
Norman Markgraf
Norman Markgraf
Diplom-Mathematiker

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

Ähnliches