1 Übersicht

In diesem zweiten Teil der Einführung wollen wir uns die folgenden Dinge ansehen:

  • Variablen als Faktoren oder numerische Variablen definieren
  • Abbildung für die Mittelwerte machen (Wiederholung)
  • Daten transformieren und neue Variable berechnen
  • Verteilung der Variablen: Histogramm erstellen (mit R-Commander)
  • T-Test per Hand selber definieren (ohne R-Commander)
  • Daten “subsetten” und umformatieren
  • Umgang mit fehlenden Werten (missing values, NA)

1.1 Der heutige Datensatz

Als Beispieldatensatz benutzen wir wieder das IQ-Priming-Beispiel, allerdings in einer etwas abgewandelten Form. Die Daten finden Sie in der CSV Datei “Daten_EinfuehrungTeil2.csv”. Die UV (zweistufig, manipuliert zwischen zwei Gruppen) war wieder das Intelligenz-Priming. Gemessen wurde der IQ jeder Versuchsperson. Diesmal allerdings zu zwei Zeitpunkten. Die erste Messung erfolgte unmittelbar nach dem Priming. Die zweite Messung (“Follow-up”) wurde nach einigen Wochen durchgeführt.

Folgende Hypothesen sind denkbar:

H1: Das Intelligenzpriming führt zu einem IQ-Unterschied unmittelbar nach dem Priming (Kurzzeiteffekt). M_int - M_bloed > 0. H2: Das Intelligenzpriming hat aber keine Langzeitwirkung. Wenn man den IQ nach einigen Wochen erneut misst, gibt es keine Unterschiede mehr zwischen den Gruppen. M_int - M_bloed = 0.

2 Datenanalyse

2.1 Daten einlesen

Daten einlesen über “readr”

library(readr)
Daten_Uebung2 <- read_delim("Daten_EinfuehrungTeil2.csv", ";", escape_double = FALSE, trim_ws = TRUE)

Ein Blick in die Daten:

head(Daten_Uebung2, 10) # dieser Code zeigt euch die ersten (deshalb "head") 10 Zeilen des Datensatzes.
## # A tibble: 10 x 4
##    Subj_ID Priming_Numeric IQ_T1 IQ_T2
##      <dbl>           <dbl> <dbl> <dbl>
##  1       2               0  91.3 115. 
##  2       4               0  86.2 117. 
##  3       6               0  77.7  99.3
##  4       8               0  72.2  85.3
##  5      10               0  76.5 115. 
##  6      12               0  84.4 103. 
##  7      14               0  67.8  86.9
##  8      16               0  79.2  96.3
##  9      18               0 102.  125. 
## 10      20               0  80.3  92.2
tail(Daten_Uebung2, 10) # dieser Code zeigt euch die letzten (deshalb "tail") 10 Zeilen des Datensatzes.
## # A tibble: 10 x 4
##    Subj_ID Priming_Numeric IQ_T1 IQ_T2
##      <dbl>           <dbl> <dbl> <dbl>
##  1      61               1 109.  109. 
##  2      63               1 125.  122. 
##  3      65               1 125.  109. 
##  4      67               1 128.   95.9
##  5      69               1 114.  133. 
##  6      71               1 110.  107. 
##  7      73               1 122.   86.0
##  8      75               1  94.5  93.8
##  9      77               1  94.4 123. 
## 10      79               1 107.   70.9

Achtung: Zeile 59 enthält einen fehlenden Wert für die IQ-Messung zum Messzeitpunkt T2. Dieser fehlende Wert wurde in der CSV-Datei mit “NA” gekennzeichnet. Der “read_delim()” Befehl weiter oben erkennt diesen Eintrag automatisch als missing value und es entstehen keine Probleme. Wenn Sie in der Enviroment auf den Datensatz klicken und ihn im Viewer betrachten, muss dieses “NA” in grauer und kursiver Schrift dargestellt sein. Falls dort einfach in schwarz und nicht-kursiv “NA” steht, hat das Programm diesen fehlenden Eintrag nicht richtig erkannt und behandelt als Folge die gesamte Spalte als Text.

R Commander öffnen (Daten als aktuelle Datenmatrix auswählen)

