Vorbereitung
Bitte laden Sie für die folgenden Aufgaben die Übungsdatensatze mdbf und fb24:
# Übungsdatensatz für Aufgabe 3
load(url("https://pandar.netlify.app/daten/mdbf.rda"))
# Übungsdatensatz für Aufgabe 4
load(url("https://pandar.netlify.app/daten/fb24.rda"))
Aufgabe 1
Eigene Funktionen helfen, Arbeitsschritte effizient zusammenzufassen.
- Schreiben Sie eine eigene Funktion namens quadriere, die eine Zahl entgegennimmt und deren Quadrat zurückgibt.
- Testen Sie die Funktion mit den Werten 3 und 7.
Lösung
# Funktion mit dem Namen 'quadriere' erstellen
quadriere <- function(x) {
# Variable x beinhaltet die Eingabe und wird innerhalb der Funktion zur weiteren Verarbeitung verwendet
# Die Variable kann beliebig benannt werden (wie in den weiteren Lösungen zu sehen)
# return() definiert die Ausgabe der Funktion
return(x^2)
}
# Funktion testen
quadriere(3)
quadriere(7)
Aufgabe 2
Mit if-Abfragen kann die Ausführung von Code gesteuert werden.
- Schreiben Sie eine Funktion alterstest, die ein Alter als Eingabe erhält und zurückgibt:
- „Volljährig“, wenn das Alter mindestens 18 ist,
- „Minderjährig“, wenn das Alter darunter liegt.
- Testen Sie Ihre Funktion mit den Werten 16 und 22.
Lösung
# Funktion mit dem Namen 'alterstest' erstellen
alterstest <- function(alter) {
if (alter >= 18) {
return("Volljährig") # Falls Alter >= 18 Ausgabe "Volljährig"
} else {
return("Minderjährig") # Falls Alter < 18 Ausgabe "Minderjährig"
}
}
# Funktion testen mit Beispielen
alterstest(16)
alterstest(22)
Aufgabe 3
Ziel dieser Aufgabe ist es, alle negativ gepolten Items im mdbf-Datensatz in eine positive Richtung umzucodieren.
Folgende Items sind negativ gepoolt: "stim3", "stim4", "stim5", "stim7", "stim9", "stim11"
- Erstellen Sie zunächst eine Kopie des Datensatzes mdbf (z. B. mdbf_r).
- Speichern Sie alle negativ gepolten Variablen in einem Vektor neg.
- Rekodieren Sie die Items mit einem for-Loop, indem Sie die Werte wie folgt umdrehen:
-1 * (x - 5)
- Überprüfen Sie den Erfolg der Rekodierung durch die Berechnung der Korrelation vor und nach der Umkodierung für stim3.
- Hinweis: Die Korrelation sollte -1 betragen
Lösung
# Kopie des Datensatzes erstellen
mdbf_r <- mdbf
# Namen Negative Items in Vektor speichern
neg <- c("stim3", "stim4", "stim5", "stim7", "stim9", "stim11")
# for-Schleife über alle negativen Items zur Rekodierung. Endet nach dem letzten Element des Vektors 'neg'
for (i in neg) {
# i ist ein Platzhalter, der in jedem Schleifendurchlauf ein Element im Vektor 'neg' annimmt
# z. B. i = "stim3" im ersten Durchlauf, dann "stim4", usw.
# Aus mdbf_r[, i] wird folglrich mdbf_r[,"stim3"] im ersten Durchlauf
# so wird die entsprechende Spalte im Datensatz dynamisch ausgewählt
mdbf_r[, i] <- -1 * (mdbf[, i] - 5) # Umkodierung ins Positive: 1 wird zu 4, 2 zu 3, 3 zu 2, 4 zu 1
}
# Überprüfung der Umkodierung am Beispiel stim3
# Die Korrelation sollte -1 betragen, da die Umkodierung eine Spiegelung ist
cor(mdbf$stim3, mdbf_r$stim3)
Aufgabe 4
Im zugehörigen Kapitel haben wir die Funktion var_eigen zur Ausgabe der Varianz und Stichprobengröße erstellt:
var_eigen <- function(x, empirical = TRUE){
n <- length(x)
x_quer <- mean(x)
if (empirical == TRUE) {
var <- sum((x - x_quer)^2) / n
} else {
var <- sum((x - x_quer)^2) / (n - 1)
}
return(list(Varianz = var, Stichprobengroesse = n))
}
Nach Anwendung der Funktion auf alle numerischen Variablen im Datensatz fb24, haben wir festgestellt, dass die Berechnung für einige der Variablen fehltschlägt, da diese NAs beinhalten. Folgende for-Schleife haben wir dazu genutzt:
for (i in names(fb24)) {
print(i)
if (is.character(fb24[, i])) {
print("Eine character Variable.")
} else {
print(var_eigen(x = fb24[, i], empirical = TRUE))
}
}
Erweitern Sie nun die Funktion var_eigen um ein logisches Argument na.rm.
Wird na.rm = TRUE
gesetzt, sollen fehlende Werte aus der Berechnung ausgeschlossen werden.
- Achten Sie darauf, dass die Berechnung von n auf der bereinigten Stichprobe basiert.
- Testen Sie die neue Funktion sowohl mit als auch ohne
na.rm = TRUE
. - Wenden Sie sie anschließend mit
na.rm = TRUE
auf alle numerischen Variablen in fb24 an.
Lösung
# Funktion zur Varianzberechnung inkl. Option zur NA-Behandlung
var_eigen <- function(x, empirical = TRUE, na.rm = FALSE) {
if (na.rm == TRUE) {
x <- x[!is.na(x)] # NAs entfernen, wenn na.rm = TRUE
}
n <- length(x) # Stichprobengröße
if (n == 0) return(list(Varianz = NA, Stichprobengroesse = 0)) # Leerer Vektor
x_quer <- mean(x) # Mittelwert berechnen
# Varianzberechnung je nach Definition
if (empirical == TRUE) {
var <- sum((x - x_quer)^2) / n
} else {
var <- sum((x - x_quer)^2) / (n - 1)
}
return(list(Varianz = var, Stichprobengroesse = n))
}
# Anwendung der Funktion var_eigen() auf alle numerischen Variablen im fb24 Datensatz
for (i in names(fb24)) {
print(i) # Ausgabe des Namen der Variable (Spaltenname im Datensatz)
if (is.character(fb24[, i])) { # Ausschluss für Variablen vom Typ character
print("Eine character Variable.")
} else {
print(var_eigen(fb24[[i]], empirical = TRUE, na.rm = TRUE)) # Aufruf mit neuem na.rm Argument
}
}