#Einstellungen zur besseren Lesbarkeit des Outputs
options(scipen = 999)
options(digits = 3)
#Laden der Pakete
library(tidyverse)
library(multilevelTools) #Paket zur Berechnung der Within- und Between-Person-Reliabilität
library(psych) #Paket für Cronbachs Alpha und Korrelationen
#Laden des Datensatzes
data_situation <- readxl::read_excel("data/data_situation_bereinigt.xlsx",
col_names = TRUE)
#data_situation_c <- data_situation |>
# filter(filter_auswertung == "gültig")C — Datenaufbereitung
Wir laden wieder zunächst die Pakete, die wir brauchen, das sind dieses Mal neben dem tidyverse noch die Pakete multilevelTools, mit dem wir die interne Konsistenz von Skalen getrennt nach Within- und Between-Person-Reliabilität auswerten können und psych, mit dem wir Cronbachs Alpha als Reliabilitätsmaß für die in Abschnitt 9.2.2.1.3 beschriebenen Alternativwege berechnen können.
Außerdem laden wir den In-situ-Datensatz, und zwar den, in dem nur noch die Fälle enthalten sind, mit denen wir final arbeiten wollen (siehe Anhang B).
C.1 Index-/Skalenbildung
Die Index-/Skalenbildung erfolgt ebenso wie in klassischen Befragungen, z. B. durch die Bildung eines Mittelwertindexes.
In unserer Studie haben wir Narrative Transportation durch True-Crime-Podcasts abgefragt (Items narr_trans_01 bis narr_trans_06). Die Items der Skala sind alle gleich gepolt, wir müssen also keines vor der Berechnung umpolen.
data_situation <- data_situation |>
rowwise() |>
mutate(narr_trans_skala = mean(c(narr_trans_01, narr_trans_02, narr_trans_03, narr_trans_04, narr_trans_05, narr_trans_06), na.rm = TRUE))
data_situation |>
select(narr_trans_skala) |>
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")Der Mittelwert der Narrative Transportation-Skala liegt über alle Personen und Messzeitpunkte hinweg bei 3,53 (SD = 0,86).
C.2 Reliabilitätsanalyse
Nun wollen wir prüfen, ob unsere Narrative Transportation-Skala reliabel ist.
Hinweis: Wir stellen hier nur die Reliabilitätsprüfung von Skalen vor - die in Abschnitt 9.2.2.1.2 beschriebene Vorgehensweise bei Single-Items ist im Rahmen unserer Studie nicht möglich.
C.2.1 Best Practice
Hierbei starten wir mit dem Best-Practice-Verfahren, bei dem Within- und Between-Person-Reliabilität unterschieden werden. Das hierfür verwendete Paket multilevelTools prüft die Reliabilität anhand einer konfirmatorischen Mehrebenen-Faktorenanalyse.
Hinweis: Es gibt auch noch andere Möglichkeiten, Reliabilitäten im Mehrebenen-Kontext in R zu berechnen, siehe hierzu Ressourcen.
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.939Wir sehen, dass sowohl die Within- (Omega = ,72) als auch die Between-Person-Reliabilität (Omega = ,90) - gemessen an der “klassischen” Grenze von ,70 - mindestens zufriedenstellend sind.
C.2.2 Alternativoptionen
Wie in Abschnitt 9.2.2.1.3 beschrieben, gibt es auch Alternativwege, die Reliabilitätsprüfung durchzuführen, die zwar alle mit gewissen Nachteilen behaftet sind, aber zumindest gute Annäherungen darstellen können - dies gilt für die Optionen 2 bis 4, die im Folgenden ebenfalls vorgestellt werden (Option 1 in Abschnitt 9.2.2.1.3 ist nicht empfehlenswert und wird entsprechend hier auch nicht gezeigt).
Ein entscheidender Nachteil ist, dass die Alternativoptionen gerade bei kleineren Fallzahlen auf Situationsebene nicht immer für jede Person oder jeden Messzeitpunkt berechenbar sind. Denn es kommt nicht selten vor, dass einzelne Variablen keine Varianz aufweisen und die Berechnung von Cronbachs Alpha deshalb fehlschlägt oder negative Werte, die nicht im Wertebereich von Cronbachs Alpha liegen, auftreten.
Im folgenden Code werden solche Fälle als NA codiert. Dementsprechend ergibt sich der Nachteil, dass die finale Berechnung von Cronbachs Alpha meist nicht auf allen Personen und/oder Messzeitpunkten beruht.
C.2.2.1 Option 2: Berechnung der Reliabilität für jede Person getrennt, aber über alle Messzeitpunkte hinweg - gemittelt
Hier berechnen wir zunächst Cronbachs Alpha für jede Person getrennt, wobei wir pro Person alle Messzeitpunkte einbeziehen.
alpha_pro_person <- data_situation |>
group_by(id) |>
summarise(
alpha = tryCatch(
psych::alpha(
across(c("narr_trans_01", "narr_trans_02", "narr_trans_03", "narr_trans_04", "narr_trans_05", "narr_trans_06"))
)$total$raw_alpha,
error = function(e) NA # Falls ein Fehler auftritt, setze Alpha auf NA
),
.groups = 'drop'
) |>
mutate(alpha = ifelse(is.na(alpha) | alpha < 0, NA, alpha)) #Falls Alpha negativ ist, setze Alpha auf NAalpha_pro_person |>
summarise(Mittelwert = mean(alpha, na.rm = TRUE),
Standardabweichung = sd(alpha, na.rm = TRUE),
Minimum = min(alpha, na.rm = TRUE),
Maximum = max(alpha, na.rm = TRUE),
Anzahl_Faelle = sum(!is.na(alpha)))Wir sehen, dass Cronbachs Alpha für die Narrative Transportation-Skala für 81 (von 101) Personen berechnet werden konnte. Im Schnitt liegt Cronbachs Alpha bei ,67.
C.2.2.2 Option 3a: Berechnung der Reliabilität für je nur einen Messzeitpunkt - Betrachtung ausgewählter Messzeitpunkte
Wir können Cronbachs Alpha auch für einzelne Messzeitpunkte berechnen, so wird jede Person pro Berechnung nur ein Mal berücksichtigt.
Im Folgenden berechnen wir Cronbachs Alpha beispielhaft für den ersten, 22. und 35. Messzeitpunkt.
ACHTUNG: dabei handelt es sich in unserem Fall jeweils um das erste, 22. und 35. Protokoll, das eine Person ausgefüllt hat! Unser Datensatz enthält nämlich nur die Messzeitpunkte pro Person, an denen auch ein Protokoll ausgefüllt wurde. In diesem Fall empfehlen wir das Vorgehen, die Reliabiltität pro Messzeitpunkt zu berechnen, nicht! Der folgende Code soll deshalb nur aufzeigen, wie die Berechnung möglich wäre.
Protokoll 1:
alpha_skala1_p1 <- data_situation |>
filter(protokoll_ges == 1)
psych::alpha(alpha_skala1_p1[c("narr_trans_01", "narr_trans_02", "narr_trans_03", "narr_trans_04", "narr_trans_05", "narr_trans_06")], discrete = FALSE)
Reliability analysis
Call: psych::alpha(x = alpha_skala1_p1[c("narr_trans_01", "narr_trans_02",
"narr_trans_03", "narr_trans_04", "narr_trans_05", "narr_trans_06")],
discrete = FALSE)
raw_alpha std.alpha G6(smc) average_r S/N ase mean sd median_r
0.77 0.77 0.78 0.36 3.4 0.036 3.5 0.74 0.34
95% confidence boundaries
lower alpha upper
Feldt 0.69 0.77 0.83
Duhachek 0.69 0.77 0.84
Reliability if an item is dropped:
raw_alpha std.alpha G6(smc) average_r S/N alpha se var.r med.r
narr_trans_01 0.80 0.80 0.79 0.44 4.0 0.031 0.015 0.45
narr_trans_02 0.69 0.69 0.69 0.31 2.3 0.050 0.024 0.30
narr_trans_03 0.75 0.75 0.75 0.38 3.1 0.041 0.029 0.34
narr_trans_04 0.73 0.74 0.73 0.37 2.9 0.042 0.032 0.33
narr_trans_05 0.72 0.72 0.72 0.34 2.6 0.045 0.029 0.37
narr_trans_06 0.69 0.70 0.69 0.32 2.3 0.050 0.026 0.30
Item statistics
n raw.r std.r r.cor r.drop mean sd
narr_trans_01 85 0.51 0.48 0.30 0.26 2.3 1.23
narr_trans_02 85 0.80 0.80 0.77 0.67 3.8 1.09
narr_trans_03 85 0.61 0.64 0.53 0.45 4.5 0.97
narr_trans_04 85 0.67 0.67 0.59 0.49 3.4 1.14
narr_trans_05 85 0.71 0.72 0.66 0.57 3.6 1.03
narr_trans_06 85 0.79 0.79 0.76 0.66 3.3 1.09Protokoll 22:
alpha_skala1_p22 <- data_situation |>
filter(protokoll_ges == 22)
psych::alpha(alpha_skala1_p22[c("narr_trans_01", "narr_trans_02", "narr_trans_03", "narr_trans_04", "narr_trans_05", "narr_trans_06")], discrete = FALSE)
Reliability analysis
Call: psych::alpha(x = alpha_skala1_p22[c("narr_trans_01", "narr_trans_02",
"narr_trans_03", "narr_trans_04", "narr_trans_05", "narr_trans_06")],
discrete = FALSE)
raw_alpha std.alpha G6(smc) average_r S/N ase mean sd median_r
0.86 0.87 0.89 0.52 6.6 0.024 3.6 0.93 0.54
95% confidence boundaries
lower alpha upper
Feldt 0.81 0.86 0.91
Duhachek 0.82 0.86 0.91
Reliability if an item is dropped:
raw_alpha std.alpha G6(smc) average_r S/N alpha se var.r med.r
narr_trans_01 0.86 0.87 0.87 0.56 6.4 0.024 0.013 0.60
narr_trans_02 0.82 0.83 0.83 0.49 4.8 0.032 0.025 0.49
narr_trans_03 0.86 0.87 0.87 0.57 6.6 0.025 0.012 0.60
narr_trans_04 0.85 0.85 0.86 0.54 5.8 0.028 0.023 0.57
narr_trans_05 0.81 0.82 0.83 0.48 4.6 0.033 0.023 0.46
narr_trans_06 0.83 0.84 0.85 0.51 5.1 0.029 0.023 0.54
Item statistics
n raw.r std.r r.cor r.drop mean sd
narr_trans_01 18 0.74 0.69 0.62 0.57 2.7 1.49
narr_trans_02 18 0.86 0.85 0.83 0.78 3.7 1.19
narr_trans_03 18 0.63 0.68 0.60 0.53 4.3 0.84
narr_trans_04 18 0.75 0.75 0.69 0.63 3.7 1.14
narr_trans_05 18 0.87 0.87 0.85 0.79 3.5 1.29
narr_trans_06 18 0.80 0.81 0.78 0.70 3.6 1.20Protokoll 35:
alpha_skala1_p35 <- data_situation |>
filter(protokoll_ges == 35)
psych::alpha(alpha_skala1_p35[c("narr_trans_01", "narr_trans_02", "narr_trans_03", "narr_trans_04", "narr_trans_05", "narr_trans_06")], discrete = FALSE)
Reliability analysis
Call: psych::alpha(x = alpha_skala1_p35[c("narr_trans_01", "narr_trans_02",
"narr_trans_03", "narr_trans_04", "narr_trans_05", "narr_trans_06")],
discrete = FALSE)
raw_alpha std.alpha G6(smc) average_r S/N ase mean sd median_r
0.71 0.72 0.76 0.3 2.6 0.062 4 0.54 0.28
95% confidence boundaries
lower alpha upper
Feldt 0.54 0.71 0.83
Duhachek 0.59 0.71 0.83
Reliability if an item is dropped:
raw_alpha std.alpha G6(smc) average_r S/N alpha se var.r med.r
narr_trans_01 0.66 0.64 0.66 0.26 1.8 0.084 0.045 0.24
narr_trans_02 0.66 0.69 0.73 0.30 2.2 0.074 0.062 0.24
narr_trans_03 0.74 0.78 0.80 0.42 3.6 0.059 0.032 0.46
narr_trans_04 0.64 0.66 0.69 0.28 1.9 0.081 0.055 0.23
narr_trans_05 0.60 0.60 0.62 0.23 1.5 0.086 0.052 0.19
narr_trans_06 0.70 0.69 0.71 0.31 2.3 0.059 0.073 0.43
Item statistics
n raw.r std.r r.cor r.drop mean sd
narr_trans_01 11 0.84 0.74 0.72 0.595 2.6 1.43
narr_trans_02 11 0.65 0.63 0.52 0.475 4.3 0.79
narr_trans_03 11 0.21 0.34 0.12 0.073 4.7 0.47
narr_trans_04 11 0.73 0.70 0.65 0.611 4.0 0.63
narr_trans_05 11 0.82 0.83 0.84 0.736 4.5 0.69
narr_trans_06 11 0.55 0.62 0.53 0.354 4.0 0.77Wir sehen, dass Cronbachs Alpha über die Feldzeit schwankt (1. Protokoll: ,77, 22. Protokoll: ,86, 35. Protokoll: ,71).
C.2.2.3 Option 3b: Berechnung der Reliabilität für je nur einen Messzeitpunkt - dann Mittelung über alle Messzeitpunkte hinweg
Genau wie bei Option 3a gilt auch hier, dass unsere Daten nicht die Messzeitpunkte, sondern die ausgefüllten Protokolle abbilden. Deshalb ist auch diese Auswertung nur zur Veranschaulichung geeignet.
alpha_pro_protokoll <- data_situation |>
group_by(protokoll_ges) |>
summarise(
alpha = tryCatch(
psych::alpha(
across(c("narr_trans_01", "narr_trans_02", "narr_trans_03", "narr_trans_04", "narr_trans_05", "narr_trans_06"))
)$total$raw_alpha,
error = function(e) NA # Falls ein Fehler auftritt, setze alpha auf NA
),
.groups = 'drop'
) |>
mutate(alpha = ifelse(is.na(alpha) | alpha < 0, NA, alpha)) #Falls alpha negativ ist, setze alpha auf NAalpha_pro_protokoll |>
summarise(Mittelwert = mean(alpha, na.rm = TRUE),
Standardabweichung = sd(alpha, na.rm = TRUE),
Minimum = min(alpha, na.rm = TRUE),
Maximum = max(alpha, na.rm = TRUE),
Anzahl_Faelle = sum(!is.na(alpha))) Wir sehen, dass Cronbachs Alpha für die Narrative Transportation-Skala für 42 (von 45) Messzeitpunkte berechnet werden konnte. Im Schnitt liegt Cronbachs Alpha bei ,80.
C.2.2.4 Option 4: Berechnung der Reliabilität für die aggregierten Mittelwerte
alpha_aggregriert <- data_situation |>
group_by(id) |>
summarize(pm_narr_trans_01 = mean(narr_trans_01, na.rm = TRUE),
pm_narr_trans_02 = mean(narr_trans_02, na.rm = TRUE),
pm_narr_trans_03 = mean(narr_trans_03, na.rm = TRUE),
pm_narr_trans_04 = mean(narr_trans_04, na.rm = TRUE),
pm_narr_trans_05 = mean(narr_trans_05, na.rm = TRUE),
pm_narr_trans_06 = mean(narr_trans_06, na.rm = TRUE),
.groups = "drop")
psych::alpha(alpha_aggregriert[c("pm_narr_trans_01", "pm_narr_trans_02", "pm_narr_trans_03", "pm_narr_trans_04", "pm_narr_trans_05", "pm_narr_trans_06")])
Reliability analysis
Call: psych::alpha(x = alpha_aggregriert[c("pm_narr_trans_01", "pm_narr_trans_02",
"pm_narr_trans_03", "pm_narr_trans_04", "pm_narr_trans_05",
"pm_narr_trans_06")])
raw_alpha std.alpha G6(smc) average_r S/N ase mean sd median_r
0.87 0.88 0.89 0.55 7.3 0.021 3.5 0.68 0.53
95% confidence boundaries
lower alpha upper
Feldt 0.82 0.87 0.90
Duhachek 0.83 0.87 0.91
Reliability if an item is dropped:
raw_alpha std.alpha G6(smc) average_r S/N alpha se var.r med.r
pm_narr_trans_01 0.89 0.89 0.88 0.61 8.0 0.018 0.017 0.62
pm_narr_trans_02 0.82 0.84 0.84 0.50 5.1 0.028 0.035 0.50
pm_narr_trans_03 0.88 0.89 0.88 0.61 7.9 0.020 0.014 0.61
pm_narr_trans_04 0.84 0.86 0.88 0.54 5.9 0.027 0.043 0.51
pm_narr_trans_05 0.82 0.83 0.84 0.50 5.0 0.029 0.029 0.52
pm_narr_trans_06 0.82 0.84 0.85 0.51 5.2 0.029 0.035 0.50
Item statistics
n raw.r std.r r.cor r.drop mean sd
pm_narr_trans_01 100 0.69 0.65 0.56 0.50 2.5 1.11
pm_narr_trans_02 100 0.87 0.88 0.87 0.81 3.7 0.74
pm_narr_trans_03 100 0.62 0.65 0.57 0.47 4.3 0.81
pm_narr_trans_04 100 0.80 0.80 0.73 0.70 3.4 0.85
pm_narr_trans_05 100 0.88 0.89 0.89 0.82 3.6 0.81
pm_narr_trans_06 100 0.87 0.87 0.85 0.79 3.4 0.87Wir sehen, dass Cronbachs Alpha bei dieser Form der Berechnung bei ,87 liegt.
C.3 Umgang mit fehlenden Werten
Siehe Abschnitt 9.2.2.2.
Schließlich speichern wir den aufbereiteten Datensatz ab.
openxlsx::write.xlsx(data_situation, "data/data_situation_final.xlsx")