library(Rcmdr)
#library(RcmdrMisc)

2.2 Faktoren definieren

Wie sie am Datensatz sehen konnten, ist die UV diesmal numerisch kodiert (0 = nicht intelligent geprimet vs. 1 = intelligent geprimet). R nimmt bei numerischer Kodierung an, dass es sich um eine gemessene Variable handelt und behandelt diese Spalte deshalb nicht als Faktor. Das müssen wir ändern. Die Möglichkeit, Faktoren zu definieren, haben Sie über die Funktion “readr” bereits kennengelernt. Man kann dafür allerdings auch den R-Commander benutzen. Das wollen wir im nächsten Schritt ausprobieren.

Ziel: Die Variable “Priming_Numeric” zum Faktor mit den Stufen “Bloed” und “Intelligent” machen (im R-Commander)

Vorgehen:

  • im R-Commander auf “Datenmanagment” –> “Variablen bearbeiten” –> “Konvertiere numerische Variablen in Faktoren…”

  • “Priming_numeric” auswählen. Es gibt zwei Radio-buttons “Verwende Etiketten” und “Verwende Ziffern”. Hierüber kann man festlegen, ob man eine numerische Kodierung (Ziffern) der Faktorstufen beibehalten möchte, oder ob man stattdessen Text-Labels (Etiketten) verwenden möchte. Wir werden Text-Labels verwenden, da man sich dann nicht mehr die ganze Zeit erinnern muss, was nun 0 und 1 bedeutet hatten.

  • auf “Ok” klicken –> Variable mit “ja” überschreiben lassen –> 0 soll zu “Bloed” werden und 1 soll zu “Intelligent” werden. –> Ok.

Den dazugehörigen R-Code finden Sie unten:

Daten_Uebung2 <- within(Daten_Uebung2, {
  Priming_Numeric <- factor(Priming_Numeric, labels=c('Bloed','Intelligent'))
})

Noch ein paar Tipps und Tricks zum Umgang mit Faktoren:

Faktorlevel kann man auch nachträglich umbenennen (wenn Priming_Numeric beispielsweise schon über readr korrekt als Faktor eingelesen wurde, aber man lieber Etiketten möchte - oder andersrum.)

Da wir Priming_Numeric ja gerade zum Faktor mit Etiketten gemacht haben, wird hier demonstriert, wie man zurück zu Zahlen käme. Es geht aber natürlich in beide Richtungen.

Manuell rekodieren über Code:

#Achtung: hier muss zunächst die bestehende Reihenfolge der Faktorlevel beachtet werden. 
#Die kann man zb über folgenden Befehl abrufen:
levels(Daten_Uebung2$Priming_Numeric)
## [1] "Bloed"       "Intelligent"
#Die Reihenfolge ist offenbar Bloed, Intelligent 
#Rekodieren unter Beachtung der Reihenfolge:
levels(Daten_Uebung2$Priming_Numeric) <- c("0","1")
#Prüfen, ob Rekodieren geklappt hat:
levels(Daten_Uebung2$Priming_Numeric)
## [1] "0" "1"
#hat geklappt :)

Im Commander:

Datenmanagement -> Variablen bearbeiten -> Rekodiere Variable

Variable auswählen, Rekodierungsanweisung in der unten sichtbaren Form ausfüllen (wir gehen jetzt wieder zurück von Zahlen zu Labels):

library(knitr)
knitr::include_graphics("RekodierenCommander.png")

#Dieser Code wird bei euch nicht ausführbar sein, weil ihr den Screenshot nicht gespeichert haben werdet. Mit diesem Paket und Befehl kann man aber generell Bilder ins Markdown einfügen. Ggf. einfach auskommentieren, wenn ihr das Markdown bei euch komplett ausführen oder knitten wollt. 

Der resultierende Code:

Daten_Uebung2 <- within(Daten_Uebung2, {
  Priming_Numeric <- Recode(Priming_Numeric, '0 = "Bloed"; 1 = "Intelligent"; ;', 
  as.factor=TRUE)
})

Prüfen, ob eine Variable aktuell ein Faktor ist oder nicht:

is.factor(Daten_Uebung2$Priming_Numeric)
## [1] TRUE
#TRUE = ja, FALSE = nein

