D — Auswertung

Wir laden zunächst alle nötigen Pakete. Das sind - neben dem tidyverse - einige Pakete, die wir für die folgenden Auswertungen brauchen. Ihre jeweilige Funktion ist in den Kommentaren im Code beschrieben. Dann laden wir die aufbereiteten und bereinigten Datensätze auf Situations- und Personenebene.

#Einstellungen zur besseren Lesbarkeit des Outputs
options(scipen = 999) 
options(digits = 3)  


#Laden der Pakete
library(tidyverse) 

library(psych) #Paket für Cronbachs Alpha und Korrelationen
library(rmcorr) #Paket zur Berechnung von Within-Person-Korrelationen
library(multilevelTools) #Paket zur Berechnung von Between- und Within-Person-Reliabilitäten

library(lme4) #Paket für Mehrebenenanalysen
library(lmerTest) #Paket für p-Werte für lmer-Modelle
library(performance) # Paket für Modellfit und ICC
library(sjPlot) # Paket für die Darstellung der Ergebnistabellen

library(multilevLCA) #Paket für für Mehrebenen-Latent-Class-Analysen


#Laden der Datensätze
data_situation <- readxl::read_excel("data/data_situation_final.xlsx",
                 col_names = TRUE)

data_person_presurvey <- readxl::read_excel("data/data_person_level_presurvey.xlsx",
                 col_names = TRUE)

data_person_postsurvey <- readxl::read_excel("data/data_person_level_postsurvey.xlsx",
                 col_names = TRUE)

D.1 Grundlegende Auswertungen

Zunächst berichten wir einige Deskriptiva unserer Studie.

D.1.1 Fallzahlen, Abbruchquote und Compliance

sum_protokolle <- as_tibble(data_situation  |>  
  group_by(id) |> 
  count())

sum_protokolle |> 
  select(n) |>
  map_dfr(~ tibble
          ( Personen = length(.x),
            Situationen = sum(.x, na.rm = TRUE)), 
          .id = "variable")
sum_protokolle |> 
  select(n) |>
  map_dfr(~ tibble
          ( Personen = length(.x),
            M_Protokolle = mean(.x, na.rm = TRUE), 
            SD_Protokolle = sd(.x, na.rm = TRUE),
            Min_Protokolle = min(.x, na.rm = TRUE),
            Max_Protokolle = max(.x, na.rm = TRUE)), 
          .id = "variable")

In unserer finalen Stichprobe haben wir 2896 Protokolle von 101 Personen. Im Schnitt hat jede:r Teilnehmer:in 28,7 Protokolle ausgefüllt (SD = 11,1). Dies beinhaltet Situationen, in denen kein Podcast gehört wurde, und solche mit Podcast-Nutzung - True Crime oder andere Podcasts.

Da wir uns im Folgenden v. a. für die Situationen interessieren, in denen ein Podcast gehört wurde, schauen wir uns auch die Fallzahlen hierfür an.

sum_protokolle_pod <- as_tibble(data_situation |> 
  filter(pod_nutz == "Ja, True-Crime-Podcast" | pod_nutz == "Ja, anderer Podcast") |>                            
  group_by(id) |> 
  count())

sum_protokolle_pod |> 
  select(n) |>
  map_dfr(~ tibble
          ( Personen = length(.x),
            Situationen = sum(.x, na.rm = TRUE)), 
          .id = "variable")
sum_protokolle_pod |> 
  select(n) |>
  map_dfr(~ tibble
          ( Personen = length(.x),
            M_Protokolle = mean(.x, na.rm = TRUE), 
            SD_Protokolle = sd(.x, na.rm = TRUE),
            Min_Protokolle = min(.x, na.rm = TRUE),
            Max_Protokolle = max(.x, na.rm = TRUE)), 
          .id = "variable")

Die 101 Personen haben in 1263 Situationen einen Podcast gehört. Im Schnitt haben die Teilnehmer:innen in 12,5 Protokollen (SD = 6,69) von einer Podcast-Nutzung berichtet.

Auch Attrition und Compliance, die wir bereits in Abschnitt B.2 berechnet haben, sollten hier angegeben werden. Die Abbruchquote lag bei 48%, die Compliance bei 60% (SD = 23,03).

D.1.2 Deskriptiva der Personenvariablen

Nun beschreiben wir unsere Stichprobe zunächst auf Personenebene. Hierfür markieren wir zunächst die Fälle im Datensatz, die an der In-situ-Studie teilgenommen haben. Das sind - wie wir bereits wissen (siehe Abschnitt D.1.1) - 101 Personen.

anzahl_esm <- data_situation |> 
  group_by(id) |> 
  count() 
  

data_person_presurvey <- left_join(data_person_presurvey, anzahl_esm, by="id")

data_person_presurvey <- data_person_presurvey |> 
  filter(consent_esm == "eingewilligt") |> #wir behalten nur die, die ihr Einverständnis gegeben haben
  mutate(tn_esm = if_else(!is.na(n) & n > 0, "an ESM-Studie teilgenommen", "nicht an ESM-Studie teilgenommen")) 

data_person_presurvey |> 
  count(tn_esm)
data_person_presurvey_esm <- data_person_presurvey |>
  filter(tn_esm == "an ESM-Studie teilgenommen") 
data_person_presurvey_esm |>
  select(soz_age) |>
  map_dfr(~ tibble
          ( M = mean(.x, na.rm = TRUE), 
            SD = sd(.x, na.rm = TRUE),
            Min = min(.x, na.rm = TRUE),
            Max = max(.x, na.rm = TRUE)), 
          .id = "variable")
data_person_presurvey_esm |>
  count(soz_gender) |>
  mutate(percentage = n/sum(n) * 100) |>
  arrange(desc(n))

Die Teilnehmer:innen sind im Schnitt 31,8 Jahre alt (SD = 7,83), 84% sind weiblich, 14% männlich und 2% divers.

D.1.3 Deskriptiva der Situationsvariablen

Auch die Variablen auf Situationsebene betrachten wir zunächst deskriptiv.

Wir beginnen mit den metrischen Variablen.

#Da die Nutzungsdauer in zwei getrennten Variablen (Minuten und Stunden) erhoben wurde, müssen wir diese zunächst in eine Variable verrechnen
data_situation <- data_situation |>
  mutate(pod_dauer = pod_dauer_std * 60 + pod_dauer_min)


data_situation |>
  select(aufmerksamkeit, stimmung, narr_trans_skala, pod_dauer) |>
  map_dfr(~ tibble
          ( M = mean(.x, na.rm = TRUE), 
            SD = sd(.x, na.rm = TRUE),
            Min = min(.x, na.rm = TRUE),
            Max = max(.x, na.rm = TRUE)), 
          .id = "variable")

Über alle Personen und Situationen hinweg lag die Aufmerksamkeit bei 3,80 (SD = 0,87), die Stimmung bei 3,53 (SD = 0,87) und die Narrative Transportation bei 3,53 (SD = 0,86). Im Schnitt dauerte eine Podcast-Nutzungsepisode 66 Minuten (SD = 57,06).

Da es sich bei Narrativer Transportation um eine Skalenabfrage handelt, berichten wir auch die Reliabilität dieser Skala. In Abschnitt C.2 haben wir verschiedene Alternativen der Berechnung kennengelernt.

omegaSEM(
  items = c("narr_trans_01", "narr_trans_02", "narr_trans_03", "narr_trans_04", "narr_trans_05", "narr_trans_06" ),
  id = "id",
  data = data_situation,
  savemodel = FALSE)
$Results
           label   est ci.lower ci.upper
43  omega_within 0.720    0.689    0.750
46 omega_between 0.903    0.868    0.939

Sowohl die Within- (Omega = ,72) als auch die Between-Person-Reliabilität (Omega = ,90) ist - gemessen an der “klassischen” Grenze von ,70 - zufriedenstellend.

Weiterhin schauen wir uns deskriptiv die kategorialen Variablen an.

