Max-Planck-Institut fuer Bildungsforschung Berlin
R Script: Aleksandr Merkulov

Beschreibung.

Das Skript berechnet die s.g. Schlafkomponenten aus dem Schlafqualitaets-Fragebogen (PSQI) und erstellt Statistiken und Grafiken zu Ergebnissen. Das Skript ist nur fuer die Version von PSQI geeignet, die am Max-Planck-Institut fuer Bildungsforschung verwendet wird – die 3. und 4. Versionen von PSQI passen nicht, allerdings kann der Code dazu von Ihnen gerne angepasst werden.

WICHTIG: Wie lade ich die Daten hoch?

Fuer das Skript muss eine .csv-Tabelle mit originalen Daten vorbereitet werden. Eine Volrage mit 10 generierten Probanden ist unter dem folgenden Link zu finden: https://github.com/alexmerk/misc/blob/master/psqi.csv Die Daten von Probanden muessen in einem “wide-format” stehen, naemlich: jeder Proband muss reihenweise angegeben werden, jede Variable (Item) - spaltenweise. Bitte unbedingt beachten: Die Variablennamen in Ihrer Tabelle muessen mit der Beispiel-Datei (psqi.csv) uebereinstimmen, und zwar:

Legende Tabelle:

  • id = ID von eine(r) Proband(in).
  • psqi1 = Uhrzeit “HH:MM”.
  • psqi2 = Anzahl Minuten.
  • psqi3 = Uhrzeit “HH:MM”.
  • psqi4 = Anzahl Stunden.
  • psqi5a, psqi5b, … psqi10 = Angaben fuer entsprechende Fragen aus dem PSQI. Bitte eine Zahl von 0 bis 3 angeben!
  • psqi5jo = Offener Teil (“Bitte beschreiben Sie…”) der Frage 5j.
  • sex = 1 - weiblich; 2 - maennlich.
  • alter = Alter in Jahren.
  • height = Koerpergroesse in cm.
  • weight = Koerpergewicht in kg.
  • job = aktueller Berufstatus:
    • 0 = Schueler/Student(in)
    • 1 = Arbeiter(in)
    • 2 = Rentner(in)
    • 3 = selbststaendig
    • 4 = Angestellte(r)
    • 5 = arbeitslos / Hausfrau(mann)

Aufbereitete Tabelle einlesen.

Entweder die .csv-Datei im Arbeitsordner von R ablegen oder den Pfad zu der Datei unten in “filepath” angeben bzw. aus den Kommentaren rausnehmen.

psqi <- read.csv ("psqi.csv", sep = ",", header = TRUE, stringsAsFactors = FALSE)
#filepath <- ("C:/Data/psqi.csv")
#psqi <- read.csv (filepath, sep = ",", header = TRUE, stringsAsFactors = FALSE)

Packages laden und installieren.

Ggf. “install.packages” auskommentieren!

packages <- c("dplyr","chron","ggplot2", "tidyr")
#install.packages (packages)
lapply (packages, library, character.only=TRUE)
rm(packages)

Berechnung von Schlafkomponenten.

