Max-Planck-Institut fuer Bildungsforschung Berlin
R Script: Aleksandr Merkulov
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.
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:
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)
Ggf. “install.packages” auskommentieren!
packages <- c("dplyr","chron","ggplot2", "tidyr")
#install.packages (packages)
lapply (packages, library, character.only=TRUE)
rm(packages)
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)
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
hist_psqi <- ggplot(psqi, aes(psqi)) +
geom_histogram(binwidth=1, breaks=c(1:21), fill="#6699CC", color="black")
hist_psqi
hist_psqi_sex <- hist_psqi + facet_wrap(~sex.r, ncol=2)
hist_psqi_sex