data_situation |>
  filter(pod_nutz == "Ja, True-Crime-Podcast" | pod_nutz == "Ja, anderer Podcast") |> #die Frage wurde nur in den Podcast-Episoden beantwortet, deshalb filtern wir zunächst
  group_by(kopfhoerer) |>
  summarise(N = n()) |>
  mutate(Prozent = N / sum(N) * 100) |> 
  arrange(desc(N))
data_situation |>
  filter(pod_nutz == "Ja, True-Crime-Podcast" | pod_nutz == "Ja, anderer Podcast") |> #die Frage wurde nur in den Podcast-Episoden beantwortet, deshalb filtern wir zunächst
  group_by(umgebung) |>
  summarise(N = n()) |>
  mutate(Prozent = N / sum(N) * 100) |> 
  arrange(desc(N))

In knapp der Hälfte der Situationen (46%) haben die Teilnehmer:innen ohne Kopfhörer Podcast gehört. Die meisten Nutzungsepisoden (58%) fanden zuhause statt, ein gutes Drittel (35%) unterwegs.

D.1.4 Korrelationen

Es ist sinnvoll, immer auch die Korrelationen zwischen den Variablen zu berichten.

Zunächst die Within-Person-Korrelationen:

dist_rmc_mat <- rmcorr_mat(id, variables = c("narr_trans_skala", "aufmerksamkeit", "pod_dauer", "stimmung"), data_situation, CI.level = 0.95)

dist_rmc_mat$summary

Narrative Transportation korreliert auf der intraindividuellen Ebene signifikant mit Aufmerksamkeit (r = ,37), Nutzungsdauer (r = ,12) und Stimmung (r = ,21): Je stärker die Narrative Transportation bei einer Person in einer Situation ausgeprägt ist, desto aufmerksamer ist sie, desto länger hört sie Podcast und desto besser ist sie gelaunt. Ebenso gilt: Je aufmerksamer eine Person in einer Situation ist, desto besser ist sie gelaunt (r = ,21).

Dann die Between-Person-Korrelationen:

between_person_corr <- data_situation |>
  group_by(id) |>
  summarize(across(c(narr_trans_skala, aufmerksamkeit, pod_dauer, stimmung), mean, na.rm = TRUE))


between_person_corr_p <- between_person_corr |>
  select(-id) 

corr.test(between_person_corr_p)
Call:corr.test(x = between_person_corr_p)
Correlation matrix 
                 narr_trans_skala aufmerksamkeit pod_dauer stimmung
narr_trans_skala             1.00           0.35      0.05     0.24
aufmerksamkeit               0.35           1.00     -0.01     0.39
pod_dauer                    0.05          -0.01      1.00     0.08
stimmung                     0.24           0.39      0.08     1.00
Sample Size 
                 narr_trans_skala aufmerksamkeit pod_dauer stimmung
narr_trans_skala              100            100       100      100
aufmerksamkeit                100            101       101      101
pod_dauer                     100            101       101      101
stimmung                      100            101       101      101
Probability values (Entries above the diagonal are adjusted for multiple tests.) 
                 narr_trans_skala aufmerksamkeit pod_dauer stimmung
narr_trans_skala             0.00           0.00       1.0     0.07
aufmerksamkeit               0.00           0.00       1.0     0.00
pod_dauer                    0.62           0.91       0.0     1.00
stimmung                     0.02           0.00       0.4     0.00

 To see confidence intervals of the correlations, print with the short=FALSE option

Interindividuell korreliert Narrative Transportation signifikant mit Aufmerksamkeit (r = ,35): Personen, die über alle Situationen hinweg eher narrativ transportiert werden, sind auch über alle Sitationen hinweg aufmerksamer. Weiterhin gilt: Personen, die generell aufmerksamer sind, sind auch über alle Situationen hinweg besser gelaunt (r = ,39).

D.2 Auswertungen auf Personenebene

Wollen wir die In-situ-Daten rein auf Personenebene auswerten, müssen wir diese zunächst aggregieren. Wie wir dies machen, hängt vom Forschungsinteresse ab. Im Folgenden zeigen wir für die Beispiele im Buch (siehe Abschnitt 9.4), wie wir die Daten aggregieren können.

data_aggregated <- data_situation |>
  group_by(id) |>
  summarise(
    tc_episoden = sum(pod_nutz == "Ja, True-Crime-Podcast"), #Aufsummieren der True Crime-Nutzungsepisoden über die Feldzeit hinweg
    pm_stimmung = mean(stimmung, na.rm = TRUE), #Mittelwert der Stimmung über die Feldzeit hinweg
    var_stimmung = sd(stimmung, na.rm = TRUE) #Standardabweichung der Stimmung über die Feldzeit hinweg
  ) |>
 ungroup()

data_aggregated |>
  select(tc_episoden, pm_stimmung, var_stimmung) |>
  map_dfr(~ tibble
          ( M = mean(.x, na.rm = TRUE), 
            SD = sd(.x, na.rm = TRUE),
            Min = min(.x, na.rm = TRUE),
            Max = max(.x, na.rm = TRUE)), 
          .id = "variable")

Die weitere Auswertung erfolgt dann mit für Querschnittsstudien gängigen Auswertungsverfahren, die hier nicht weiter vorgestellt werden.

D.3 Auswertungen auf Situationsebene

D.3.1 Deskriptive Auswertungen

Auf Situationsebene können wir uns zum einen deskriptive Kennwerte für unsere Variablen anschauen. Die Auswertungen entsprechen denen in Abschnitt D.1.3.

Zudem können wir die situative Variation von Konstrukten betrachten. Beispielsweise könnten wir uns dafür interessieren, wie sich die Podcast-Nutzungsdauer über den Tag verteilt. Das können wir sowohl für alle Teilnehmer:innen - also auf Aggregatebene - tun als auch für einzelne Teilnehmer:innen. Dafür bietet sich eine grafische Darstellung an.

#Um die Ansicht übersichtlich zu machen, werden die Verläufe in Paketen von je 20 Teilnehmer:innen angezeigt.


data_situation <- data_situation |> 
  mutate(id_num = as.numeric(as.factor(id)), #hierfür vergeben wir zunächst eine numerische ID, da unsere ID eine Zeichenfolge ist.
         uhrzeit = as.POSIXct(uhrzeit, format="%H:%M:%S", tz="UTC"), #außerdem müssen wir die Uhrzeit noch ins richtige Format umwandeln, da auch sie eine Zeichenfolge ist.
    tagesabschnitt = case_when( #hier wählen wir sinnvolle Tagesabschnitte aus.
      hour(uhrzeit) >= 6  & hour(uhrzeit) < 12 ~ "1",
      hour(uhrzeit) >= 12 & hour(uhrzeit) < 18 ~ "2",
      hour(uhrzeit) >= 18 & hour(uhrzeit) < 23 ~ "3",
      TRUE ~ "4"
    )
  )

nutzung <- as_tibble(data_situation |> 
  filter(id_num %in% unique(data_situation$id_num)[1:20]) |> # dann können wir hier die ersten 20 Fälle auswählen
  group_by(id, tagesabschnitt) |> 
  mutate(pod_dauer = if_else(is.na(pod_dauer), 0, pod_dauer)) |>   
  summarise(nutz_dauer = mean(pod_dauer, na.rm = TRUE), .groups = "drop")) 

ggplot(nutzung, aes(x = tagesabschnitt, y = nutz_dauer)) +
  geom_bar(stat = "identity", position = "dodge") +
  facet_wrap(~ id, ncol = 5) +
  labs(x = "Tagesabschnitt", y = "Nutzungsdauer (Minuten)") +
  theme_minimal() 

nutzung <- as_tibble(data_situation |> 
  filter(id_num %in% unique(data_situation$id_num)[21:40]) |> # ...hier die nächsten 20 Fälle 
  group_by(id, tagesabschnitt) |> 
  mutate(pod_dauer = if_else(is.na(pod_dauer), 0, pod_dauer)) |> 
  summarise(nutz_dauer = mean(pod_dauer, na.rm = TRUE), .groups = "drop")) 

