Skip to content
Christian Treffenstädt edited this page Jul 24, 2014 · 9 revisions

Lösungen zu den Übungsaufgaben

A1: Greife auf das 3. Element des zuvor erstellten Altersvektors zu

alter[3]
## [1] 24

A2: Lasse dir das Geschlecht der 4 letzten Versuchspersonen anzeigen

geschlecht[7:10]
## [1] "female" "male"   "male"   "male"

A3: Lasse dir die IQ-Werte für fluide Intelligenz der jüngeren Hälfte von Probanden anzeigen

iq_fluid[alter < median(alter)]
## [1] 107  90 105  96 116

A4: Lasse dir die IQ-Werte für kristalline Intelligenz aller Männer anzeigen

iq_kristallin[geschlecht == "male"]
## [1] 104 106  91 124 106

A5: Erstelle einen neuen Vektor, der für jede Versuchsperson den Mittelwert der beiden IQ-Skalen darstellt

# Lösung 1:

mean_iq <- (iq_fluid + iq_kristallin)/2  # Sollte man nur machen, wenn es keine fehlenden Werte gibt

# Lösung 2:

mean_iq <- rowMeans(cbind(iq_fluid, iq_kristallin))  # Kompliziert, funktioniert aber mit fehlenden Werten

A6: Erstelle einen neuen Vektor, der die z-standardisierten Gesamt-IQ-Werte für jede Versuchsperson enthält

    a) Standardisiere die Werte anhand der Vorgabewerte im Testmanual (m=100, sd=15)
zstandard_iq_manual <- (mean_iq - 100)/15
    b) Standardisiere die Werte anhand der Stichprobenwerte.
zstandard_iq_empirical <- (mean_iq - mean(mean_iq))/sd(mean_iq)

A7: Überprüfe für A6b, ob die z-Standardisierung erfolgreich war (m ca. 0?, sd ca. 1?)

round(mean(zstandard_iq_empirical), 4)  # Gerundet auf 4 Nachkommastellen
## [1] 0
sd(zstandard_iq_empirical)
## [1] 1

A8: Wie häufig ist der z-Wert in A6a größer als der z-Wert in A6b?

sum(test_vektor <- zstandard_iq_manual > zstandard_iq_empirical)
## [1] 9

A9: Erstelle ein data frame aus vp_nummer, alter, geschlecht und Gesamt-IQ-Wert aus A5

data_frame <- data.frame(Vp = vp_nummer, Alter = alter, Geschlecht = geschlecht, 
    IQ_Mean = mean_iq)

A10: Ergänze das Frame aus A9 um die beiden Vektoren mit den unterschiedlich z-standardisierten Gesamt-IQ-Werten

data_frame <- cbind(data_frame, zstandard_iq_manual, zstandard_iq_empirical)  # Dieses Mal gibt cbind() keine Matrix zurück!

A11: Lasse dir aus dem Datenframe den Gesamt-IQ-Wert der dritten Person im Datensatz anzeigen

data_frame[3, 4]
## [1] 112

A12: Lasse dir aus der Datenmatrix die Spalte mit den Alterswerten anzeigen

data_frame[, 2]
##  [1] 20 34 24 28 28 22 20 20 34 20

A13: Erstelle einen neuen Datenframe, der nur die Werte der ersten beiden Versuchspersonen enthält

data_frame2 <- data_frame[1:2, ]

A14: Erstelle einen neuen Datenframe, der nur die Werte weiblichen Versuchspersonen enthält

data_frame3 <- data_frame[data_frame[, 3] == "female", ]

A15: Rekodiere die vierte Variable des obigen Datenframes nach folgendem Muster: 1=-2, 2=-1, 3=0, 4=1, 5=2

data_frame$item_4_recode <- NA  # Wir initialisieren eine sechste Variable

data_frame$item_4_recode[data_frame$item4 == 1] <- -2
data_frame$item_4_recode[data_frame$item4 == 2] <- -1
data_frame$item_4_recode[data_frame$item4 == 3] <- 0
data_frame$item_4_recode[data_frame$item4 == 4] <- 1
data_frame$item_4_recode[data_frame$item4 == 5] <- 2

A16: Erweitere das Datenframe um den Geschlechtsvektor, den wir zuvor verwendet haben. Rekodiere den Vektor nach folgendem Muster: 'male'=0, 'female'=1

data_frame$geschlecht <- geschlecht  # Wir fügen den Altervektor ein

data_frame$geschlecht_recode <- NA

data_frame$geschlecht_recode[data_frame$geschlecht == "male"] <- 0
data_frame$geschlecht_recode[data_frame$geschlecht == "female"] <- 1

A17: Erstelle im Datenframe eine neue Variable, die die Summe der beiden rekodierten Items sowie der beiden nicht rekodierten Items enthält