2.3 Grafiken

Ziel: Grafiken für IQ-Werte zu T1 und T2 erzeugen (im R-Commander), Reskalierung der y-Achse für zweiten Plot (per Hand einfügen)

Vorgehen:

R-Commander –> Grafiken –> Plot für arithmetische Mittel –> Abhängige Var = IQ_T1. Unter Optionen noch Konfidenzintervalle als Fehlerbalken auswählen.

with(Daten_Uebung2, plotMeans(IQ_T1, Priming_Numeric, error.bars="conf.int", level=0.95, 
  connect=TRUE))

Die Grafik deutet an, dass das Priming kurzzeitig einen Effekt in die vermutete Richtung hatte.

Jetzt dasselbe für T2.

with(Daten_Uebung2, plotMeans(IQ_T2, Priming_Numeric, error.bars="conf.int", level=0.95, 
  connect=TRUE))

Auch hier scheint sich die Hypothese zu bestätigen. Zum Zeitpunkt T2 (einige Wochen später) haben sich die IQ-Werte wieder einem Normalwert von ca. 100 angenähert.

Als letztes wollen wir noch die Y-Achse reskalieren. Das geht mit dem folgenden Code:

with(Daten_Uebung2, plotMeans(IQ_T2, Priming_Numeric, error.bars="conf.int", level=0.95, 
  connect=TRUE, ylim=c(80,125)))

2.4 Daten transformieren/ neue Variablen berechnen, z.B. AV-Werte standardisieren

Oft muss/ will man Werte in einem Datensatz rekodieren. Sie erinnern sich vllt., dass wir z.B. ganz zu Beginn in Quanti I einmal Fragebogenwerte rekodiert hatten, da manche Items umgepolt werden mussten. Ein anderer häufiger Fall ist die Standardisierung von Werten. Letzteres soll jetzt gezeigt werden.

Idee: wir normalisieren (z-standardisieren) die IQ-Werte am bekannten Populationsparameter (M = 100 und SD = 15). Dann beschreiben die Mittelwerte die Abweichungen der Gruppen von der Population (in der Einheit Standard-Deviation, SD).

Ziel: IQ-Werte zu T1 und T2 an Normalpopulation standardisieren (per Hand oder im Commander).

Vorgehen R-Commander:

Datenmanagment –> Variablen bearbeiten –> Erzeuge neue Variable

Im Fenster, das sich dann öffnet: Zunächst den Variablennamen spezifizieren. Wir nennen die erste Variable “z_IQ_T1”.

In das Feld “Anweisung für die Berechnung” schreiben wir: (IQ_T1-100)/15

Falls Ihnen nicht mehr klar ist, warum wir diese Formel verwenden, schauen Sie noch einmal in den Unterlagen von Quanti I bei z-Standardisierung nach.

Dieselben Schritte könnten wir jetzt für “IQ_T2” wiederholen. Alternativ zum Commander, könnte man auch einfach den nachfolgenden Code ausführen:

Daten_Uebung2$z_IQ_T1 <- with(Daten_Uebung2,(IQ_T1-100)/15) 
Daten_Uebung2$z_IQ_T2 <- with(Daten_Uebung2,(IQ_T2-100)/15) 

Wenn sie jetzt noch einmal die Datenmatrix betrachten, werden Sie feststellen, dass es zwei neue Spalten gibt. Diese beiden Spalten enthalten nun die z-standardisierten IQ-Werte.

Die Mittelwerte dieser z-Werte lassen sich jetzt als Abstand der Experimentalgruppenmittelwerte zum Mittelwert der Normalbevölkerung in Standardabweichungseinheiten interpretieren.

2.5 Mittelwertsgrafik mit z-standardisierten Werten

Wir schauen uns nun noch einmal die entsprechenden Grafiken an. Dazu können wir einfach den Code von oben kopieren und im neuen Code die neu angelegten Spalten auswählen.

Für T1:

with(Daten_Uebung2, plotMeans(z_IQ_T1, Priming_Numeric, error.bars="conf.int", level=0.95, 
  connect=TRUE))

Interpretieren Sie die dargestellten Mittelwerte.

