21  Verallgemeinerte lineare Modelle

21.1 Folien

Folien als Vollbild | Folien als PDF

21.2 Daten zur heutigen Sitzung

21.3 Code und Ausgaben aus der Vorlesung

R Skript herunterladen

Laden der relevanten Pakete

library(MASS) # Für Negativ-binomiale Regression
library(marginaleffects) # Modellvorhersagen und Vergleiche
library(performance) # Modellbeurteilung (hier vor allem R2 und Dispersion)
library(parameters) # Modellschätzungen extrahieren und darstellen
library(report) # Einfaches Erstellen von statistischen Berichten
library(tidyverse) # Datenmanagement und Visualisierung: https://www.tidyverse.org/
── Attaching core tidyverse packages ──────────────────────── tidyverse 2.0.0 ──
✔ dplyr     1.2.0     ✔ readr     2.1.6
✔ forcats   1.0.1     ✔ stringr   1.6.0
✔ ggplot2   4.0.2     ✔ tibble    3.3.1
✔ lubridate 1.9.4     ✔ tidyr     1.3.2
✔ purrr     1.2.1     
── Conflicts ────────────────────────────────────────── tidyverse_conflicts() ──
✖ dplyr::filter() masks stats::filter()
✖ dplyr::lag()    masks stats::lag()
✖ dplyr::select() masks MASS::select()
ℹ Use the conflicted package (<http://conflicted.r-lib.org/>) to force all conflicts to become errors
theme_set(theme_classic(base_size = 12)) # Voreinstellung für Plots

Lesen und Aufbereiten des Datensatz von Van Erkel & Van Aelst

d <- haven::read_stata(here::here("data/Vanerkel_Vanaelst_2021.dta")) |>
  rename(
    Political_knowledge = PK,
    Personalized_news = personalized_news,
    Radio = News_channels_w4_1,
    Television = News_channels_w4_2,
    Newspapers = News_channels_w4_3,
    Online_news_sites = News_channels_w4_4,
    Twitter = News_channels_w4_5,
    Facebook = News_channels_w4_6,
  ) |>
  mutate(
    Gender = as_factor(Gender),
    Education = as_factor(Education),
    Age10 = Age / 10
  )

Beschreibung einzelen Fragen

d |>
  select(starts_with("PK")) |>
  mutate(across(everything(), ~ factor(., labels = c("incorrect", "correct")))) |>
  report_sample()
# Descriptive Statistics

Variable         | Summary
--------------------------
PK1 [correct], % |    83.1
PK2 [correct], % |    68.7
PK3 [correct], % |    40.7
PK4 [correct], % |    87.9
PK5 [correct], % |    62.8
PK6 [correct], % |    24.1

Beschreibung Wissensindex

d |>
  ggplot(aes(Political_knowledge)) +
  geom_bar()

Daten aus Faehnrich et al. laden

d2 <- read_rds(here::here("data/Faehnrich_2020.rds"))

Auszug aus dem Datensatz von Faehnrich et al. - Zaehlvariablen

d2 |>
  select(id, likes_count, comments_count, shares_count) |>
  slice_sample(n = 10)
# A tibble: 10 × 4
   id                             likes_count comments_count shares_count
   <chr>                                <dbl>          <dbl>        <dbl>
 1 102471088936_10151782113633937          32              0            2
 2 103256838688_10152076126808689         248              4           22
 3 21489041474_10151617226346475           70              0            3
 4 16686610106_10154986047745107          513             22           29
 5 140105122708_10152984518697709         336              6           98
 6 245640871929_10152948041316930         775             17           91
 7 49702985881_10151464322755882           34              0            9
 8 374809010319_10152312330145320          86              2           10
 9 10111634660_706131796084572            114              1           15
10 20835777216_10152626212717217          133              0           22

Plot Lineare Regression mit PK3 - Simuliertes Beispiel

set.seed(1)
d_fake <- d |>
  mutate(PK3_fake = rbinom(n = n(), size = 1, prob = plogis(-10 + 2 * Age10)))
plt_bin_fake <- d_fake |>
  ggplot(aes(Age10, PK3_fake)) +
  geom_point(position = position_jitter(width = 0, height = 0.03, seed = 1), shape = 1) +
  labs(x = "Alter in Jahrzehnten (Age / 10)", y = "Frage 3 (0 = falsch, 1 = richtig)") +
  scale_y_continuous(limits = c(-0.2, 1.2), breaks = (0:4) / 4)
plt_bin_fake +
  geom_smooth(method = "lm", linewidth = 2, se = F)
`geom_smooth()` using formula = 'y ~ x'
Warning: Removed 6 rows containing missing values or values outside the scale range
(`geom_smooth()`).

Plot Logistische Regression mit PK3 - Simuliertes Beispiel

plt_bin_fake +
  geom_smooth(
    method = "glm", method.args = list(family = "binomial"),
    se = F, linewidth = 2
  )
`geom_smooth()` using formula = 'y ~ x'

Plot Lineare Regression mit PK3

plt_bin <- d |>
  ggplot(aes(Age10, PK3)) +
  geom_point(position = position_jitter(width = 0, height = 0.03, seed = 1), shape = 1) +
  labs(x = "Alter in Jahrzehnten (Age / 10)", y = "Frage 3 (0 = falsch, 1 = richtig)") +
  scale_y_continuous(limits = c(-0.2, 1.2), breaks = (0:4) / 4)
plt_bin +
  geom_smooth(method = "lm", linewidth = 2, se = F)
`geom_smooth()` using formula = 'y ~ x'

Plot Logistische Regression mit PK3

plt_bin +
  geom_smooth(
    method = "glm", method.args = list(family = "binomial"),
    se = F, linewidth = 2
  )
`geom_smooth()` using formula = 'y ~ x'

Null-Modell Logistische Regression mit PK3

m0 <- glm(
  PK3 ~ 1, # Null-Modell nur mit Intercept (Konstante)
  family = binomial(link = "logit"), # aV ist binär, logit-Link = Logistische Regression
  data = d
)

Null-Modell Logistische Regression mit PK3 Tabelle

m0 |>
  report_table(metrics = "R2", include_effectsize = FALSE)
Parameter   | Coefficient |         95% CI |     z |      p | Fit
-----------------------------------------------------------------
(Intercept) |       -0.38 | [-0.50, -0.25] | -5.84 | < .001 |    
            |             |                |       |        |    
Tjur's R2   |             |                |       |        |   0

Invers logit Formel

1 / (1 + exp(0.38))
[1] 0.4061269

Invers logit Funktion

plogis(-0.38)
[1] 0.4061269

PK 3 deskriptiv

d |>
  select(PK3) |>
  mutate(across(everything(), ~ factor(., labels = c("incorrect", "correct")))) |>
  report_sample()
# Descriptive Statistics

Variable         | Summary
--------------------------
PK3 [correct], % |    40.7

Bivariate Logistische Regression mit PK3 und Alter

d <- d |>
  mutate(
    Age10_c = Age10 - mean(Age10)
  )
m1 <- glm(
  PK3 ~ Age10_c, # Regressionsgleichung
  family = binomial(link = "logit"), # aV ist binär, logit-Link = Logistische Regression
  data = d
)

Bivariate Logistische Regression mit PK3 und Alter Tabelle

m1 |>
  report_table(metrics = "R2", include_effectsize = FALSE)
Parameter   | Coefficient |         95% CI |     z |      p |  Fit
------------------------------------------------------------------
(Intercept) |       -0.39 | [-0.52, -0.26] | -5.97 | < .001 |     
Age10 c     |        0.28 | [ 0.18,  0.38] |  5.60 | < .001 |     
            |             |                |       |        |     
Tjur's R2   |             |                |       |        | 0.03

Bivariate Logistische Regression mit PK3 und Alter Baseline Wahrscheinlichkeit

plogis(-0.39)
[1] 0.4037173

Bivariate Logistische Regression mit PK3 und Alter Average counterfactual comparison M+1

m1 |>
  avg_comparisons(
    variables = list(Age10_c = 1), # Welcher Vergleich? Hier: Mittelwert und M + 1
    type = "response" # In welcher Metrik? Hier: Wahrscheinlichkeit
  )

 Estimate Std. Error    z Pr(>|z|)    S  2.5 % 97.5 %
    0.066     0.0112 5.91   <0.001 28.2 0.0442 0.0879

Term: Age10_c
Type: response
Comparison: +1

Bivariate Logistische Regression mit PK3 und Alter Average counterfactual comparison M-1

m1 |>
  avg_comparisons(
    variables = list(Age10_c = -1), # Welcher Vergleich? Hier: Mittelwert und M - 1
    type = "response" # In welcher Metrik? Hier: Wahrscheinlichkeit
  )

 Estimate Std. Error     z Pr(>|z|)    S   2.5 %  97.5 %
   -0.063     0.0103 -6.14   <0.001 30.2 -0.0831 -0.0429

Term: Age10_c
Type: response
Comparison: +-1

Bivariate Logistische Regression mit PK3 und Alter Average counterfactual comparison Junge

m1 |>
  avg_comparisons(
    variables = list(Age10_c = c(min(d$Age10_c), min(d$Age10_c) + 1)), # Welcher Vergleich? Hier: minimum + 10 Jahre
    type = "response" # In welcher Metrik? Hier: Wahrscheinlichkeit
  )

 Estimate Std. Error    z Pr(>|z|)    S  2.5 % 97.5 %
   0.0494    0.00516 9.59   <0.001 69.9 0.0393 0.0596

Term: Age10_c
Type: response
Comparison: -2.397583081571 - -3.397583081571

Bivariate Logistische Regression mit PK3 und Alter Average counterfactual comparison Alte

m1 |>
  avg_comparisons(
    variables = list(Age10_c = c(max(d$Age10_c) - 1, max(d$Age10_c))), # Welcher Vergleich? Hier: maximum - 10 Jahre
    type = "response" # In welcher Metrik? Hier: Wahrscheinlichkeit
  )

 Estimate Std. Error    z Pr(>|z|)    S 2.5 % 97.5 %
   0.0693     0.0124 5.59   <0.001 25.4 0.045 0.0936

Term: Age10_c
Type: response
Comparison: 1.802416918429 - 0.802416918429003

Bivariate Logistische Regression mit PK3 und Alter Odds Ratios

m1 |>
  report_table(metrics = "R2", include_effectsize = FALSE, exponentiate = TRUE)
Parameter   | Coefficient |       95% CI |     z |      p |  Fit
----------------------------------------------------------------
(Intercept) |        0.67 | [0.59, 0.77] | -5.97 | < .001 |     
Age10 c     |        1.32 | [1.20, 1.46] |  5.60 | < .001 |     
            |             |              |       |        |     
Tjur's R2   |             |              |       |        | 0.03

Multiple Logistische Regression mit PK3

d <- d |>
  mutate(
    Online_news_sites_c = Online_news_sites - mean(Online_news_sites),
    Twitter_c = Twitter - mean(Twitter),
    Facebook_c = Facebook - mean(Facebook),
    Age10_c = Age10 - mean(Age10)
  )
m2 <- glm(
  PK3 ~ Online_news_sites_c + Twitter_c + Facebook_c + Gender + Age10_c, # Regressionsgleichung
  family = binomial(link = "logit"), # aV ist binär, logit-Link = Logistische Regression
  data = d
)

Multiple Logistische Regression mit PK3 Tabelle

m2 |>
  report_table(metrics = "R2", include_effectsize = FALSE)
Parameter           | Coefficient |         95% CI |     z |      p |  Fit
--------------------------------------------------------------------------
(Intercept)         |        0.13 | [-0.05,  0.31] |  1.42 | 0.157  |     
Online news sites c |        0.19 | [ 0.11,  0.28] |  4.50 | < .001 |     
Twitter c           |       -0.03 | [-0.18,  0.12] | -0.42 | 0.675  |     
Facebook c          |       -0.11 | [-0.19, -0.04] | -2.82 | 0.005  |     
Gender [female]     |       -1.20 | [-1.48, -0.92] | -8.35 | < .001 |     
Age10 c             |        0.19 | [ 0.09,  0.30] |  3.55 | < .001 |     
                    |             |                |       |        |     
Tjur's R2           |             |                |       |        | 0.14

Multiple Logistische Regression mit PK3 Baseline Wahrscheinlichkeit

plogis(0.13)
[1] 0.5324543

Multiple Logistische Regression mit PK3 Average counterfactual comparison M+1

m2 |>
  avg_comparisons(
    variables = list(
      Online_news_sites_c = 1, Twitter_c = 1, Facebook_c = 1, Gender = "reference", Age10_c = 1
    ), # Welcher Vergleich? Hier: Mittelwert und M + 1 und Faktor
    type = "response" # In welcher Metrik? Hier: Wahrscheinlichkeit
  )

                Term      Contrast Estimate Std. Error     z Pr(>|z|)    S
 Age10_c             +1             0.04062    0.01128  3.60  < 0.001 11.6
 Facebook_c          +1            -0.02352    0.00814 -2.89  0.00388  8.0
 Gender              female - male -0.26638    0.03064 -8.69  < 0.001 58.0
 Online_news_sites_c +1             0.04060    0.00877  4.63  < 0.001 18.0
 Twitter_c           +1            -0.00669    0.01592 -0.42  0.67452  0.6
   2.5 %   97.5 %
  0.0185  0.06273
 -0.0395 -0.00755
 -0.3264 -0.20633
  0.0234  0.05780
 -0.0379  0.02452

Type: response

Multiple Logistische Regression mit PK3 Odds Ratios

m2 |>
  report_table(metrics = "R2", include_effectsize = FALSE, exponentiate = TRUE)
Parameter           | Coefficient |       95% CI |     z |      p |  Fit
------------------------------------------------------------------------
(Intercept)         |        1.14 | [0.95, 1.36] |  1.42 | 0.157  |     
Online news sites c |        1.21 | [1.12, 1.32] |  4.50 | < .001 |     
Twitter c           |        0.97 | [0.83, 1.12] | -0.42 | 0.675  |     
Facebook c          |        0.89 | [0.82, 0.97] | -2.82 | 0.005  |     
Gender [female]     |        0.30 | [0.23, 0.40] | -8.35 | < .001 |     
Age10 c             |        1.21 | [1.09, 1.35] |  3.55 | < .001 |     
                    |             |              |       |        |     
Tjur's R2           |             |              |       |        | 0.14

Multiple Logistische Regression mit PK3 R2 Tabelle

m2 |>
  report_table(metrics = "R2", include_effectsize = FALSE)
Parameter           | Coefficient |         95% CI |     z |      p |  Fit
--------------------------------------------------------------------------
(Intercept)         |        0.13 | [-0.05,  0.31] |  1.42 | 0.157  |     
Online news sites c |        0.19 | [ 0.11,  0.28] |  4.50 | < .001 |     
Twitter c           |       -0.03 | [-0.18,  0.12] | -0.42 | 0.675  |     
Facebook c          |       -0.11 | [-0.19, -0.04] | -2.82 | 0.005  |     
Gender [female]     |       -1.20 | [-1.48, -0.92] | -8.35 | < .001 |     
Age10 c             |        0.19 | [ 0.09,  0.30] |  3.55 | < .001 |     
                    |             |                |       |        |     
Tjur's R2           |             |                |       |        | 0.14

Multiple Logistische Regression mit PK3 R2 Text

m2 |>
  report_performance() |>
  cat()

The model’s explanatory power is moderate (Tjur’s R2 = 0.14)

Varianten der Modellspezifikation für Test mit 5 Fragen

m5q_v1 <- glm(
  cbind(Political_knowledge, 5 - Political_knowledge) ~ Age10_c, # Zahl der richtig und falsch beantworteten Fragen in cbind()
  family = binomial(link = "logit"), # eine Frage ist binär, logit-Link = Logistische Regression
  data = d
)

m5q_v2 <- glm(
  Political_knowledge / 5 ~ Age10_c, # Anteil der richtig beantworteten Fragen als aV
  family = binomial(link = "logit"), # eine Frage ist binär, logit-Link = Logistische Regression
  weights = rep(5, nrow(d)), # Zahl der Fragen als Gewicht
  data = d
)

Ausgabe Logistische Regression mit 5 Fragen

m5q_v1 |>
  report_table(metrics = "R2", include_effectsize = FALSE)
Warning: Can't calculate accurate R2 for binomial models that are not Bernoulli
  models.
Warning: Models of class `glm` are not yet supported.
Parameter   | Coefficient |       95% CI |     z |      p | Fit
---------------------------------------------------------------
(Intercept) |        0.45 | [0.40, 0.51] | 15.34 | < .001 |    
Age10 c     |        0.25 | [0.21, 0.29] | 11.78 | < .001 |    
            |             |              |       |        |    

Intercept Logistische Regression mit 5 Fragen

round(plogis(coef(m5q_v1))[1], 2)
(Intercept) 
       0.61 

Plot Lineare Regression mit Political_knowledge

d |>
  ggplot(aes(Age10, Political_knowledge)) +
  geom_point(position = position_jitter(width = 0, height = 0.1, seed = 1), shape = 1) +
  labs(x = "Alter in Jahrzehnten (Age / 10)", y = "Richtig beantwortete Fragen") +
  geom_smooth(method = "lm", se = F, linewidth = 2)
`geom_smooth()` using formula = 'y ~ x'

Plot Logistische Regression mit Political_knowledge

d |>
  ggplot(aes(Age10, Political_knowledge / 5, weight = 5)) +
  geom_point(position = position_jitter(width = 0, height = 0.02, seed = 1), shape = 1) +
  labs(x = "Alter in Jahrzehnten (Age / 10)", y = "Richtig beantwortete Fragen") +
  geom_smooth(
    method = "glm", method.args = list(family = "binomial"), se = F,
    linewidth = 2
  )
`geom_smooth()` using formula = 'y ~ x'

Mittelwert und Varianz der Beispiel-Variable

d2_RU <- d2 |>
  mutate(
    ym = floor_date(ymd_hms(created_time), "month"),
    ym_int = as.integer(as.factor(ym)) - min(as.integer(as.factor(ym)), na.rm = TRUE)
  ) |>
  filter(uni == "UC San Francisco") |>
  na.omit()
Warning: There was 1 warning in `mutate()`.
ℹ In argument: `ym = floor_date(ymd_hms(created_time), "month")`.
Caused by warning:
!  33 failed to parse.
d2_RU |>
  summarise(
    M = mean(comments_count),
    Var = var(comments_count),
    n = n()
  )
# A tibble: 1 × 3
      M   Var     n
  <dbl> <dbl> <int>
1  3.55  28.8   128

Plot Lineare Regression mit comments_count - Simuliertes Beispiel

d_fake <- d2_RU |>
  mutate(
    lambda = exp(2 + 0.08 * ym_int + rnorm(n = n(), mean = 0, sd = 0.3)),
    comments_count_fake = rpois(n = n(), lambda = lambda)
  )
plt_count_fake <- d_fake |>
  ggplot(aes(ym, comments_count_fake)) +
  geom_point(position = position_jitter(width = 0, height = 0.1, seed = 1), shape = 1) +
  labs(x = "Zeit (in Monatsschritten)", y = "Zahl der Kommentare")
plt_count_fake +
  geom_smooth(method = "lm", linewidth = 2, se = F)
`geom_smooth()` using formula = 'y ~ x'

Plot Poisson- und negativ-binomiale Regression mit comments_count - Simuliertes Beispiel

plt_count_fake +
  geom_smooth(
    method = "glm", method.args = list(family = "poisson"),
    se = F, linewidth = 1, color = "green", linetype = 2
  ) +
  geom_smooth(
    method = MASS::glm.nb,
    se = F, linewidth = 1
  )
`geom_smooth()` using formula = 'y ~ x'
`geom_smooth()` using formula = 'y ~ x'

Plot Lineare Regression mit comments_count

plt_count <- d2_RU |>
  ggplot(aes(ym, comments_count)) +
  geom_point(position = position_jitter(width = 0, height = 0.1, seed = 1), shape = 1) +
  labs(x = "Zeit (in Monatsschritten)", y = "Zahl der Kommentare")
plt_count +
  geom_smooth(method = "lm", linewidth = 2, se = F)
`geom_smooth()` using formula = 'y ~ x'

Plot Negativ-binomiale Regression mit comments_count

plt_count +
  geom_smooth(
    method = MASS::glm.nb,
    se = F, linewidth = 2
  )
`geom_smooth()` using formula = 'y ~ x'

Null-Modell Negativ-binomiale Regression mit comments_count

nbm0 <- glm.nb( # Negativ-binomiale Regression
  comments_count ~ 1, # Null-Modell nur mit Intercept (Konstante)
  data = d2_RU
)

Null-Modell Negativ-binomiale Regression mit comments_count Tabelle

nbm0 |>
  report_table(metrics = "R2", include_effectsize = FALSE)
Parameter     | Coefficient |       95% CI |     z |  df |      p |      Fit
----------------------------------------------------------------------------
(Intercept)   |        1.27 | [1.02, 1.52] | 10.06 | Inf | < .001 |         
              |             |              |       |     |        |         
R2_Nagelkerke |             |              |       |     |        | 3.38e-16

exp Funktion

exp(coef(nbm0))
(Intercept) 
   3.554687 

comments_count deskriptiv

mean(d2_RU$comments_count)
[1] 3.554688

Bivariate negativ-binomiale Regression mit comments_count und Zeit

d2_RU <- d2_RU |>
  mutate(ym_int_half = ym_int - (max(ym_int) + 1) / 2)

nbm1 <- glm.nb( # Negativ-binomiale Regression
  comments_count ~ ym_int_half, # Regressionsgleichung
  data = d2_RU
)

Bivariate negativ-binomiale Regression mit comments_count und Zeit Tabelle

nbm1 |>
  report_table(exponentiate = TRUE, metrics = "R2", include_effectsize = FALSE)
Parameter     | Coefficient |       95% CI |    z |  df |      p |  Fit
-----------------------------------------------------------------------
(Intercept)   |        3.22 | [2.57, 4.07] | 9.97 | Inf | < .001 |     
ym int half   |        1.05 | [1.03, 1.07] | 4.20 | Inf | < .001 |     
              |             |              |      |     |        |     
R2_Nagelkerke |             |              |      |     |        | 0.21

Bivariate negativ-binomiale Regression comments_count und Zeit Average counterfactual comparison M+1

nbm1 |>
  avg_comparisons(
    variables = list(ym_int_half = c(0, 1)), # Welcher Vergleich? Hier: Mitte der Zeit und M + 1 Monat
    type = "response" # In welcher Metrik? Hier: Erwartete Zahl der Kommentare
  )

 Estimate Std. Error    z Pr(>|z|)    S 2.5 % 97.5 %
    0.154     0.0415 3.72   <0.001 12.3 0.073  0.236

Term: ym_int_half
Type: response
Comparison: 1 - 0

Bivariate negativ-binomiale Regression mit comments_count und Zeit Average counterfactual comparison M-1

nbm1 |>
  avg_comparisons(
    variables = list(ym_int_half = c(0, -1)), # Welcher Vergleich? Hier: Mitte der Zeit und M - 1 Monat
    type = "response" # In welcher Metrik? Hier: Erwartete Zahl der Kommentare
  )

 Estimate Std. Error    z Pr(>|z|)    S  2.5 % 97.5 %
    0.147     0.0381 3.86   <0.001 13.1 0.0726  0.222

Term: ym_int_half
Type: response
Comparison: 0 - -1

Bivariate negativ-binomiale Regression mit comments_count und Zeit Average counterfactual comparison Junge

nbm1 |>
  avg_comparisons(
    variables = list(ym_int_half = c(min(d2_RU$ym_int_half), min(d2_RU$ym_int_half) + 1)), # Welcher Vergleich? Hier: minimum + 1 Monat
    type = "response" # In welcher Metrik? Hier: Erwartete Zahl der Kommentare
  )

 Estimate Std. Error    z Pr(>|z|)    S  2.5 % 97.5 %
   0.0664    0.00824 8.05   <0.001 50.1 0.0502 0.0826

Term: ym_int_half
Type: response
Comparison: -17 - -18

Bivariate negativ-binomiale Regression mit comments_count und Zeit Average counterfactual comparison Alte

nbm1 |>
  avg_comparisons(
    variables = list(ym_int_half = c(max(d2_RU$ym_int_half) - 1, max(d2_RU$ym_int_half))), # Welcher Vergleich? Hier: maximum - 1 Monat
    type = "response" # In welcher Metrik? Hier: Erwartete Zahl der Kommentare
  )

 Estimate Std. Error    z Pr(>|z|)   S  2.5 % 97.5 %
    0.327      0.143 2.29    0.022 5.5 0.0472  0.606

Term: ym_int_half
Type: response
Comparison: 17 - 16

Multiple negativ-binomiale Regression mit comments_count

d2_RU <- d2_RU |>
  mutate(
    ym_int_half = ym_int - (max(ym_int) + 1) / 2,
    word_count_100_c = (word_count - mean(word_count, rm.na = TRUE)) / 100
  )
nbm2 <- glm.nb(
  comments_count ~ ym_int_half + topic_research + topic_teaching + word_count_100_c, # Regressionsgleichung
  data = d2_RU
)

Multiple negativ-binomiale Regression mit comments_count Tabelle

nbm2 |>
  report_table(exponentiate = TRUE, metrics = "R2", include_effectsize = FALSE)
Parameter            | Coefficient |       95% CI |    z |  df |      p |  Fit
------------------------------------------------------------------------------
(Intercept)          |        2.54 | [1.82, 3.61] | 5.31 | Inf | < .001 |     
ym int half          |        1.05 | [1.03, 1.08] | 4.40 | Inf | < .001 |     
topic research [yes] |        1.23 | [0.77, 1.96] | 0.89 | Inf | 0.376  |     
topic teaching [yes] |        1.81 | [1.00, 3.45] | 1.92 | Inf | 0.055  |     
word count 100 c     |        1.12 | [0.31, 4.29] | 0.19 | Inf | 0.848  |     
                     |             |              |      |     |        |     
R2_Nagelkerke        |             |              |      |     |        | 0.26

Multiple negativ-binomiale Regression mit comments_count Average counterfactual comparison

nbm2 |>
  avg_comparisons(
    variables = list(
      ym_int_half = c(0, 1), topic_research = "reference",
      topic_teaching = "reference",
      word_count_100_c = 1
    ), # Welche Vergleiche?
    type = "response" # In welcher Metrik? Hier: Erwartete Zahl der Likes
  )

             Term Contrast Estimate Std. Error     z Pr(>|z|)    S   2.5 %
 topic_research   yes - no    0.683     0.7762 0.880    0.379  1.4 -0.8385
 topic_teaching   yes - no    2.516     1.6437 1.531    0.126  3.0 -0.7057
 word_count_100_c +1          0.388     2.1409 0.181    0.856  0.2 -3.8086
 ym_int_half      1 - 0       0.157     0.0411 3.819   <0.001 12.9  0.0763
 97.5 %
  2.204
  5.737
  4.584
  0.237

Type: response

Multiple negativ-binomiale Regression mit comments_count R2 Tabelle

nbm2 |>
  report_table(exponentiate = TRUE, metrics = "R2", include_effectsize = FALSE)
Parameter            | Coefficient |       95% CI |    z |  df |      p |  Fit
------------------------------------------------------------------------------
(Intercept)          |        2.54 | [1.82, 3.61] | 5.31 | Inf | < .001 |     
ym int half          |        1.05 | [1.03, 1.08] | 4.40 | Inf | < .001 |     
topic research [yes] |        1.23 | [0.77, 1.96] | 0.89 | Inf | 0.376  |     
topic teaching [yes] |        1.81 | [1.00, 3.45] | 1.92 | Inf | 0.055  |     
word count 100 c     |        1.12 | [0.31, 4.29] | 0.19 | Inf | 0.848  |     
                     |             |              |      |     |        |     
R2_Nagelkerke        |             |              |      |     |        | 0.26

Multiple negativ-binomiale Regression mit comments_count R2 Text

nbm2 |>
  report_performance() |>
  cat()

The model’s explanatory power is substantial (Nagelkerke’s R2 = 0.26)

Poisson-Regression

pm2 <- glm(
  comments_count ~ ym_int_half + topic_research + topic_teaching + word_count_100_c, # Regressionsgleichung
  family = poisson(link = "log"), # aV Zählvariable, log-Link = Poisson-Regression
  data = d2_RU
)

Modellvergleich Koeffizienten

compare_models(Poisson = pm2, "Negativ-binomial" = nbm2, exponentiate = TRUE)
Parameter            |           Poisson |  Negativ-binomial
------------------------------------------------------------
(Intercept)          | 2.46 (2.10, 2.88) | 2.54 (1.80, 3.59)
ym int half          | 1.06 (1.05, 1.07) | 1.05 (1.03, 1.08)
topic research [yes] | 1.31 (1.08, 1.58) | 1.23 (0.78, 1.96)
topic teaching [yes] | 1.72 (1.37, 2.17) | 1.81 (0.99, 3.33)
word count 100 c     | 1.10 (0.66, 1.83) | 1.12 (0.36, 3.48)
------------------------------------------------------------
Observations         |               128 |               128

Test der einzelnen Modelle: Poisson-Regression

check_overdispersion(pm2)
# Overdispersion test

       dispersion ratio =   5.822
  Pearson's Chi-Squared = 716.094
                p-value = < 0.001
Overdispersion detected.

Test der einzelnen Modelle: Negativ-binomiale Regression

check_overdispersion(nbm2)
# Overdispersion test

 dispersion ratio = 0.933
          p-value = 0.976
No overdispersion detected.

Modellvergleich Informationkriterien

compare_performance(pm2, nbm2, metrics = c("AIC", "BIC"))
# Comparison of Model Performance Indices

Name |  Model | AIC (weights) | BIC (weights)
---------------------------------------------
pm2  |    glm | 876.9 (<.001) | 891.1 (<.001)
nbm2 | negbin | 589.2 (>.999) | 606.3 (>.999)

Modellvergleich Test

library(lmtest)
Loading required package: zoo

Attaching package: 'zoo'
The following objects are masked from 'package:base':

    as.Date, as.Date.numeric
lrtest(pm2, nbm2)
Likelihood ratio test

Model 1: comments_count ~ ym_int_half + topic_research + topic_teaching + 
    word_count_100_c
Model 2: comments_count ~ ym_int_half + topic_research + topic_teaching + 
    word_count_100_c
  #Df  LogLik Df Chisq Pr(>Chisq)    
1   5 -433.44                        
2   6 -288.59  1 289.7  < 2.2e-16 ***
---
Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1

21.4 Hausaufgabe (Freiwillig)

  1. Reproduzieren Sie die verallgemeinerten linearen Modelle aus der Vorlesung. Interpretieren Sie die Ergebnisse.

Lösung

21.5 Transkript

Das folgende Transkript wurde auf Basis der Aufzeichnung der Vorlesung erstellt. Die vollständigen Aufzeichnungen inklusive der Bildschirminhalte sind in Blackboard🔒 verfügbar. Die Tonspur wurde zuerst mit Hilfe der Werkzeuge des Oral-History.Digital Projekts wörtlich transkribiert. Die wörtliche Transkription wurde in Kombination mit den Vorlesungsfolien mithilfe von Sprachmodellen (v. a. Claude Sonnet 4.5 und GPT 5.2) zu einem übersichtlichen Transkript zusammengefasst. Im Anschluss wurde das Transkript von einer studentischen Hilfskraft überprüft, geglättet und ggf. angepasst. In diesem Prozess kann es an verschiedenen Stellen zu Fehlern kommen. Im Zweifel gilt das gesprochene Wort, und auch beim Vortrag mache ich Fehler.

Ich stelle das Transkript hier als experimentelles, ergänzendes Material zur Dokumentation der Vorlesung zur Verfügung. Noch bin ich mir unsicher, ob es eine sinnvolle Ergänzung ist und behalte mir vor, es weiter zu bearbeiten oder zu löschen.

Verallgemeinerte lineare Modelle

Warum verallgemeinerte lineare Modelle?

Bislang wurde in der Vorlesung immer mit dem linearen Modell gearbeitet: Ob bivariate Regression, multiple Regression, Moderation, Mediation, Strukturgleichungsmodelle oder Mehrebenenmodelle – in all diesen Fällen wurde angenommen, dass die abhängige Variable (aV), also die Variable, die erklärt oder vorhergesagt werden soll, metrisch und kontinuierlich ist. Das bedeutet, dass sie theoretisch jeden beliebigen Wert annehmen kann und dass Abstände zwischen Werten gleich interpretierbar sind (z. B. ist der Wert 4 doppelt so groß wie der Wert 2). Diese Annahme ist bei vielen Variablen, etwa bei Likert-Skalen, näherungsweise akzeptabel, weil man von einer dahinterliegenden, latenten kontinuierlichen Skala ausgeht. Es gibt jedoch Variablentypen, bei denen diese Annahme eindeutig nicht erfüllt ist.

Zwei solche Fälle stehen im Zentrum dieser Einheit:

  • Binäre Variablen: Sie können nur zwei Ausprägungen annehmen, typischerweise codiert als 0 und 1 (z. B. ‘kommt in einem Social-Media-Post vor’ vs. ‘kommt nicht vor’, oder ‘Wissensfrage richtig beantwortet’ vs. ‘falsch beantwortet’). Diese Variablen sind diskret; ein Fall kann nicht ‘ein bisschen richtig’ sein.
  • Zählvariablen (Count-Variablen): Das sind nicht-negative ganze Zahlen, die entstehen, wenn etwas gezählt wird, z. B. die Anzahl der Likes oder Kommentare zu einem Social-Media-Post. Auch hier sind nur diskrete, nicht-negative Werte möglich; negative oder gebrochene Zählwerte ergeben keinen Sinn.

Wenn man solche Variablen mit einem normalen linearen Modell modelliert, entstehen zwei Probleme: Erstens ist die Beziehung zwischen den Prädiktoren und der aV in der Regel nicht linear, weil die aV nur bestimmte diskrete Werte oder einen begrenzten Wertebereich annehmen kann. Zweitens sagt das lineare Modell mitunter Werte vorher, die es in der Realität gar nicht geben kann – zum Beispiel negative Wahrscheinlichkeiten oder negative Zählwerte. Genau deshalb braucht man verallgemeinerte lineare Modelle (Generalized Linear Models, GLM): Sie behalten die Grundlogik der linearen Regression bei, verwenden aber eine passende Verteilungsannahme für die aV sowie eine sogenannte Link-Funktion, die die lineare Vorhersage in den jeweils gültigen Wertebereich überträgt.

Die Einheit gliedert sich in zwei inhaltliche Blöcke: zunächst logistische Modelle für binäre abhängige Variablen, danach Poisson- und negativ-binomiale Modelle für Zählvariablen als aV. Beide Modellarten teilen viele Prinzipien mit der linearen Regression (z. B. die Logik von Nullmodell und Prädiktoren, die statistische Inferenz mit Standardfehlern, Teststatistiken und Konfidenzintervallen), unterscheiden sich aber in der Verteilungsannahme und vor allem in der Interpretation der Koeffizienten.

Binäre Variablen als abhängige Variable: Logistische Modelle

Ausgangsbeispiel: Wissensfragen bei Van Erkel & Van Aelst (2021)

Als Anwendungsbeispiel dient erneut die aus der Vorlesung bekannte Studie von Van Erkel und Van Aelst (2021) zum politischen Surveillance-Wissen. Befragten wurden sechs politische Wissensfragen gestellt (von denen eine Frage, PK5, nicht in den späteren Wissensindex eingeht). Für jede Frage wurde erfasst, ob sie richtig oder falsch beantwortet wurde. Der Anteil richtiger Antworten schwankte deutlich zwischen den Fragen: Bei der leichtesten Frage (PK4) antworteten 87.9 % richtig, bei der schwierigsten (PK6) nur 24.1 %. Diese einzelnen Fragen sind binäre Variablen (richtig = 1, falsch = 0). Bildet man aus den fünf in den Index eingehenden Fragen eine Summe, erhält man eine additive Wissens-Zählvariable mit Werten von 0 bis 5, die in der Verteilung eine Glockenform mit Schwerpunkt bei 3 zeigt. Damit liefert dieselbe Studie sowohl ein Beispiel für eine binäre aV (einzelne Frage) als auch für eine Zählvariable (Summenindex), auf die im späteren Verlauf der Einheit zurückgekommen wird.

Warum die lineare Regression bei binärer aV versagt

Um das Problem zu veranschaulichen, wird zunächst ein simuliertes Beispiel mit einem besonders starken (künstlichen) Zusammenhang gezeigt: das Alter einer Person (in Jahrzehnten gemessen, also durch 10 geteilt) als Prädiktor für die richtige Beantwortung einer Wissensfrage (0 = falsch, 1 = richtig). Legt man hier – wie bei der linearen Regression üblich – einfach eine gerade Linie durch die Punktwolke, ergeben sich zwei Probleme:

  • Die vorhergesagten Werte können außerhalb des sinnvollen Bereichs von 0 und 1 liegen, das heißt es werden negative oder über 1 liegende ‘Wahrscheinlichkeiten’ vorhergesagt. Das ist mathematisch und inhaltlich nicht sinnvoll, da eine Wahrscheinlichkeit niemals kleiner als 0 oder größer als 1 sein kann.
  • Ein linearer Zusammenhang ist bei einer binären aV konzeptionell nicht plausibel, da es keine ‘richtigeren’ oder ‘falscheren’ Antworten gibt, sondern nur die beiden diskreten Zustände richtig/falsch.

Dieses Vorgehen – eine 0/1-aV direkt linear zu modellieren – wird auch als Linear Probability Model (LPM) bezeichnet. Es ist streng genommen fehlerhaft, wird in der Praxis und in der Forschungsliteratur aber gelegentlich dennoch eingesetzt, weil es einfacher zu interpretieren ist und bei gemäßigten Zusammenhängen oft nur wenig von den Ergebnissen der korrekteren logistischen Regression abweicht.

Die logistische Regression und die Logit-Funktion

Die Lösung besteht darin, statt einer geraden Linie eine S-förmige Kurve durch die Datenpunkte zu legen. Diese S-Kurve sorgt dafür, dass die vorhergesagten Werte immer zwischen 0 und 1 bleiben – egal wie extrem der Wert des Prädiktors ist. Diese Transformation wird über die sogenannte Logit-Funktion realisiert:

  • Die Regressionsgleichung selbst bleibt wie gewohnt aufgebaut (Intercept plus Regressionsgewicht mal Prädiktor), sie wird aber nicht mehr direkt als vorhergesagter Wert interpretiert, sondern zunächst als sogenannter Logit.
  • Über die Logit-Funktion \(P(Y_i) = 1 / (1 + e^{-(b_0 + b_1 \cdot X_i)})\) wird dieser Logit in eine Wahrscheinlichkeit zwischen 0 und 1 zurückgerechnet.
  • In der Mitte der Verteilung verläuft die Kurve nahezu linear, an den Rändern (nahe 0 und nahe 1) flacht sie zunehmend ab, sodass extreme Werte des Prädiktors nie zu Wahrscheinlichkeiten unter 0 oder über 1 führen.

Man muss die Formel der Logit-Funktion nicht auswendig lernen; entscheidend ist das Verständnis, dass die logistische Regression genau dieses Problem der linearen Regression löst, indem sie die lineare Vorhersage durch eine Transformation in den gültigen Wahrscheinlichkeitsbereich überträgt.

Gemeinsamkeiten und Unterschiede: lineare vs. logistische Regression

Logistische Regression teilt viele Grundprinzipien mit der linearen Regression, unterscheidet sich aber in wichtigen Punkten:

  • Gleiche Annahmen bezüglich Unabhängigkeit der Fälle und (fehlender) Multikollinearität der Prädiktoren.
  • Gleiche Logik der Modellspezifikation: Man beginnt mit einem Nullmodell (nur Intercept) und erweitert es schrittweise um Prädiktorvariablen.
  • Gleiche Logik der statistischen Inferenz: Es werden Standardfehler, Teststatistiken (hier: \(z\)-Werte statt \(t\)-Werte) und Konfidenzintervalle berechnet und interpretiert.
  • Statistisch unterschiedliche, aber konzeptionell ähnliche Gütemaße (Pseudo-\(R^2\)) kommen zum Einsatz.
  • Die Koeffizienten werden grundlegend anders interpretiert als in der linearen Regression, da sie sich nicht mehr auf der Wahrscheinlichkeitsskala, sondern auf der Logit-Skala befinden.

Das Nullmodell und der Intercept

Wie bei der linearen Regression beginnt man mit einem Nullmodell, das nur aus dem Intercept (der Regressionskonstante) besteht. Am Beispiel der dritten Wissensfrage (PK3) aus dem Datensatz von Van Erkel und Van Aelst ergibt sich ein Intercept von \(-0.39\) auf der Logit-Skala. Dieser Wert lässt sich nicht direkt als Wahrscheinlichkeit lesen, sondern muss über die inverse Logit-Funktion (auch plogis-Funktion genannt) zurücktransformiert werden. Rechnet man \(1 / (1 + e^{-(-0.39)})\) beziehungsweise nutzt die Funktion plogis(-0.39), erhält man rund \(0.41\) bzw. 40.7 %. Das entspricht exakt dem deskriptiven Anteil richtiger Antworten bei dieser Frage. Das Nullmodell einer logistischen Regression bildet also – genau wie bei der linearen Regression – schlicht den Mittelwert der aV ab, hier eben in Form der beobachteten Erfolgsquote.

Als Gütemaß für das Nullmodell wird Tjur’s \(R^2\) ausgewiesen, das hier folgerichtig den Wert 0 annimmt, da ohne Prädiktoren noch keine Varianz erklärt werden kann.

Koeffizienten in der logistischen Regression interpretieren

Die Koeffizienten einer logistischen Regression liegen auf der Logit-Skala und sind daher nicht direkt als Veränderung von Wahrscheinlichkeiten interpretierbar. Das liegt daran, dass die Veränderung der Wahrscheinlichkeit bei einer Erhöhung des Prädiktors um eine Einheit nicht überall in der Verteilung gleich groß ist (siehe die S-Form der Kurve): In der Mitte der Verteilung ist die Steigung am größten, an den Rändern flacht sie ab. Zudem hängt die Interpretation zusätzlich vom Wert des Intercepts und der übrigen Prädiktoren ab. Es gibt drei gängige Möglichkeiten, logistische Koeffizienten dennoch verständlich zu interpretieren:

Geteilt-durch-4-Regel

Die einfachste Faustregel teilt den Koeffizienten durch 4. Dieser Wert (\(B/4\)) stellt eine Obergrenze für die tatsächliche Veränderung der Wahrscheinlichkeit dar, wenn sich der Prädiktor um eine Einheit ändert, ausgedrückt in Prozentpunkten. Die Abweichung von dieser Obergrenze ist am Rand der Verteilung des Prädiktors größer als in deren Mitte, da dort die S-Kurve stärker abflacht.

Am Beispiel des Modells mit dem (mittelwertzentrierten) Alter als Prädiktor für PK3 ergibt sich ein Koeffizient von \(0.28\). Geteilt durch 4 ergibt das etwa \(0.07\), also 7 Prozentpunkte. Die Interpretation lautet: Personen, die sich im Alter um 10 Jahre (eine Einheit des in Jahrzehnten codierten Prädiktors) unterscheiden, unterscheiden sich in etwa um 7 Prozentpunkte in der Wahrscheinlichkeit, die Frage richtig zu beantworten – die ältere Person hat die höhere Wahrscheinlichkeit. Der Intercept von \(-0.39\) entspricht dabei, wie oben gezeigt, einer Baseline-Wahrscheinlichkeit von rund 40 % für eine Person mit Durchschnittsalter.

Average Counterfactual Comparison

Eine genauere, aber rechenaufwendigere Alternative ist der Vergleich vorhergesagter Wahrscheinlichkeiten für hypothetische (kontrafaktische) Personen, wie er bereits aus der Einheit zur multiplen linearen Regression bekannt ist. Dabei wird zum Beispiel berechnet, wie stark sich die vorhergesagte Wahrscheinlichkeit ändert, wenn man eine Person um 10 Jahre älter macht. Für das Altersbeispiel zeigt sich: Im Durchschnitt beantwortet eine um 10 Jahre ältere Person die Frage mit einer um etwa 6 bis 7 Prozentpunkte höheren Wahrscheinlichkeit richtig, wenn man den Vergleich um den Mittelwert herum oder bei jüngeren Personen betrachtet. Am Rand der Verteilung, also bei bereits sehr alten Personen, fällt dieser Unterschied kleiner aus (rund 4 bis 5 Prozentpunkte), weil die S-Kurve dort bereits abflacht. Diese Methode ist somit präziser als die Geteilt-durch-4-Regel, weil sie explizit berücksichtigt, dass der Effekt je nach Position auf der Kurve unterschiedlich groß ausfällt.

Odds Ratios (exponenzierte Koeffizienten)

Die dritte, in Publikationen sehr verbreitete Möglichkeit ist die Angabe von Odds Ratios, also von exponenzierten Koeffizienten (\(Exp(B)\)). Um Odds Ratios zu verstehen, muss man zunächst den Begriff der Odds (auf Deutsch: Chance oder Risiko) von dem Begriff der Wahrscheinlichkeit abgrenzen:

  • \(Odds = P(Y=1) / (1 - P(Y=1))\). Odds sind also das Verhältnis der Wahrscheinlichkeit, dass ein Ereignis eintritt, zur Wahrscheinlichkeit, dass es nicht eintritt.
  • Man spricht von ‘Chance’, wenn das Ereignis positiv konnotiert ist (z. B. die Frage richtig zu beantworten), und von ‘Risiko’, wenn es negativ konnotiert ist (z. B. an einer Krankheit zu erkranken).
  • Sind beide möglichen Ausgänge gleich wahrscheinlich (jeweils 50 %), betragen die Odds genau 1.

Eine Odds Ratio ist der Quotient aus zwei solchen Odds, also die Odds einer Person geteilt durch die Odds einer anderen Person (bzw. einer Person mit einem um eine Einheit höheren Prädiktorwert). Odds Ratios lassen sich folgendermaßen interpretieren:

  • \(Exp(B) = 1\) bedeutet: kein Unterschied zwischen den verglichenen Personen.
  • \(Exp(B) > 1\) bedeutet: eine erhöhte Chance bzw. ein erhöhtes Risiko für die Person mit dem höheren Prädiktorwert.
  • \(Exp(B) < 1\) bedeutet: eine niedrigere Chance bzw. ein niedrigeres Risiko.
  • \(Exp(B) = 0.5\) bedeutet: Mit jeder Einheit mehr auf dem Prädiktor besteht nur noch ein halb so großes Risiko bzw. eine halb so große Chance.
  • \(Exp(B) = 2\) bedeutet: Mit jeder Einheit mehr auf dem Prädiktor verdoppelt sich die Chance bzw. das Risiko.

Für das Altersbeispiel ergibt sich ein Odds Ratio von \(1.32\) für den Prädiktor Alter (in Jahrzehnten). Das bedeutet: Eine Person, die 10 Jahre älter ist, hat eine etwa 1.3-mal so große Chance, die Frage richtig zu beantworten, wie eine 10 Jahre jüngere Person. Wichtig zu beachten ist, dass der exponenzierte Intercept in der Regel keine sinnvoll interpretierbare Bedeutung hat und deshalb meist nicht berichtet wird.

Modell mit mehreren Prädiktoren

Wie in der multiplen linearen Regression lässt sich auch die logistische Regression um mehrere Prädiktoren erweitern. Im Beispiel wird die dritte Wissensfrage (PK3) durch die Nutzung von Online-Nachrichtenseiten, Twitter, Facebook, das (selbstberichtete) Geschlecht sowie das Alter vorhergesagt. Alle metrischen Prädiktoren, für die der Wert 0 keine sinnvolle Bedeutung hätte, werden vorab mittelwertzentriert (also der Mittelwert wird von jedem Wert abgezogen), damit der Intercept sinnvoll interpretierbar bleibt. Die binäre Geschlechtsvariable (0 = männlich, 1 = weiblich) wird dagegen nicht zentriert, da sie bereits einen sinnvollen Nullpunkt (männlich) besitzt.

In diesem Modell zeigt sich, dass die Twitter-Nutzung statistisch nicht signifikant mit der richtigen Beantwortung der Frage zusammenhängt – hier kann kein verlässlicher Effekt in der Grundgesamtheit angenommen werden. Für alle übrigen Prädiktoren (Online-Nachrichten-Nutzung, Facebook-Nutzung, Geschlecht, Alter) zeigen sich hingegen statistisch signifikante Zusammenhänge, die inhaltlich interpretiert werden:

  • Der Intercept liegt bei \(0.13\) Logits, was einer Wahrscheinlichkeit von rund 53 % entspricht (berechnet über plogis(0.13)). Das ist die vorhergesagte Wahrscheinlichkeit für Männer mit Durchschnittsalter und durchschnittlicher Nutzung der drei Mediumsvariablen, die richtige Antwort zu geben – also für Personen, die auf allen Prädiktoren den Wert 0 aufweisen.
  • Da diese Baseline-Wahrscheinlichkeit von 53 % nahe der Mitte der S-Kurve liegt, funktioniert die Geteilt-durch-4-Regel hier besonders gut als Annäherung.
  • Für die Nutzung von Online-Nachrichtenseiten (gemessen auf einer 7er-Skala von 1 = keine Nutzung bis 7 = sehr viel Nutzung) ergibt sich ein Koeffizient von \(0.19\) mit einem Konfidenzintervall von etwa \(0.11\) bis \(0.28\) und einem statistisch signifikanten Effekt (\(z = 4.5\); \(p < 0.001\)). Zwei Personen, die sich nur in dieser Nutzung um einen Skalenpunkt unterscheiden, sich aber auf allen anderen Prädiktoren gleichen, unterscheiden sich um etwa 5 Prozentpunkte (\(0.19 / 4\)) in der Wahrscheinlichkeit, die Frage richtig zu beantworten – die Person mit stärkerer Nutzung hat die höhere Wahrscheinlichkeit.
  • Für das Geschlecht (Koeffizient \(-1.20\)) ergibt sich nach der Geteilt-durch-4-Regel ein Unterschied von etwa 30 Prozentpunkten: Frauen beantworten die Frage – bei gleichem Alter und gleicher Mediennutzung wie vergleichbare Männer – mit einer um rund 30 Prozentpunkte geringeren Wahrscheinlichkeit richtig.

Das grundlegende Prinzip der Interpretation ist dabei identisch zur multiplen linearen Regression: Man vergleicht stets zwei Personen (oder Fälle), die sich auf genau einem Prädiktor um eine Einheit unterscheiden, auf allen übrigen im Modell enthaltenen Prädiktoren aber exakt gleiche Werte aufweisen. Der Unterschied liegt lediglich darin, dass bei der logistischen Regression diese Vergleiche über die Geteilt-durch-4-Regel, die Average Counterfactual Comparison oder Odds Ratios in Prozentpunkte bzw. Chancenverhältnisse übersetzt werden müssen, statt sie – wie in der linearen Regression – direkt als Punkte auf der aV lesen zu können.

Auch für dasselbe Modell mit mehreren Prädiktoren lassen sich alternativ Odds Ratios berichten: Für die Online-Nachrichten-Nutzung ergibt sich ein Odds Ratio von \(1.21\) (die Chance einer richtigen Antwort steigt also um den Faktor 1.2 pro Skalenpunkt), für das weibliche Geschlecht ein Odds Ratio von \(0.30\) (Frauen haben demnach nur eine etwa 0.3-mal so große Chance wie gleich alte Männer mit identischer Mediennutzung, die Frage richtig zu beantworten).

Modellgüte: Pseudo-R²

Da es in der logistische Regression – anders als in der linearen Regression – kein eindeutiges \(R^2\) gibt, wurden verschiedene sogenannte Pseudo-\(R^2\)-Maße entwickelt, die die Modellgüte durch den Vergleich von Nullmodell und dem zu beurteilenden Modell mit Prädiktoren abschätzen. Verbreitete Varianten sind McFadden’s \(R^2\), Nagelkerke’s \(R^2\), Cox & Snell’s \(R^2\) sowie Tjur’s \(R^2\). Für logistische Regressionsmodelle wird in dieser Vorlesung Tjur’s \(R^2\) empfohlen. Die Interpretation erfolgt grundsätzlich wie bei einem gewöhnlichen \(R^2\) (höhere Werte bedeuten mehr erklärte Varianz), wobei je nach Maß und Modell die theoretischen Grenzwerte 0 und 1 nicht notwendigerweise erreichbar sind. Im Beispielmodell mit mehreren Prädiktoren für PK3 ergibt sich ein Tjur’s \(R^2\) von \(0.14\), was als moderate Erklärungskraft des Modells eingeordnet wird.

Ausblick: die binomiale Zählvariable

Als Brücke zum nächsten Themenblock wird eine besondere Art von Zählvariable eingeführt: die binomiale Zählvariable. Das ist eine ganze, nicht-negative Zahl mit einem bekannten Maximum, die als Anzahl der Erfolge in einer bekannten Anzahl binärer Versuche verstanden werden kann. Ein Beispiel ist der aus den sechs (bzw. fünf indexrelevanten) Wissensfragen gebildete additive Wissensindex mit Werten von 0 bis 5: Er zählt, wie viele von fünf möglichen binären Wissensfragen richtig beantwortet wurden.

Solche binomialen Zählvariablen lassen sich weiterhin mit einer logistischen Regression modellieren. Dabei gibt man entweder die Anzahl der richtig und falsch beantworteten Fragen gemeinsam als aV ein (über die Funktion cbind()) oder man verwendet den Anteil richtig beantworteter Fragen als aV und die Gesamtzahl der Fragen als Gewicht (weights). In beiden Fällen wird geschätzt, mit welcher Wahrscheinlichkeit eine weitere ‘durchschnittliche’ Frage aus dem Test richtig beantwortet wird.

Im Beispiel mit dem (zentrierten) Alter als Prädiktor für den Wissensindex ergibt sich ein Intercept von \(0.45\) Logits, was einer Wahrscheinlichkeit von 61 % entspricht: Eine Person mit Durchschnittsalter beantwortet demnach eine durchschnittliche Frage mit 61-prozentiger Wahrscheinlichkeit richtig. Der Alters-Koeffizient von \(0.25\) führt nach der Geteilt-durch-4-Regel zu einer Interpretation von etwa 6 Prozentpunkten: Zwei Personen, die sich im Alter um 10 Jahre unterscheiden, unterscheiden sich um rund 6 Prozentpunkte in der Wahrscheinlichkeit, eine durchschnittliche Frage richtig zu beantworten. Vergleicht man in diesem Beispiel die lineare mit der logistischen Modellierung des Wissensindex, zeigt sich, dass bei diesem eher gemäßigten Zusammenhang praktisch kein Unterschied zwischen beiden Modellansätzen sichtbar wird – anders als im stark simulierten Ausgangsbeispiel.

Zählvariablen als abhängige Variable: Poisson- und negativ-binomiale Modelle

Grundlagen und Beispiel: Social-Media-Metriken (Fähnrich et al., 2020)

Zählvariablen sind nicht-negative ganze Zahlen, die typischerweise entstehen, wenn etwas gezählt wird, ohne dass es eine natürliche Obergrenze gibt – im Unterschied zur binomialen Zählvariable aus dem vorherigen Abschnitt. Wichtige Beispiele aus der Kommunikationswissenschaft sind Social-Media-Metriken wie die Anzahl der Likes, Kommentare oder Shares zu einem Post, aber auch Häufigkeiten und Dauern der Mediennutzung. Als Anwendungsbeispiel dient die Studie von Fähnrich, Vogelgesang und Scharkow (2020) zur strategischen Online-Kommunikation von Universitäten, in der unter anderem die Zahl der Kommentare zu Facebook-Posts der UC San Francisco im Zeitverlauf betrachtet wird.

Für die Modellierung von Zählvariablen gibt es zwei verbreitete Verteilungsannahmen:

  • Poisson-Verteilung: Es wird angenommen, dass der erwartete Mittelwert und die erwartete Varianz der Verteilung gleich groß sind.
  • Negative Binomialverteilung: Diese Verteilung besitzt einen zusätzlichen Dispersionsparameter, der es erlaubt, dass der erwartete Mittelwert von der erwarteten Varianz abweicht.

In diesem Zusammenhang wird der Begriff der Über- bzw. Unterdispersion eingeführt: Damit ist eine fehlende Passung zwischen der theoretisch erwarteten Varianz (gemäß Poisson-Annahme) und der tatsächlich beobachteten Streuung der Datenpunkte um ihre Vorhersagewerte gemeint. Im Beispiel der Kommentare zu UC-San-Francisco-Posts (\(M = 3.55\); Varianz = \(28.85\); \(n = 128\)) liegt die beobachtete Varianz weit über dem Mittelwert – ein deutliches Anzeichen für Überdispersion. Als vereinfachte Entscheidungsregel gilt: Eine endgültige Entscheidung zwischen Poisson- und negativ-binomialem Modell lässt sich erst anhand der geschätzten Modelle treffen, aber das deskriptive Verhältnis von Mittelwert zu Varianz gibt oft schon einen ersten Hinweis auf das angemessene Modell. Insbesondere bei Social-Media-Daten ist die Annahme gleicher Varianz und Mittelwert (Poisson) nur sehr selten erfüllt, weshalb die negativ-binomiale Regression zumindest testweise immer mitgeprüft werden sollte – auch wenn sich die inhaltliche Interpretation der Koeffizienten am Ende kaum unterscheidet.

Warum die lineare Regression bei Zählvariablen versagt

Auch hier wird das Problem zunächst an einem simulierten Beispiel mit bekanntem, datengenerierendem Poisson-Prozess illustriert: die Zahl der Kommentare zu Posts der UC San Francisco im Zeitverlauf (gemessen in Monatsschritten). Legt man eine gewöhnliche lineare Regressionsgerade durch diese Datenpunkte, ergeben sich zwei Probleme:

  • Die vorhergesagte Kommentarzahl kann kleiner als 0 werden – eine negative Anzahl von Kommentaren ist aber unmöglich.
  • Weder der lineare Zusammenhang noch die Homoskedastizität (also die Annahme gleich großer Streuung über den gesamten Wertebereich) sind bei Zähldaten typischerweise gegeben, da die Streuung mit steigendem Erwartungswert häufig zunimmt.

Damit verstößt die lineare Regression bei Zählvariablen gegen zentrale eigene Annahmen.

Das Nullmodell und der Intercept

Auch hier beginnt man mit einem Nullmodell, das nur den Intercept enthält (\(\log(Y_i) = b_0\)). Für die Kommentarzahl der UC-San-Francisco-Posts ergibt sich dabei ein Intercept von \(1.27\) auf der logarithmierten Skala. Exponenziert man diesen Wert (\(\exp(1.27)\)), erhält man rund \(3.55\) – das entspricht exakt dem beobachteten Mittelwert der Kommentarzahl in den Daten. Wie bei der linearen und der logistischen Regression bildet also auch hier das Nullmodell schlicht den Mittelwert der aV ab, in diesem Fall den erwarteten Mittelwert der Zählvariable. Als Gütemaß des Nullmodells wird ein \(R^2\) von 0 ausgewiesen (hier als Nagelkerke’s \(R^2\) bezeichnet).

Koeffizienten interpretieren

Koeffizienten von Modellen mit Log-Link sind ebenfalls schwer direkt interpretierbar, weil der multiplikative Effekt eines Prädiktors immer vom jeweiligen Ausgangsniveau der aV abhängt. Es werden zwei Interpretationsmöglichkeiten unterschieden:

Exponenzierte Koeffizienten als Wachstumsfaktor bzw. Wachstumsrate

Analog zu den Odds Ratios in der logistischen Regression exponenziert man auch hier die Koeffizienten. Man unterscheidet dabei zwischen dem Wachstumsfaktor (\(e^{b_1}\)) und der Wachstumsrate (\(e^{b_1} - 1\)). Am Beispiel eines Modells, das die Kommentarzahl über den Beobachtungszeitraum hinweg vorhersagt (der Zeitprädiktor wurde so kodiert, dass die Mitte des Beobachtungszeitraums den Wert 0 hat), ergibt sich ein exponenzierter Intercept von \(3.22\) und ein exponenzierter Zeitkoeffizient von \(1.05\):

  • Der exponenzierte Intercept (\(3.22\)) gibt an: In der Mitte des Beobachtungszeitraums liegt die erwartete Zahl der Kommentare bei \(3.2\).
  • Der Wachstumsfaktor von \(1.05\) bedeutet: Die erwartete Zahl der Kommentare wächst pro Monat auf das 1.05-Fache.
  • Ausgedrückt als Wachstumsrate (\(1.05 - 1 = 0.05\)) bedeutet das: Die erwartete Zahl der Kommentare wächst pro Monat um 5 %.

Für das umfangreichere Modell mit mehreren Prädiktoren (Zeit, zwei Themen-Dummy-Variablen ‘Forschung’ und ‘Lehre’ sowie die Wortlänge des Posts in Hundert-Wort-Schritten, ebenfalls zentriert) ergibt sich ein exponenzierter Intercept von \(2.54\): In der Mitte des Beobachtungszeitraums liegt die erwartete Kommentarzahl für einen durchschnittlich langen Post ohne die beiden Themen bei \(2.5\). Der exponenzierte Zeitkoeffizient bleibt bei \(1.05\), das heißt, die erwartete Kommentarzahl wächst – bei sonst gleichen Eigenschaften des Posts – weiterhin um etwa 5 % pro Monat. Die Koeffizienten für die beiden Themen-Variablen und die Wortlänge sind in diesem Modell dagegen statistisch nicht signifikant, sodass für sie kein verlässlicher Effekt angenommen werden kann.

Average Counterfactual Comparison

Auch für Zählvariablen lässt sich – wie in der multiplen linearen Regression – der Effekt eines Prädiktors über den Vergleich hypothetischer (kontrafaktischer) Fälle an unterschiedlichen Stellen der Verteilung genauer bestimmen, statt nur mit einem einzigen multiplikativen Faktor zu arbeiten. Am Zeitbeispiel zeigt sich, dass der geschätzte Zuwachs an Kommentaren pro Monat je nach Position im Beobachtungszeitraum unterschiedlich groß ausfällt: Zu Beginn des Untersuchungszeitraums steigt die erwartete Kommentarzahl um etwa \(0.07\) pro Monat, in der Mitte des Zeitraums um \(0.15\) zusätzliche Kommentare pro Monat, und am Ende des Zeitraums (vom vorletzten zum letzten Monat) sogar um rund \(0.33\) Kommentare. Das macht deutlich, dass ein konstanter prozentualer Wachstumsfaktor in absoluten Kommentarzahlen zu sehr unterschiedlichen Zuwächsen führt, je nachdem, wie hoch das Ausgangsniveau bereits ist – ein typisches Merkmal exponentiellen Wachstums. Für die übrigen Prädiktoren im Mehrprädiktoren-Modell (Themen, Wortlänge) zeigen sich in dieser Betrachtung keine statistisch signifikanten Unterschiede.

Modellgüte: Pseudo-R²

Auch für Poisson- und negativ-binomiale Regression existieren verschiedene Pseudo-\(R^2\)-Maße (McFadden, Nagelkerke, Cox & Snell, Tjur), die die Passung von Nullmodell und geschätztem Modell vergleichen. Für diese beiden Modelltypen wird in der Vorlesung Nagelkerke’s \(R^2\) empfohlen. Auch hier gilt: Die Interpretation erfolgt analog zur linearen Regression, wobei die theoretischen Grenzwerte 0 und 1 je nach Maß und Modell mitunter nicht erreichbar sind. Im Beispielmodell mit mehreren Prädiktoren für die Kommentarzahl ergibt sich ein Nagelkerke’s \(R^2\) von \(0.26\), was als substanzielle Erklärungskraft des Modells eingestuft wird.

Modellvergleich: Poisson- oder negativ-binomiale Regression?

Am Ende des Blocks wird direkt verglichen, welches der beiden Modelle für die Kommentar-Daten besser geeignet ist. Vergleicht man die (exponenzierten) Koeffizienten eines Poisson-Modells mit denen des entsprechenden negativ-binomialen Modells für dieselben Prädiktoren, fallen die geschätzten Koeffizienten selbst recht ähnlich aus. Deutlich unterschiedlich ist jedoch die Inferenzstatistik: Im Poisson-Modell erscheinen die Unterschiede nach Themen (Forschung, Lehre) statistisch signifikant, im negativ-binomialen Modell dagegen nicht.

Um zu entscheiden, welches Modell verlässlicher ist, wird ein Overdispersion-Test durchgeführt, der prüft, ob die Annahme gleicher Varianz und gleichen Mittelwerts (Poisson) erfüllt ist. Für das Poisson-Modell ergibt sich ein Dispersionsverhältnis von \(5.82\) mit einem statistisch signifikanten Testergebnis (\(p < 0.001\)) – die Varianz in den Daten ist also weit größer als vom Poisson-Modell angenommen, es liegt eine deutliche Überdispersion vor. Für das negativ-binomiale Modell liegt das Dispersionsverhältnis dagegen bei \(0.93\) und ist nicht signifikant, das Modell passt also gut zur beobachteten Streuung.

Ergänzend werden Informationskriterien wie AIC (Akaike Information Criterion) und BIC (Bayesian Information Criterion) zum Modellvergleich herangezogen: Beide Kriterien fallen für das negativ-binomiale Modell (\(AIC = 589.2\)) deutlich niedriger aus als für das Poisson-Modell (\(AIC = 876.9\)), was ebenfalls klar für das negativ-binomiale Modell spricht (niedrigere Werte zeigen die bessere Modellpassung an).

Die inhaltliche Schlussfolgerung lautet: Da die Verteilungsannahme der Poisson-Regression (Varianz entspricht dem Erwartungswert) hier eindeutig verletzt ist, sind die Standardfehler des Poisson-Modells zu klein geschätzt, wodurch die Inferenzstatistik verzerrt ist. Die im Poisson-Modell gefundenen ‘statistisch signifikanten’ Unterschiede nach Themen wären daher mit hoher Wahrscheinlichkeit eine fälschliche Ablehnung der Nullhypothese. Die negativ-binomiale Regression passt wesentlich besser zu den vorliegenden Daten, und die dort gefundenen nicht signifikanten Ergebnisse für die Themen-Variablen gelten als die verlässlicheren Befunde. Für Social-Media-Daten sollte man also grundsätzlich beide Modelle schätzen und anhand von Overdispersion-Test sowie AIC/BIC das besser passende Modell auswählen.

Fazit

Die lineare Regression lässt sich verallgemeinern, um unterschiedliche Verteilungen der abhängigen Variable sowie passende Link-Funktionen zwischen den Prädiktoren und der aV zu ermöglichen. Damit können auch binäre Variablen und Zählvariablen als abhängige Variablen korrekt modelliert werden, ohne gegen deren inhärente Grenzen (z. B. den Wertebereich 0 bis 1 bei Wahrscheinlichkeiten oder die Nicht-Negativität bei Zähldaten) zu verstoßen.

Diese größere Flexibilität hat allerdings ihren Preis: Verallgemeinerte lineare Modelle sind komplexer als die lineare Regression, und ihre Koeffizienten lassen sich weniger intuitiv interpretieren – man benötigt zusätzliche Schritte wie die Geteilt-durch-4-Regel, Average Counterfactual Comparisons oder das Exponenzieren von Koeffizienten zu Odds Ratios bzw. Wachstumsfaktoren/-raten. Bei der Wahl des passenden Modells stellt sich daher immer die Abwägungsfrage: Wann ist die einfachere lineare Regression noch gut genug als Annäherung, und wann sollte man auf ein verallgemeinertes lineares Modell zurückgreifen? Bei sehr starken, deutlich nichtlinearen Zusammenhängen (wie im simulierten Beispiel) sind die Unterschiede gravierend; bei moderaten, realistischen Zusammenhängen (wie in den empirischen Beispielen) fallen sie hingegen oft klein aus.

Wichtig ist außerdem, dass sich vieles, was in den vorherigen Einheiten der Vorlesung zur linearen Regression erarbeitet wurde, direkt auf verallgemeinerte lineare Modelle übertragen lässt. Dazu zählen unter anderem kausale Annahmen, die Konzepte von Moderation und Interaktion, Mediation, Pfadmodelle, Strukturgleichungsmodelle sowie Mehrebenenmodelle. Verallgemeinerte lineare Modelle sind also keine völlig neue Modellklasse, sondern eine konsequente Erweiterung der aus der gesamten Vorlesung bekannten linearen Modelllogik auf andere Verteilungen der abhängigen Variable.