ggplot(nutzung, aes(x = tagesabschnitt, y = nutz_dauer)) +
  geom_bar(stat = "identity", position = "dodge") +
  facet_wrap(~ id, ncol = 5) +
  labs(x = "Tagesabschnitt", y = "Nutzungsdauer (Minuten)") +
  theme_minimal()

nutzung <- as_tibble(data_situation |> 
  filter(id_num %in% unique(data_situation$id_num)[41:60]) |> # ...usw.
  group_by(id, tagesabschnitt) |> 
  mutate(pod_dauer = if_else(is.na(pod_dauer), 0, pod_dauer)) |> 
  summarise(nutz_dauer = mean(pod_dauer, na.rm = TRUE), .groups = "drop")) 

ggplot(nutzung, aes(x = tagesabschnitt, y = nutz_dauer)) +
  geom_bar(stat = "identity", position = "dodge") +
  facet_wrap(~ id, ncol = 5) +
  labs(x = "Tagesabschnitt", y = "Nutzungsdauer (Minuten)") +
  theme_minimal()

D.3.2 Mehrebenenanalysen zur Auswertung von in situ Daten

D.3.2.1 Zerlegung in Personen-und Situationsvarianz

Zunächst ist es sinnvoll zu prüfen, wie sich die Varianz in der abhängigen Variable verteilt. Diese Information enthält das Nullmodell, also das Mehrebenenmodell ohne Prädiktoren.

nullmodell <- lmer(narr_trans_skala ~ 1  + (1  | id), data_situation, REML=FALSE)

# ICC 
icc(nullmodell)

Der ICC von ,57 zeigt an, dass 57% der Varianz in Narrativer Transportation zwischen Personen schwankt und somit 43% zwischen Situationen.

D.3.2.2 Zentrierung

D.3.2.2.1 Zentrierung am Gesamtmittelwert

Im Rahmen von Mehrebenenmodellen zentrieren wir die Variablen, die wir einbeziehen, im Vorfeld. Dies können wir am Gesamtmittelwert (also über alle Personen und Messzeitpunkte hinweg) tun. Der Gesamtmittelwert wird vom jeweiligen Wert abgezogen. Für die Situationsvariablen bedeutet ein positiver Wert also, dass eine Person zu einem Messzeitpunkt über dem Durchschnitt aller Personen und Messzeitpunkte liegt, ein negativer, dass sie darunter liegt.

data_situation <- data_situation |>
  mutate(gmc_aufmerksamkeit = aufmerksamkeit - mean(aufmerksamkeit, na.rm = TRUE),
         gmc_stimmung = stimmung - mean(stimmung, na.rm = TRUE),
         gmc_narr_trans_skala = narr_trans_skala - mean(narr_trans_skala, na.rm = TRUE),
         gmc_pod_dauer = pod_dauer - mean(pod_dauer, na.rm = TRUE)
         )

data_situation |>
  select(gmc_aufmerksamkeit, gmc_stimmung, gmc_narr_trans_skala, gmc_pod_dauer) |>
  map_dfr(~ tibble
          ( M = mean(.x, na.rm = TRUE), 
            SD = sd(.x, na.rm = TRUE),
            Min = min(.x, na.rm = TRUE),
            Max = max(.x, na.rm = TRUE)), 
          .id = "variable")

Die Ergebnisse zeigen, dass der Mittelwert dieser neuen Variablen - wie gewollt - bei 0 liegt (minimale Abweichungen ergeben sich durch Rundungsungenauigkeiten).

D.3.2.2.2 Zentrierung am Personenmittelwert

Oft wollen wir die Situationsvariablen allerdings am Personenmittelwert zentrieren. Hier wird für jede teilnehmende Person gesondert ihr individueller Mittelwert über alle Messzeitpunkte errechnet und dieser Mittelwert von jedem einzelnen Messzeitpunkt abgezogen. Dann liegt der Wert bei 0, wenn die Person z. B. so gelaunt ist, wie sie es im Durchschnitt ist, hat ein positives Vorzeichen, wenn die Person besser als ihr Durchschnitt gelaunt ist und ein negatives, wenn sie schlechter als ihr Durchschnitt gelaunt ist.

data_situation <- data_situation |>
  group_by(id) |>
  mutate(pmc_aufmerksamkeit = aufmerksamkeit - mean(aufmerksamkeit, na.rm = TRUE),
         pmc_stimmung = stimmung - mean(stimmung, na.rm = TRUE),
         pmc_narr_trans_skala = narr_trans_skala - mean(narr_trans_skala, na.rm = TRUE),
         pmc_pod_dauer = pod_dauer - mean(pod_dauer, na.rm = TRUE)
         ) |>
   ungroup()

data_situation |>
  select(pmc_aufmerksamkeit, pmc_stimmung, pmc_narr_trans_skala, pmc_pod_dauer) |>
  map_dfr(~ tibble
          ( M = mean(.x, na.rm = TRUE), 
            SD = sd(.x, na.rm = TRUE),
            Min = min(.x, na.rm = TRUE),
            Max = max(.x, na.rm = TRUE)), 
          .id = "variable")

Auch hier liegt der Mittelwert bei 0 (mit kleinen Abweichungen).

Je nach Auswertung (siehe Abschnitt 9.5.2.5 und Abschnitt D.3.2.4.3) wollen wir ggf. auch den Personenmittelwert selbst als Variable mit in die Analysen aufnehmen. Diesen können wir berechnen und an den Datensatz anspielen.

person_means <- data_situation |>
  group_by(id) |>
  summarise(m_aufmerksamkeit = mean(aufmerksamkeit, na.rm = TRUE),
            m_stimmung = mean(stimmung, na.rm = TRUE),
            m_narr_trans_skala = mean(narr_trans_skala, na.rm = TRUE),
            m_pod_dauer = mean(pod_dauer, na.rm = TRUE)) |>
   ungroup()

data_situation <- left_join(data_situation, person_means, by = "id")

D.3.2.3 Personenvariablen als Prädiktoren

Wir können in Mehrebenenanalysen auch Personenvariablen zur Erklärung der abhängigen Variablen heranziehen.

Hierfür müssen wir diese zunächst aufbereiten. Wir wollen Geschlecht, Alter und Transportabilität als Prädiktoren berücksichtigen. Hierfür zentrieren wir die metrischen Variablen (Alter aus der Vorabbefragung und Transportabilität aus der Nachbefragung) zunächst am Gesamtmittelwert (siehe hierzu auch Abschnitt 9.5.2.3 und Abschnitt D.3.2.2.1). Geschlecht dichotomisieren wir, weil sich lediglich 2% der Teilnehmer:innen als divers identifizieren und dies eine zu kleine Anzahl an Teilnehmer:innen ist, um verlässliche Aussagen treffen zu können.

Dann spielen wir die Daten der Vorab- und Nachbefragung an den In-situ-Datensatz an.

data_person_presurvey <- data_person_presurvey |>
  mutate(gmc_soz_age = soz_age - mean(soz_age, na.rm = TRUE),
         soz_gender_d = ifelse(soz_gender == "weiblich", "weiblich", "maennlich/divers"))


data_situation <- left_join(data_situation, data_person_presurvey, by="id")


data_person_postsurvey <- data_person_postsurvey |>
  mutate(gmc_trans_scale = trans_scale - mean(trans_scale, na.rm = TRUE))


data_situation <- left_join(data_situation, data_person_postsurvey, by="id")

Nun können wir die drei Variablen als Prädiktoren in unser Mehrebenenmodell einführen.

pers_modell <- lmer(narr_trans_skala ~ 1 + gmc_soz_age + soz_gender_d + gmc_trans_scale + (1  | id), data_situation, REML=FALSE)
summary(pers_modell) 
Linear mixed model fit by maximum likelihood . t-tests use Satterthwaite's
  method [lmerModLmerTest]
Formula: narr_trans_skala ~ 1 + gmc_soz_age + soz_gender_d + gmc_trans_scale +  
    (1 | id)
   Data: data_situation

      AIC       BIC    logLik -2*log(L)  df.resid 
     1637      1666      -813      1625       865 

Scaled residuals: 
   Min     1Q Median     3Q    Max 
-4.254 -0.560  0.097  0.640  3.632 