Für T2:

with(Daten_Uebung2, plotMeans(z_IQ_T2, Priming_Numeric, error.bars="conf.int", level=0.95, 
  connect=TRUE))

Interpretieren Sie die dargstellten Mittelwerte.

2.6 Verteilung der Daten: Histogramm

Sie wissen bereits, dass IQ-Werte in der Population annähernd normalverteilt sind. Simmt das auch (ungefähr) für die beiden Stichproben? Wie sie schon wissen, lässt sich die Verteilung einer Variablen gut mit Hilfe eines Histogramms veranschaulichen. Auch das geht sehr leicht mit dem R-Commander.

Ziel: Histogramm der Rohwerte erstellen (im R-Commander)

Vorgehen: Grafiken –> Histogramm. Bei der Variablenauswahl wählen wir zunächst T1 aus. (Ob Sie die unstandardisierten Werte oder die standardisierten Werte nehmen, ist egal; die Standardisierung ähndert nichts an der Verteilung. Wir nehmen die unstandardisierten Werte.)

Bedenken Sie, dass sich die Werte der Spalte mit den IQ-Werten zu T1 aus den zwei Versuchsgruppen zusammensetzen. Wir brauchen natürlich separate Verteilungsgrafiken für beide Gruppen. Das geht, indem man auf die Schaltfläche “Grafik für die Gruppen” klickt und dort die UV auswählt.

Dieselben Schritte müssen sie dann für T2 wiederholen.

Alternativ kann auch wieder nachfolgender Code ausgeführt werden:

Für T1:

with(Daten_Uebung2, Hist(IQ_T1, groups=Priming_Numeric, scale="frequency", breaks="Sturges", 
  col="darkgray"))

Für T2:

with(Daten_Uebung2, Hist(IQ_T2, groups=Priming_Numeric, scale="frequency", breaks="Sturges", 
  col="darkgray"))

Wie sie sehen, sehen die Daten zu T1 nicht gerade normalverteil aus. Für die “blöd” Gruppe ist die Verteilung linksschief und rechtssteil und für die “intelligent” Gruppe ist die Verteilung linkssteil und rechtsschief. Zu T2 sehen die Werte schone eher normalverteilt aus.

2.7 T-Tests per Hand

Als nächstes prüfen wir die Gruppenunterschiede statistisch. Wie man einen T-Test über den R-Commander berechnent, wissen sie Schon. Nachfolgend kommt deshalb nur die Analyse via R-Code.

Ziel: T-test zwischen Gruppen zu T1 (unabhängige Daten, gerichtete Hypothese, direkt über Code)

Vorgehen: Code s. unten.

t.test(IQ_T1~Priming_Numeric, alternative='less', conf.level=.95, var.equal=TRUE, 
  data=Daten_Uebung2)
## 
##  Two Sample t-test
## 
## data:  IQ_T1 by Priming_Numeric
## t = -9.344, df = 78, p-value = 1.162e-14
## alternative hypothesis: true difference in means is less than 0
## 95 percent confidence interval:
##       -Inf -23.92738
## sample estimates:
##       mean in group Bloed mean in group Intelligent 
##                    86.863                   115.977

Interpretieren Sie das Ergebnis. Warum ist der empirsiche t-Wert negativ? Warum wird für das KI der Mittelwertsdifferenz ein Wertebereich von “-Inf” bis “-23.92738” angezeigt?

Nun noch die Effektstärke:

library(effsize)

cohen.d(Daten_Uebung2$IQ_T1,Daten_Uebung2$Priming_Numeric,paired=FALSE)
## 
## Cohen's d
## 
## d estimate: -2.089386 (large)
## 95 percent confidence interval:
##     lower     upper 
## -2.642843 -1.535928

Ein Cohen’s d von ca. 2.0 sagt aus, dass der Abstand der beiden Gruppen zu T1 ca. 2 SDs beträgt. Schauen Sie sich noch einmal die entsprechende Mittelwertsgrafik an und prüfen Sie, ob das ungefähr stimmt.

Als nächstes testen wir, ob sich die Gruppen zu T2 immer noch unterscheiden. Im Code ändern wir noch den “alternative” Teil zu “two.sided”, um den Fall zu simulieren, in dem die Hypothese ungerichtet ist.

