A — Grundlogik von in situ-Daten und Datenstruktur

Hinweis: In diesem Kapitel schauen wir uns die Daten noch nicht im Detail an. Das Kapitel dient lediglich dazu, Struktur und Grundlogik von In-situ-Datensätzen zu erläutern. Deshalb betrachten wir nur Auszüge aus dem ESM-Datensatz (dem eigentlichen In-situ-Datensatz) und der Vorabbefragung als Beispielfall für die Darstellung von stabilen Personenmerkmalen in In-situ-Datensätzen. Weiterhin wollen wir zeigen, wie man beim Zusammenspiel der Daten vorgeht und wie Datensätze umstrukturiert werden können.

Wir laden zunächst das tidyverse sowie den In-situ‑ und den Personendatensatz (genauer: den Datensatz der Vorabbefragung).

library(tidyverse) 


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


glimpse(data_situation)
Rows: 1,017
Columns: 6
$ id            <chr> "12ASDZ9VKS", "12ASDZ9VKS", "12ASDZ9VKS", "12ASDZ9VKS", …
$ studientag    <dbl> 1, 1, 1, 2, 2, 2, 3, 3, 3, 4, 4, 4, 1, 2, 2, 2, 2, 3, 3,…
$ datum         <chr> "2023-09-18", "2023-09-18", "2023-09-18", "2023-09-19", …
$ protokoll_ges <dbl> 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 1, 2, 3, 4, 5, 6,…
$ pod_nutzung   <chr> "Ja, True-Crime-Podcast", "Nein, kein Podcast", "Ja, Tru…
$ stimmung      <dbl> 3, 4, 4, 4, 3, 4, 4, 5, 3, 4, 3, 3, 3, 4, 5, 4, 4, 4, 4,…

Die gekürzte Version des In-situ-Datensatzes hat 1017 Zeilen (= Messzeitpunkte/ausgefüllte Protokolle) und 6 Spalten (= Variablen).

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

glimpse(data_person)
Rows: 104
Columns: 3
$ id         <chr> "37NHHV1GEZ", "5M4E64V4UR", "1P7YWVKA7F", "4GKD1VPYR4", "9L…
$ soz_gender <chr> "maennlich", "weiblich", "weiblich", "maennlich", "weiblich…
$ soz_age    <dbl> 37, 42, 28, 24, 29, 32, 44, 31, 31, 40, 23, 29, 20, 28, 47,…

Die gekürzte Version des Personendatensatzes, genauer der Vorabbefragung, hat 104 Zeilen (= Teilnehmer:innen) und 3 Spalten (= Variablen).

Nun spielen wir die Personenvariablen an den In-situ-Datensatz an. In beiden Datensätzen kennzeichnet die Spalte id zusammengehörige Fälle.

data_long <- left_join(data_situation, data_person, by="id")

Der entstandene Datensatz hat das sogenannte Long-Format, d. h. jede Zeile enthält einen Messzeitpunkt. Die Spalte id kennzeichnet, welche Messzeitpunkte zur selben Person gehören.

data_long

Die id kennzeichnet jede Person eindeutig. Im Long-Format kommt eine ID so oft vor wie die jeweilige Person Messzeitpunkte geliefert hat. Die Variablen studientag, datum und protokoll_ges sind zeitbezogene Variablen. pod_nutzung und stimmung enthalten die Antworten der Teilnehmer:innen zum jeweiligen Messzeitpunkt. Die Variablen soz_gender und soz_age sind Personenvariablen und somit für jeden zur selben Person gehörenden Messzeitpunkt gleich.

Benötigen wir den Datensatz stattdessen im Wide-Format, können wir ihn entsprechend umstrukturieren.

data_wide <- data_long |>  
  select(id, protokoll_ges, pod_nutzung, stimmung, soz_gender, soz_age) |>  #hier wählen wir nur die Variablen aus, die wir im Folgenden brauchen  
  pivot_wider(names_from = protokoll_ges, values_from = c(pod_nutzung, stimmung)) #bei values_from stehen die zeitvariierenden Variablen
data_wide

Im Wide-Format gibt es pro Person (also pro id) jeweils nur eine Zeile. Für jede Situationsvariable pro Messzeitpunkt (z. B. Messzeitpunkt t1, Messzeitpunkt t2 etc.) gibt es eine Spalte, zudem noch je eine Spalte für jede zeitstabile Personenvariable.

Liegt der Datensatz im Wide-Format vor und wir wollen ihn ins Long-Format umwandeln, ist dies ebenfalls möglich.

data_long2 <- data_wide  |> 
  pivot_longer(
    cols = -c(id, soz_gender, soz_age), # Alle Spalten außer 'id', 'soz_gender' und 'soz_age' werden gemäß der nächsten Parametereinstellungen in das Long-Format umgewandelt.
    names_to = c(".value", "protokoll_ges"), # Die Spaltennamen werden in zwei Teile aufgeteilt, wobei ".value" und "protokoll_ges" die neuen Spaltennamen sind.
    names_pattern = "([a-z_]+)([0-9]+)")  |>   # Das Muster, nach dem die alten Spaltennamen aufgespalten werden. Hier werden Kleinbuchstaben und Unterstriche verwendet.
  rename(pod_nutzung = pod_nutzung_, # Umbenennung der Spalte 'pod_nutzung_' in 'pod_nutzung', analog 'stimmung'
         stimmung = stimmung_) |>  
  filter(!is.na(pod_nutzung)) #Filtern der Zeilen, in denen kein ausgefülltes Protokoll vorliegt, um wieder denselben Datensatz wie oben zu erhalten
  
data_long2