Random effects:
 Groups   Name        Variance Std.Dev.
 id       (Intercept) 0.261    0.511   
 Residual             0.301    0.549   
Number of obs: 871, groups:  id, 100

Fixed effects:
                      Estimate Std. Error        df t value
(Intercept)            3.48891    0.15418 115.11848   22.63
gmc_soz_age            0.01083    0.00733  96.63537    1.48
soz_gender_dweiblich  -0.00747    0.16636 113.65319   -0.04
gmc_trans_scale        0.68542    0.10113  99.55760    6.78
                                 Pr(>|t|)    
(Intercept)          < 0.0000000000000002 ***
gmc_soz_age                          0.14    
soz_gender_dweiblich                 0.96    
gmc_trans_scale             0.00000000087 ***
---
Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1

Correlation of Fixed Effects:
            (Intr) gmc_s_ sz_gn_
gmc_soz_age  0.180              
sz_gndr_dwb -0.932 -0.179       
gmc_trns_sc  0.167  0.184 -0.177

Wir sehen, dass unser Modell auf 871 Situationen von 100 Personen beruht. Das liegt daran, dass Narrative Transportation nur für die True-Crime-Episoden gemessen wurde, was die Fallzahlen entsprechend reduziert. Eine Person hat gar keine True-Crime-Episoden berichtet und fehlt somit auf Personenebene.

Während Geschlecht und Alter keinen Einfluss haben, geht ein höheres Maß an Transportabilität mit einer situativ höheren Narrativen Transportation einher.

Statt personenbezogenen Variablen, die wir im Rahmen der Vorab- oder Nachbefragung erhoben haben, können wir auch aggregierte In-situ-Variablen ins Modell einbeziehen, z. B. die Gesamtnutzungshäufigkeit von True-Crime-Podcasts über die Feldzeit hinweg. Die Variable haben wir bereits in Abschnitt D.2 berechnet.

#Zunächst müssen wir die Variable an den In-situ-Datensatz anspielen und am Gesamtmittelwert zentrieren 
data_aggregated_tc_episoden <- data_aggregated |> 
  select(id, tc_episoden)

data_situation <- left_join(data_situation, data_aggregated_tc_episoden, by="id")

data_situation <- data_situation |> 
  mutate(gmc_tc_episoden = tc_episoden - mean(data_situation$tc_episoden, na.rm = TRUE))


#Dann können wir sie in unser Mehrebenenmodell einführen
pers_modell <- lmer(narr_trans_skala ~ 1 + gmc_soz_age + soz_gender_d + gmc_trans_scale + gmc_tc_episoden + (1  | id), data_situation, REML=FALSE)
summary(pers_modell) 
Linear mixed model fit by maximum likelihood . t-tests use Satterthwaite's
  method [lmerModLmerTest]
Formula: narr_trans_skala ~ 1 + gmc_soz_age + soz_gender_d + gmc_trans_scale +  
    gmc_tc_episoden + (1 | id)
   Data: data_situation

      AIC       BIC    logLik -2*log(L)  df.resid 
     1639      1672      -812      1625       864 

Scaled residuals: 
   Min     1Q Median     3Q    Max 
-4.256 -0.562  0.102  0.635  3.633 

Random effects:
 Groups   Name        Variance Std.Dev.
 id       (Intercept) 0.260    0.510   
 Residual             0.301    0.549   
Number of obs: 871, groups:  id, 100

Fixed effects:
                      Estimate Std. Error        df t value
(Intercept)            3.49967    0.15556 112.13664   22.50
gmc_soz_age            0.00983    0.00761  93.97820    1.29
soz_gender_dweiblich  -0.01754    0.16741 112.80469   -0.10
gmc_trans_scale        0.67967    0.10167  99.61086    6.69
gmc_tc_episoden        0.00521    0.01088  97.51655    0.48
                                 Pr(>|t|)    
(Intercept)          < 0.0000000000000002 ***
gmc_soz_age                          0.20    
soz_gender_dweiblich                 0.92    
gmc_trans_scale              0.0000000013 ***
gmc_tc_episoden                      0.63    
---
Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1

Correlation of Fixed Effects:
            (Intr) gmc_s_ sz_gn_ gmc_tr_
gmc_soz_age  0.131                      
sz_gndr_dwb -0.933 -0.136               
gmc_trns_sc  0.147  0.208 -0.160        
gmc_tc_psdn  0.145 -0.276 -0.126 -0.118 

Wir sehen, dass die Anzahl an True-Crime-Nutzungsepisoden keinen Zusammenhang mit der Narrativen Transportation hat.

D.3.2.4 Situationsvariablen als Prädiktoren

Wir können auch Situationsvariablen als Prädiktoren in unser Modell einbeziehen. Hierfür nehmen wir die am Personenmittelwert zentrierten Variablen (siehe Abschnitt 9.5.2.3 und Abschnitt D.3.2.2.2).

D.3.2.4.1 Fixe Effekte

Wir können Situationsvariablen als fixe Effekte ins Modell aufnehmen.

Wir nehmen an, dass die Podcast-Nutzungsdauer, die Stimmung und die Aufmerksamkeit die Narrative Transportation beeinflussen.

sit_modell_fix <- lmer(narr_trans_skala ~ 1 + pmc_pod_dauer + pmc_stimmung + pmc_aufmerksamkeit + (1  | id), data_situation, REML=FALSE) 
summary(sit_modell_fix)
Linear mixed model fit by maximum likelihood . t-tests use Satterthwaite's
  method [lmerModLmerTest]
Formula: 
narr_trans_skala ~ 1 + pmc_pod_dauer + pmc_stimmung + pmc_aufmerksamkeit +  
    (1 | id)
   Data: data_situation

      AIC       BIC    logLik -2*log(L)  df.resid 
     1522      1551      -755      1510       854 

Scaled residuals: 
   Min     1Q Median     3Q    Max 
-3.394 -0.550  0.034  0.596  3.731 

Random effects:
 Groups   Name        Variance Std.Dev.
 id       (Intercept) 0.399    0.632   
 Residual             0.254    0.504   
Number of obs: 860, groups:  id, 100

Fixed effects:
                    Estimate Std. Error        df t value             Pr(>|t|)
(Intercept)          3.46425    0.06678 102.04663   51.88 < 0.0000000000000002
pmc_pod_dauer        0.00121    0.00038 769.76472    3.20              0.00145
pmc_stimmung         0.09874    0.02656 782.03643    3.72              0.00022
pmc_aufmerksamkeit   0.26267    0.02589 775.31481   10.15 < 0.0000000000000002
                      
(Intercept)        ***
pmc_pod_dauer      ** 
pmc_stimmung       ***
pmc_aufmerksamkeit ***
---
Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1

Correlation of Fixed Effects:
            (Intr) pmc_p_ pmc_st
pmc_pod_dar -0.006              
pmc_stimmng -0.019 -0.056       
pmc_fmrksmk -0.004 -0.006 -0.212

Das ist auch der Fall: Wenn eine Person länger als gewöhnlich Podcast hört, besser gelaunt ist und aufmerksamer zuhört als im Schnitt, steigt auch die Narrative Transportation.

DISCLAIMER: Wir formulieren hier kausal. Da alle Variablen aber im selben Protokoll gemessen wurden, können wir nicht sagen, ob die drei Variablen wirklich ursächlich für Narrative Transportation sind oder umgekehrt - oder ob allen eine andere Ursache zugrunde liegt. Nur auf Basis theoretischer Überlegungen nehmen wir diese Kausalrichtung an.

D.3.2.4.2 Zufällige Effekte (Random Slopes)

Neben den fixen Effekten können wir Situationsvariablen auch als zufällige Effekte in Form von Random Slopes ins Modell aufnehmen. Hier lassen wir zu, dass eine unabhängige Variable die abhängige Variable Narrative Transportation bei verschiedenen Personen unterschiedlich beeinflusst, also z. B. eine Person eher narrativ transportiert wird, wenn sie aufmerksam zuhört, die andere eher, wenn sie weniger aufmerksam ist.

