#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 — 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.
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.939Sowohl 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$summaryNarrative 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 optionInterindividuell 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.177Wir 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.212Das 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.143anova(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.022Wir 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.172D.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.461Wir 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.549Die 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.122Das 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 testenDiscarding 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= 3results
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.5022Als 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()