Standardizing inter-element distances in repertory grids
R-Kurs Mark Heckmann WiSe 2010-2011 Uni Bremen
1. Einführung in
das R Frame-
work
Mark Heckmann
Universität Bremen
WiSe 2010/11 1
2. Was erwarten wir von dem Kurs?
• Von vorne abholen / Grundlagen
• Grafiken erstellen
• Datensätze speichern / erstellen
• Weniger und genauer statt viel oberflächlich
2
3. „Auch wenn das Handwerkszeug solcher
Forschung sich virtuos etablierter Techniken der
Empirie und des Experimentierens bedient (in
deutlicher Abgrenzung zur dümmlichen -
ingnoranten Aufgabe dieser Instrumente) ...“
Reuter, 2002 , S. 180
Reuter, H. (2002). Über den Umgang mit offenen Fragen. In G. Gniech, H. Reuter & M. A.
Stadler (Hrsg.). Lebenswelt und Erleben: Beiträge zur Erfahrungspsychologie. Festschrift zum 65.
Geburtstag von Gisla Gniech. Lengerich: Pabst Science Publishers (S. 172-181).
3
4. ACHTUNG
METHO
DIK ≠
!
METHOD
„Auch wenn das Handwerkszeug solcher
OLOGIE
Forschung sich virtuos etablierter Techniken der
Empirie und des Experimentierens bedient (in
deutlicher Abgrenzung zur dümmlichen -
ingnoranten Aufgabe dieser Instrumente) ...“
Reuter, 2002 , S. 180
Reuter, H. (2002). Über den Umgang mit offenen Fragen. In G. Gniech, H. Reuter & M. A.
Stadler (Hrsg.). Lebenswelt und Erleben: Beiträge zur Erfahrungspsychologie. Festschrift zum 65.
Geburtstag von Gisla Gniech. Lengerich: Pabst Science Publishers (S. 172-181).
3
19. “Nurse, get on the internet, go to SURGERY.COM,
scroll down and click on the ,‘Are you totally lost?‘
icon.“
18
20. ACHTUNG!
Flache
Lernkurve
„Nehmen Sie sich ein Beispiel an Kindern, die
das Laufen lernen. Mit der Einstellung von
vielen Erwachsenen hätten sie nach dem
ersten Sturz aufgehört und gesagt: "Nee, tut
mir leid, auf zwei Beinen gehen ist nicht mein
Ding.“
Dr. Eckart von Hirschhausen
19
21. Endless o
n
R Ressources the web!
• R Project Site: www.r-project.org
• Blogs
• www.r-bloggers.com
• http://ryouready.wordpress.com
• eBooks/Wikis/Sites
•Quick-R website
•http://de.wikibooks.org/wiki/GNU_R
•http://addictedtor.free.fr
• R seek (www.rseek.org)
20
22. Basics
• R arbeitet im Frage-Anwort Modus
• Navigieren in R Konsole durch Aufwärts und Abwärts Pfeile
• Alles hinter der Raute (#) sind Kommentare und wird von R
nicht ausgewertet
• Ein Befehl wird durch ein Semikolon oder durch einen
Zeilenumbruch abgeschlossen
• Ein Befehl darf über mehrere Zeilen gehen
• Dezimalstellen sind Punkte, keine Kommas. Kommas haben
eine andere Funktion
21
24. Code : Zuweisungen
### Der Zuweisungsoperator ###
a <- 2 + 2! ! !
# Zuweisungsoperator kleiner-Zeichen
!
# plus minus-Zeichen
a <- b <- 2 + 2! !
# möglich aber unschön!
a! ! ! ! !
# Variable a enthält nun Wert
2 + 2 -> a! ! !
# so rum geht es auch, sollte aber
!
# nicht verwendet werden
a = 2 + 2!! !
# Zuweisung wird aber klarer durch
!
# Richtungsangabe des Pfeils
a <- 100! ! !
# keine Warnung, wenn eine Variable
!
# übergespeichert wird
a * 10
a <- "Ich bin der Inhalt"! Variablen sind nicht typensicher,
#
! d.h. sie können Zahlen, Buchstaben
#
! etc. enthalten
#
a * 10!! ! ! Fehler, da Zeichen mal Zahl
#
23
25. Objektbezeichnungen I
• Variablen- / Objektbenennung: können alphanumerisch sein
sowie, Punkte und Unterstriche enthalten
object1 <- 10
object1.1 <- “hallo“
object1_1 <- 10
• Darf keine Operatoren enthalten (+, - *, / etc.)
object-1 <- “hallo“
• Objektname darf nicht mit Zahl beginnen bzw. Punkt
24
26. Objektbezeichnungen II
• Objektname darf nicht mit Zahl beginnen bzw. Punkt
gefolgt von einer Zahl
1object <- 10
.1object <- “hallo“
• Groß- und Kleinschreibung wird unterschieden (Nutzung
zum Strukturieren von Objektnamen)
myObject <- 10
myobject <- 11
25
29. Code : Logik II
# logisches ODER
TRUE | TRUE! ! # TRUE
TRUE | FALSE
FALSE | TRUE
FALSE | FALSE
# Kurzformen
T !! ! ! ! # Kurzform von TRUE
F! ! ! ! ! # Kurzform von FALSE
T | F
T & T
28
30. Funktionen I
Funktion (lat. functio = Tätigkeit,Verrichtung)
z.B.:
c() steht für concatenate (verbinden, verketten)
> a <- c(1,2,3)
> a
[1] 1 2 3
rnorm() für random normal distribution
> rnorm(4)
[1] -0.3628728 -0.4580532 -1.3729865 -1.5834625
29
31. Funktionen II
Die Angaben innerhalb einer Klammer von
Funktionen heißen Argumente.
> rnorm(4)
[1] -0.3628728 -0.4580532 -1.3729865 -1.5834625
Jede Funktion hat ein definiertes Set an Argumenten,
die sie verarbeiten kann (s. Dokumentation)
> ?rnorm
Um sich alle möglichen Argumente anzeigen zu lassen
> args(rnorm)
30
32. Funktionen III
Jede Funktion gibt ein Objekt zurück
> c(1,2,3)
[1] 1 2 3
Ggf. kann dies auch unsichtbar geschehen
v <- rnorm(100)
hist(v)
a <- hist(v) # Rückgabe der Funktion speichern
a
Falls eine Funktion nichts spezifisches zurückgibt,
gibt sie ein NULL Objekt (leer) zurück
a <- plot(1:10)
a
31
33. “Nurse, get on the internet, go to SURGERY.COM,
scroll down and click on the ,‘Are you totally lost?‘
icon.“
32
34. Hilfe!
Die allerwichtigste Funktion!
### HELP R ###
help.start()!! ! # Hilfe aufrufen. Auch über das
# Menü möglich
?mean! ! ! ! ! # Hilfe zur Funktion "mean"
help(mean)! ! # identisch! !
help("mean")!! # identisch! !
33
35. R-help = an R-user best friend !
R-help
Leer
34
36. Code : Vorgriff Datentyp Vektor
# Vorgriff auf Datentyp Vektoren (mehr später)
c()! ! !
! ! ! # concatenate (deu. "verbinden")
?c
c(1,2,3)! ! ! ! # numerischer Vektor
! ! ! ! ! ! # Zahl am Anfang des Outputs gibt
# Nr. des Elements
a <- c(1,2,3)! ! # Speichern in einer Variablen
c(a,a)!
! ! ! ! # Verknüpfen von zwei Variablen
c(1,2,a)! ! ! ! # Verknüpfen von Zahlen und Variablen
b <- c(1,2,a,c(1,1))! # flexible Verknüpfungen sind möglich
d <- c(eins=1, zwei=3)! named vector, die Elemente haben Namen
#
35
37. Code : Sequenzen
# Vektorsequenzen erzeugen
?seq
seq(from=1, to=5)! ! # Sequenz von 1 bis 5
seq(from=1, to=5, by=.5) # von 1 bis 5 in Schritten von 0.5
seq(1,20)!! ! ! # von eins bis 20
1:20 ! ! ! ! ! # Kurzschreibweise
10:20! ! ! ! ! # von 10 bsi 20
(-10):10! ! ! ! # von -10 bis 10
?rep
rep(x=1, times=10)
rep(x=c(1,2), times=10)
rep(x=c(1,2), times=c(3,5))
rep(x=c(1,2), each=2)
rep(x=c(1,2), each=2, times=10)
rep(x=c(1,2), each=2, length=8)
36
40. Remembe
he r:
lp.star
t()
Your turn!
1.
Erzeuge einen zufälligen Vektor mit der Länge 10
(Tip: benutze die Funktion rnorm())
2.
Berechne den Mittelwert mit Hilfe der Funktionen
sum() und length()
3.! Berechne den Mittelwert noch einmal mit der Funktion
mean()
39
41. Code : Konstanten
# in R eingebaute Konstanten
LETTERS! ! ! # Großbuchstaben von A bis Z
letters! ! ! # Kleinbuchstaben von a bis z
month.name! ! # englische Monatsnamen
month.abb!! ! # englische Monatsnamen abgekürzt
pi! ! ! ! ! # die Zahl Pi
40
43. Your turn!
Erzeuge folgende Ausgabe in der Konsole, indem
Du paste() und die Konstante month.name nutzt.
"January is month number 1" "February is month number 2"
"March is month number 3" "April is month number 4"
"May is month number 5" "June is month number 6"
"July is month number 7" "August is month number 8"
"September is month number 9" "October is month number 10"
"November is month number 11" "December is month number 12"
42
44. Code : vectorwise
# Vektorwertiges Arbeiten
a <- 1:3
b <- 3:1
a - b! ! ! ! ! ! # Vektorweise Substraktion
a * b! ! ! ! ! ! # Vektorweise Multiplikation
c(1,2,3,4) - c(1,2)!
! ! # Was kommt da raus?
x <- c(4.1, 5.0, 6.35) * 2! ! # Multiplikation für
!# jedes Element
x + 5:7! ! ! ! ! ! # Addition für jedes Element
3:5 - 1:6!! ! ! ! ! # Recycling
3:5 - 2:3!! ! ! ! ! # Recycling mit Warnung
43
45. Code : Zugriff
# Zugriff auf Elemente eines Vektors
b <- c(1,2,3,4,5)! ! ! # numerischer Vektor
b[1]! ! ! ! ! ! ! # erstes Element
b[c(1,2,3)]! ! ! ! ! # Elemente 1,2,3
b[1:3]!
! ! ! ! ! ! # Elemente 1,2,3
44
46. Editoren nutzen
R Editor
Mac OS Textmate Windows Tinn-R
Datei wird als .R Datei gespeichert und kann so
immer wieder genutzt werden
45
47. Code : Anwendung BMI I
### BMI BEISPIEL FÜR INTERAKTIVE NUTZUNG ###
68/1.70^2 !! ! ! ! ! # Body Mass Index.
myBmi <- 68/1.70^2! ! ! ! # Wert in ein Objekt speichern
myBmi
weight <- c(68, 50, 88, 73)! # Vektor mit Gewichtsdaten
weight
height <- c(1.70, 1.63, 1.90, 1.78) # Vektor mit Größen in m
height
68 / 1.70^2! ! ! ! ! ! ! # BMI für die erste Person
weight[1]/height[1]^2! ! ! ! # BMI für die erste Person
# Wie berechne ich nun den BMI für alle?
bmi <- weight/height^2!
! ! ! # vektorwertig, intuitiv?
46
49. Code : Anwendung BMI III
(bmi[1] – mean.bmi)^2 + (bmi[2] – mean.bmi)^2 +
(bmi[3] – mean.bmi)^2 + (bmi[4] – mean.bmi)^2! # SSQ
(bmi - c(mean.bmi, mean.bmi, mean.bmi, mean.bmi))^2
# wie kann ich es einfacher schreiben ?
bmi2 <- (bmi – mean.bmi)^2! ! # mit recycling!!
bmi2.sum <- sum(bmi2)! ! ! ! # SSQ
n <- 4!
! ! ! ! ! ! ! ! # Anzahl Werte
sd.bmi <- sqrt(bmi2.sum / n-1)! # Wurzel aus SSQ geteilt
# durch n-1
n <- length(bmi)! ! ! ! ! # Anzahl Werte berechnen
sd.bmi <- sqrt(sum(bmi – mean.bmi)^2)/n-1)
sd(bmi)! ! ! ! # so ist es natürlich viel einfacher
48
50. Take along!
Selbst wenn etwas nicht in R
nicht existiert, kann man es sich
selber programmieren!
49
51. Your turn!
Berechne die geschätzte Kovarianz für folgende
zwei Datenreihen in R „zu Fuß“
x <- c(-2,-1,-1,0,1,1,2)
y <- c(-1,-2,1,0,2,-1,1)
50
52. Code : Navigieren
# Projektordner anlegen /RCourse
# Navigieren in Verzeichnissen
getwd() !! ! ! ! # Unterschied Slash/Backslash Windows
setwd() ! ! ! ! ! # Arbeitsverzeichnis setzen
setwd("/Users/markheckmann/")
!! # in Verzeichnis RCourse wechseln
setwd("..") ! ! ! ! # ein Verzeichnis runter
setwd("markheckmann")! ! # ein Verzeichnis hoch
setwd("../markheckmann")! # eins runter und wieder eins hoch
51
53. Your turn!
Lege ein Verzeichnis RCourse an (nicht über R) und setze es als neues
Arbeitsverzeichnis in R. Lege einen Unterordner data an und wechsele
in ihn. Wechsel anschließend wieder in den übergeordneten Ordner.
52
54. Code : Arbeitsbereich sichern /
laden
### Workspace speichern ###
?save.image()
save.image("erster Kurstag.RData")! # Arbeitsbereich speichern
ls()! ! ! ! ! ! # Alle Objekte im Arbeitsbereich
!
# anzeigen
rm()! ! ! ! ! ! # Objekte aus Arbeitsbereich löschen
rm(list=ls)! ! ! ! # Alle Objekte aus Arbeitsbereich löschen
load("erster Kurstag.RData")!! # den zuvor gespeicherten
! # Arbeitsbereich laden
ls()! ! ! ! ! ! ! ! ! # Objekte sind wieder da
53
55. Code : Vektoren I
### vector – eindimensionales Datenobjekt ###
a <- c(T, F, T, F)! ! ! ! # logischer Vektor
a <- c(1,2,3,4,5)! ! ! ! # numerischer Vektor
a <- c("A", "B", "C")! ! ! # character Vektor
c(TRUE, 2, FALSE)! ! ! ! # innerhalb eines Vektors stets
# nur ein Typ möglich
c(T, "A", 1)!! ! ! ! # Automatische Umwandlung auf
# niedrigstes mögliches Datenniveau
54
56. Code : Vektoren II
# Zugriff auf eine Elemente durch eckige Klammern
a[1]! ! ! ! # Zugriff auf erstes Element des Vektors
a[c(1,2)]!! ! # Zugriff auf die ersten beiden Elemente
a[c(2,1)]! !
! # umgekehret Reihenfolge
a[c(T,F,F)]! ! # Zugriff durch TRUE/FALSE Vektor
a[c(T,F)]!! ! # Wieso 2 Elemente?
b <- c(a=1, b=2, c=3)! # Erstellen eines "named" vectors
names(b)! ! ! ! !# Namen der Vektorelemente anzeigen
b["c"]!
! ! ! ! !# Zugriff nun auch über den Namen des
!# Elements möglich
a[-1]! ! ! ! ! # negatives Indizieren
a[c(-1,-2)]! ! ! ! # negatives Indizieren
55
57. Code : Vektoren III
x <- c(NA, 1, 2, NA, 99)! # Vektor mit missing values (NA)
x == 1!! ! ! ! ! ! welcher Eintrag ist gleich 1
#
x > 1! ! ! ! ! ! ! welche Einträge sind größer 1
#
x == NA! ! ! ! ! ! welcher ist NA? so falsch
#
is.na(x)! ! ! ! ! ! Funktion is.na() nutzen
#
which(is.na(x))!! ! ! Einträge mit welchem Indizes sind NA?
#
x[!is.na(x)]!! ! ! ! # Einträge auswählen, die nicht NA sind
x[x==99] <- NA! ! ! ! Einträge der Zahl 99 mit NA
#
! ! ! ! ! ! ! ! # überschreiben
56
58. Your Turn!
Oftmals wird 99 oder 999 als Platzhalter für missing values
benutzt. Ersetze alle Werte des Vektors, die 99 oder 999
sind mit NA.
x <- c(1,4,3,99,4,3,999,99,3,6,999)
57
59. Your Turn!
v <- 1:10
Setze alle Elemente des Vektors v, die kleiner gleich 3 sind
auf 0, alle die zwischen 4 und 7 sind auf 1 und alle größer
sieben auf NA.
[1] 0 0 0 1 1 1 1 NA NA NA
58
61. Your Turn!
Erzeuge eine Matrix M mit 20 Spalten und den folgenden
Zeileneinträgen:
Zeile 1: 1, 2, ..., 20
Zeile 2: Zahlen zwischen 2 und 40 mit Abstand 2
Zeile 3: Spalte 1-10 mit Eintrag 1, Spalte 11-20 mit Eintrag 2
Zeile 4: 1,1,2,2,1,1,2,2,...
Zeile 5: 1,1,2,2,3,3,4,4,4,4,5,5,5,5,6,6,6,6,6,6
Zeile 6: 1,2,2,2,3,3,3,3,3,3,1,2,2,2,3,3,3,3,3,3
60
Quelle: Foliensatz von Peter Ruckdeschel / Matthias Kohl. R/S-plus für Einsteiger und Fortgeschrittene
62. Code : Matrix II
# auf Matrixelemente zugreifen
x[1,1]!
! ! ! ! # Element erste Zeile, erste Spalte
x[ ,1]!
! ! ! ! # komplette erste Spalte
x[ ,1:2]! ! ! ! # komplette erste und zweite Spalte
x[1, ]!
! ! ! ! # komplette erste Zeile
x[1:2, 2:3]! ! ! # erste & zweite Zeile, zweite & dritte
# Spalte
x[c(1,3), c(2,4)]
x[-1, -2]!! ! ! # negatives Indizieren; ohne Zeile 1
# und Spalte 2
x > 5! ! ! ! ! # welche Elemente sind größer 5
is.na(x)! ! ! ! # Welche Einträge der Matrix sind NA?
61
63. Code : Matrix III
# Matrixelemente verändern
x[1,1] <- 10!! ! # Zahl zu einer Zelle zuweisen
x[ ,1] <- 10!! ! # Zahl zu Spalte zuweisen mit
# Recycling
x[1, ] <- 10!! ! # Zahl zu Zeile zuweisen
x[1, 2:3] <- c(100,100)! # Zwei Zellen verändern
62
64. Code : Matrix IV
# Zeilen und Spaltennamen hinzufügen
colnames(x)! ! ! ! # Spaltennamen anzeigen
rownames(x)! ! ! ! # Zeilennamen anzeigen
colnames(x) <- c("Winter", "Frühling", "Herbst", "Winter")!
# Spaltennamen setzen
rownames(x) <- c("A", "B", "C")! # Zeilennamen setzen
x[, "Winter"]! ! ! ! ! # Zugriff über Namen
x[, c("Winter", "Frühling")]!
x[, c(1, "Winter")]! ! !
! # geht nicht, da 1 in einem
# String konvertiert wird!
rownames(x) <- NULL # Zeilennamen löschen
colnames(m)! ! ! ! ! # Spaltennamen
colnames(m)[4]! ! ! ! # Viertes Element
colnames(m)[4] <- "April"! Viertes Element verändern
#
m 63
66. Code : Matrix V
# Reihenfolge der Spalten der Matrix ändern
m[, c(1,3,5,7,9,11,2,4,6,8,10,12)]! !
index <- c(1,3,5,7,9,11,2,4,6,8,10,12)
m[, index]
m[, c(12:1)]
65
67. Code : Matrix VI
# Matrizen verbinden
cbind ! ! ! # verbinden der Spalten (gleiche Zeilenanzahl
# nötig)
cbind(m, m)! # m mit m verbinden!
! !
cbind(m[1:3, 1:3], m[1:3, 9:12])!
cbind(m[1:2, 1:3], m[1:4, 1:3])!! # Ungleiche Zeilenanzahl
rbind # verbinden der Zeilen (gleiche
# Spaltenanzahl nötig)
rbind(m, m)! ! ! ! ! # m zweimal untereinander
rbind(m[1:3, 1:3], m[18:20, 1:3])! # Oberen und unteren
# Teil von m verbinden
rbind(m[1:3, 1:3], m[18:20, 3:5])! # Achtung Spaltennamen der
# ersten Matrix werden genutzt
66
68. Your Turn!
1) Erzeuge eine Matrix M mit 7 Spalten und 7 Zeilen aus
zufälligen NV-Werten, die auf eine Stelle gerundet werden.
2) Die Zellen sollen nun durch 999 ersetzt werden:
(Zeile, Spalte) (1,1) (4,3) (4,4) (1,7)
3) Alle Einträge die 999 enthalten sollen NA gesetzt werden.
67
Quelle: Foliensatz von Peter Ruckdeschel / Matthias Kohl. R/S-plus für Einsteiger und Fortgeschrittene
73. Monty-Hall-Dilemma
Angenommen Sie befinden sich in einer Spielshow und haben die Wahl
zwischen drei Toren. Hinter einem Tor ist ein Auto, hinter den anderen sind
Ziegen. Das Auto und die Ziegen sind vor der Show zufällig hinter die Tore
verteilt worden. Die Regeln der Spielshow sind folgende: Nachdem Sie ein
Tor gewählt haben bleibt dieses zunächst geschlossen. Der Showmaster
Monty Hall, der weiß was sich hinter den Toren befindet, muss nun eine
der beiden verbleibenden Tore öffnen, und hinter dem von ihm geöffneten
Tor muss sich eine Ziege befinden.Wenn hinter beiden verbleibenden
Toren jeweils eine Ziege steht, öffnet er eines der beiden Tore zufällig.
Nachdem Monty Hall ein Tor mit einer Ziege geöffnet hat fragt er Sie, ob
Sie bei Ihrer ersten Wahl bleiben oder zum letzten verbleibenden Tor
wechseln möchten. Nehmen Sie an Sie wählen Tor 1 und der Showmaster
öffnet Tor 3 mit einer Ziege. Er fragt Sie dann: „Möchten Sie zu Tor 2
wechseln?“ Ist es zu Ihrem Vorteil, Ihre Wahl zu ändern?
72
74. Code : Matrix VII
### Rechnen mit Matrizen
A <- matrix(c(1,3,2,5,2,3,1,2,3), ncol=3)
A
t(A)! ! ! ! ! # transponieren einer Matrix
A + A! ! ! ! ! # Zellenweise Addition
A * 4! ! ! ! ! # Jede Zelle mal vier
A * A! ! ! ! ! # Zellenweise Multiplikation
A^2!
A %*% A! ! ! ! # Matrixmultiplikation
Ainv <- solve(A)! # Inverse einer quadratischen Matrix
A %*% Ainv! ! ! # Inverse Mal Matrix = Einheitsmatrix
Ainv %*% A! !
A %*% solve(A)
rbind(A, A)! ! ! ! # Zeilen verbinden
cbind(A, A)! ! ! ! # Spalten verbinden
cbind(A, rep(1,3))! ! # eine Spalte anhängen
rbind(A, A) %*% cbind(A, A)! # Beispiel
73
77. Your turn!
Berechne den Vektor b der Regression y
regrediert auf x in Matrizenform
x <- c(-2,-1,-1,0,1,1,2)
y <- c(-1,-2,1,0,2,-1,1)
Beachte: die Designmatrix X enthält
eine Spalte mit Einsen für die Konstante!
Zur Kontrolle:
m <- lm(y ~ x)
summary(m) 75
78. Code: Faktoren
### factors - für qualitativ unterschiedliche Merkmale
val <- c(1,2,1,1,1,2,3,3)! ! ! ! # neuer Vektor
f <- factor(val)
f
g <- factor(val, levels=1:5)! ! ! # factor erzeugen mit
g ! # Levels 1 bis 5
levels(f)! ! ! ! ! ! ! # Bezeichnung der Levels
levels(f) <- c("Treatment 1", "Treatment 2", "Control")
f !! # Neue Level Bezeichnungen
factor(c("male", "female", "male", "male")
# Umwandeln eines vector in factor
x <- c(1,1,2,2,3,3)! ! ! # neuer Vektor
x <- as.factor(x)!
! ! ! # umwandeln in factor
x
levels(x)! ! ! ! ! ! Bezeichnung der Levels
#
levels(x) <- c("Treatment 1", "Treatment 2", "Control")
! # Neue Level Bezeichnungen 76
79. Your turn!
Erzeuge einen factor der folgenden Form:
[1] Gruppe 4 Gruppe 4 Gruppe 4 Gruppe 4
Gruppe 3 Gruppe 3 Gruppe 3 Gruppe 2 Gruppe 2
Gruppe 1
Levels: Gruppe 1 Gruppe 2 Gruppe 3 Gruppe 4
77
80. Code: data frames I
data frames
In Matrizen müssen alle Einträge vom selben Typ sein. Z. B. alles numerisch oder
alles characters. data frames können pro Spalte unterschiedliche Typen enthalten
(Faktoren, numerische Werte, Zeichenketten). Sie müssen jedoch stets dieselbe
Anzahl von Einträgen pro Spalte aufweisen.
treat <- c(20, 21, 23, 18, 30)
control <- c(19, 21, 20, 23, 18)
d <- data.frame(treat, control)
d$treat! ! ! ! ! ! ! # Zugriff mit Dollaroperator
d[["treat"]]!! ! ! ! # gibt Vektor zurück
d[,1]
d[[1]]
78
81. Code: data frames II
### Zugriff auf Elemente eines data frames
d["treat"]! ! ! ! # gibt data frame zurück
d[1]
d[1:3, ]! ! ! ! ! # Zeilen 1 bis 3, alle Spalten
d[1:3, 1:2]! ! ! ! # Zeilen 1 bis 3, Spalten 1 und 2
d[1:3, c("treat", "control")]! # identisch
d[-1,]!
! ! ! ! ! # ohne erste Zeile
d[-(1:2), -1]! ! ohne erste beiden Zeilen, ohne
#
! erste Spalte
#
### Erweiterung des data frames um einen factor
f <- factor(c("m", "m", "w", "w", "w"))
data.frame(Geschlecht= f, treat, control)
79
82. Your turn!
konstruiere folgenden data frame:
(IQ normalverteilt um 100 mit sd=15; BMI normalverteilt um 20, sd=5)
Geschlecht Intervention IQ BMI
1 m Control 94.8 22.5
2 m Treat 113.1 19.6
3 m Placebo 107.1 24.3
4 m Control 108.8 9.2
5 m Treat 102.4 24.5
6 m Placebo 104.8 23.0
7 m Control 90.6 17.9
8 m Treat 102.9 18.0
9 m Placebo 105.4 17.7
10 m Control 105.4 14.4
11 w Treat 107.9 16.0
12 w Placebo 108.8 18.9
13 w Control 93.7 19.5
14 w Treat 113.8 19.4
15 w Placebo 70.7 16.4
16 w Control 79.1 21.8
17 w Treat 116.5 22.3
18 w Placebo 106.3 19.2
19 w Control 133.6 20.4
20 w Treat 79.2 23.3 80
83. Code: Subsets I
### data frames subsetting
d[4]! ! ! ! ! ! # Auswahl der vierten Spalte
d[1:3]!! ! ! ! ! # Spalten 1 bis 3
d[c("Geschlecht", "IQ")]! # Nur Geschlecht und IQ
d[-1]! ! ! ! ! ! # alle Spalten bis auf erste
d[c(T,F,T,F)]! ! ! ! # Jede zweite Spalte
d[c(T, F)]! ! ! ! ! # Jede zweite Spalte
d[c(F, T)]! ! ! ! ! # Jede zweite Spalte
d["IQ"] > 107! ! ! ! # Welche IQ Werte sind > 107
index <- d["IQ"] > 107!! # in Index speichern
d[index, ]! ! ! ! ! # Zeilen auswählen mit IQ > 107
cbind(d, d$IQ > 107 )! ! # Spalte anfügen, die zeigt, ob
# IQ Werte größer 107 sind
81
84. Your turn!
Baue den vorher erzeugten Datensatz um: a) erst die
ungeraden, dann die geraden Zeilen b) neue Spaltenreihenfolge
IQ BMI Geschlecht Intervention
1 109.9 18.9 m Control
3 101.2 18.7 m Placebo
5 111.4 14.7 m Treat
7 104.6 17.3 m Control
9 103.7 24.9 m Placebo
11 97.1 16.0 w Treat
13 89.7 28.7 w Control
15 103.2 20.5 w Placebo
17 86.6 29.4 w Treat
19 89.6 28.3 w Control
2 109.1 18.7 m Treat
4 110.1 18.0 m Control
6 110.3 22.2 m Placebo
8 123.5 23.2 m Treat
10 107.6 17.8 m Control
12 104.2 20.1 w Placebo
14 69.2 21.1 w Treat
16 96.9 31.0 w Control
18 103.9 14.5 w Placebo
20 96.4 17.5 w Treat 82
85. Code: Subsets II
names(d)! ! ! ! ! # Spaltennamen des Datensatzes
names(d)=="IQ"! ! ! # welche Namen sind gleich "IQ"
d[names(d)=="IQ"]! ! # subsetting mit logischem Vektor
names(d)!="IQ"! ! ! # welche Namen sind nicht "IQ"?
d[names(d)!="IQ"]! ! # Spalten, die nicht "IQ" sind auswählen
d[ ,names(d)!="IQ"]!
! # Identisch
index <- d$IQ > 100 & d$Geschlecht=="m"
! # welche Fälle sind Männer mit einem IQ > 100
d[index, ]! ! # auswählen
d[d$Intervention=="Control" | d$Intervention=="Treat",]! !
! # Intervention ist Control oder Treat
d[d$Intervention %in% c("Control", "Treat"),]! ! ! !
! # alternative Schreibweise
83
86. Your turn!
Wähle aus dem Datensatz alle Fälle aus, die weiblich sind
und zur Treatmentgruppe gehören
Geschlecht Intervention IQ BMI
11 w Treat 123.8 21.5
14 w Treat 96.3 28.5
17 w Treat 104.3 20.4
20 w Treat 94.8 14.5
84
87. Your turn!
Wähle aus dem data frame jene Fälle aus, die einen IQ innerhalb des
Bereichs 90-110 haben und zugleich Männer sind
Geschlecht Intervention IQ BMI
1 m Control 109.9 18.9
2 m Treat 109.1 18.7
4 m Control 110.1 18.0
5 m Treat 111.4 14.7
6 m Placebo 110.3 22.2
8 m Treat 123.5 23.2
10 m Control 107.6 17.8
85
89. Your turn!
Wähle aus dem Datensatz mit subset alle Fälle aus, die einen IQ
größer als der Durchschnitt haben, der berechnet wird.
Geschlecht Intervention IQ BMI
1 m Control 102.5 16.7
2 m Treat 102.3 18.9
3 m Placebo 101.8 18.2
5 m Treat 106.7 21.0
10 m Control 118.9 15.7
11 w Treat 123.8 21.5
12 w Placebo 104.8 24.4
13 w Control 105.7 13.1
15 w Placebo 100.7 19.2
17 w Treat 104.3 20.4
19 w Control 105.0 10.8
87
90. Your turn!
Wähle aus dem Datensatz mit subset alle Fälle aus, die a) einen IQ
außerhalb des Intervalls [90-110] haben.
Geschlecht Intervention IQ BMI
6 m Placebo 84.5 22.2
7 m Control 80.7 13.8
10 m Control 118.9 15.7
11 w Treat 123.8 21.5
16 w Control 78.9 25.6
... und b) zugleich weiblich sind
Geschlecht Intervention IQ BMI
11 w Treat 123.8 21.5
16 w Control 78.9 25.6
88
91. packages laden
Die R-base Installation enthält sog.
My Computer packages, in denen bestimmte
Funktionen enthalten sind.
packages müssen erst geladen
werden, bevor die in ihnen enthaltenen
Funktionen benutzt werden können.
R-Base installation Einige packages werden automatisch
basic packages geladen, andere müssen nach Bedarf
geladen werden.
> library(package.name)
89
92. packages installieren
CRAN server
>1500 additional on
de
packages man
d My Computer
Installation per Kommandozeile
> install.packages("package.name")
R-Base installation
oder per R-Konsolenmenü basic packages
90
96. Your turn!
Lies den Datensatz wow_excerpt.csv ein und
speichere ihn in der Variablen df
94
97. Code: attach data
# Objekte/Datensätze in den Suchpfad hängen
K1! ! ! ! ! ! # Objekt unbekannt
attach(wow)! ! ! # Datensätze in den Suchpfad hängen
K1! ! ! ! ! ! # Objekt nun im Suchpfad
detach(anscombe)! # Datensatz aus Suchpfad entfernen
K1! ! ! ! ! ! # Objekt wieder unbekannt
search() # packages im Suchpfad
95
98. Datensatz wow_excerpt.csv
Geschlecht 1=keine Angabe , 2=männlich, 3=weiblich
Alter 1=keine Angabe, 2=unter 18, 3=18-29, 4=30-40, 5=41-50 , 6=über 50
1=keine Angabe, 2=weniger als 7 Stunden, 3=weniger als 14 Stunden
Zeitaufwand (pro Woche) 4=weniger als 20 Stunden, 5=20-30 Stunden, 6=30-40 Stunden, 7=mehr
als 40 Stunden
K1 Kontrollverlust: Ich sage mir oft: „Nur noch ein paar Minuten“ und kann
dann doch nicht aufhören
K2
K3
K4
Entzugserscheinungen: Ich beschäftige mich auch während der Zeit, in
E1
der ich nicht WoW spiele, gedanklich sehr viel mit dem Spiel.
E2
E3
E4
T1 Toleranzentwicklung: Mittlerweile verbringe ich mehr Zeit bei WoW als
zu Beginn meiner Online- Aktivitäten.
T2
T3
T4
AL1 Arbeit/Leistung: Meine Leistungen in der Schule/im Beruf leiden unter
dem Spielen bei WoW.
Al2
AL3
Al4
nKsB1 Soziale Beziehungen: Seitdem ich WoW spiele, haben sich einige
Freunde von mir zurückgezogen.
nKsB2
nKsB3 96
nKsB4
99. EDA - die Daten anschauen
### Anschauen der WoW Daten ###
head(wow)!! ! ! # die ersten Zeilen
names(wow)! ! ! # Variablennamen
library(psych)! ! # library psych laden
describe(wow)! ! # Überblick über Datensatz
library(Hmisc)
hist.data.frame(wow[1:9])!! # Histogramme der
! ! ! ! ! ! ! ! ! # ersten neuen Variablen
hist.data.frame(wow[10:17])! # Histogramme
hist.data.frame(wow[18:23])! # Histogramme
multi.hist(wow[1:9])! ! ! # aus psych
pairs(attitude)
pairs.panels(attitude)!
! ! # aus psych
pairs.panels(attitude, lm=TRUE)!
97
100. Your turn!
Lies den Datensatz wow_excerpt.csv ein und
speichere ihn in der Variablen df
Hänge df dann in den Suchpfad, so dass man auf die
Variablen ohne Angabe des Datensatzes zugreifen kann.
Entferne den Datensatz dann wieder aus dem Suchpfad.
Installiere und lade dann das psych package und
die nutze die darin enthaltene Funktion describe(),
um einen ersten Eindruck von den Daten zu
bekommen. Danach „entlade“ das package psych.
98
101. Code: Deskriptive Statistiken
### Deskriptive Statistiken ###
summary(wow)!! ! # summaries der Variablen
attach(wow)! ! ! ! # in den Suchpfad hängen
library(psych)! ! ! # psych laden
describe(wow)! ! ! # Basisstatisiken der Variablen
describe.by(wow[4:11], Geschlecht)! !
# Basisstatisiken pro Faktorstufe von Geschlecht
describe.by(wow[4:11], list(Geschlecht, Alter))
# Basisstatisiken pro Faktorstufe von Geschlecht
# und Alter
detach(wow)! ! ! ! # Aus dem Suchpfad entfernen
99
102. crosstabs I
### Häufigkeiten ###
# One Way Table
attach(wow)
table(Alter)!! # Häufigkeitstabelle von Alter
# Two Way Table
mytable <- table(Geschlecht, Alter)! # Häufigkeitstabelle
mytable
ftable(mytable)!! ! ! # ftable zur schöneren Darstellung
prop.table(mytable) ! ! # Zellen Prozente
prop.table(mytable, 1) ! ! # Zeilen Prozente
prop.table(mytable, 2) ! ! # Spalten Prozente
100
103. crosstabs II
# Three Way Tables
mt <- table(Geschlecht, Alter, Zeitwaufwand)
ftable(mt)
# Tables mit CrossTable
library(gmodels)
CrossTable(Geschlecht, Alter)
CrossTable(Geschlecht, Alter, format="SPSS")
101
104. Your turn!
Mache folgende Häufigkeitstabellen für den wow
Datensatz mit CrossTable:
1) Alter gegen Zeitaufwand
2) Geschlecht gegen Zeitaufwand
Lese danach den Datensatz ngo.csv ein und erstelle
a) Kreuztabelle für jahrgang vs. geschl
b) Erzeuge Histogramme und Scatterplots für die
Variablen mathe, englisch, deutsch
102
109. Your turn!
Lies den Datensatz wow_excerpt.csv ein und
durchlaufe die Schritte:
a) missings NA setzen
b) Alle qualitativen Merkmale in Faktoren umwandeln
und die Faktorstufen benennen
107
111. Beratungsgespräch I
Ein junger Mann ohne Risikofaktoren
kommt in die AIDS-Beratung und
informiert sich über die gängigen
HIV-Tests (ELIZA plus Western-Blot).
Der Arzt sagt: „Die beiden
kombinierten AIDS-Tests
entdecken mit 99,9%
Sicherheit das HI-Virus
(Sensitivität) und sind
sogar mit 99,99% spezifisch,
d.h. eine falsch positive Diagnose
kommt nur in 0,01% der Fälle vor.“ In
der Gruppe, zu der der junge Mann
gehört, ist HIV mit 0,01% Grundrate nur
wenig verbreitet. Der Test fällt positiv aus!
Wie wahrscheinlich ist es nun, dass der
Mann HIV hat? 109
112. Beratungsgespräch II
Von 100.000 Männern ohne Risikofaktoren
sind nur etwa 10 mit dem HI-Virus
infiziert (Grundrate). Die beiden
kombinierten AIDS-Tests
entdecken mit 99,9%
Sicherheit das AIDS-
Virus (Sensitivität),
d.h. würde man
diese hunderttausend
Männer testen, dann würden
10 von 10 HIV-Positiven einen po-
sitiven Befund bekommen. Von den
99.990 nicht-infizierten Männern fällt der
Test bei 0,01% dieser Personen, also bei un-
gefähr 10 Personen, falsch-positiv aus. Wie
wahrscheinlich ist eine HIV-Infektion, wenn
der Mann positiv testet?
110
113. Gigerenzer, G. (2008). Das Einmaleins der Skepsis: Über den richtigen
Umgang mit Zahlen und Risiken. Berlin: Berliner Taschenbuch-Verl.
111
114. Buchtips
Gigerenzer, G. (2008). Das Einmaleins der Dubben, H.-H., & Beck-Bornholdt, H.-P.
Skepsis: Über den richtigen Umgang mit (2006). Der Hund, der Eier legt: Erkennen von
Zahlen und Risiken. Berlin: Berliner Fehlinformation durch Querdenken. rororo,
Taschenbuch-Verl. 62196. Reinbek bei Hamburg: Rowohlt. 112
116. DAY 3
SPSS - das A
fehlt nicht umsonst
„und dann rechnen wir
mit dem Taschenrechner
weiter... !“
114
117. Variablen berechnen
# Neue Variablen berechnen
wow$KO <- (wow$K1 + wow$K2 + wow$K3 + wow$K4)/4!!
# Skala bilden über vier Werte K1-K4
?transform! ! ! # zur Berechnung von Variablen
wow <- transform(wow, KO=(K1 + K2 + K3 + K4)/4)!!
# neue Variable KO mit tranform
wow <- transform(wow, EN=(E1 + E2 + E3 + E4)/4)!!
# neue Variable EN
wow <- transform(wow, TO=(T1 + T2 + T3 + T4)/4)!!
# neue Variable TO
wow <- transform(wow, AL=(AL1 + AL2 + AL3 + AL4)/4)
# neue Variable AL
wow <- transform(wow, NK=(nKsB1 + nKsB2 + nKsB3 + nKsB4)/4)!
# neue Variable NK
115
118. Your turn!
Lies den Datensatz wow_excerpt.csv ein und
durchlaufe die Schritte:
c) Skala berechnen
d) einen Gesamtwert berechnen über die fünf Skalen
namens „score“, der der Durchschnitt der Skalen
KO, EN, TO, AL, NK ist.
116
120. Formulas I
### Formulas in R ###
Dienen der Beschreibung von statistischen Modellen
Sind wie kleine eigene Sprache
y ~ model!
Dabei trennt die Tilde1 ("~") die auf der linken Seite
angegebene Zielvariable (abhängige Variable, response) von
dem auf der rechten Seite angegebenen Rest des Modells
(model).
# Operatoren der Formelsprache
+! Hinzunahme einer Variablen
-! Herausnahme einer Variablen (-1 für Achsenabschnitt)
:! Wechselwirkung/Interaktion von Variablen
*! Hinzunahme von Variablen und deren Wechselwirkungen
.! alle Variablen aus dem Datensatz in das Modell aufnehmen
^ ! Interaktionen bis zur Ordnung i aufnehmen
118
121. Formulas II
y ~ x1 ! ! ! ! # Modell mit einem Regressor
y ~ x1 + 1 !! ! # identisch
y ~ x1 - 1 ! ! ! ! ein Regressor ohne Konstante
#
y ~ x1 + x2 ! # zwei Regressoren, keine Interaktion
y ~ x1 + x2 + x1:x2 ! # zwei Regressoren plus Interaktion
y ~ x1 * x2! ! ! ! # identisch
y ~ .! ! ! ! ! ! # alle Variablen aufnehmen
y ~ x1 + I(x1^2)! ! # quadratischer Term
119
123. Your turn!
IQ ist auf einen Mittelwert von100 mit einer
Standardabweichung von 15 normiert (Population).
Teste jeweils per z-Test, ob eine der Gruppen (gr) von
dem Populationsmittel abweicht.
121
132. Your turn!
Schaue in einer zweifaktoriellen Anova, ob sich die
Variable height über die Faktoren gr und
gender unterscheidet.
Gebe die Interaktionsplots aus.
130
138. Your turn!
Berechne für die Variablen iq und height eine lineare
Regression. Mache einen scatterplot mit
Konfidenzintervallen für die Mitten und die
Individuen.
Teste abschließend auf Linearität des Modells
136
140. Your turn!
Berechne für die Variablen iq eine Regression auf
height, gender und gr und mache sukzessiv
Vergleichstests mit den Modellen, wobei du mit
einem eifachen Modell beginnst und schrittweise
immer mehr Variablen aufnimmst, die einen
signifikanten Erklärungsbeitrag leisten.
138
149. Your turn!
a) Berechne eine Regression von iq auf gr mit
Gruppe 2 als Baseline.
b) Füge in das Modell eine Interaktion zwischen
gr und height hinzu
147
150. Code: Faktorenanalyse
### FAKTORENANALYSE ###
wow <- na.omit(wow)! !
! ! # Missings entfernen
names(wow)
scree(wow[4:23])! ! ! # Scree plot
fa.parallel(wow[1:20])!
! # Scree plot
fit <- factanal(wow[4:23], 6, rotation="varimax")
print(fit, digits=2, cut=.3, sort=FALSE)
library(psych)
fit <- fa(wow[4:23], 6)! # Alternative mit vielen Optionen
! ! ! ! ! ! ! ! # an Schätz- und Rotationsverfahren
print(fit, digits=2, cut=.3)
148
151. Your turn!
Lade die .csv Datei fa_daten.csv und mache mit ihr eine
Faktorenanalyse.
149
161. DAY 4
Great Graphics
DAY 4
Charles J. Minard. Verluste der französischen Armee im
159
Russlandfeldzug 1812-1813. Paris, 20. Nov. 1869
162. Minard‘s
plot made in R
Muenchen, R. (2009). R for SAS and SPSS users. New
York: Springer, p. 160
276.
163. Peter Aldhous, Haiti Earthquake in R
http://www.readwriteweb.com/hack/2011/01/how-a-science-journalist-creat.php 161
164. Peter Aldhous, Earthquakes in R
http://www.readwriteweb.com/hack/2011/01/how-a-science-journalist-creat.php 162
165. „It's not just a pretty picture, it's a reaffirmation of the
impact we have in connecting people, even across
oceans and borders“
Paul Butler, Dec 2010.Visualization of facebook
users‘ friendships between cities
http://www.facebook.com/note.php?note_id=469716398919 163
166. Hans Rosling‘s Gapminder
The Power of Visualization
Hans Rosling in action: http://www.youtube.com/
watch?v=hVimVzgtD6w164
167. Hans Rosling‘s Gapminder
The Power of Visualization
Freely av
ailable a
s the Goo
API “Mot gle Visua
ionchart lization
Can easil “
y be crea
ted via th
“googleV e R packa
is“ ge
Hans Rosling in action: http://www.youtube.com/
watch?v=hVimVzgtD6w164
168. Google MotionChart in R
library(googleVis)
> Fruits
Fruit Year Location Sales Expenses Profit Date
1 Apples 2008 West 98 78 20 2008-12-31
2 Apples 2009 West 111 79 32 2009-12-31
3 Apples 2010 West 89 76 13 2010-12-31
4 Oranges 2008 East 96 81 15 2008-12-31
5 Bananas 2008 East 85 76 9 2008-12-31
6 Oranges 2009 East 93 80 13 2009-12-31
7 Bananas 2009 East 94 78 16 2009-12-31
8 Oranges 2010 East 98 91 7 2010-12-31
9 Bananas 2010 East 81 71 10 2010-12-31
M1 <- gvisMotionChart(! Fruits, idvar="Fruit", timevar="Year")
M1! ! ! ! ! ! ! ! # HTML code
plot(M1)
165
173. Verfügbare Datensätze
### Daten zum experimentieren ###
# Viele Datensätze sind bereits in R vorhanden
data()!
! ! ! # zeigt an welche Datensätze existieren
# Laden weiterer Datensätze:
library(datasets)! ! # laden des Pakets datasets
# Wie auch Funktionen sind Datensätze dokumentiert.
# Die Doku kann wie folgt aufgerifen werden.
?name_des_datensatzes
169
175. Grafiken II
?boxplot! ! ! ! ! !
boxplot(price ~ clarity)! ! ! # price über clarity
?pairs!
! ! ! ! ! !! # Viele Scatterplots
pairs(wow[c( "KO","EN","TO",!! ! # Auswahl einiger
! ! ! ! "AL","NK","score")])! # Scatterplots
?barplot! ! ! ! ! !# Barchart
barplot(1:10)! ! ! ! ! ! # mit einem Vektor
barplot(matrix(1:9,3))!
! ! ! # mit einer Matrix
barplot(table(Geschlecht, ! ! # mit eine table Objekt
! ! ! ! Zeitaufwand))
barplot(table(color, cut))! ! # mit table Objekt
171
176. Grafiken III
?coplot! ! # condition plot: scatterplots konditioniert
! ! # nach einer oder mehreren Variablen
! ! ! !
coplot(lat ~ long | depth, data = quakes)
coplot(lat ~ long | depth * mag, data = quakes)
?dotchart!! ! ! !
dotchart(VADeaths)
?stripchart! ! !
stripchart(decrease ~ treatment, data = OrchardSprays)
stripchart(score ~ Zeitaufwand, data = wow)
172
177. Your turn!
Erzeuge einen conditioned plot (coplot) von score
(y-Achse) gegen KO (x-Achse) konditioniert mit dem
Faktor Zeitaufwand.
Mache dann einen weiteren Plot mit den beiden
konditionalen Faktoren Zeitaufwand und Geschlecht.
173
178. Your turn!
Erzeuge einen dotchart und ein barplot auf dem jeweils
Geschlecht gegen Alter zu sehen ist. Nutze hierzu die
table() Funktion zur Vorbereitung der Daten.
174
181. Grafikbeispiel
#### iris dataset #######
?iris
hist(iris)! ! ! ! ! ! ! # Histogramme
pairs(iris[1:4])! ! ! ! ! # Vier Histogramme
pairs(iris[1:4], pch=21) # Symbol ändern
pairs(iris[1:4], pch=21, !! ! # Farben pro Spezie
! ! col=iris$Species)
# andere Farben pro Spezie
col <- c("red", "green3", "blue")[iris$Species]
# Farbvektor zuweisen
pairs(iris[1:4], pch=21, col=col)
177
182. Your turn!
Erzeuge folgendes barchart mit der Funktion barplot()
Altersverteilung
unter 18
18−29
30−40
41−50
über 50
w
Geschlecht
m
0 50 100 150 200 250 300
Anzahl an Personen
178
183. base graphics I
### Einführung ins base Grafik System ###
# grafische Basiselemente
?plot! ! ! ! ! ! ! ! welche Optionen gibt es?
#
dev.new()!! ! ! ! ! ! # neues Fenster öffnen
set.seed(5)! ! ! ! ! ! # Ausgangspunkt für Zufallszahl
iq <- rnorm(30, 100, 15)! !
pisa <- iq*.5+10 + rnorm(30,0,1) # pisa aus iq plus Zufall
plot(iq, pisa)! ! ! ! !
# plotten von x gegen y
plot(iq, pisa, pch=2)! ! ! # Ändern des Characters
plot(iq, pisa, pch=3)! ! ! # Ändern des Characters
plot(iq, pisa, type="h")! ! # Änderung des type Arguments
179
184. base graphics II
?lines
plot(iq, pisa)! ! ! ! ! ! ! # plotten von x gegen y
lines(x=c(60,130), y=c(40,80))! ! # Linie von P(60,40)
! ! ! ! ! ! ! ! ! ! ! # nach P(130,80)
lines(x=c(60,130), y=c(40,80), # Linie in anderer Farbe
! col=3)
lines(x=c(60,130), y=c(40,80), !! # Linie mit anderer Farbe,
! ! col=3, lty=3, lwd=2)! ! ! # Typ, Dicke
180
185. base graphics III
?abline
plot(iq, pisa, col="brown", !# plotten von pisa gegen iq
pch=16)
abline(v=mean(iq), !! ! # vertikale gestrichelte
! ! col="grey", lty=2)! ! # graue Linie beim MW von IQ
! ! !
abline(h=mean(pisa), ! ! ! # hor. Linie beim MW pisa
! ! col="grey", lty=2)!
! !
abline(v=c(90, 110), ! ! ! # vert Linie bei x=90 und x=110
! ! col="blue", lty=3)! !
!!
abline(lm(pisa ~ iq))! ! ! # Regressionslinie pisa ~ iq
! ! ! ! ! !
181
186. Your turn!
Erzeuge einen plot mit dem WoW Daten. Plotte AL gegen score in der
Farbe blau. Benenne die Achsen und gib der Grafik eine Überschrift.
Zeiche dann eine gestrichelte vertikale Linie beim Mittelwert von Al und
eine horizontale beim Mittelwert von score ein. Füge zuletzt eine
Regressionsgerade in rot hinzu.
Übung
●
●
3.5
●
●
● ●
● ● ●
3.0
●
●
● ●
● ●
● ●
●
● ●
● ● ●
2.5
Suchtscore
● ● ● ●
●
● ● ● ● ● ●
● ● ●
● ● ●
● ● ● ● ●
● ● ● ●
● ● ● ● ● ●
● ● ● ● ●
● ● ● ● ● ●
2.0
● ● ● ● ● ● ● ●
● ● ● ●
● ● ● ● ● ●
● ● ●
● ● ● ● ● ● ●
● ● ● ●
● ● ● ● ●
● ● ● ● ● ●
● ● ● ●
● ● ● ●
1.5
● ● ● ● ●
● ● ●
● ●
● ● ● ●
● ● ● ●
● ● ●
● ●
● ●
●
●
1.0
●
1.0 1.5 2.0 2.5 3.0 3.5 4.0
negative Konsequenzen 182
187. base graphics IV
?points
plot(iq, pisa, type="n")! ! ! # plotten ohne Punkte
points(iq, pisa)! ! ! ! ! # Punkte hinzufügen
?text! ! ! ! ! ! ! ! ! # um Text hinzuzufügen
text(72,74, "test text", col="blue")!
# Text an Position (72,78)
?mtext!
! ! ! ! ! ! ! ! # für margin text
mtext(side=3, "test mtext", col="red")!
# margin text oben
183