Hinweis: Im Buch nehmen wir in Abschnitt 9.5.2.5 ein anderes Beispiel, das sich aufgrund des Datenniveaus aber weniger gut eignet.

Um die Signifikanz eines Random Slopes zu testen, führen wir einen Chi²-Differenztest durch. Wir machen dies am Beispiel einer der Situationsvariablen (pmc_aufmerksamkeit), es ist aber genauso möglich, alle Situationsvariablen als zufällige Effekte ins Modell aufzunehmen. Dann bietet es sich an, diese zunächst getrennt mittels Chi²-Differenztest auf ihre Signifikanz zu prüfen.

Achtung: Die Modellierung von Random Slopes macht das Modell deutlich komplexer, es kann eher zu Konvergenzproblemen kommen, v. a. bei geringeren Fallzahlen.

sit_modell_random <- lmer(narr_trans_skala ~ 1 + pmc_pod_dauer + pmc_stimmung + pmc_aufmerksamkeit + (1 + pmc_aufmerksamkeit  | id), data_situation, REML=FALSE) 
summary(sit_modell_random)
Linear mixed model fit by maximum likelihood . t-tests use Satterthwaite's
  method [lmerModLmerTest]
Formula: 
narr_trans_skala ~ 1 + pmc_pod_dauer + pmc_stimmung + pmc_aufmerksamkeit +  
    (1 + pmc_aufmerksamkeit | id)
   Data: data_situation

      AIC       BIC    logLik -2*log(L)  df.resid 
     1483      1521      -734      1467       852 

Scaled residuals: 
   Min     1Q Median     3Q    Max 
-3.502 -0.537  0.027  0.578  2.817 

Random effects:
 Groups   Name               Variance Std.Dev. Corr 
 id       (Intercept)        0.3982   0.631         
          pmc_aufmerksamkeit 0.0489   0.221    0.20 
 Residual                    0.2246   0.474         
Number of obs: 860, groups:  id, 100

Fixed effects:
                     Estimate Std. Error         df t value
(Intercept)          3.465609   0.066503 102.038374   52.11
pmc_pod_dauer        0.001106   0.000379 768.823935    2.92
pmc_stimmung         0.083787   0.026011 775.163874    3.22
pmc_aufmerksamkeit   0.267958   0.037005  81.971132    7.24
                               Pr(>|t|)    
(Intercept)        < 0.0000000000000002 ***
pmc_pod_dauer                    0.0037 ** 
pmc_stimmung                     0.0013 ** 
pmc_aufmerksamkeit        0.00000000022 ***
---
Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1

Correlation of Fixed Effects:
            (Intr) pmc_p_ pmc_st
pmc_pod_dar -0.005              
pmc_stimmng -0.020 -0.044       
pmc_fmrksmk  0.108 -0.025 -0.143
anova(sit_modell_fix, sit_modell_random) 

Wir sehen am Chi²-Differenzest, dass das Freisetzen der Slopes von Aufmerksamkeit das Modell signifikant verbessert hat. Der Effekt von Aufmerksamkeit auf Narrative Transportation unterscheidet sich also zwischen Personen.

Wie dieser Unterschied aussieht, können wir zum einen grafisch inspizieren.

Die Koeffizienten pro Person finden wir im Modell. Hier sehen wir, dass nur die Slopes für die Variable pmc_aufmerksamkeit für jede Person unterschiedlich sind, da wir nur für diese Variable Random Slopes zugelassen haben.

# Koeffizienten anzeigen und extrahieren
coef_summary <- str(coef(sit_modell_random))
List of 1
 $ id:'data.frame': 100 obs. of  4 variables:
  ..$ (Intercept)       : num [1:100] 3.62 4.14 3.74 3.28 3.55 ...
  ..$ pmc_pod_dauer     : num [1:100] 0.00111 0.00111 0.00111 0.00111 0.00111 ...
  ..$ pmc_stimmung      : num [1:100] 0.0838 0.0838 0.0838 0.0838 0.0838 ...
  ..$ pmc_aufmerksamkeit: num [1:100] 0.363 0.559 0.306 0.339 0.274 ...
 - attr(*, "class")= chr "coef.mer"

Nun können wir die Random Slopes als Histogramm darstellen.

# Extrahieren der Koeffizienten und Transformation
tmp <- coef(sit_modell_random)[[1]]

# Histogramm erstellen
histogram <- ggplot(tmp, aes(x = pmc_aufmerksamkeit)) +
  geom_histogram() +
  labs(x = "Random Slopes", y = "Häufigkeit") +
  ggtitle("Verteilung der Random Slopes (Aufmerksamkeit)") +
  theme_minimal()
histogram

Wir sehen am Histogramm, dass die Aufmerksamkeit nur für wenige Personen (2) einen negativen Zusammenhang mit Narrativer Transportation aufweist. Bei fast allen ist der Zusammenhang also positiv, unterscheidet sich aber in seiner Stärke.

Um die Random Slopes weiter zu beschreiben, können wir uns nun z. B. noch ausgeben lassen, in welchem Bereich 95% der Slopes liegen.

# Quantile anzeigen
quantiles <- quantile(tmp$pmc_aufmerksamkeit, probs = c(0.025, 0.975))
cat("Quantile (2.5% und 97.5%):", quantiles, "\n")
Quantile (2.5% und 97.5%): 0.0625 0.536 

Wir sehen, dass 95% der Slopes zwischen 0,07 und 0,54 liegen.

Weiterhin kann es sinnvoll sein, sich anzeigen zu lassen, wie viele Slopes ein negatives und wie viele ein positives Vorzeichen haben.

pmc_aufmerksamkeit.kat <- numeric(length(tmp$pmc_aufmerksamkeit))
pmc_aufmerksamkeit.kat[tmp$pmc_aufmerksamkeit < 0] <- "kleiner 0"
pmc_aufmerksamkeit.kat[tmp$pmc_aufmerksamkeit > 0] <- "groesser 0"

table.pmc_aufmerksamkeit.kat <- table(pmc_aufmerksamkeit.kat)
prop.table(table.pmc_aufmerksamkeit.kat)
pmc_aufmerksamkeit.kat
groesser 0  kleiner 0 
      0.98       0.02 

Wie schon im Histogramm ersichtlich, finden wir bei 98% der Teilnehmer:innen einen positiven Zusammenhang zwischen Aufmerksamkeit und Narrativer Transportation und nur bei 2% einen negativen.

D.3.2.4.3 Within-Between-Modelle

Neben der am Personenmittelwert zentrierten Variable können wir auch den Personenmittelwert selbst ins Modell einbeziehen (zur Berechnung siehe Abschnitt D.3.2.2.2). Dies erlaubt die klare Trennung zwischen Within- und Between-Person-Effekten.

modell_within_between <- lmer(narr_trans_skala ~ 1 + pmc_pod_dauer + m_pod_dauer  + (1  | id), data_situation, REML=FALSE) 
summary(modell_within_between)
Linear mixed model fit by maximum likelihood . t-tests use Satterthwaite's
  method [lmerModLmerTest]
Formula: narr_trans_skala ~ 1 + pmc_pod_dauer + m_pod_dauer + (1 | id)
   Data: data_situation

      AIC       BIC    logLik -2*log(L)  df.resid 
     1649      1673      -820      1639       856 

Scaled residuals: 
   Min     1Q Median     3Q    Max 
-4.198 -0.552  0.086  0.623  3.791 

Random effects:
 Groups   Name        Variance Std.Dev.
 id       (Intercept) 0.409    0.639   
 Residual             0.299    0.547   
Number of obs: 861, groups:  id, 100

Fixed effects:
                Estimate Std. Error         df t value             Pr(>|t|)    
(Intercept)     3.409977   0.141380 100.000974   24.12 < 0.0000000000000002 ***
pmc_pod_dauer   0.001380   0.000412 770.525388    3.35              0.00084 ***
m_pod_dauer     0.000972   0.001817  99.266593    0.53              0.59402    
---
Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1

Correlation of Fixed Effects:
            (Intr) pmc_p_
pmc_pod_dar -0.023       
m_pod_dauer -0.877  0.022