psqi <- psqi %>% mutate(
    psqi1 = as.chron (as.character(psqi1), format ="%H:%M"),
    psqi3 = as.chron (as.character(psqi3), format ="%H:%M"),
    sex.r = case_when(
             sex %in% 1 ~ "Frauen",
             sex %in% 2 ~ "Maenner"),
         # Komponente 1: Subjektive Schlafqualitaet (en: Overall Sleep Quality, PSQISLPQUAL).
         psqi_k1 = psqi6,
         # Komponente 2: Schlaflatenz (en: Sleep Latency, PSQILATEN).
         psqi_k2 = ifelse (psqi2<=15, 0,
                     ifelse ( (psqi2>15)&(psqi2<=30), 1,
                     ifelse ( (psqi2>30)&(psqi2<=60), 2, 3))
                    ) + psqi5a,
         psqi_k2 = case_when(
             psqi_k2 %in% 0 ~ 0,
             psqi_k2 %in% c(1,2) ~ 1,
             psqi_k2 %in% c(3,4) ~ 2,
             psqi_k2 %in% c(5,6) ~ 3),
        # Komponente 3: Schlafdauer (en: Duration of Sleep, PSQIDURAT). 
        psqi_k3 = case_when(
             is.na(psqi4) ~ NA_real_,
             psqi4 >= 7 ~ 0,
             (psqi4 >= 6) & (psqi4 < 7) ~ 1,
             (psqi4 >= 5) & (psqi4 < 6) ~ 2,
             psqi4 < 5 ~ 3),
         # Komponente 4: Schlafeffizienz (en: Sleep Efficiency, PSQIHSE). 
         psqi_k4 = 100*(psqi4 / ifelse ( hours(psqi1)>12,
            (24+(difftime (psqi3, psqi1))),
            difftime(psqi3, psqi1))),
         psqi_k4 = case_when(
             is.na(psqi_k4) ~ NA_real_,
             psqi_k4 >= 85 ~ 0,
             (psqi_k4>=75)&(psqi_k4<85) ~ 1,
             (psqi_k4>=65)&(psqi_k4<75) ~ 2,
             psqi_k4 < 65 ~ 3),
         # Komponente 5: Schlafstoerungen (en: Sleep Disturbance, PSQIDISTB).
         psqi_k5 = rowSums (select(., psqi5b:psqi5j), na.rm=TRUE),
         psqi_k5 = case_when(
            is.na(psqi_k5) ~ NA_real_,
            (psqi_k5 %in% 0)|is.na(psqi_k5) ~ 0,
            psqi_k5 %in% 1:9 ~ 1,
            psqi_k5 %in% 10:18 ~ 2,
            psqi_k5 %in% 19:27 ~ 3),
         # Komponente 6: Schlafmittelkonsum (en: Need Meds to Sleep, PSQIMEDS).
         psqi_k6 = psqi7,
         # Komponente 7: Tagesschlaefrigkeit (en: Day Dysfunction Due to Sleepiness, PSQIDAYDYS)
         psqi_k7 = psqi8 + psqi9,
         psqi_k7 = case_when(
            is.na(psqi_k7) ~ NA_real_,
            psqi_k7 %in% 0 ~ 0,
            psqi_k7 %in% c(1,2) ~ 1,
            psqi_k7 %in% c(3,4) ~ 2,
            psqi_k7 %in% c(5,6) ~ 3)
         # psqi_ges = rowSums (select(., psqi_k1:psqi_k7), na.rm=TRUE)
         # this code didn't work, apparently because dplyr::select inside
         # dplyr::mutate is not compatible with the new variables that were
         # created inside the same dplyr::mutate call.
)
psqi$psqi <- rowSums (select(psqi, psqi_k1:psqi_k7), na.rm=TRUE)

Zusammenfassung von Ergebnissen.

summary(psqi$psqi)
##    Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
##    2.00    3.25    4.00    4.80    4.75   12.00

IDs mit Gesamtwerten zwischen 6 und 10 (schlechte Schlafqualitaet):

psqi$id[(psqi$psqi>=6)&(psqi$psqi<=10)]
## [1] 201

IDs mit Gesamtwerten ueber 10 (Verdacht auf Schlafstoerung):

psqi$id[psqi$psqi>10]
## [1] 103

Plotting the graphs.

Histogramm PSQI Gesamtwert fuer alle Probanden.

hist_psqi <- ggplot(psqi, aes(psqi)) +
    geom_histogram(binwidth=1, breaks=c(1:21), fill="#6699CC", color="black")
hist_psqi

Histogramm PSQI Gesamtwert fuer Frauen und Maenner getrennt.

hist_psqi_sex <- hist_psqi + facet_wrap(~sex.r, ncol=2)
hist_psqi_sex