t.test(IQ_T2~Priming_Numeric, alternative='two.sided', conf.level=.95, var.equal=TRUE, 
  data=Daten_Uebung2)
## 
##  Two Sample t-test
## 
## data:  IQ_T2 by Priming_Numeric
## t = -0.18755, df = 77, p-value = 0.8517
## alternative hypothesis: true difference in means is not equal to 0
## 95 percent confidence interval:
##  -7.013208  5.805798
## sample estimates:
##       mean in group Bloed mean in group Intelligent 
##                  100.6445                  101.2482

Wie in den Grafiken schon ersichtlich, unterscheiden sich die Gruppen zu T2 nicht mehr voneinander.

2.8 Subsets von Datensätzen erstellen

Oftmals enthält ein Datensatz Spalten oder Zeilen, die man für die Analysen gar nicht benötigt. Im Folgenden soll deshalb gezeigt werden, wie man “Subsets” in R erstellen kann.

Ziel: Daten subsetten. Z.B. die z-Werte-Spalten wieder aus der Tabelle löschen.

Subsetten funktioniert in R am besten über Code mit der sogenannten “subset-Funktion”. Eine gute Hilfe/ Übersicht findet sich hier: https://www.statmethods.net/management/subset.html

Hier der Code für unser Beispiel:

Daten_Uebung2_sub <- subset(Daten_Uebung2,select=c(1:4))

Daten_Uebung2_sub2 <- subset(Daten_Uebung2,select=c(1,3:4,6))


# Erstellt ein neues Objekt "Daten_Uebung2_sub" 

# in der subset-Funktion wird als erste der Ausgangsdatensatz ausgewählt "Daten_Uebung2". Der "select" Befehlt wählt dann die Spalten aus (1 bis 4), die wir behalten wollen. Spalen 5 und 6 enthalten ja die z-Werte und diese wollen wir nicht mehr haben.

Als nächstes schauen wir uns an, wie man separate Tabellen für die beiden Priming-Gruppen erstellen kann.

Ziel: Daten subsetten, um separate Tabellen für Priming-Gruppen zu bekommen.

Code:

Daten_Bloed <- subset(Daten_Uebung2_sub, Priming_Numeric=="Bloed") # Priming_Numeric ist die UV-Spalte. Hier soll nur die Stufe "Bloed" selektiert werden. 


Daten_Intelligent <- subset(Daten_Uebung2_sub, Priming_Numeric=="Intelligent") # Priming_Numeric ist die UV-Spalte. Hier soll nur die Stufe "Intelligent" selektiert werden. 

2.9 Neue Berechnungen mit den erstellten Subsets

Als nächstes könnten wir die erstellten Subsets nutzen, um abhängige t-tests (separat für beide Priming-Gruppen) durchzuführen.

Hier der Code für die t-Tests für abhängige Daten.

Für die “Blöd” Gruppe:

with(Daten_Bloed, (t.test(IQ_T1, IQ_T2, alternative='less', conf.level=.95, 
  paired=TRUE)))
## 
##  Paired t-test
## 
## data:  IQ_T1 and IQ_T2
## t = -4.8805, df = 39, p-value = 9.122e-06
## alternative hypothesis: true difference in means is less than 0
## 95 percent confidence interval:
##       -Inf -9.023816
## sample estimates:
## mean of the differences 
##                -13.7815

Interpretieren Sie das Ergebnis.

Für die “Intelligent” Gruppe:

with(Daten_Intelligent, (t.test(IQ_T1, IQ_T2, alternative='greater', conf.level=.95, paired=TRUE)))
## 
##  Paired t-test
## 
## data:  IQ_T1 and IQ_T2
## t = 4.0626, df = 38, p-value = 0.0001172
## alternative hypothesis: true difference in means is greater than 0
## 95 percent confidence interval:
##  8.53333     Inf
## sample estimates:
## mean of the differences 
##                14.58667

Interpretieren Sie das Ergebnis.

2.10 Noch einmal “reshapen”