Wir sehen in unserem Beispiel, dass Narrative Transportation nicht davon beeinflusst wird, ob eine Person generell länger oder kürzer Podcast hört (Between-Person-Effekt, modelliert durch den Personenmittelwert), aber davon, ob sie in einer Situation länger als für sie üblich Podcast hört (Within-Person-Effekt, modelliert durch die am Personenmittelwert zentrierte Variable).

Die bisherigen getrennten Modellierungsschritte sind nicht zwingend notwendig bzw. am Ende steht ein Gesamtmodell mit allen interessierenden Prädiktoren.

modell_gesamt <- lmer(narr_trans_skala ~ 1 + pmc_pod_dauer + pmc_stimmung + pmc_aufmerksamkeit + gmc_soz_age + soz_gender_d + gmc_trans_scale  + (1 + pmc_aufmerksamkeit | id), data_situation, REML=FALSE) 
summary(modell_gesamt)
Linear mixed model fit by maximum likelihood . t-tests use Satterthwaite's
  method [lmerModLmerTest]
Formula: 
narr_trans_skala ~ 1 + pmc_pod_dauer + pmc_stimmung + pmc_aufmerksamkeit +  
    gmc_soz_age + soz_gender_d + gmc_trans_scale + (1 + pmc_aufmerksamkeit |  
    id)
   Data: data_situation

      AIC       BIC    logLik -2*log(L)  df.resid 
     1449      1501      -714      1427       849 

Scaled residuals: 
   Min     1Q Median     3Q    Max 
-3.499 -0.555  0.021  0.593  2.842 

Random effects:
 Groups   Name               Variance Std.Dev. Corr 
 id       (Intercept)        0.2581   0.508         
          pmc_aufmerksamkeit 0.0473   0.218    0.25 
 Residual                    0.2246   0.474         
Number of obs: 860, groups:  id, 100

Fixed effects:
                       Estimate Std. Error         df t value
(Intercept)            3.467520   0.149092 115.245257   23.26
pmc_pod_dauer          0.001084   0.000379 772.498415    2.86
pmc_stimmung           0.082118   0.025918 783.618838    3.17
pmc_aufmerksamkeit     0.271748   0.036563  83.497638    7.43
gmc_soz_age            0.011791   0.007149  99.462558    1.65
soz_gender_dweiblich   0.003302   0.160770 113.694362    0.02
gmc_trans_scale        0.679776   0.098526 102.267787    6.90
                                 Pr(>|t|)    
(Intercept)          < 0.0000000000000002 ***
pmc_pod_dauer                      0.0043 ** 
pmc_stimmung                       0.0016 ** 
pmc_aufmerksamkeit         0.000000000084 ***
gmc_soz_age                        0.1022    
soz_gender_dweiblich               0.9837    
gmc_trans_scale            0.000000000446 ***
---
Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1

Correlation of Fixed Effects:
            (Intr) pmc_p_ pmc_st pmc_fm gmc_s_ sz_gn_
pmc_pod_dar  0.015                                   
pmc_stimmng -0.013 -0.044                            
pmc_fmrksmk  0.042 -0.025 -0.146                     
gmc_soz_age  0.180  0.013  0.013 -0.006              
sz_gndr_dwb -0.930 -0.019  0.005  0.009 -0.178       
gmc_trns_sc  0.162 -0.002 -0.018  0.004  0.180 -0.172
D.3.2.4.4 Zeitliche Dynamiken, zeitversetzte Zusammenhänge und Autokorrelationen
D.3.2.4.4.1 Zeitbezogene Variablen als Prädiktoren

Wir können auch zeitbezogene Variablen als Prädiktoren in unsere Modelle einführen. Die Variable studientag zählt den Tag der In-situ-Phase (von 1-12) hoch und wir testen hier, ob dies einen Einfluss auf die Stimmung der Teilnehmer:innen hat (mit der Annahme, dass die Stimmung im Studienverlauf aufgrund der Studienlast schlechter wird).

modell_zeit1 <- lmer(stimmung ~ 1 + studientag  + (1  | id), data_situation, REML=FALSE) 
summary(modell_zeit1)
Linear mixed model fit by maximum likelihood . t-tests use Satterthwaite's
  method [lmerModLmerTest]
Formula: stimmung ~ 1 + studientag + (1 | id)
   Data: data_situation

      AIC       BIC    logLik -2*log(L)  df.resid 
     6695      6719     -3343      6687      2883 

Scaled residuals: 
   Min     1Q Median     3Q    Max 
-3.769 -0.588  0.018  0.629  2.906 

Random effects:
 Groups   Name        Variance Std.Dev.
 id       (Intercept) 0.224    0.473   
 Residual             0.545    0.738   
Number of obs: 2887, groups:  id, 101

Fixed effects:
              Estimate Std. Error         df t value             Pr(>|t|)    
(Intercept)    3.41074    0.05584  160.38688   61.08 < 0.0000000000000002 ***
studientag     0.01744    0.00412 2812.59914    4.24             0.000023 ***
---
Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1

Correlation of Fixed Effects:
           (Intr)
studientag -0.461

Wir sehen, dass das Gegenteil der Fall ist: Die Teilnehmer:innen werden im Studienverlauf immer besser gelaunt.

Wir könnten uns auch anschauen, ob sich die Podcast-Nutzungsdauer zwischen Wochentagen und Wochenendtagen unterscheidet. Hierfür erzeugen wir zunächst eine neue Variable, aus der hervorgeht, ob es sich bei einem Studientag um einen Wochenendtag oder einen Tag unter der Woche gehandelt hat.

data_situation <- data_situation |> 
  mutate(we_wt = case_when(
    studientag %in% c(6, 7, 11, 12) ~ "Wochenende",
    TRUE ~ "Wochentag"
  ))


modell_zeit2 <- lmer(pod_dauer ~ 1 + we_wt  + (1  | id), data_situation, REML=FALSE) 
summary(modell_zeit2)
Linear mixed model fit by maximum likelihood . t-tests use Satterthwaite's
  method [lmerModLmerTest]
Formula: pod_dauer ~ 1 + we_wt + (1 | id)
   Data: data_situation

      AIC       BIC    logLik -2*log(L)  df.resid 
    13371     13391     -6682     13363      1241 

Scaled residuals: 
   Min     1Q Median     3Q    Max 
-4.427 -0.505 -0.140  0.295 10.137 

Random effects:
 Groups   Name        Variance Std.Dev.
 id       (Intercept) 1118     33.4    
 Residual             2315     48.1    
Number of obs: 1245, groups:  id, 101

Fixed effects:
               Estimate Std. Error      df t value            Pr(>|t|)    
(Intercept)       68.67       4.40  191.98   15.61 <0.0000000000000002 ***
we_wtWochentag    -1.36       3.21 1177.63   -0.42                0.67    
---
Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1

Correlation of Fixed Effects:
            (Intr)
we_wtWchntg -0.549

Die Teilnehmer:innen hören unter der Woche nicht länger oder kürzer Podcast als am Wochenende.

D.3.2.4.4.2 Zeitversetzte Variablen als Prädiktoren

Neben zeitbezogenen Variablen als Prädiktoren können wir uns auch für zeitversetzte Zusammenhänge zwischen Variablen interessieren. Wir nehmen z. B. angelehnt an die Mood-Management-Theorie an, dass die vorangegangene Stimmung einen Einfluss auf die Podcast-Nutzungsdauer hat.

Um dies zu testen, müssen wir zunächst den Stimmungswert des vorangegangenen Messzeitpunktes anspielen. Auch hier verwenden wir wieder die am Personenmittelwert zentrierte Variable.

#Hier spielen wir den Wert der Variable des vorherigen Messzeitpunktes ein. 
data_situation <- data_situation |>
  arrange(id, desc(protokoll_ges)) |>
  group_by(id) |>
  mutate(lag_pmc_stimmung = lag(pmc_stimmung)) |>
  ungroup()