data_frame$varSum <- data_frame[, 1] + data_frame[, 3] + data_frame[, 5] + data_frame[, 
    6]

A18: Rekodiere die genannten Variablen so um, dass ihre negative Polung umgekehrt wird

data <- read.csv2("http://e-scientifics.de/content/datasets/Big5_GEMI_R.csv")

library(car)  # Laden des notwendigen Pakets für die Funktion recode()
# Die Holzhammer-Methode:

data$neo_ffi_1_rec <- recode(data$neo_ffi_1, "2=-2; 1=-1; 0=0; -1=1; -2=2")
data$neo_ffi_3_rec <- recode(data$neo_ffi_3, "2=-2; 1=-1; 0=0; -1=1; -2=2")
data$neo_ffi_8_rec <- recode(data$neo_ffi_8, "2=-2; 1=-1; 0=0; -1=1; -2=2")
data$neo_ffi_9_rec <- recode(data$neo_ffi_9, "2=-2; 1=-1; 0=0; -1=1; -2=2")
data$neo_ffi_12_rec <- recode(data$neo_ffi_12, "2=-2; 1=-1; 0=0; -1=1; -2=2")
data$neo_ffi_14_rec <- recode(data$neo_ffi_14, "2=-2; 1=-1; 0=0; -1=1; -2=2")
data$neo_ffi_15_rec <- recode(data$neo_ffi_15, "2=-2; 1=-1; 0=0; -1=1; -2=2")
data$neo_ffi_16_rec <- recode(data$neo_ffi_16, "2=-2; 1=-1; 0=0; -1=1; -2=2")
data$neo_ffi_18_rec <- recode(data$neo_ffi_18, "2=-2; 1=-1; 0=0; -1=1; -2=2")
data$neo_ffi_23_rec <- recode(data$neo_ffi_23, "2=-2; 1=-1; 0=0; -1=1; -2=2")
data$neo_ffi_24_rec <- recode(data$neo_ffi_24, "2=-2; 1=-1; 0=0; -1=1; -2=2")
data$neo_ffi_27_rec <- recode(data$neo_ffi_27, "2=-2; 1=-1; 0=0; -1=1; -2=2")
data$neo_ffi_29_rec <- recode(data$neo_ffi_29, "2=-2; 1=-1; 0=0; -1=1; -2=2")
data$neo_ffi_30_rec <- recode(data$neo_ffi_30, "2=-2; 1=-1; 0=0; -1=1; -2=2")
data$neo_ffi_31_rec <- recode(data$neo_ffi_31, "2=-2; 1=-1; 0=0; -1=1; -2=2")
data$neo_ffi_33_rec <- recode(data$neo_ffi_33, "2=-2; 1=-1; 0=0; -1=1; -2=2")
data$neo_ffi_38_rec <- recode(data$neo_ffi_38, "2=-2; 1=-1; 0=0; -1=1; -2=2")
data$neo_ffi_39_rec <- recode(data$neo_ffi_39, "2=-2; 1=-1; 0=0; -1=1; -2=2")
data$neo_ffi_42_rec <- recode(data$neo_ffi_42, "2=-2; 1=-1; 0=0; -1=1; -2=2")
data$neo_ffi_44_rec <- recode(data$neo_ffi_44, "2=-2; 1=-1; 0=0; -1=1; -2=2")
data$neo_ffi_45_rec <- recode(data$neo_ffi_45, "2=-2; 1=-1; 0=0; -1=1; -2=2")
data$neo_ffi_46_rec <- recode(data$neo_ffi_46, "2=-2; 1=-1; 0=0; -1=1; -2=2")
data$neo_ffi_48_rec <- recode(data$neo_ffi_48, "2=-2; 1=-1; 0=0; -1=1; -2=2")
data$neo_ffi_54_rec <- recode(data$neo_ffi_54, "2=-2; 1=-1; 0=0; -1=1; -2=2")
data$neo_ffi_55_rec <- recode(data$neo_ffi_55, "2=-2; 1=-1; 0=0; -1=1; -2=2")
data$neo_ffi_57_rec <- recode(data$neo_ffi_57, "2=-2; 1=-1; 0=0; -1=1; -2=2")
data$neo_ffi_59_rec <- recode(data$neo_ffi_59, "2=-2; 1=-1; 0=0; -1=1; -2=2")



# Eine schönere Alternative, die nur funktioniert wenn die Daten in
# Matrixform vorliegen:

data <- as.matrix(data)

column_nrs = c(1, 3, 8, 9, 12, 14, 15, 16, 18, 23, 24, 27, 29, 30, 31, 33, 38, 
    39, 42, 44, 45, 46, 48, 54, 55, 57, 59) + 2  # Gibt uns die Positionen der zu rekodierenden Variablen

recodes <- recode(data[, column_nrs], "2=-2; 1=-1; 0=0; -1=1; -2=2")