Bisher liegen die Daten im sogenannten “Wide-Format” vor. Wie Sie schon wissen, ist das nicht für alle Dinge, die man machen möchte, die optimale Darstellung. Deshalb wollen wir jetzt die Daten in das “Long-Format” transformieren. Dazu werden wir wieder das Paket “reshape2” verwenden.

Ziel: Daten in vom wide ins long format überführen mit reshape2

Vorgehen: siehe nachfolgenden Code

library(reshape2) # Paket laden
Daten_long<- melt(Daten_Uebung2_sub,id.vars = c("Subj_ID","Priming_Numeric"),variable.name="Messzeitpunkt",value.name="IQ_Wert")

# bei den "id.vars" geben wir diesmal zwei Spalten an, die nicht mit eingeschmolzen werden sollen: die subject IDs und die UV-Codierung. 

Ein Blick in die Daten im Long-Format:

head(Daten_long, 10) # dieser Code zeigt euch die ersten (deshalb "head") 10 Zeilen des Datensatzes.
##    Subj_ID Priming_Numeric Messzeitpunkt IQ_Wert
## 1        2           Bloed         IQ_T1   91.32
## 2        4           Bloed         IQ_T1   86.18
## 3        6           Bloed         IQ_T1   77.69
## 4        8           Bloed         IQ_T1   72.22
## 5       10           Bloed         IQ_T1   76.54
## 6       12           Bloed         IQ_T1   84.41
## 7       14           Bloed         IQ_T1   67.84
## 8       16           Bloed         IQ_T1   79.22
## 9       18           Bloed         IQ_T1  102.05
## 10      20           Bloed         IQ_T1   80.33

Bisher hatten wir Ihnen nur gezeigt, wie man Daten vom Wide- ins Long-Format überführt. Wie käme man von Daten im Long-Format zu Daten im Wide-Format? Das geht auch mit dem “reshape2” Paket.

Hier noch einmal in nütlicher Link: http://www.cookbook-r.com/Manipulating_data/Converting_data_between_wide_and_long_format/

Hier der Code für die rückformatierung ins Wide-Format:

Daten_wide <- dcast(Daten_long, Subj_ID + Priming_Numeric ~ Messzeitpunkt, value.var="IQ_Wert")

# anstannt melt benutzt man jetzt die "dcast" Funktion. Die erste Eingabe ist natürlich wieder der Ausgangsdatensatz, der transformiert werden soll. Danach sagt man, welche Spalten "fix" bleiben sollen (Subject ID und/plus Priming-Faktor) und welche Spalte "wide" werden soll (Messzeitpunkt). Als letztes muss man sagen, welche Spalte die Messwerte beinhaltet.

Ein Blick in die rückformatierten Daten:

head(Daten_wide, 10) # dieser Code zeigt euch die ersten (deshalb "head") 10 Zeilen des Datensatzes.
##    Subj_ID Priming_Numeric  IQ_T1  IQ_T2
## 1        1     Intelligent 143.00  67.37
## 2        2           Bloed  91.32 114.91
## 3        3     Intelligent 125.53 107.53
## 4        4           Bloed  86.18 116.92
## 5        5     Intelligent 100.24 107.61
## 6        6           Bloed  77.69  99.27
## 7        7     Intelligent 123.04 124.38
## 8        8           Bloed  72.22  85.26
## 9        9     Intelligent  91.84 101.07
## 10      10           Bloed  76.54 114.66

2.11 Neue Grafik mit den Long-Format-Daten

Nun aber zurück zum Long-Format.

Ein Vorteil des Long-Format ist es, dass wir nun eine Abbildung erstellen können, die beide Gruppen und beide Messzeitpunkte zusammenfasst. Vorher mussten wir für die beiden Messzeitpunkte separate Abbildungen erstellen.

Das experimentelle Design, welches den Daten zugrunde liegt, ist ein 2 (Priming: Bloed vs. Intelligent; between subjects) x 2 (IQ-Messungszeitpunkt: T1 gleich nach Priming vs. T2 einige Wochen später; within-subject) mixed Design. (“Mixed” weil es sowohl between- als auch within-subject Manipulationen gibt.) Das Long-Format erlaubt es uns, die gesamate Information in diesem 2 x 2 Design in einer Abbildung deskriptiv zu beschreiben.