#Da das aber dazu führt, dass wir die Stimmung des Vortages für den jeweils ersten Messzeitpunkt einer Person am Tag anspielen und das nicht sinnvoll erscheint, passen wir den Code an und schließen den jeweils ersten Messzeitpunkt eines Tages aus.

data_situation <- data_situation |>
  group_by(id) |>
  mutate(lag_pmc_stimmung = ifelse(protokoll_tag == 1, NA, lag(pmc_stimmung))) |>
  ungroup()

Nun können wir die neue Variable als Prädiktor ins Modell aufnehmen.

modell_lag <- lmer(pod_dauer ~ 1 + lag_pmc_stimmung  + (1  | id), data_situation, REML=FALSE) 
summary(modell_lag)
Linear mixed model fit by maximum likelihood . t-tests use Satterthwaite's
  method [lmerModLmerTest]
Formula: pod_dauer ~ 1 + lag_pmc_stimmung + (1 | id)
   Data: data_situation

      AIC       BIC    logLik -2*log(L)  df.resid 
     6470      6487     -3231      6462       631 

Scaled residuals: 
   Min     1Q Median     3Q    Max 
-2.148 -0.576 -0.194  0.378  5.517 

Random effects:
 Groups   Name        Variance Std.Dev.
 id       (Intercept)  248     15.8    
 Residual             1380     37.1    
Number of obs: 635, groups:  id, 95

Fixed effects:
                 Estimate Std. Error     df t value             Pr(>|t|)    
(Intercept)         58.71       2.33  79.33   25.18 < 0.0000000000000002 ***
lag_pmc_stimmung     7.37       2.21 608.55    3.33              0.00093 ***
---
Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1

Correlation of Fixed Effects:
            (Intr)
lg_pmc_stmm 0.023 

Die Fallzahlen sind nun deutlich kleiner, da wir von jeder Person den jeweils ersten Messzeitpunkt eines Tages ausgeschlossen haben.

Wir sehen, dass Personen, die zuvor besser gelaunt waren als gewöhnlich, länger Podcast hören.

D.3.2.4.5 Zusammenspiel von Personen- und Situationsvariablen

Mehrebenenmodelle ermöglichen auch, Interaktionen zwischen Variablen auf einer Ebene oder zwischen den Ebenen, sog. Crosslevel-Interaktionen, zu modellieren (Verbindung der Variablen mit *). Im Beispiel nehmen wir an, dass sich Transportabilität nur in Situationen, in denen aufmerksam gehört wird, auf Narrative Transportation auswirkt.

modell_crosslevel <- lmer(narr_trans_skala ~ 1 + pmc_pod_dauer + pmc_stimmung + pmc_aufmerksamkeit + gmc_soz_age + soz_gender_d + gmc_trans_scale + gmc_trans_scale*pmc_aufmerksamkeit + (1 + pmc_aufmerksamkeit | id), data_situation, REML=FALSE) 
summary(modell_crosslevel)
Linear mixed model fit by maximum likelihood . t-tests use Satterthwaite's
  method [lmerModLmerTest]
Formula: 
narr_trans_skala ~ 1 + pmc_pod_dauer + pmc_stimmung + pmc_aufmerksamkeit +  
    gmc_soz_age + soz_gender_d + gmc_trans_scale + gmc_trans_scale *  
    pmc_aufmerksamkeit + (1 + pmc_aufmerksamkeit | id)
   Data: data_situation

      AIC       BIC    logLik -2*log(L)  df.resid 
     1451      1508      -714      1427       848 

Scaled residuals: 
   Min     1Q Median     3Q    Max 
-3.499 -0.557  0.022  0.592  2.842 

Random effects:
 Groups   Name               Variance Std.Dev. Corr 
 id       (Intercept)        0.2581   0.508         
          pmc_aufmerksamkeit 0.0473   0.217    0.25 
 Residual                    0.2246   0.474         
Number of obs: 860, groups:  id, 100

Fixed effects:
                                     Estimate Std. Error         df t value
(Intercept)                          3.467311   0.149132 115.323801   23.25
pmc_pod_dauer                        0.001084   0.000379 772.503133    2.86
pmc_stimmung                         0.082121   0.025919 783.544167    3.17
pmc_aufmerksamkeit                   0.271785   0.036561  83.540980    7.43
gmc_soz_age                          0.011790   0.007149  99.466988    1.65
soz_gender_dweiblich                 0.003536   0.160815 113.786928    0.02
gmc_trans_scale                      0.679168   0.099271 101.817588    6.84
pmc_aufmerksamkeit:gmc_trans_scale  -0.003350   0.065638  87.530098   -0.05
                                               Pr(>|t|)    
(Intercept)                        < 0.0000000000000002 ***
pmc_pod_dauer                                    0.0043 ** 
pmc_stimmung                                     0.0016 ** 
pmc_aufmerksamkeit                       0.000000000084 ***
gmc_soz_age                                      0.1023    
soz_gender_dweiblich                             0.9825    
gmc_trans_scale                          0.000000000598 ***
pmc_aufmerksamkeit:gmc_trans_scale               0.9594    
---
Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1

Correlation of Fixed Effects:
            (Intr) pmc_p_ pmc_st pmc_fm gmc_s_ sz_gn_ gmc_t_
pmc_pod_dar  0.015                                          
pmc_stimmng -0.014 -0.044                                   
pmc_fmrksmk  0.042 -0.025 -0.146                            
gmc_soz_age  0.181  0.013  0.013 -0.006                     
sz_gndr_dwb -0.930 -0.019  0.005  0.009 -0.178              
gmc_trns_sc  0.163 -0.002 -0.019  0.003  0.180 -0.173       
pmc_fmrk:__  0.024  0.001 -0.006 -0.007  0.009 -0.025  0.122

Das ist nicht der Fall, die Crosslevel-Interaktion ist nicht signifikant.

Wäre sie signifikant, bietet es sich an, die Interaktion grafisch darzustellen, um sie besser interpretieren zu können. Dies ist z. B. mit dem Paket sjPlot möglich.

plot_model(modell_crosslevel, type = "pred", terms = c("gmc_trans_scale", "pmc_aufmerksamkeit"), pred.type = "re") +
  labs(x = "Transportabilität", y = "Narrative Transportation") +
  ggtitle("Crosslevel-Interaktion") +
  theme_minimal()

Wir sehen auch grafisch, dass es keine Crosslevel-Interaktion gibt, die Linien verlaufen parallel.

D.3.2.5 Tabellenerstellung und grafische Aufbereitung der Ergebnisse

Schließlich hilft das Paket sjPlot, die Modelle übersichtlicher in Tabellenform darzustellen. Hier erstellen wir eine Tabelle, in der unser obiges Gesamtmodell - einmal mit und einmal ohne Crosslevel-Interaktion - übersichtlich dargestellt wird.

Hinweis: Diese Tabelle ist zwar übersichtlicher, enthält aber z. B. noch die Variablennamen. Dies kann entweder nachträglich in einem Textverarbeitungsprogramm angepasst werden oder auch direkt in R. Weitere Informationen finden sich hier.

tab_model(modell_gesamt, modell_crosslevel)
  narr trans skala narr trans skala
Predictors Estimates CI p Estimates CI p
(Intercept) 3.47 3.17 – 3.76 <0.001 3.47 3.17 – 3.76 <0.001
pmc pod dauer 0.00 0.00 – 0.00 0.004 0.00 0.00 – 0.00 0.004
pmc stimmung 0.08 0.03 – 0.13 0.002 0.08 0.03 – 0.13 0.002
pmc aufmerksamkeit 0.27 0.20 – 0.34 <0.001 0.27 0.20 – 0.34 <0.001
gmc soz age 0.01 -0.00 – 0.03 0.099 0.01 -0.00 – 0.03 0.099
soz gender d [weiblich] 0.00 -0.31 – 0.32 0.984 0.00 -0.31 – 0.32 0.982
gmc trans scale 0.68 0.49 – 0.87 <0.001 0.68 0.48 – 0.87 <0.001
pmc aufmerksamkeit × gmc
trans scale
-0.00 -0.13 – 0.13 0.959
Random Effects
σ2 0.22 0.22
τ00 0.26 id 0.26 id
τ11 0.05 id.pmc_aufmerksamkeit 0.05 id.pmc_aufmerksamkeit
ρ01 0.25 id 0.25 id
ICC 0.56 0.56
N 100 id 100 id
Observations 860 860
Marginal R2 / Conditional R2 0.273 / 0.678 0.273 / 0.678