# Allerdings haben wir dann die ursprünglichen Variablennamen, was wenig
# sinnvoll ist

names(recodes) <- c(1, 3, 8, 9, 12, 14, 15, 16, 18, 23, 24, 27, 29, 30, 31, 
    33, 38, 39, 42, 44, 45, 46, 48, 54, 55, 57, 59)  # Ein schneller Fix, der die rekodierten Variablen zwar umbenennt, aber lediglich mit einer Nummer versieht

names(recodes) <- paste(names(recodes), "_rec", sep = "")  # So würde man das Problem später elegant lösen

data <- cbind(data, recodes)  # Wir hängen die rekodierten Variablen einfach an unser Datenframe an

# Alternativ kann man natürlich auch in dieselben Variablen rekodieren
# anstatt in andere und hat das Variablennamenproblem dann nicht



# Rekodierung mehrerer Variablen in einem Datenframe mit der Funktion
# lapply():

column_nrs = c(1, 3, 8, 9, 12, 14, 15, 16, 18, 23, 24, 27, 29, 30, 31, 33, 38, 
    39, 42, 44, 45, 46, 48, 54, 55, 57, 59) + 2  # Gibt uns die Positionen der zu rekodierenden Variablen

recodes <- lapply(data[, column_nrs], recode, recodes = "2=-2; 1=-1; 0=0; -1=1; -2=2")

recodes <- as.data.frame(recodes)  # Aus der von lapply zurückgegebenen Liste machen wir wieder ein Datenframe

# Beim zusammenfügen beider Datensätze besteht aber wieder das Problem der
# doppelten Variablennamen

names(recodes) <- c(1, 3, 8, 9, 12, 14, 15, 16, 18, 23, 24, 27, 29, 30, 31, 
    33, 38, 39, 42, 44, 45, 46, 48, 54, 55, 57, 59)  # Ein schneller Fix, der die rekodierten Variablen zwar umbenennt, aber lediglich mit einer Nummer versieht

names(recodes) <- paste(names(recodes), "_rec", sep = "")  # So würde man das Problem später elegant lösen

data <- cbind(data, recodes)

A19: Berechne die Skalenwerte für die drei verbleibenden Skalen des NEO-FFI. Füge die 5 neuen Variablen zum bestehenden Datensatz hinzu

Skala_O <- rowMeans(data[, seq(from = 5, to = 60, by = 5)])

Skala_V <- rowMeans(data[, seq(from = 6, to = 61, by = 5)])

Skala_G <- rowMeans(data[, seq(from = 7, to = 62, by = 5)])

data <- cbind(data, Skala_N, Skala_E, Skala_O, Skala_V, Skala_G)

A20: Suche im Internet oder der R-Hilfe nach einer Funktion, die dir die Kurtosis einer Verteilung zurückgibt. Berechne die Kurtosis der Variable Skala_N im Datensatz

Wir können die Funktion kurtosi() aus dem Paket psych verwenden:

# install.packages('psych') # Wir können diesen Befehl nutzen, falls das
# Paket psych noch nicht installiert ist

library("psych")
kurtosi(data$Skala_N)  # Kurtosis der Verteilung
## [1] 0.2489
# Es gibt natürlich noch viele weitere Pakete, die uns die entsprechenden
# Informationen liefern können

A21: Suche im Internet oder der R-Hilfe nach einer Funktion, die dir die Schiefe einer Verteilung zurückgibt. Berechne die Kurtosis der Variable Skala_N im Datensatz

Wir können die Funktion skew() aus dem Paket psych verwenden:

# install.packages('psych') # Wir können diesen Befehl nutzen, falls das
# Paket psych noch nicht installiert ist

library("psych")
skew(data$Skala_N)  # Schiefe der Verteilung
## [1] 0.1742
# Es gibt natürlich noch viele weitere Pakete, die uns die entsprechenden
# Informationen liefern können

A22: Berechne alle beschriebenen deskriptiven Kennzahlen für die Variable Skala_E im Datensatz

mean(data$Skala_E)  # Gibt uns den Mittelwert der Skala in unserer Stichprobe zurück
## [1] 0.2115
sd(data$Skala_E)  # Standardabweichung
## [1] 0.3044
median(data$Skala_E)  # Median
## [1] 0.25
min(data$Skala_E)  # Kleinster Wert in der Stichprobe
## [1] -0.75
max(data$Skala_E)  # Größter Wert in der Stichprobe
## [1] 0.9167
range(data$Skala_E)  # Range der Skalenwerte
## [1] -0.7500  0.9167
kurtosi(data$Skala_E)  # Kurtosis der Verteilung
## [1] -0.3862
skew(data$Skala_N)  # Schiefe der Verteilung
## [1] 0.1742
Clone this wiki locally