Ziel: Mit diesem neuen Datensatz alle Informationen in einer Grafik darstellen.

Vorgehen: Commander –> “Daten_long” als aktuelle Datenmatrix einstellen –> Grafiken –> Plot für arithmetische Mittel –> bei Gruppierungsvariablen sowohl “Priming_numeric” als auch “Messzeitpunkt” auswählen. Bei AV natürlich “IQ” auswählen. Unter “Optionen” noch Konfidenzintervall für die Fehlerbalken auswählen. –> Ok.

Hier auch der dahinterliegende Code:

with(Daten_long, plotMeans(IQ_Wert, Messzeitpunkt, Priming_Numeric, error.bars="conf.int", 
  level=0.95, connect=TRUE, legend.pos="farright"))

Schauen Sie sich die Abbildung an und interpretieren Sie diese. Was ist auf der X-Achse abgebildet und was sind die verschiedenen Linien?

Wie könnte man die Grafik so abändern, dass der Priming-Faktor auf der X-Achse ist und die Messzeitpunkte als die verschiedenen Linien dargestellt werden? Die einfachste Möglichkeit wäre, einfach die Reihenfolge der Angaben im Code abzuändern.

with(Daten_long, plotMeans(IQ_Wert, Priming_Numeric, Messzeitpunkt, error.bars="conf.int", 
  level=0.95, connect=TRUE, legend.pos="farright"))

Denken Sie noch einmal über das experimentelle Design nach. Welche der beiden Abbildungen erscheint Ihnen angemessener, um die vorliegenden Daten zu beschreiben? Warum?

3 Umgang mit fehlenden Werten

Zuletzt wollen wir uns noch ansehen, was passiert, wenn ein Datensatz fehlende Werte (Missing Values) enthält. Dazu gibt es noch eine zweite csv Datei, “Daten_MissingValues_EinfuehrungTeil2.csv”.

Zum laden der Daten benutzen wir einfach den Code von vorhin mit abgeändertem Dateinamen.

Daten2_Uebung2 <- read_delim("Daten_MissingValues_EinfuehrungTeil2.csv", ";", escape_double = FALSE, trim_ws = TRUE)

Wie Sie sehen können, gab es trotz der Missing Values keine Fehlermeldung beim Einlesen. Betrachten wir zunächst die Datenmatrix:

Daten2_Uebung2
## # A tibble: 80 x 3
##    Subj_ID Priming_Numeric IQ_T1
##      <dbl>           <dbl> <dbl>
##  1       2               0  91.3
##  2       4               0  86.2
##  3       6               0  77.7
##  4       8               0  72.2
##  5      10               0  76.5
##  6      12               0  84.4
##  7      14               0  67.8
##  8      16               0  79.2
##  9      18               0  NA  
## 10      20               0  80.3
## # ... with 70 more rows

Wie Sie sehen können (z.B. für Versuchsperon mit der ID 18), sind fehlende Werte von der Person, die den Datensatz erstellt hat, mit “NA” gekennzeichnet. Dies ist die Standardbezeichnung und es ergeben sich nachfolgend keine Probleme, wenn diese Standardbezeichnung zur Kenntlichmachung fehlender Werte benutzt wird.

Wir können z.B. ohne Probleme eine Abbildung erstellen. Dazu muss natürlich erst einmal wieder Priming_Numeric in einen Faktor umgewandelt werden.

Daten2_Uebung2 <- within(Daten2_Uebung2, {
  Priming_Numeric <- factor(Priming_Numeric, labels=c('Bloed','Intelligent'))
})

Hier der Code für die Abbildung (identisch mit oben, bis auf den Namen des Datensatzes):

with(Daten2_Uebung2, plotMeans(IQ_T1, Priming_Numeric, error.bars="conf.int", level=0.95, 
  connect=TRUE))

Fazit: Missing values sind kein Problem, wenn sie mit “NA” im Datensatz stehen. Falls eine andere Bezeichnung gewählt wurde, könnten sie diese beim Einlesen angeben, wenn Sie die Daten mit dem Paket “readr” oder mit dem Paket “base” einlesen. (Das wurde im ersten Video schon einmal erzählt.)