Zudem gibt es verschiedene grafische Darstellungsmöglichkeiten, hier stellen wir z. B. die fixen Effekte des Gesamtmodells und ihre Standardfehler dar. Weitere Möglichkeiten finden sich hier.

plot_model(modell_gesamt, type = "est", show.ci = TRUE, title = "Fixe Effekte") +
  theme_minimal()

D.3.3 Klassen-/Typenbildung von Situationen und Personen

Mittels Multilevel Latent Class Analysis können wir Situationen und Personen in Klassen/Typen einteilen. Das Paket multilevLCA ermöglicht dies.

Wir wollen uns anschauen, welche Situationstypen wir hinsichtlich der Nutzungsdauer (kürzer vs. länger als eine Stunde), der Verwendung von Kopfhörern (ja vs. nein), der Umgebung (zuhause vs. außer Haus) und der Paralleltätigkeit (ja vs. nein) identifizieren können und ob es Personen gibt, die besonders zu bestimmten Situationstypen neigen.

#Vorbereitung

#Wir filtern die Situationen, in denen ein Podcast gehört wurde
data_mlc <- data_situation |>
  filter(pod_nutz == "Ja, True-Crime-Podcast" | pod_nutz == "Ja, anderer Podcast") |> 
  select(id, pod_nutz, pod_dauer, kopfhoerer, umgebung, parallel)

#Wir erstellen unsere Variablen
data_mlc <- data_mlc |>
  mutate(kopfhoerer_d = if_else(kopfhoerer == "Nein", 0, 1),
         pod_dauer_d = if_else(pod_dauer < 60, 0, 1),
         umgebung_d = if_else(umgebung == "Zuhause", 1, 0),
         parallel_d = if_else(parallel == "Nichts anderes", 0, 1)) 


#Wir filtern die Personen heraus, die nur einen Messzeitpunkt beisteuern, weil das Modell sonst nicht läuft.
data_mlc <- data_mlc|> 
  add_count(id) |> 
  filter(n > 1) |> 
  as.data.frame()

data_mlc$rownumber = 1:nrow(data_mlc)


#Durchführung der MLCA
Y = colnames(data_mlc)[7:10] #Wir wählen die Spalten aus, die in das Modell einfließen sollen (die dichotomisierten Variablen)

results = multiLCA(data_mlc, Y, iT = 2:6, id_high = "id", iM = 2:6, extout = T) #Wir lassen Lösungen von 2-6 Klassen auf beiden Ebenen testen
Discarding rows with missing values for any indicator...
Fitting single-level measurement model (step 1)...
Fitting single-level measurement model (step 1)...
Fitting single-level measurement model (step 1)...
Fitting single-level measurement model (step 1)...
Fitting single-level measurement model (step 1)...
Fitting multilevel measurement model (step 2)...
Fitting multilevel measurement model (step 2)...
Fitting multilevel measurement model (step 2)...
Fitting multilevel measurement model (step 2)...
Fitting multilevel measurement model (step 2)...
Fitting multilevel measurement model (step 3)...
Fitting multilevel measurement model (step 3)...
Fitting multilevel measurement model (step 3)...
Fitting multilevel measurement model (step 3)...
Fitting multilevel measurement model (step 3)...
$step1
     BIClow  BIChigh AIC     ICL_BIClow ICL_BIChigh
iT=2 6186.01 6163.32 6139.88 -          -          
iT=3 6212.01 6176.73 6140.26 -          -          
iT=4 6235.61 6187.73 6138.23 -          -          
iT=5 6270.84 6210.36 6147.83 -          -          
iT=6 6306.51 6233.43 6157.88 -          -          

$step2
         BIClow  BIChigh AIC     ICL_BIClow ICL_BIChigh
iT*,iM=2 5967.56 5939.84 5911.18 6219.62    5965.27    
iT*,iM=3 5938.9  5906.14 5872.27 6411.97    5956.37    
iT*,iM=4 5949.73 5911.93 5872.85 6389.38    6008.72    
iT*,iM=5 5963.13 5920.29 5876    6397.76    6044.68    
iT*,iM=6 5977.38 5929.5  5880    6297.21    6102.87    

$step3
         BIClow  BIChigh AIC     ICL_BIClow ICL_BIChigh
iT=2,iM* 5938.9  5906.14 5872.27 6411.97    5956.37    
iT=3,iM* 5742.01 5691.61 5639.5  6098.1     5719.36    
iT=4,iM* 5781.7  5713.66 5643.32 6618.43    5742.04    
iT=5,iM* 5789.3  5703.62 5615.04 6264.19    5729.35    
iT=6,iM* 5838.35 5735.02 5628.21 6206.09    5760.56    

$optimal
     
iT= 3
iM= 3
results

CALL:
multiLCA(data = data_mlc, Y = Y, iT = 2:6, id_high = "id", iM = 2:6, 
    extout = T)

SPECIFICATION:
                    
 Multilevel LC model

MISSING VALUES ON THE INDICATORS:
                  
 Row-wise deletion

FINAL SAMPLE SIZE:
     
 1243

ESTIMATION DETAILS:

 EMiter LLfirst LLlast
    122   -2819  -2800

---------------------------

GROUP PROPORTIONS:
           
P(G1) 0.444
P(G2) 0.371
P(G3) 0.184

CLASS PROPORTIONS:
            G1     G2    G3
P(C1|G) 0.1891 0.7985 0.110
P(C2|G) 0.7404 0.1337 0.118
P(C3|G) 0.0705 0.0678 0.772

RESPONSE PROBABILITIES:

                     C1    C2     C3
P(kopfhoerer_d|C) 1.000 0.000 0.6696
P(pod_dauer_d|C)  0.543 0.445 0.4651
P(umgebung_d|C)   0.606 0.808 0.0394
P(parallel_d|C)   0.922 0.935 0.2767

---------------------------

MODEL AND CLASSIFICATION STATISTICS:
                    
R2entrlow     0.8631
R2entrhigh    0.8666
BIClow     5742.0079
BIChigh    5691.6056
ICLBIClow  6098.1013
ICLBIChigh 5719.3599
AIC        5639.5022

Als optimale Lösung wird uns vorgeschlagen, drei Klassen auf Situations- und drei auf Personenebene zu bilden. Schauen wir uns die Situationsklassen an, können wir sie wie folgt beschreiben:

C1 zeichnet sich dadurch aus, dass die Nutzung mit Kopfhörern und während man etwas parallel macht, stattfindet. Die Umgebung und die Nutzungsdauer variieren.

In Situationen des Typs C2 werden keine Kopfhörer genutzt, man ist eher zuhause und macht etwas parallel. Im Vergleich zu C1 finden eher kürzere Nutzungsepisoden statt, dennoch variiert die Nutzungsdauer auch hier.

Schließlich zeichnen sich Situationen des Typs C3 dadurch aus, dass sie außer Haus stattfinden und meist nichts parallel gemacht wird. Ob Kopfhörer getragen werden und wie lange die Nutzungsdauer ist, variiert.

Auf Personenebene sehen wir, dass je eine Situationsklasse einen Personentyp klar bestimmt. So gibt es Personen, die v. a. in C2-Situationen Podcast hören, die anderen beiden Situationstypen kommen seltener vor (G1). Analog gilt dies auch für die beiden anderen Situationstypen C1 (G2) bzw. C3 (G3).

Das Paket multilevLCA bietet zudem Optionen, die Ergebnisse grafisch darzustellen, hier z. B. die Situationsklassen.

results$mPhi |> 
  as.data.frame() |> 
  rownames_to_column() |> 
  gather(k,v, -rowname) |> 
  ggplot(aes(x = rowname, y = v, color = k, group = k))+
  geom_point()+
  geom_line()+
  coord_flip() +
  theme_minimal()