197
Einführung in R (Statistik + Programmierung) Mark Heckmann Universität Bremen www.markheckmann.de http://ryouready.wordpress.com

R kurs so se 2010 uni bremen m. heckmann

Embed Size (px)

Citation preview

Page 1: R kurs so se 2010 uni bremen   m. heckmann

Einführung in R

(Statistik + Programmierung)

Mark HeckmannUniversität Bremen

www.markheckmann.dehttp://ryouready.wordpress.com

Page 2: R kurs so se 2010 uni bremen   m. heckmann

Why R?

• free

• open source

• flexible

• (not yet extensive) documentation

• high-end graphics engine

• packages for (almost) everything

Page 3: R kurs so se 2010 uni bremen   m. heckmann

R-Appetizer

Page 4: R kurs so se 2010 uni bremen   m. heckmann

mpg

wt

2

3

4

5

●●

● ●●

●●

● ●

15 20 25 30

factor(cyl)● 4● 6● 8

Page 5: R kurs so se 2010 uni bremen   m. heckmann

rating

density

0.0

0.2

0.4

0.6

0.8

1.0

1.2

2 4 6 8 10

mpaa

NC−17PGPG−13R

Page 6: R kurs so se 2010 uni bremen   m. heckmann

depth

dens

ity

0.0

0.1

0.2

0.3

0.4

0.5

0.6

56 58 60 62 64 66 68 70

cutFairGoodVery GoodPremiumIdeal

Page 7: R kurs so se 2010 uni bremen   m. heckmann

ggplot special

Page 8: R kurs so se 2010 uni bremen   m. heckmann
Page 9: R kurs so se 2010 uni bremen   m. heckmann
Page 10: R kurs so se 2010 uni bremen   m. heckmann
Page 11: R kurs so se 2010 uni bremen   m. heckmann

Arbeiten mit R

Page 12: R kurs so se 2010 uni bremen   m. heckmann

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 

Page 13: R kurs so se 2010 uni bremen   m. heckmann

R Ressources• 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)

Page 14: R kurs so se 2010 uni bremen   m. heckmann

R-help

Leer

R-user & R-help = beste Freunde!

Page 15: R kurs so se 2010 uni bremen   m. heckmann

Die ersten beiden Tage

müsst ihr leider durchhalten!

Page 16: R kurs so se 2010 uni bremen   m. heckmann

### TAG 1 ###

Page 17: R kurs so se 2010 uni bremen   m. heckmann

Good to know I• 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

Page 18: R kurs so se 2010 uni bremen   m. heckmann

Code 1 : Arithmetik

### Grundlegende arithmetische Operatoren ###4+4!! ! ! # Addition4-1!! ! ! # Subtraktion4/2!! ! ! # Division2*2!! ! ! # Multiplikation2^2 ! ! ! # Potenz2**2! ! ! # alternative für Potenz5 %/%2 ! ! # Ganzzahlige Division5 %% 2!! ! # Modulo Division2 + 2*3! ! # Rechenregeln werden beachtet2 * 2^3! ! # (2-1)*(2+2)! # Klammern können gesetzt werden wo nötig

Page 19: R kurs so se 2010 uni bremen   m. heckmann

Code 2 : Zuweisungen### Der Zuweisungsoperator ###a <- 2 + 2! ! # Zuweisungsoperator kleiner-Zeichen # plus minus-Zeichena <- b <- 2 + 2! # möglich aber unschöna! ! ! ! # Variable a enthält nun Wert2 + 2 -> a! ! # so rum geht es auch, sollte aber # nicht verwedenet werdena = 2 + 2!! # Alternative Zuweisung (wird i.d.R. # nicht verwendet). ! ! ! ! # Zuweisung wird klarer durch # Richtungsangabe des Pfeilsa <- 100! ! # keine Warnung, wenn eine Variable # übergespeichert wirda * 10a <- "Ich bin der Inhalt"! # Variablen sind nicht typensicher, # d.h. sie können Zahlen, Buchstaben # etc. enthaltena * 10!! ! # Fehler, da Zeichen mal Zahl

Page 20: R kurs so se 2010 uni bremen   m. heckmann

Objektbezeichnungen

• Variablen/Objekt-benennung: können alphanumerisch sein sowie, Punkte und Unterstriche enthalten

• Darf keine Operatoren enthalten (+, - *, / etc.)

• Objektname darf nicht mit Zahl beginnen bzw. Punkt gefolgt von einer Zahl. #

• Groß- und Kleinschreibung wird unterschieden (Nutzung zum Strukturieren von Objektnamen)

Page 21: R kurs so se 2010 uni bremen   m. heckmann

Code 3 : Bezeichnung & Stil

varone <- 1varOne <- 2! ! # ist eine andere Variable als varone

neueVariable1 <- 7 neueVariable2=neueVariable1+2! ! # kaum lesbar! schlechter Stil!neueVariable2 <- neueVariable1 + 2!# besser, sauber getrennt

Page 22: R kurs so se 2010 uni bremen   m. heckmann

Code 4 : Logik

### Hierarchie der Datentypen in R. #### Jede höhere Stufe kann auch die tieferen repräsentierenNULL! ! ! # die leere Menge, unterstse StufeTRUE! ! ! # logische Werte3.14! ! ! # ganze und reelee Zahlen2.13+3i! ! ! # komplexe Zahlen"Hallo"! ! ! # Buchstaben und Zeichen

Page 23: R kurs so se 2010 uni bremen   m. heckmann

Code 5 : Logik

# Logische Operationen1 == 2!! ! ! # logischer Vergleich1 != 2 ! ! ! # ist ungleich?1 > 2 !! ! ! # 1 größer 2?1 >= 2 ! ! ! # 1 größer gleich 2?1 < 2 !! ! ! # 1 kleiner 21 <= 2 ! ! ! # 1 kleiner gleich 2! 1 <= 2! ! ! # Negierung von 1 kleiner gleich 2

# logisches UNDTRUE && TRUE!! # TRUETRUE && FALSE! ! # FALSEFALSE && TRUE! ! # FALSEFALSE && FALSE! ! # FALSE

Page 24: R kurs so se 2010 uni bremen   m. heckmann

Code 6 : Logik# logisches ODERTRUE || TRUE!! # TRUETRUE || FALSEFALSE || TRUEFALSE || FALSE

# ausschließliches ODERxor(TRUE, FALSE)! # ausschließliches ODERxor(TRUE, FALSE)

T !! ! ! ! # Kurzform von TRUEF! ! ! ! ! # Kurzform von FALSE

c(T,T) & c(T,T)!! # vektorwertiger Vergleich, d.h. # für jedes Element einzelnc(T,F) | c(F,F)

Page 25: R kurs so se 2010 uni bremen   m. heckmann

Code 7 : Logik

# Rechnen mit logischen WertenFALSE + TRUE!! # 1TRUE + TRUE! ! ! # 2TRUE * 2! ! ! # 2TRUE - FALSE - TRUE!

Page 26: R kurs so se 2010 uni bremen   m. heckmann

Funktionen IFunktion (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

Page 27: R kurs so se 2010 uni bremen   m. heckmann

Funktionen IIDie 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)

Page 28: R kurs so se 2010 uni bremen   m. heckmann

Funktionen IIIJede Funktion gibt ein Objekt zurück> c(1,2,3)[1] 1 2 3

Ggf. kann dies auch unsichtbar geschehenv <- rnorm(100)hist(v)

a <- hist(v) # Rückgabe der Funktion speicherna

Falls eine Funktion nichts spezifisches zurückgibt,gibt sie ein NULL Objekt zurücka <- plot(1:10)a

Page 29: R kurs so se 2010 uni bremen   m. heckmann

Code 8 : Hilfe!

### HELP R ###help.start()!! ! # Hilfe aufrufen. Auch über das # Menü möglich?mean! ! ! ! ! # Hilfe zur Funktion "mean"help(mean)! ! # identisch! !help("mean")!! # identisch! !

apropos() ! ! ! ! # alle Objekt, die mean enthaltenhelp.search("mean") ! # oder??mean

Page 30: R kurs so se 2010 uni bremen   m. heckmann

Code 9 : Vorgriff Datentyp Vektor

# Vorgriff auf Datentyp Vektoren (mehr später)c()!! ! ! ! ! # concatenate (deu. "verbinden")?cc(1,2,3)! ! ! ! # numerischer Vektor! ! ! ! ! ! # Zahl am Anfang des Outputs gibt # Nr. des Elements a <- c(1,2,3)! ! # Speichern in einer Variablenc(a,a)!! ! ! ! # Verknüpfen von zwei Variablenc(1,2,a)! ! ! ! # Verknüpfen von Zahlen und Variablenb <- 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

Page 31: R kurs so se 2010 uni bremen   m. heckmann

Code 10 : Sequenzen # Vektorsequenzen erzeugen?seqseq(from=1, to=5)! ! # Sequenz von 1 bis 5seq(from=1, to=5, by=.5) # von 1 bis 5 in Schritten von 0.5seq(1,20)!! ! ! # von eins bis 201:20 ! ! ! ! ! # Kurzschreibweise10:20! ! ! ! ! # von 10 bsi 20(-10):10! ! ! ! # von -10 bis 10

?reprep(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)

Page 32: R kurs so se 2010 uni bremen   m. heckmann

[1] 10 9 8 7 6 5 4 3 2 1

[1] 1 1 1 1 1 1 1 1 1 1

[1] 1 2 1 2 1 2 1 2 1 2

[1] 1 1 1 1 1 2 2 2 2 2

[1] 1 1 1 1 2 2 2 3 3 4

Your turn!Erzeuge folgende Vektoren, mit jeweils mit 10 Elementen

Page 33: R kurs so se 2010 uni bremen   m. heckmann

Code 11 : Wichtige Funktionen

# Wichtige Funktionenall()! ! ! # Sind alle Elemente TRUEany()! ! ! # Ist mindestens ein Element TRUEwhich()! ! ! # Welche Elemente sind TRUE

a <- c(1.2, 3.3, 6.1, 4.6)max()! ! # Maximum min()! ! # Minimumsqrt()!! # Quadratwurzelround()! ! # rundensum()! ! # Summemean()!! # Mittelwert

length()! # Länge des Vektorsrnorm()! ! # zufällige NV Werte generieren

Page 34: R kurs so se 2010 uni bremen   m. heckmann

Code 12 : Konstanten

# in R eingebaute KonstantenLETTERS! ! ! # Großbuchstaben von A bis Zletters! ! ! # Kleinbuchstaben von a bis zmonth.name! ! # englische Monatsnamenmonth.abb!! # englische Monatsnamen abgekürztpi!! ! ! # die Zahl Pi

Page 35: R kurs so se 2010 uni bremen   m. heckmann

Code 13 : Strings # Umgang mit Strings / Zeichen?printprint("Hallo")! ! # Drucken von "Hallo" in der Konsoleprint(1+1)! ! ! # Ausruck wird erst ausgewertet, dann gedruckt

?paste!! ! ! ! # Konvertierung in characters und verbindenpaste(1)! ! ! ! ! ! ! ! ! ! ! !paste(1:3)paste(1, "A")paste(c(1:3), c("A", "B", "C"))!! # Vektorweisepaste(c(1:3), c("A", "B"))! ! ! # recycling des kürzeren # Vektors bei ungleicher Längepaste(1, "A", sep="")! ! ! ! ! # Seperatorzeichen festlegenpaste(c(1:3), c("A", "B", "C"), sep="")! # Seperator festlegen!paste(c(1:3), c("A", "B", "C"), sep="_")! # Seperator festlegenpaste(c(1:3), c("A", "B", "C"),

sep="_", collapse=" ")! ! # Trennzeichen zum Kollabieren paste(c(1:3), c("A", "B", "C"), sep="_", collapse="_")

Page 36: R kurs so se 2010 uni bremen   m. heckmann

"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"

Your turn!Erzeuge folgende Ausgabe in der Konsole, indem

Du paste() und die Konstante month.name nutzt.

Page 37: R kurs so se 2010 uni bremen   m. heckmann

Code 14 : Strings?cat! ! ! # Ausgabe der und Aneinanderhängen der Objektcat("Hallo")!! ! ! ! ! ! ! # Ausgabe von Hallo auf der Konsolecat("Hallo", "wie gehts?")! ! ! # Ausgabe von EINEM Textcat("Ich bin Jonny Nr.", 5)! ! ! # Mischen von Zahlen und Textcat("IQ hat einen mean von :", 100, ! "und eine sd von:", 15)! ! ! # Zahlen und Textalter <- 31cat("Ich bin", alter, "Jahre alt.")!! # Variablen und Textcat("Eins plus Eins ist", 1 + 1)! ! # Ausdrücke werden erst # ausgewertet!cat("Dieser Satz hat einen Umbruch \n und geht dann weiter.") # Umbruch durch \ncat("Ein Tabulator \t mitten im Satz.")! # Tabulator durch \tcat("Anführungsstriche 'Test' im Text")! # Anführungsstrichecat("Anführungsstriche \"Test\" im Text")!# Escape Symbol

Page 38: R kurs so se 2010 uni bremen   m. heckmann

Der Vektor v hat die Länge 5 Er besteht aus folgenden Elementen: 1 2 3 4 5

Tip: Benutze hierzu die Funktion cat() und length() und kombiniere Variablen und Text.

Your turn!Du hast folgenden Vektor: v <- c(1,2,3,4,5).

Erzeuge folgende Ausgabe in der Konsole:

Page 39: R kurs so se 2010 uni bremen   m. heckmann

January is month number 1February is month number 2March is month number 3April is month number 4May is month number 5June is month number 6July is month number 7August is month number 8September is month number 9October is month number 10November is month number 11December is month number 12

Your turn!Erzeuge folgende Ausgabe in der Konsole, indem

Du cat(), paste() und die Konstant month.name nutzt.

Die Ausgabe soll nun pro Zeile erfolgen

Page 40: R kurs so se 2010 uni bremen   m. heckmann

Code 15 : vectorwise

# Vektorwertiges Arbeitena <- 1:3b <- 3:1a - b! ! ! ! ! ! ! # Vektorweise Substraktiona*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 Elementx + 5:7! ! ! ! ! ! # Addition für jedes Element3:5 - 1:6!! ! ! ! ! # Recycling3:5 - 2:3!! ! ! ! ! # Recycling mit Warnung

Page 41: R kurs so se 2010 uni bremen   m. heckmann

Code 16 : Zugriff

# Zugriff auf Elemente eines Vektorsb <- c(1,2,3,4,5)! ! ! # numerischer Vektorb[1]! ! ! ! ! ! ! # erstes Elementb[c(1,2,3)]! ! ! ! ! # Elemente 1,2,3b[1:3]!! ! ! ! ! ! # Elemente 1,2,3

Page 42: R kurs so se 2010 uni bremen   m. heckmann

Code 17 : Anwendung BMI ### BMI BEISPIEL FÜR INTERAKTIVE NUTZUNG ###68/1.70^2 # Body Mass Index. # Um den Wert weiterzubenutzen in ein Objekt speichernmyBmi <- 68/1.70^2myBmimyBmi.2 <- myBmi2bmi <- myBmi ! ! ! # Fehler, weil Objektname mit Zahl beginntweight <- c(68, 50, 88, 73)! ! # Vektor mit Gewichtsdatenweightheight <- c(1.70, 1.63, 1.90, 1.78) # Vektor mit Größen in mheight68 / 1.70^2! ! ! ! ! ! ! # BMI für die erste Personweight[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?

Page 43: R kurs so se 2010 uni bremen   m. heckmann

Code 18 : Anwendung BMI

height2 <- c(1.70, 1.63, 1.90)weight / height2^2!! ! ! ! # Vektor wird recycled mit warningheight3 <- c(1.70, 1.63)weight / height3^2!! ! ! ! # Vektor wird recycled ohne warninig, da er

# Standardabweichung "zu Fuss" berechnensum.bmi <- bmi[1] + bmi[2] + bmi[3] + bmi[4]!# Summe der Wertemean.bmi <- sum.bmi/4! ! ! ! ! ! ! # Mittelwertsum(bmi)! ! ! ! ! ! ! ! ! ! # Summesum(bmi)/4! ! ! ! ! ! ! ! ! ! # Mittelwertmean(bmi)!! ! ! ! ! ! ! ! ! # Mittelwert

length(bmi)! ! ! ! ! ! ! ! ! ! # Länge des Vektorssum(bmi)/length(bmi)! ! ! ! ! ! ! # Durchscnitt

Page 44: R kurs so se 2010 uni bremen   m. heckmann

Code 19 : Anwendung BMI

(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

(bmi – mean.bmi)^2!! ! ! ! ! # mit recycling!!sum((bmi – mean.bmi)^2)! ! ! ! # SSQsd.bmi <- sqrt(sum(bmi – mean.bmi)^2)/n-1)# Wurzel aus SSQ geteilt # durch n-1n <- 4sd.bmi <- sqrt(sum(bmi – mean.bmi)^2)/n-1)

sd(bmi)! ! ! ! # so ist es natürlich viel einfacher

Page 45: R kurs so se 2010 uni bremen   m. heckmann

Take along!

Selbst wenn etwas nicht in R nicht existiert, kann

man es sich selber programmieren!

Page 46: R kurs so se 2010 uni bremen   m. heckmann

x <- c(-2,-1,-1,0,1,1,2)y <- c(-1,-2,1,0,2,-1,1)

Your turn!Berechne die geschätzte Kovarianz für folgende

zwei Datenreihen in R „zu Fuß“

Page 47: R kurs so se 2010 uni bremen   m. heckmann

Code 20 : Navigieren

# Projektordner anlegen /RCourse# Navigieren in Verzeichnissengetwd() !! ! # Unterschied Slash/Backslash Windowssetwd() ! ! ! ! # Arbeitsverzechnis setzensetwd("/Users/markheckmann/RCourse")

# in Verzeichnis RCourse wechselnsetwd("..") ! ! ! # ein Verzeichnis runtersetwg("testdir")! ! # ein Verzeichnis hochsetwd("../testdir")!! # eins runter und wieder eins hoch

Page 48: R kurs so se 2010 uni bremen   m. heckmann

Your turn!Lege ein Verzeichnis RCourse an und setze es als neues

Arbeitsverzeichnis. Lege eine Unterordner data an und wechsele in ihn. Wechsel anschließend wieder in den übergeordneten Ordner.

Page 49: R kurs so se 2010 uni bremen   m. heckmann

Code 20b : Arbeitsbereich ### Workspace speichern / History speichern?savehistory()savehistory("Befehle_von_Tag_1.history")loadhistory("Befehle_von_Tag_1.history")

?save.image()save.image("erster Kurstag.RData")!# Arbeitsbereich speichernls()! ! ! ! ! ! ! ! # Alle Objekte im Arbeitsbereich # anzeigenrm()! ! ! ! ! ! ! ! # Objekte aus Arbeitsbereich löschenrm(list=ls)! ! ! ! ! ! # Alle Objekte aus Arbeitsbereich löschenload("erster Kurstag.RData")!# den zuvor gespeicherten # Arbeitsbereich ladenls()! ! ! ! ! ! ! ! # Objekte sind wieder da

Page 50: R kurs so se 2010 uni bremen   m. heckmann

x <- c(-2,-1,-1,0,1,1,2)y <- c(-1,-2,1,0,2,-1,1)

Your turn!Berechne die Korrelation für folgende zwei Datenreihen in R „zu Fuß“. Konstruiere die Lösung so, dass man x und y (gleich lang)

austauschen kann, ohne den Code sonst zu verändern.

Page 51: R kurs so se 2010 uni bremen   m. heckmann

Code 21 : Datentypen ### Datentypen ###

### Hierarchie der Datentypen in R. #### Jede höhere Stufe kann auch die tieferen repräsentierenNULL! ! ! # die leere Menge, unterste StufeTRUE! ! ! # logische Werte3.14! ! ! # ganze und reelee Zahlen2.13+3i! ! ! # komplexe Zahlen"Hallo"! ! ! # Buchstaben und Zeichen

# Datenobjekte in R – ALLES in R ist ein Objekt1 !! ! # numeric"Hallo"! ! # charactersNA!! ! # missing valueNaN!! ! # Not a number

Page 52: R kurs so se 2010 uni bremen   m. heckmann

### TAG 2 ###

Page 53: R kurs so se 2010 uni bremen   m. heckmann

Welche Regeln gibt es für die Benennung von Objekten?

Welche Regeln gibt es für leserlichen Code?

Welche Objektnamen sind erlaubt?a1234ausdruckVariable.VariableVariable._VariableVariable_1teVariable.1Variable

Überlege was folgende Ausdrücke ergeben:11 %% 51:6 %% 211 %/% 510:19 %/% 5

Quiz 1 !

Page 54: R kurs so se 2010 uni bremen   m. heckmann

Überlege was folgende Ausdrücke ergeben:

11 %% 51:6 %% 2

11 %/% 510:19 %/% 5

T & F | TT | (T | F)(T | T) & (T | F)c(T, F) | c(F, T)

xor(T, F)xor(c(T,F), c(F,F))

!any(T)any(c(T, F) | c(F, T))which(c(T, F) | c(F, T))

Quiz 2 !

Page 55: R kurs so se 2010 uni bremen   m. heckmann

Überlege was folgende Ausdrücke ergeben:

1:5 > 2c(-1,2,3,5) == min(c(-1,2,3,5))

6 + 1:46:1 - 3:1

3*FALSE - TRUE*5c(T,F,T,F,T) == 1c(T,F,T,F,T) == FALSE

x <- c(1,5,2,0,6,2,9) Suche die Stelle des Vektors x raus, der zu der niedrigsten Zahl sowie zu der höchste Zahl gehört. Ordne die beiden Werte dann in einem Vektor an.

Quiz 3 !

Page 56: R kurs so se 2010 uni bremen   m. heckmann

Überlege was folgende Ausdrücke ergeben:

seq(10, 1, -1)seq(10, 1, 1)rep(1:3, times=3:1)rep(rep(1:2, t=1:2), t=1:3)rep(1:3, l=5)LETTERS[2:4]

Erzeuge folgende Vektoren:[1] "a" "c" "e" "g" "i" "k" "m" "o" "q" "s" "u" "w" "y"[1] "B=2" "D=4" "F=6" "H=8" "J=10"

Erzeuge einen Vektoren mit NV Zufallszahlen der Länge 10 und runde ihn auf eine Dezimalstelle.

Quiz 4 !

Page 57: R kurs so se 2010 uni bremen   m. heckmann

Code 22 : Vektoren

### vector – eindimensionales Datenobjekt ###a <- c(T, F, T, F)!! ! ! # logischer Vektora <- c(1,2,3,4,5)! ! ! ! # numerischer Vektora <- c("A", "B", "C")! ! ! # character Vektor

?vector! ! ! ! ! ! ! # Hilfe zu vector() aufrufenvector("logical", length=10)!# log. Vektor der Länge 10 erzeugenvector("numeric", length=10)!# num. Vektor der Länge 10 erzeugenvector("character", length=10)! # char Vektor d. L. 10 erzeugen

c(TRUE, 2, FALSE)! ! ! ! # innerhalb eines Vektors stets # nur ein Typ möglich

c(T, "A", 1)!! ! ! ! # Automatische Umwandlung auf # niedrigstes mögliches Datenniveau

Page 58: R kurs so se 2010 uni bremen   m. heckmann

Code 23 : Vektoren# Zugriff auf eine Elemente durch eckige Klammern und Angabe der Position oder des Namens, sofern es ein „named vector“ ist.a[1]! ! ! ! ! # Zugriff auf erstes Element des Vektorsa[c(1,2)]!! ! ! # Zugriff auf die ersten beiden Elemente des Vektorsa[c(2,1)]!! ! ! # umgekehret Reihenfolge

a[c(T,F,F)]! ! ! ! # Zugriff durch TRUE/FALSE Vektora[c(T,F)]!! ! ! # Wieso 2 Elemente?

b <- c(a=1, b=2, c=3)! # Erstellen eines "named" vectorsnames(b)! ! ! ! # Namen der Vektorelemente anzeigenb["c"]!! ! ! ! # Zugriff nun auch über den Namen des # Elements möglich

a[-1]! ! ! ! ! # negatives Indizierena[c(-1,-2)]! ! ! ! # negatives Indizieren

Page 59: R kurs so se 2010 uni bremen   m. heckmann

Code 24 : Vektoren

x <- c(NA, 1, 2, NA, 99)! # Vektor mit missing values (NA)x == 1!! ! ! ! ! # welcher Eintrag ist gleich 1x > 1! ! ! ! ! ! # welche Einträge sind größer 1x == NA! ! ! ! ! # welcher ist NA? so falschis.na(x)! ! ! ! ! # Funktion is.na() nutzenwhich(is.na(x))!! ! # Einträge mit welchem Indizes sind NA?x[!is.na(x)]!! ! ! # Einträge auswählen, die nicht NA sindx[x==99] <- NA! ! ! # Einträge der Zahl 99 mit NA überschreiben

Page 60: R kurs so se 2010 uni bremen   m. heckmann

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)

Your Turn!

Page 61: R kurs so se 2010 uni bremen   m. heckmann

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

Your Turn!

Page 62: R kurs so se 2010 uni bremen   m. heckmann

Code 25 : Matrix### matrix – zweidimensionales Datenobjekt ###?matrixmatrix(1:12, nrow=3, ncol=4)!! ! ! # Matrix erstellenmatrix(1:12, nrow=3, ncol=4, byrow=TRUE)! # Matrix reihenweise

x <- 1:12dim(x) <- c(3,4)! ! ! ! # Dimensionsattribut ändernxdim(x) <- c(12)!! ! ! ! # zurück zu Vektordim(x) <- c(3,4)! ! ! ! # Wieder als Matrix

e <- matrix(c(1,0,0,0,1,0,0,0,1), 3, 3)! ! # Einheitsmatrixdiag(3)! ! ! ! ! ! ! # Einheitsmatrix per Funktion

is.matrix()

Page 63: R kurs so se 2010 uni bremen   m. heckmann

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

Quelle: Foliensatz von Peter Ruckdeschel / Matthias Kohl. R/S-plus für Einsteiger und Fortgeschrittene

Your Turn!

Page 64: R kurs so se 2010 uni bremen   m. heckmann

Code 26 : Matrix# auf Matrixelemente zugreifenx[1,1]!! ! ! ! # Element erste Zeile, erste Spaltex[ ,1]!! ! ! ! # komplette erste Spaltex[ ,1:2]! ! ! ! # komplette erste und zweite Spaltex[1, ]!! ! ! ! # komplette erste Zeilex[1:2, 2:3]! ! ! # erste & zweite Zeile, zweite & dritte # Spaltex[c(1,3), c(2,4)]

x[-1, -2]!! ! ! # negatives Indizieren; ohne Zeile 1 # und Spalte 2

x[c(T, F, T), T]! # Auswahl funkioniert auch über T/Fx[c(T, F, T), c(F,F,T,T)]

x > 5! ! ! ! ! # welche Elemente sind größer 5is.na(x)! ! ! ! # Welche Einträge der Matrix sind NA?

Page 65: R kurs so se 2010 uni bremen   m. heckmann

Code 26 : Matrix

# Matrixelemente verändernx[1,1] <- 10!! ! # Zahl zu einer Zelle zuweisenx[ ,1] <- 10!! ! # Zahl zu Spalte zuweisen mit # Recyclingx[1, ] <- 10!! ! # Zahl zu Zeile zuweisen

x[1, 2:3] <- c(100,100)! # Zwei Zellen verändern

x[c(T, F, T), T] # Auswahl funkioniert auch über # TRUE/FALSEx[c(T, F, T), c(F,F,T,T)]

Page 66: R kurs so se 2010 uni bremen   m. heckmann

Code 27 : Matrix # Zeilen und Spaltennamen hinzufügencolnames(x)! ! ! ! # Spaltennamen anzeigenrownames(x)! ! ! ! # Zeilennamen anzeigencolnames(x) <- c("Winter", "Frühling", "Herbst", "Winter")! # Spaltennamen setzenrownames(x) <- c("A", "B", "C")! # Zeilennamen setzen

x[, "Winter"]! ! ! ! ! # Zugriff über Namenx[, 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)! ! ! ! ! # Spaltennamencolnames(m)[4]! ! ! ! # Viertes Elementcolnames(m)[4] <- "April"!# Viertes Element verändernm

Page 67: R kurs so se 2010 uni bremen   m. heckmann

Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov DecWoche 1 0 0 1 1 0 3 0 -1 0 -1 -1 0Woche 2 -2 -1 1 0 0 0 1 1 2 -2 -1 -1Woche 3 -1 2 -1 -1 -3 0 3 3 1 -1 0 -1Woche 4 1 0 -2 0 0 0 1 2 1 0 0 0Woche 5 1 1 1 -2 0 -1 1 0 -2 0 0 -2Woche 6 0 0 0 -1 -1 0 0 1 1 1 -1 0Woche 7 1 1 -1 -1 -1 0 0 0 0 -1 1 -1Woche 8 0 1 -3 0 -1 1 2 0 -1 0 0 0Woche 9 -1 0 0 0 -1 0 0 0 2 -1 0 1Woche 10 -1 1 1 0 0 1 0 0 0 1 0 1Woche 11 0 -2 0 0 0 0 0 0 1 0 1 0Woche 12 -1 0 1 -2 -1 -1 0 2 1 1 1 -2Woche 13 2 3 -1 -1 2 1 0 0 1 2 0 -1Woche 14 0 0 0 1 -1 -1 -2 -1 0 1 1 1Woche 15 -1 0 0 1 0 1 -1 0 -1 0 -1 -2Woche 16 0 1 0 -1 0 2 0 -1 -2 -2 -2 -2Woche 17 -1 0 0 -1 0 3 1 1 0 -1 -2 0Woche 18 0 1 -1 0 1 1 -2 -1 2 0 -1 1Woche 19 -3 0 1 1 -2 -2 0 0 1 -2 1 -1Woche 20 2 1 0 -1 2 0 0 1 1 0 -1 2

Your turn!Erstelle folgende Matrix (mit zufälligen Werten):

Tip: nutze rnorm() und round()

Page 68: R kurs so se 2010 uni bremen   m. heckmann

Code 28 : Matrix

# Reihenfolge der Spalten der Matrix ändernm[, 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)]

Page 69: R kurs so se 2010 uni bremen   m. heckmann

Code 29 : Matrix # Matrizen verbindencbind ! ! ! # 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 untereinanderrbind(m[1:3, 1:3], m[18:20, 1:3])! # Oberen und unteren # Teil von m verbindenrbind(m[1:3, 1:3], m[18:20, 3:5])! # Achtung Spaltennamen der # ersten Matrix werden genutzt

Page 70: R kurs so se 2010 uni bremen   m. heckmann

1) Erzeuge eine Matrix M mit 7 Spalten und 7 Zeilen aus zufälligen NV-Werten, die auf eine Stelle gerundet werden.

2) Folgende Zellen sollen nun durch 999 ersetzt werden:(1,1) (4,3) (4,4) (1,7)

3) Alle Einträge die 999 enthalten sollen NA gesetzt werden.

Quelle: Foliensatz von Peter Ruckdeschel / Matthias Kohl. R/S-plus für Einsteiger und Fortgeschrittene

Your Turn!

Page 71: R kurs so se 2010 uni bremen   m. heckmann

Code 30 : Matrix ### Rechnen mit MatrizenA <- matrix(c(1,3,2,5,2,3,1,2,3), ncol=3)At(A)! ! ! ! ! # transponieren einer MatrixA + A! ! ! ! ! # Zellenweise AdditionA * 4! ! ! ! ! # Jede Zelle mal vierA * A! ! ! ! ! # Zellenweise MultiplikationA^2!A %*% A! ! ! ! # MatrixmultiplikationAinv <- solve(A)! # Inverse einer quadratischen MatrixA %*% Ainv! ! ! # Inverse Mal Matrix = EinheitsmatrixAinv %*% A! !A %*% solve(A)

rbind(A, A)! ! ! ! # Zeilen verbindencbind(A, A)! ! ! ! # Spalten verbindencbind(A, rep(1,3))!! # eine Spalte anhängen

rbind(A, A) %*% cbind(A, A)! # Beispiel

Page 72: R kurs so se 2010 uni bremen   m. heckmann

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!

Your turn!Berechne die Matrix b der Regression y

regrediert auf x in Matrizenform

Page 73: R kurs so se 2010 uni bremen   m. heckmann

Code 31 : Faktoren ### factors - für qualitativ unterschiedliche Merkmaleval <- c(1,2,1,1,1,2,3,3)!! ! ! # neuer Vektorf <- factor(val, levels=1:3)!! ! # factor erzeugen mit # Levels 1 bis 3flevels(f)!! ! ! ! ! ! # Bezeichnung der Levelslevels(f) <- c("Treatment 1", "Treatment 2", "Control") # Neue Level Bezeichnungenf

# Umwandeln eines vector in factorx <- c(1,1,2,2,3,3)!! ! # neuer Vektorx <- as.factor(x)! ! ! # umwandeln in factorxlevels(x)!! ! ! ! # Bezeichnung der Levelslevels(x) <- c("Treatment 1", "Treatment 2", "Control") # Neue Level Bezeichnungen

Page 74: R kurs so se 2010 uni bremen   m. heckmann

[1] Gruppe 4 Gruppe 4 Gruppe 4 Gruppe 4 Gruppe 3 Gruppe 3 Gruppe 3 Gruppe 2 Gruppe 2 Gruppe 1Levels: Gruppe 1 Gruppe 2 Gruppe 3 Gruppe 4

Your turn!Erzeuge einen factor der folgenden Form:

Page 75: R kurs so se 2010 uni bremen   m. heckmann

Code 31 : Listen### lists / Listen - Datentyp ###bmi.class1 <- c(20,23,26,18)bmi.class2 <- seq(20, 30, by=2)bmi.class3 <- 20:35# --> passen nicht in Matrix, da sie unterschiedliche Anzahl an Einträgen haben

l <- list(bmi.class1, bmi.class2, bmi.class3)! # Erstellen einer Listel! ! ! !l[[1]] ! ! ! # Auf Listenelemente wird mit einer # doppelten eckigen Klammer zugegriffenl[[1]][1:3]! ! # Auswahl des ersten Listenelements und # innerhalb diesem das erste bis dritte Element

l[1]! ! ! # Listenelement 1 noch als Listel[1:2] ! ! # Listenelemente 1 und 2l[-1]! ! ! # negatives indzieren

Page 76: R kurs so se 2010 uni bremen   m. heckmann

Code 32 : Listen l <- list(mathe=bmi.class1, bio=bmi.class2, deutsch=bmi.class3)! # benannte Listenames(l)! ! ! ! ! # Namen der Liste anzeigenl[["deutsch"]]! ! ! # Zugriff auf Listeneintrag per Namenl$deutsch!! ! ! ! # äquivalent: Zugriff mit Dollar Operatorl$deutsch[5]!! ! ! # Fünftes Element des Listenelements # deutsch

l <- list(bmi.class1, bmi.class2, bmi.class3) # Liste ohne # Namen erzeugennames(l) <- c("mathe", "bio", "deutsch")! # Namen nachträglich # hinzufügenl

Page 77: R kurs so se 2010 uni bremen   m. heckmann

Code 33 : Listen

l <- list(Jahreszeiten=m, mathe=bmi.class1)! # Liste kann unterschiedliche Objekt enthaltenl[[1]]!! ! # Erstes Listenelement ist eine Matrixis.matrix(l[[1]]) !! # Ist das erste L-Element eine Matrix?is.matrix(l$mathe)!! # Ist L-Element mathe eine matrix?is.vector(l$mathe)!! # Ist L-Element mathe ein Vektor?

l[[2]] <- diag(3)! ! # L-element 2 d. Einheitsmatrix ersetztl[[1]][1] <- 999! ! # einen einzelnen Eintrag verändern

l <- l[3:1]! ! ! ! # Reihenfolge der Listenelemente ändernl<- rev(l)! ! ! ! # Listenreihenfolge umkehren

Page 78: R kurs so se 2010 uni bremen   m. heckmann

[[1]] [1] "A" "B" "C" "D" "E" "F" "G" "H" "I" "J" "K" "L" "M"

[[2]][1] "Ich bin das zweite Element"

[[3]] [,1] [,2] [,3] [,4] [,5][1,] 0.9 0.3 0.5 0.6 2.4[2,] -0.9 -0.7 1.5 -1.1 -1.2[3,] -1.2 0.9 0.4 -1.7 0.2[4,] -0.4 -0.1 0.2 0.0 0.8[5,] 1.3 -1.1 -0.7 0.0 1.1

Your turn!Erstelle eine Liste l, bei der:das erste Element ein Vektor der Großbuchstaben A bis M istdas zweite Element die Zeichenkette "Ich bin das zweite Element"das dritte Element eine Matrix (5x5) mit zufälligen Werten mit 1 Dezimalkommastelle enthält. Z.B. so:

Page 79: R kurs so se 2010 uni bremen   m. heckmann

$Buchstaben[1] "A" "B" "C" "D" "E" "F"

$Matrix [,1] [,2] [,3] [,4] [,5][1,] 0.7 0.5 NA 0.8 0.7[2,] NA 0.9 NA NA 1.5[3,] NA 1.3 1.3 NA NA[4,] 0.7 NA 1.1 NA 0.0[5,] NA 1.1 NA NA 1.6

$Text[1] "Ich bin das zweite Element"

Your turn!Füge nun noch folgende Namen zu den Listenelementen hinzu:Buchstaben, Text, Matrix.Dann ändere alle Einträge der Matrix, die kleiner als 0 sind, in NAs um, kürze den Vektor Buchstaben auf A bis F und kehre die Reihenfolge der letzten beiden Listenelemente um.

Page 80: R kurs so se 2010 uni bremen   m. heckmann

Code 34 : data frames### data frames #### in Matrizen müssen alle Einträge vom selben Typ sein. Z.B# alles numerisch oder alles characters. data frames sind # spezielle Listen und können deshalb pro Spalte # unterschiedliche Typen enthalten (Faktoren, numerische Werte, # Characters). Im Ggs. zur Liste müssen sie 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=treat, control=control)d$treat! ! ! ! ! ! ! # Zugriff mit Dollaroperatord[["treat"]]!! ! ! ! # gibt Vektor zurückis.vector(d[["treat"]])! ! # gibt Vektor zurückd[,1]

Page 81: R kurs so se 2010 uni bremen   m. heckmann

Code 35 : data frames d["treat"]! ! ! ! ! ! # gibt data frame zurückis.data.frame(d["treat"])!! # gibt data frame zurückd[1]

d[1:3, ]! ! ! ! ! # Zeilen 1 bis 3, alle Spaltend[1:3, 1:2]! ! ! ! # Zeilen 1 bis 3, Spalten 1 und 2d[1:3, c("treat", "control")]! # identisch

d[-1,]!! ! ! ! ! # ohne erste Zeiled[-(1:2), -1]! # ohne erste beiden Zeilen, ohne # erste Spalte

f <- factor(c("m", "m", "w", "w", "w"))data.frame(Geschlecht= f, treat, control)

Page 82: R kurs so se 2010 uni bremen   m. heckmann

Geschlecht Intervention IQ BMI1 m Control 94.8 22.52 m Treat 113.1 19.63 m Placebo 107.1 24.34 m Control 108.8 9.25 m Treat 102.4 24.56 m Placebo 104.8 23.07 m Control 90.6 17.98 m Treat 102.9 18.09 m Placebo 105.4 17.710 m Control 105.4 14.411 w Treat 107.9 16.012 w Placebo 108.8 18.913 w Control 93.7 19.514 w Treat 113.8 19.415 w Placebo 70.7 16.416 w Control 79.1 21.817 w Treat 116.5 22.318 w Placebo 106.3 19.219 w Control 133.6 20.420 w Treat 79.2 23.3

Your turn! konstruiere folgenden data frame:

(IQ normalverteilt um 100 mit sd=15; BMI normalverteilt um 20, sd=5)

Page 83: R kurs so se 2010 uni bremen   m. heckmann

### TAG 3 #

Page 84: R kurs so se 2010 uni bremen   m. heckmann

Kehre die Elemente des folgenden Vektors um[1] 1 1 1 2 2 3

Schreibe dann eine Befehlsfolge, die die Reihenfolge der Elemente eines beliebigen Vektors umkehrt, also auch funktioniert, wenn der Vektor ein anderer ist

Erzeuge folgenden data frame mit beliebigen Werten

IQ schulnote1 95.9 32 83.0 23 104.7 44 99.6 35 87.0 36 88.4 57 84.1 38 106.5 59 108.6 310 105.6 3

Quiz 1 !

Page 85: R kurs so se 2010 uni bremen   m. heckmann

Ändere folgende Zellen des data frame in NA: (1,1) (5,2)

Füge eine Spalte an, in dem sich 0 und 1 abwechseln an den data frame an und gib ihr den Namen "dummy"

Erzeuge eine Liste, die den data frame als ersten Eintrag enthält

Ändere nun die Zelle (2,2) des data frames (erstes Listenelement) in der Liste auf NA

Quiz 2 !

Page 86: R kurs so se 2010 uni bremen   m. heckmann

Code 36-37 : Subsets### data frames subsetting

d[4]! ! ! ! ! ! # Auswahl der vierten Spalted[1:3]!! ! ! ! ! # Spalten 1 bis 3d[c("Geschlecht", "IQ")]! # Nur Geschlecht und IQd[-1]! ! ! ! ! ! # alle Spalten bis auf ersted[c(T,F,T,F)]! ! ! ! # Jede zweite Spalted[c(T, F)]! ! ! ! ! # Jede zweite Spalted[c(F, T)]! ! ! ! ! # Jede zweite Spalte

d["IQ"] > 107! ! ! ! # Welche IQ Werte sind > 107index <- d["IQ"] > 107!! # in Index speichernd[index, ]! ! ! ! ! # Zeilen auswählen mit IQ > 107cbind(d, d$IQ > 107 )! ! # Spalte anfügen, die zeigt, ob

# IQ Werte größer 107 sind

Page 87: R kurs so se 2010 uni bremen   m. heckmann

IQ BMI Geschlecht Intervention1 109.9 18.9 m Control3 101.2 18.7 m Placebo5 111.4 14.7 m Treat7 104.6 17.3 m Control9 103.7 24.9 m Placebo11 97.1 16.0 w Treat13 89.7 28.7 w Control15 103.2 20.5 w Placebo17 86.6 29.4 w Treat19 89.6 28.3 w Control2 109.1 18.7 m Treat4 110.1 18.0 m Control6 110.3 22.2 m Placebo8 123.5 23.2 m Treat10 107.6 17.8 m Control12 104.2 20.1 w Placebo14 69.2 21.1 w Treat16 96.9 31.0 w Control18 103.9 14.5 w Placebo20 96.4 17.5 w Treat

Your turn!baue den vorher erzeugten Datensatz um: a) erst die

ungeraden, dann die geraden Zeilen kommen b) neue Spaltenreihenfolge

Page 88: R kurs so se 2010 uni bremen   m. heckmann

Code 38 : Subsetsnames(d)=="IQ"! ! ! # welche Namen sind gleich "IQ"d[names(d)=="IQ"]! ! # subsetting mit logischem Vektornames(d)!="IQ"! ! ! # welche Namen sind nicht "IQ"?d[names(d)!="IQ"]! ! # Spalten, die nicht "IQ" sind auswählend[,names(d)!="IQ"]!! # Identisch

index <- d$IQ > 100 & d$Geschlecht=="m" # welche Fälle sind Männer mit einem IQ > 100d[index,]!! # auswählend[d$Intervention=="Control" | d$Intervention=="Treat",]! ! # Intervention ist Control oder Treatd[d$Intervention %in% c("Control", "Treat"),]! ! ! ! # alternative Schreibweise

Page 89: R kurs so se 2010 uni bremen   m. heckmann

Geschlecht Intervention IQ BMI11 w Treat 123.8 21.514 w Treat 96.3 28.517 w Treat 104.3 20.420 w Treat 94.8 14.5

Your turn!Wähle aus dem Datensatz alle Fälle aus, die weiblich sind

und zur Treatmentgruppe gehören

Page 90: R kurs so se 2010 uni bremen   m. heckmann

Geschlecht Intervention IQ BMI1 m Control 109.9 18.92 m Treat 109.1 18.74 m Control 110.1 18.05 m Treat 111.4 14.76 m Placebo 110.3 22.28 m Treat 123.5 23.210 m Control 107.6 17.8

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

Page 91: R kurs so se 2010 uni bremen   m. heckmann

Code 39 : subset()

?subset! ! ! ! ! ! ! ! ! # die subset Funktionsubset(d, subset=IQ < 100 & Geschlecht=="m")!! !

# Logische Auswahlsubset(d, IQ > 120 | IQ < 80)! ! # Logische Auswahlsubset(d, select=c(IQ, Geschlecht))! # Variablenauswahl mit selectsubset(d, select=c("IQ", "Geschlecht")) # identisch

Page 92: R kurs so se 2010 uni bremen   m. heckmann

Geschlecht Intervention IQ BMI1 m Control 102.5 16.72 m Treat 102.3 18.93 m Placebo 101.8 18.25 m Treat 106.7 21.010 m Control 118.9 15.711 w Treat 123.8 21.512 w Placebo 104.8 24.413 w Control 105.7 13.115 w Placebo 100.7 19.217 w Treat 104.3 20.419 w Control 105.0 10.8

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.

Page 93: R kurs so se 2010 uni bremen   m. heckmann

Geschlecht Intervention IQ BMI6 m Placebo 84.5 22.27 m Control 80.7 13.810 m Control 118.9 15.711 w Treat 123.8 21.516 w Control 78.9 25.6

Your turn!Wähle aus dem Datensatz mit subset alle Fälle aus, die a) einen IQ

außerhalb des Durchschnitts (90-110) haben.

... und b) zugleich weiblich sind

Geschlecht Intervention IQ BMI11 w Treat 123.8 21.516 w Control 78.9 25.6

Page 94: R kurs so se 2010 uni bremen   m. heckmann

packages laden

R-Base installationbasic packages

My ComputerDie R-base Installation enthält sog.packages, in denen bestimmte Funktionen enthalten sind.

packages müssen erst geladenwerden, bevor die in ihnen enthaltenenFunktionen benutzt werden können.

Einige packages werden automatisch geladen, andere müssen nach Bedarfgeladen werden.

> library(package.name)

Page 95: R kurs so se 2010 uni bremen   m. heckmann

R-Base installationbasic packages

>3000 additional packages My Computer

on demand

CRAN server

Installation per Kommandozeile> install.packages("package.name")

oder per R-Konsolenmenü

packages installieren

Page 96: R kurs so se 2010 uni bremen   m. heckmann

Code 40 : packages installieren

### packages installieren und laden

install.packages("plyr")! # plyr installierenlibrary(plyr)! ! ! ! # package ladendetach(package:plyr)! ! # package entfernen

describe()! ! ! ! ! # Funktion existiert nichtinstall.packages("psych")!# psych installierenlibrary(psych)! ! ! ! # Paket ladendescribe(rnorm(100))! ! # nun existiert sie

search() # packages im Suchpfad

Page 97: R kurs so se 2010 uni bremen   m. heckmann

Code 41 : Daten einlesen### EINLESEN VON DATEN IN R ###?read.csv!! ! ! # Einlesen einer .csv Datei (englisch)?read.csv2! ! ! # Einlesen einer .csv Datei (deutsch)?read.table # für .txt Dateien?read.spss # für .sav Dateien?spss.get # im Hmisc package

setwd("/Users/markheckmann/Documents/Magic Briefcase/R/2010 R Einführung/data") # Arbeitsverzeichnis wechseln

df <- read.table("mieten.txt") # mieten.txt einlesenhead(df) # Zeilen haben keine Überschriftdf <- read.table("mieten.txt", header = TRUE) # Einlesen mit header=TRUEhead(df)

Page 98: R kurs so se 2010 uni bremen   m. heckmann

Code 42 : Daten einlesen

?read.csv2 ! ! ! ! # für deutsche .csv Dateiendf <- read.csv2("mieten.csv")head(df)

library(Hmisc)mydata <- spss.get("wow.sav", use.value.labels=TRUE)

Page 99: R kurs so se 2010 uni bremen   m. heckmann

Code 42 : attach data

# Objekte/Datensätze in den Suchpfad hängen

y1!! ! ! ! ! # Objekt unbekanntattach(anscombe)! # Datensätze in den Suchpfad hängeny1!! ! ! ! ! # Objekt nun im Suchpfaddetach(anscombe)! # Datensatz aus Suchpfad entferneny1!! ! ! ! ! # Objekt wieder unbekannt

search() # packages im Suchpfad

Page 100: R kurs so se 2010 uni bremen   m. heckmann

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.

Page 101: R kurs so se 2010 uni bremen   m. heckmann

Datensatz wow_excerpt.csvGeschlecht 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

Zeitaufwand (pro Woche)1=keine Angabe, 2=weniger als 7 Stunden, 3=weniger als 14 Stunden 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

K2K3K4

E1 Entzugserscheinungen: Ich beschäftige mich auch während der Zeit, in der ich nicht WoW spiele, gedanklich sehr viel mit dem Spiel.

E2E3E4

T1 Toleranzentwicklung: Mittlerweile verbringe ich mehr Zeit bei WoW als zu Beginn meiner Online- Aktivitäten.

T2T3T4

AL1 Arbeit/Leistung: Meine Leistungen in der Schule/im Beruf leiden unter dem Spielen bei WoW.

Al2AL3Al4

nKsB1 Soziale Beziehungen: Seitdem ich WoW spiele, haben sich einige Freunde von mir zurückgezogen.

nKsB2nKsB3nKsB4

Page 102: R kurs so se 2010 uni bremen   m. heckmann

Editoren nutzen

Windows Tinn-R

R Editor

Mac OS Textmate

Datei wird als .R Datei gespeichert und kann so immer wieder genutzt werden

Page 103: R kurs so se 2010 uni bremen   m. heckmann

Code 43 : EDA

### Anschauen der WoW Daten ###library(psych)! ! ! ! # library psych ladendescribe(wow)! ! ! ! # Überblick über Datensatz

hist(wow[1:9])! ! ! ! # Histogramme der ersten neuen Variablenhist(wow[10:17])! ! ! # Histogrammehist(wow[18:23])! ! ! # Histogramme

Page 104: R kurs so se 2010 uni bremen   m. heckmann

Code 44 : missings

# Gibt es keine Ahnung Antworten (wie k.A.), # die noch nicht als Missing kodiert sind?

table(wow$Geschlecht)! ! ! ! # Häufigkeitstabellewow$Geschlecht[wow$Geschlecht==1] <- NA! # 1 zu NA umkodierentable(wow$Geschlecht)

table(wow$Zeitaufwand)!! ! ! # Häufigkeitstabellewow$Zeitaufwand[wow$Zeitaufwand==1] <- NA! # 1 zu NA umkodieren

table(wow$Alter)! ! ! ! ! ! ! # Häufigkeitstabellewow$Alter[wow$Alter==1] <- NA! ! ! ! # 1 zu NA umkodieren

Page 105: R kurs so se 2010 uni bremen   m. heckmann

Code 45 : Rekodieren

### Rekodieren ###library(memisc)!! # eine Funktion unter verschiedenen # zum Rekodierenrecode(wow$K1,! ! # rekodieren von K1 A = 1 <- 4, B = 2 <- 3, C = 3 <- 2, D = 4 <- 1)

Page 106: R kurs so se 2010 uni bremen   m. heckmann

Code 46 : als Faktor# Sind alle qualitativen Merkmale als Faktoren definiert?

wow$Geschlechtwow$Geschlecht <- as.factor(wow$Geschlecht)! # in Faktor umwandelnlevels(wow$Geschlecht) <- c("m", "w")! ! ! # F-stufen bennennen

wow$Alterwow$Alter <- as.factor(wow$Alter)! ! ! ! # in Faktor umwandelnlevels(wow$Alter) <- c("unter 18", "18-29", "30-40", "41-50", "über 50" )! # F-stufen bennennen

wow$Zeitaufwandwow$Zeitaufwand <- as.factor(wow$Zeitaufwand)# in Faktor umwandelnlevels(wow$Zeitaufwand) <- c(">7 Std.", "> 14 Std.", "> 20 Std.", !! ! ! ! "20-30 Std.", "30-40 Std.", "> 40 Std.") # Faktorstufen bennenen

Page 107: R kurs so se 2010 uni bremen   m. heckmann

Code 47 : neue Variablen # 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 Variablenwow <- transform(wow, KO=(K1 + K2 + K3 + K4)/4)!! # neue Variable KO mit tranformwow <- 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

Page 108: R kurs so se 2010 uni bremen   m. heckmann

Code 48 : Dummy Variable# Dummy Variablen anlegen (mehrere Varianten)

mean(wow$KO, na.rm=TRUE)! # Mittelwert der Variablenwow$KO > 1.967054! ! ! # welche Werte größer als Mittelwert?wow$meanSplit.KO <- wow$KO > mean(wow$KO, na.rm=TRUE) # neuer Variable zuweisenwow$meanSplit.KO <- as.numeric(wow$meanSplit.KO)! ! # in numerische Variable wandeln!

wow$meanSplitKO <- as.numeric(wow$KO > mean(wow$KO, n=T)) # einfache Variante

wow <- transform(wow, meanSplitKO=as.numeric(KO > mean(KO, n=T))) # einfache Variante

Page 109: R kurs so se 2010 uni bremen   m. heckmann

Code 49 : Datenausgabe

### Datenausgabe ###

?write.table!! ! ! ! ! ! # zum speichern als .txt filewrite.table(d, "test.txt", sep="\t")

write.csv2(d, "test.csv")!! ! # als .scv datei speichern

# an SPSS program to read itlibrary(foreign)write.foreign(d, "test.txt", "test.sps", package="SPSS") # ohne Gewähr !!!

Page 110: R kurs so se 2010 uni bremen   m. heckmann

Code 50 : Deskriptive Statistiken

### Deskriptive Statistiken ###

summary(wow)!! ! # summaries der Variablenattach(wow)library(psych)! ! ! # psych ladendescribe(wow)! ! ! # Basisstatisiken der Variablen

describe.by(wow[4:11], Geschlecht)!! # Basisstatisiken pro Faktorstufe von Geschlechtdescribe.by(wow[4:11], list(Geschlecht, meanSplitKO)) # Basisstatisiken pro Faktorstufe von Geschlecht # und meanSplitKOdetach(wow)

Page 111: R kurs so se 2010 uni bremen   m. heckmann

Your turn!Lies den Datensatz wow_excerpt.csv ein und durchlaufe die Schritte:a) missings Na setzenb) Faktoren in Faktoren verwandeln und bennenenc) Skala berechnend) eine Variable (0,1) anlegen, die KO am mean splittete) einen Gesamtwert berechnen über die fünf Skalen namens „score“, der der Durchschnitt der Skalen KO, EN, TO, AL, NK ist.

Page 112: R kurs so se 2010 uni bremen   m. heckmann

Code 51 : crosstabs### Häufigkeiten ###

# One Way Tableattach(wow)table(Alter)!! # Häufigkeitstabelle von Alter

u <- subset(wow, meanSplitKO==1, select=Geschlecht) # nur KO größer als meantable(u)! ! ! # Häufigkeitstabelle!

# Two Way Tablemytable <- table(Geschlecht, Alter)! # Häufigkeitstabellemytableftable(mytable)!! ! ! # ftable zur schöneren Darstellung

prop.table(mytable) ! ! # Zellen Prozenteprop.table(mytable, 1) ! ! # Zeilen Prozenteprop.table(mytable, 2) ! ! # Spalten Prozente

Page 113: R kurs so se 2010 uni bremen   m. heckmann

Code 52 : crosstabs

# Three Way Tablesmt <- table(Geschlecht, Alter, meanSplitKO)ftable(mt)

# Tables mit CrossTablelibrary(gmodels)CrossTable(Geschlecht, Alter)CrossTable(Geschlecht, Alter, format="SPSS")

Page 114: R kurs so se 2010 uni bremen   m. heckmann

Your turn!Mache folgende Häufigkeitstabellen für den wow Datensatz mit CrossTable:1) Alter gegen Zeitaufwand2) Geschlecht gegen Zeitaufwand

Page 115: R kurs so se 2010 uni bremen   m. heckmann

Code 53 : Formulas### Formulas in R ###Dienen der Beschreibung von statistischen ModellenSind 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

Page 116: R kurs so se 2010 uni bremen   m. heckmann

Code 54 : Formulas

y ~ x1 ! ! ! # Modell mit einem Regressory ~ x1 + x2 # zwei Regressoren, keine Interaktiony ~ x1 + x2 + x1:x2 ! # zwei Regressoren plus Interaktion y ~ x1 * x2! ! ! ! # identisch

Page 117: R kurs so se 2010 uni bremen   m. heckmann

Code 55 : lm # lineare Modelle schätzen?lm!! ! ! ! ! ! ! ! # lineare Modellelm1 <- lm(score ~ KO, data=wow)!! # Modell mit 1 Regressorlm1!! ! ! ! ! ! ! ! # Modell ausgebensummary(lm1)!! ! ! ! ! # summary des Modells

lm2 <- lm(score ~ KO*AL, data=wow)) # zwei Regressoren + Interaktionlm2!! ! ! ! ! ! ! ! # Modell ausgebensummary(lm2)!! ! ! ! ! # summary des Modells

attach(wow)! ! ! ! ! ! ! # wow anhängenplot(KO, score)!! ! ! ! ! # KO gegen score plottenabline(lm1)! ! ! ! ! ! ! # Regressionsgerade hinzufügendetach(wow)! ! ! ! ! ! ! # wow aushängen

Page 118: R kurs so se 2010 uni bremen   m. heckmann

Code 56 : Modelle vergleichen

# Modelle vergleichen

fit1 <- lm(x1 ~ y1 + y2, data=anscombe)fit2 <- lm(x1 ~ y1, data=anscombe)anova(fit1, fit2)

Page 119: R kurs so se 2010 uni bremen   m. heckmann

Your turn!Nutze den Datensatz anscombe und berechne eine Regression von y1 auf x1.Plotte die Werte und zeichne die Regressionsgerade ein.

Page 120: R kurs so se 2010 uni bremen   m. heckmann

Code 57 : One-Way-Anova

##### 1-WAY-ANOVA ######wowAnova <- aov(score ~ Alter, data=wow)summary(wowAnova)

### Post-hoc Tests ###TukeyHSD(wowAnova)!! # Tukey Testlibrary(gplots)!! ! ! ! ! # gplots ladenattach(wow)! ! ! ! ! ! ! # Datensatz wow aushängenplotmeans(score ~ Alter)! ! ! # mean plot mit # Konfidenzgrenzenpairwise.t.test(score, Alter, p.adj = "none")! # paarweise t-Tests ohne Alpha Korrekturpairwise.t.test(score, Alter, p.adj = "bonf") ! # mit Alpha Bonferroni Korrekturdetach(wow)! ! ! ! ! ! ! # Datensatz wow aushängen

Page 121: R kurs so se 2010 uni bremen   m. heckmann

Your turn!Nutze den Datensatz InsectSprays. Dieser enthält Zählungen von Insekten bei der Nutzung verschiedener Insektensprays.

Schaue, ob sich count über die Faktorstufen von sprays unterscheiden.

Mache einen plot der Mittelwerte und als post-hoc Testeinen Tukey-Test sowie paarweise t-Tests mit Bonferroni Korrektur.

Page 122: R kurs so se 2010 uni bremen   m. heckmann

Code 58 : Two-Way-Anova

##### 2-WAY-ANOVA ######

fit <- aov(KO ~ Geschlecht * Alter, data=wow) summary(fit)

# Two-way Interaction Plotattach(wow)interaction.plot(Geschlecht, Zeitaufwand,

AL, type="b", col=1:3)interaction.plot(Zeitaufwand, Geschlecht, AL, type="b", col=1:3)detach(wow)

Page 123: R kurs so se 2010 uni bremen   m. heckmann

Code 59 : Faktorenanalyse

##### FAKTORENANALYSE #######wow <- na.omit(wow)!! # Missings entfernen

names(wow)fit <- factanal(wow[4:23], 6, rotation="varimax")fitprint(fit, digits=2, cutoff=.3, sort=FALSE)

Page 124: R kurs so se 2010 uni bremen   m. heckmann

Your turn!Lade die .csv Datei fa_daten.csv und mache mit ihr eine Faktorenanalyse.

Page 125: R kurs so se 2010 uni bremen   m. heckmann

### TAG 4 ###

Page 126: R kurs so se 2010 uni bremen   m. heckmann

Graphic SystemsR Graphic Systems

base graphics grid graphics

various packages

many graphicfunction

lattice ggplot2

Page 127: R kurs so se 2010 uni bremen   m. heckmann

Code 60 : Datensätze### Daten zum ausprobieren ###

# Viele Datensätze sind bereits in R vorhanden

data()!! ! ! # zeigt an welche Datensätze existierenanorexia! ! ! # Daten anorektischer Patienten aus

# package MASSinsectsprays!! # package datasets

# Es kann auch das package datasets installiert# werden, in dem viele Datensätze inkl. # Beschreibung hinterlegt sind

install.packages("datasets")!! # installierenlibrary(datasets)! ! ! ! ! # laden des Pakets

Page 128: R kurs so se 2010 uni bremen   m. heckmann

Code 61 : Grafiken I### einfache Visualisierungen ###

?plot! ! ! ! ! ! # einfacher Scatterplotplot(wow$KO, wow$score)

?hist! ! ! ! ! ! # Histogrammhist(islands)hist(wow[1:16])

library(Hmisc)! ! ! !hist.data.frame(wow[1:16])! # Alternative

?qqplot! ! ! ! ! ! # QQ-Plotsqqnorm(precip)qqnorm(wow[,"score"])

Page 129: R kurs so se 2010 uni bremen   m. heckmann

Code 62 : Grafiken II

?boxplot! ! ! ! ! # Boxplotboxplot(count ~ spray, data = InsectSprays)boxplot(score ~ Alter, data=wow, col="lightgray")

?pairs!! ! ! ! ! # Viele Scatterplotspairs(USJudgeRatings)pairs(wow[c("KO","EN","TO","AL","NK","score")])

?barplot! ! ! ! ! # Barchartbarplot(VADeaths)barplot(1:10)barplot(matrix(1:9,3))barplot(table(Geschlecht, Zeitaufwand))

Page 130: R kurs so se 2010 uni bremen   m. heckmann

Code 63 : Grafiken III

?coplot! ! ! ! ! ! # condition plotcoplot(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)

Page 131: R kurs so se 2010 uni bremen   m. heckmann

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.

Page 132: R kurs so se 2010 uni bremen   m. heckmann

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.

Page 133: R kurs so se 2010 uni bremen   m. heckmann

Code 64 : Grafikoptionen ändern I

#### Grafikoptionen verändern ###

# Jede Funktion hat viele Parameter, die verändert # werden können

attach(wow)

plot(KO, score)plot(KO, score, xlab="Kontrollverlust", ylab="Suchtscore")plot(KO, score, main="Kontrollverlust vs. Sucht", ! xlab="Kontrollverlust", ylab="Suchtscore")plot(KO, score, col=3)plot(KO, score, col=3, pch=15)plot(KO, score, col=3, pch=15, cex=.5)plot(KO, score, col=3, pch=15, cex=.5)

Page 134: R kurs so se 2010 uni bremen   m. heckmann

Code 65 : Grafikoptionen ändern II?barplotbarplot(table(Geschlecht, Zeitaufwand))! ! # stacked

barplot(table(Geschlecht, Zeitaufwand), beside=TRUE)! # Gruppen nebeneinander

barplot(table(Geschlecht, Zeitaufwand), col=3:4, ! ! main="Zeitaufwand vs. Geschlecht") # Farbe und Überschrift

barplot(table(Geschlecht, Zeitaufwand), horiz=TRUE)!! # Gekippt

barplot(table(Geschlecht, Zeitaufwand), cex.names=.7) ! # Achsenbeschriftung kleinerbarplot(table(Geschlecht, Zeitaufwand), ! legend.text=c("männlich", "weiblich"),!cex.names=.8) # Legendedetach(wow)

Page 135: R kurs so se 2010 uni bremen   m. heckmann

Code 66 : Grafikbeispiel

#### iris dataset #######

?irishist(iris)pairs(iris[1:4])pairs(iris[1:4], pch=21) # Character ändernpairs(iris[1:4], pch=21, col=iris$Species) # Farben ändern

col <- c("red", "green3", "blue")[iris$Species]pairs(iris[1:4], pch=21, col=col) # Neue Farben

pairs(wow[c(24:28, 30)], col=meanSplitKO + 10) # Neue Farben WoW

Page 136: R kurs so se 2010 uni bremen   m. heckmann

Your turn!Erzeuge folgendes barchart mit der Funktion barplot()

mw

unter 1818−2930−4041−50über 50

Altersverteilung

Anzahl an Personen

Ges

chle

cht

0 50 100 150 200 250 300

Page 137: R kurs so se 2010 uni bremen   m. heckmann

Code 67 : base graphics I

### Einführung ins base Grafik System ###

# grafische Basiselemente?plot! ! ! ! ! ! ! # welche Optionen gibt es?! ! ! ! !set.seed(5)! ! ! ! ! ! # Ausgangspunkt für Zufallszahliq <- rnorm(30, 100, 15)! !pisa <- x*.5+10 + rnorm(30,0,1) # pisa aus iq plus Zufall

plot(iq, pisa)! ! ! ! # plotten von x gegen yplot(iq, pisa, pch=2)! ! ! # Ändern des Charactersplot(iq, pisa, pch=3)! ! ! # Ändern des Charactersplot(iq, pisa, type="h")! ! # Änderung des type Arguments

Page 138: R kurs so se 2010 uni bremen   m. heckmann

Code 68 : base graphics II

?linesplot(iq, pisa)! ! ! # plotten von x gegen ylines(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), col=3) # andere Farbe! ! !# die par() (Parameter) Einstellungenlines(x=c(60,130), y=c(40,80), col=3, lty=3, lwd=2)

Page 139: R kurs so se 2010 uni bremen   m. heckmann

Code 69 : base graphics III

?ablineplot(iq, pisa, col="brown", pch=16)!! # plotten von x gegen y

abline(v=mean(iq), col="grey", lty=2)! ! # vertikale Linine bei MW IQ

abline(h=mean(pisa), col="grey", lty=2)! ! # hor. Linie bei MW pisa

abline(v=c(90, 110), col="blue", lty=3)! ! !# vert Linie bei x=90 und x=110

abline(lm(pisa ~ iq))!!! ! ! ! ! # Regressionslinie pisa ~ iq

Page 140: R kurs so se 2010 uni bremen   m. heckmann

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.

●●

●●

●●

●●

●●

●●

●●

●●

●●

●●●

● ●

●●

●●

● ●

●●

●●

● ●

●●

● ●

●●

●●

●●

● ●●

● ●

1.0 1.5 2.0 2.5 3.0 3.5 4.0

1.0

1.5

2.0

2.5

3.0

3.5

Übung

negative Konsequenzen

Such

tsco

re

Page 141: R kurs so se 2010 uni bremen   m. heckmann

Code 70 : base graphics IV

?pointsplot(iq, pisa, type="n")! ! ! # plotten ohne Punktepoints(iq, pisa)! ! ! ! ! # Punkte hinzufügen

?text! ! ! ! ! ! ! ! ! # um Text hinzuzufügentext(72,78, "test text", col="blue")! # Text an Position (72,78)

?mtext!! ! ! ! ! ! ! ! # für margin textmtext(side=3, "test mtext", col="red")! # margin text oben

Page 142: R kurs so se 2010 uni bremen   m. heckmann

Code 70b : Grafische Bereiche

Page 143: R kurs so se 2010 uni bremen   m. heckmann

Code 71 : base graphics V

### par settings ###par()! ! ! ! ! # Parameter settings anschauenoldPar <- par()!! ! # Parameter settings speichernplot(1:10)! ! ! ! # einfacher plot

par(mar=c(4,4,4,8))!! # Margin verändernplot(1:10)! ! ! ! # einfacher plot

par(mfrow=c(1,2))! ! # mfrow ändernplot(1:10)! ! ! ! # plot 1plot(1:10)! ! ! ! # plot 2

par(oldPar)! ! ! ! # alte Parameter wieder laden

Page 144: R kurs so se 2010 uni bremen   m. heckmann

Your turn!Zeichne den plot score (auf y) gegen TO (auf x) (WoW Daten) und direkt daneben das Histogram von score. Nutze hierzu die par() Einstellung mfrow.Zusatzaufgabe: Füge dem plot vorher noch für den Fall mit dem größten und für kleinsten Suchtwert jeweils einen Punkt hinzu, der rot und gefüllt ist.

●●●

●●●

●●

●●

● ●

●●

●●

●●

●●

●●

●●

●●● ●●

●●●

●●

●●

●●

●●

●●

●●

●●

● ●

● ●

●●●

●●

●●

●●

●●

●●

●●

●●

●●

●●

●●

● ●●

●●

●●

●●

●●

● ●

●●

●●

●●

●●

●●

●●

●●

●●

●●

●●

●●

●● ●●

●●

●●

●●

●●

●●

●●

1.0 2.0 3.0 4.0

1.0

1.5

2.0

2.5

3.0

3.5

TO gegen score

TO

score

Histogram of score

score

Frequency

1.0 1.5 2.0 2.5 3.0 3.5

020

4060

Page 145: R kurs so se 2010 uni bremen   m. heckmann

Normskala IQ

Page 146: R kurs so se 2010 uni bremen   m. heckmann

Normskala R

●●

4050

6070

80

70 80 90 100 110 120 130

−2 −1 0 1 2

30 40 50 60 70

Pisa Ergebnisse geschätzt durch den IQ

IQ Werte

z−Werte

T−Werte

Page 147: R kurs so se 2010 uni bremen   m. heckmann

Code 72 : plot from scratch I# plot from scratcholdPar <- par()!! ! # alte Parameter speichernpar(oma=c(3,0,0,4))!! # outer margin verändern

plot(iq, pisa, type="n", axes=FALSE, ! # leerer plot xlab="", ylab="", xlim=c(70,130), ylim=c(39,81))rect(90, 0, 110, 100, col = "#FCF0F1", border=NA)! # Rechteck zeichnenpoints(iq, pisa, col="lightgrey", pch=16)! ! # Punkte hinzufügen

axis(side=2)!! ! ! ! ! ! ! ! # y-Achse axis(1, cex.axis=.8)! ! ! ! ! ! # x-Achse 1at <- c(70, 85, 100, 115, 130)! # Punkte der 2. x-Achseaxis(side=1, at=at, labels=-2:2, ! # 2. x-Achse! line=2.5, cex.axis=.8) axis(side=1, at=at, labels= ((at-100)/15)*10+50,! line=5, cex.axis=.8) # 3. x-Achse

Page 148: R kurs so se 2010 uni bremen   m. heckmann

abline(lm(pisa ~ iq), lty=2)!! ! # Regressionslinie

title(main="Pisa Ergebnisse geschätzt durch den IQ") # Titel

mtext(side=1, "IQ Werte", line=-.5, at=135, ! adj=0, cex=.8, col="darkgrey") # Text 1. Achsemtext(side=1, "z-Werte", line=2.0, at=135, ! ! ! adj=0, cex=.8, col="darkgrey") # Text 2. Achsemtext(side=1, "T-Werte", line=4.5, at=135, ! ! ! adj=0, cex=.8, col="darkgrey") # Text 3. Achse

par(oldPar) # Parameter settigs wiederherstellen

Code 73 : plot from scratch II

Page 149: R kurs so se 2010 uni bremen   m. heckmann

Code 73 : Grafik als Datei

### Grafik-Output in Datei erzeugen ###

jpeg()!! # öffnet einen jpeg devicebmp()! ! # öffnet einen bmp devicepdf()! ! # öffnet einen pdf devicepng()! ! # öffnet einen png device

pdf()! ! # pdf device öffnen plot(1:10)dev.off()!# device schließen

dev.list()! # welche devices sind noch offen?

Page 150: R kurs so se 2010 uni bremen   m. heckmann

Your turn!Übung in eine .pdf Datei aus. Da der Code noch existiert kann der plot ja schnell wiederhergestellt werden :)

Page 151: R kurs so se 2010 uni bremen   m. heckmann

● ● ●

1 2 3 4 5

12

34

5

pch Symbole von 1 bis 25

x

y

Your turn!Drucke alle pch Symbole von 1 bis 25 mit plot() in einem Raster. Jedes Symbol soll eine

verschiedene Farbe haben. Erstelle eine Überschrift. Es sollte in etwa so aussehen:

Page 152: R kurs so se 2010 uni bremen   m. heckmann

Code 74 : R Commander

############# R Commander ################ library(Rcmdr)Commander()

Page 153: R kurs so se 2010 uni bremen   m. heckmann

Es ist geschafft!

Page 154: R kurs so se 2010 uni bremen   m. heckmann

### Lösungen Your Turn! ###

Page 155: R kurs so se 2010 uni bremen   m. heckmann

> seq(10,1) [1] 10 9 8 7 6 5 4 3 2 1> rep(1,t=10) [1] 1 1 1 1 1 1 1 1 1 1> rep(c(1,2), t=5) [1] 1 2 1 2 1 2 1 2 1 2> rep(c(1,2), e=5) [1] 1 1 1 1 1 2 2 2 2 2> rep(1:4, 4:1) [1] 1 1 1 1 2 2 2 3 3 4

Your turn!Erzeuge folgende Vektoren, mit jeweils mit 10 Elementen

Page 156: R kurs so se 2010 uni bremen   m. heckmann

> paste(month.name, "is month number", 1:12)

"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"

Your turn!Erzeuge folgende Ausgabe in der Konsole, indem

Du paste() und die Konstante month.name nutzt.

Page 157: R kurs so se 2010 uni bremen   m. heckmann

Der Vektor v hat die Länge 5 Er besteht aus folgenden Elementen: 1 2 3 4 5

Tip: Benutze hierzu die Funktion cat() und length() und kombiniere Variablen und Text.

> cat("Der Vektor v hat die Länge", length(v), "\nEr besteht aus folgenden Elementen", v)

Your turn!Du hast folgenden Vektor: v <- c(1,2,3,4,5).

Erzeuge folgende Ausgabe in der Konsole:

Page 158: R kurs so se 2010 uni bremen   m. heckmann

> cat(paste(month.name, "is month number", 1:12, "\n"), sep="")

January is month number 1February is month number 2March is month number 3April is month number 4May is month number 5June is month number 6July is month number 7August is month number 8September is month number 9October is month number 10November is month number 11December is month number 12

Your turn!Erzeuge folgende Ausgabe in der Konsole, indem

Du cat(), paste() und die Konstant month.name nutzt.

Die Ausgabe soll nun pro Zeile erfolgen

Page 159: R kurs so se 2010 uni bremen   m. heckmann

x <- c(-2,-1,-1,0,1,1,2)y <- c(-1,-2,1,0,2,-1,1)

Your turn!Berechne die geschätzte Kovarianz für folgende

zwei Datenreihen in R „zu Fuß“

> sum((x-mean(x))*(y-mean(y)))/6> cov(x,y) ! ! # zur Kontrolle

Page 160: R kurs so se 2010 uni bremen   m. heckmann

Your turn!Lege ein Verzeichnis RCourse an und setze es als neues

Arbeitsverzeichnis. Lege eine Unterordner data an und wechsele in ihn. Wechsel anschließend wieder in den übergeordneten Ordner.

setwd("users/mark/RCourse")setwd("data")setwd("..")

Page 161: R kurs so se 2010 uni bremen   m. heckmann

x <- c(-2,-1,-1,0,1,1,2)y <- c(-1,-2,1,0,2,-1,1)

Your turn!Berechne die Korrelation für folgende zwei Datenreihen in R „zu Fuß“. Konstruiere die Lösung so, dass man x und y (gleich lang)

austauschen kann, ohne den Code sonst zu verändern.

> kovarianz <- sum((x-mean(x))*(y-mean(y)))/(length(x)-1)> kovarianz/(sd(x)*sd(y))> cor(x,y) ! ! # zur Kontrolle

Page 162: R kurs so se 2010 uni bremen   m. heckmann

Welche Regeln gibt es für die Benennung von Objekten?(s. Folie Objektbezeichnungen)Welche Regeln gibt es für leserlichen Code?

Welche Objektnamen sind erlaubt?a1234 JAausdruck JAVariable JA.Variable JAVariable. JA_Variable NEINVariable_ JA1teVariable NEIN.1Variable NEIN

Überlege was folgende Ausdrücke ergeben:11 %% 51:6 %% 211 %/% 510:19 %/% 5

Quiz 1 !

Page 163: R kurs so se 2010 uni bremen   m. heckmann

Überlege was folgende Ausdrücke ergeben:

11 %% 51:6 %% 2

11 %/% 510:19 %/% 5

T & F | TT | (T | F)(T | T) & (T | F)c(T, F) | c(F, T)

xor(T, F)xor(c(T,F), c(F,F))

!any(T)any(c(T, F) | c(F, T))which(c(T, F) | c(F, T))

Quiz 2 !

Page 164: R kurs so se 2010 uni bremen   m. heckmann

Überlege was folgende Ausdrücke ergeben:

1:5 > 2c(-1,2,3,5) == min(c(-1,2,3,5))

6 + 1:46:1 - 3:1

3*FALSE - TRUE*5c(T,F,T,F,T) == 1c(T,F,T,F,T) == FALSE

x <- c(1,5,2,0,6,2,9) Suche die Stelle des Vektors x raus, der zu der niedrigsten Zahl sowie zu der höchste Zahl gehört. Ordne die beiden Werte dann in einem Vektor an.

> c(which.min(x), which.max(x))

Quiz 3 !

Page 165: R kurs so se 2010 uni bremen   m. heckmann

Überlege was folgende Ausdrücke ergeben:

seq(10, 1, -1)seq(10, 1, 1)rep(1:3, times=3:1)rep(rep(1:2, t=1:2), t=1:3)rep(1:3, l=5)LETTERS[2:4]

Erzeuge folgende Vektoren:> letters[seq(1,26,2)] # oder alternativ> letters[c(T,F)][1] "a" "c" "e" "g" "i" "k" "m" "o" "q" "s" "u" "w" "y"[1] "B=2" "D=4" "F=6" "H=8" "J=10"

Erzeuge einen Vektoren mit NV Zufallszahlen der Länge 10 und runde ihn auf eine Dezimalstelle.> round(rnorm(10),1)

Quiz 4 !

Page 166: R kurs so se 2010 uni bremen   m. heckmann

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)

> x[x==99 | x==999] <- NA> x [1] 1 4 3 NA 4 3 NA NA 3 6 NA

Your Turn!

Page 167: R kurs so se 2010 uni bremen   m. heckmann

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

> v[v<=3] <- 0> v[v>=4 & v<=7] <- 1> v[v>7] <- NA> v [1] 0 0 0 1 1 1 1 NA NA NA

Your Turn!

Page 168: R kurs so se 2010 uni bremen   m. heckmann

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

Quelle: Foliensatz von Peter Ruckdeschel / Matthias Kohl. R/S-plus für Einsteiger und Fortgeschrittene

Your Turn!

> z1 <- 1:20> z2 <- seq(2,40,2)> z3 <- rep(1:2, e=10)> z4 <- rep(1:2, e=2, t=5)> z5 <- rep(1:6, c(2,2,2,4,4,6))> z6 <- rep(rep(1:3, c(1,3,6)), 2)> m <- matrix(c(z1, z2, z3, z4, z5, z6), ncol=20, byrow=T)> m

Page 169: R kurs so se 2010 uni bremen   m. heckmann

Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov DecWoche 1 0 0 1 1 0 3 0 -1 0 -1 -1 0Woche 2 -2 -1 1 0 0 0 1 1 2 -2 -1 -1Woche 3 -1 2 -1 -1 -3 0 3 3 1 -1 0 -1Woche 4 1 0 -2 0 0 0 1 2 1 0 0 0Woche 5 1 1 1 -2 0 -1 1 0 -2 0 0 -2Woche 6 0 0 0 -1 -1 0 0 1 1 1 -1 0Woche 7 1 1 -1 -1 -1 0 0 0 0 -1 1 -1Woche 8 0 1 -3 0 -1 1 2 0 -1 0 0 0Woche 9 -1 0 0 0 -1 0 0 0 2 -1 0 1

...

> m <- round(matrix(rnorm(20*12), ncol=12), 0) > colnames(m) <- month.abb > rownames(m) <- paste("Woche", 1:20) > m

Your turn!Erstelle folgende Matrix (mit zufälligen Werten):

Tip: nutze rnorm() und round()

Page 170: R kurs so se 2010 uni bremen   m. heckmann

1) Erzeuge eine Matrix M mit 7 Spalten und 7 Zeilen aus zufälligen NV-Werten, die auf eine Stelle gerundet werden.

2) Folgende Zellen sollen nun durch 999 ersetzt werden:(1,1) (4,3) (4,4) (1,7)

3) Alle Einträge die 999 enthalten sollen NA gesetzt werden.

Your Turn!

M <- matrix(round(rnorm(7*7),1), ncol=7)M[1,1] <- 999M[4,3] <- 999M[4,4] <- 999M[1,7] <- 999M[M==999] <- NA

Page 171: R kurs so se 2010 uni bremen   m. heckmann

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!

Your turn!Berechne die Matrix b der Regression y

regridiert auf x in Matrizenform

X <- cbind(rep(1,7), x)! ! # Design Matrix erstellenY <- ysolve(t(X)%*% X)%*%t(X)%*%Y # Berechnunglm(y~x) # zur Kontrolle

Page 172: R kurs so se 2010 uni bremen   m. heckmann

> f <- factor(rep(4:1, 4:1))> levels(f) <- paste("Gruppe", 1:4)

[1] Gruppe 4 Gruppe 4 Gruppe 4 Gruppe 4 Gruppe 3 Gruppe 3 Gruppe 3 Gruppe 2 Gruppe 2 Gruppe 1Levels: Gruppe 1 Gruppe 2 Gruppe 3 Gruppe 4

Your turn!Erzeuge einen factor der folgenden Form:

Page 173: R kurs so se 2010 uni bremen   m. heckmann

> e1 <- LETTERS[1:13]> e2 <- "Ich bin das zweite Element"> e3 <- matrix(round(rnorm(5*5),1), ncol=5)> l <- list(e1,e2,e3)> l[[1]] [1] "A" "B" "C" "D" "E" "F" "G" "H" "I" "J" "K" "L" "M"

[[2]][1] "Ich bin das zweite Element"

[[3]] [,1] [,2] [,3] [,4] [,5][1,] 0.9 0.3 0.5 0.6 2.4[2,] -0.9 -0.7 1.5 -1.1 -1.2[3,] -1.2 0.9 0.4 -1.7 0.2[4,] -0.4 -0.1 0.2 0.0 0.8[5,] 1.3 -1.1 -0.7 0.0 1.1

Your turn!Erstelle eine Liste l, bei der: a) das erste Element ein Vektor der Großbuchstaben A bis M ist b) das zweite Element die Zeichenkette "Ich bin das zweite Element" c) das dritte Element eine Matrix (5x5) mit zufälligen Werten mit 1 Dezimalkommastelle enthält.

Page 174: R kurs so se 2010 uni bremen   m. heckmann

> names(l) <- c("Buchstaben", "Text", "Matrix")> l$Matrix[l$Matrix < 0] <- NA> l$Buchstaben <- l$Buchstaben[1:6]> l <- l[c(1,3,2)]> l$Buchstaben[1] "A" "B" "C" "D" "E" "F"

$Matrix [,1] [,2] [,3] [,4] [,5][1,] 0.7 0.5 NA 0.8 0.7[2,] NA 0.9 NA NA 1.5[3,] NA 1.3 1.3 NA NA[4,] 0.7 NA 1.1 NA 0.0[5,] NA 1.1 NA NA 1.6

$Text[1] "Ich bin das zweite Element"

Your turn!Füge nun noch folgende Namen zu den Listenelementen hinzu:Buchstaben, Text, Matrix.Dann ändere alle Einträge der Matrix, die kleiner als 0 sind, in NAs um, kürze den Vektor Buchstaben auf A bis F und kehre die Reihenfolge der letzten beiden Listenelemente um.

Page 175: R kurs so se 2010 uni bremen   m. heckmann

Geschlecht Intervention IQ BMI1 m Control 94.8 22.52 m Treat 113.1 19.63 m Placebo 107.1 24.34 m Control 108.8 9.25 m Treat 102.4 24.56 m Placebo 104.8 23.07 m Control 90.6 17.9

...> f1 <- factor(rep(c("m", "w"), each=10))> f2 <- factor(rep(c("Control", "Treat", "Placebo"), l=20))> r1 <- round(rnorm(20)*15+100, 1)> r2 <- round(rnorm(20, mean=20, sd=5), 1)> d <- data.frame(Geschlecht=f1, Intervention=f2, IQ=r1, BMI=r2)> d

Your turn! konstruiere folgenden data frame:

(IQ normalverteilt um 100 mit sd=15; BMI normalverteilt um 20, sd=5)

Page 176: R kurs so se 2010 uni bremen   m. heckmann

Kehre die Elemente des folgenden Vektors umv <- rep(1:3, 3:1)v[6:1] [1] 1 1 1 2 2 3

Schreibe dann eine Befehlsfolge, die die Reihenfolge der Elemente eines beliebigen Vektors umkehrt, also auch funktioniert, wenn der Vektor ein anderer istv[length(v):1] # oder auch: rev(v)

Erzeuge folgenden data frame mit beliebigen Werten

IQ schulnote1 95.9 32 83.0 23 104.7 4...> d1 <- data.frame(IQ=round(rnorm(10), 1), ! schulnote=round(rnorm(10), 1))> d1

Quiz 1 !

Page 177: R kurs so se 2010 uni bremen   m. heckmann

Ändere folgende Zellen des data frame in NA: (1,1) (5,2)d1[1,1] <- NAd1[5,2] <- NA

Füge eine Spalte an, in dem sich 0 und 1 abwechseln an den data frame an und gib ihr den Namen "dummy"d1 <- cbind(d1, dummy=0:1)

Erzeuge eine Liste, die den data frame als ersten Eintrag enthältl1 <- list(d1)

Ändere nun die Zelle (2,2) des data frames (erstes Listenelement) in der Liste auf NAl1[[1]][2,2] <- NA

Quiz 2 !

Page 178: R kurs so se 2010 uni bremen   m. heckmann

IQ BMI Geschlecht Intervention1 109.9 18.9 m Control3 101.2 18.7 m Placebo5 111.4 14.7 m Treat7 104.6 17.3 m Control9 103.7 24.9 m Placebo11 97.1 16.0 w Treat

...

> d[c(seq(1,19,2), seq(2,20,2)), c(3,4,1,2)]!! !> # oder auch> rbind(d[c(T,F),c(3,4,1,2)], d[c(F,T),c(3,4,1,2)])

Your turn!baue den vorher erzeugten Datensatz um: a) erst die

ungeraden, dann die geraden Zeilen kommen b) neue Spaltenreihenfolge

Page 179: R kurs so se 2010 uni bremen   m. heckmann

Geschlecht Intervention IQ BMI11 w Treat 123.8 21.514 w Treat 96.3 28.517 w Treat 104.3 20.420 w Treat 94.8 14.5

> d[d$Intervention == "Treat" & d$Geschlecht=="w" ,]

Your turn!Wähle aus dem Datensatz alle Fälle aus, die weiblich sind

und zur Treatmentgruppe gehören

Page 180: R kurs so se 2010 uni bremen   m. heckmann

Geschlecht Intervention IQ BMI1 m Control 109.9 18.92 m Treat 109.1 18.74 m Control 110.1 18.05 m Treat 111.4 14.76 m Placebo 110.3 22.28 m Treat 123.5 23.210 m Control 107.6 17.8

> d[d$IQ > 90 & d$IQ < 110 & d$Geschlecht=="m" ,]

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

Page 181: R kurs so se 2010 uni bremen   m. heckmann

Geschlecht Intervention IQ BMI1 m Control 102.5 16.72 m Treat 102.3 18.93 m Placebo 101.8 18.25 m Treat 106.7 21.010 m Control 118.9 15.711 w Treat 123.8 21.512 w Placebo 104.8 24.4...

> subset(d, IQ > mean(IQ))

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.

Page 182: R kurs so se 2010 uni bremen   m. heckmann

Geschlecht Intervention IQ BMI6 m Placebo 84.5 22.27 m Control 80.7 13.810 m Control 118.9 15.711 w Treat 123.8 21.516 w Control 78.9 25.6

> subset(d, (IQ < 90 | IQ > 110))

Your turn!Wähle aus dem Datensatz mit subset alle Fälle aus, die a) einen IQ

außerhalb des Durchschnitts (90-110) haben.

... und b) zugleich weiblich sind

Geschlecht Intervention IQ BMI11 w Treat 123.8 21.516 w Control 78.9 25.6

> subset(d, (IQ < 90 | IQ > 110) & Geschlecht=="w")

Page 183: R kurs so se 2010 uni bremen   m. heckmann

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.

setwd("/Users/mark/RCourse/data")wow <- read.csv2("wow_excerpt.csv")attach(wow)detach(wow)library(psych)describe(wow)detach(package:psych)

Page 184: R kurs so se 2010 uni bremen   m. heckmann

Your turn!Lies den Datensatz wow_excerpt.csv ein und durchlaufe die Schritte:a) missings NA setzenb) Faktoren in Faktoren verwandeln und benennenc) Skala berechnend) eine Variable (0,1) anlegen, die KO am mean splittete) einen Gesamtwert berechnen über die fünf Skalen namens „score“, der der Durchschnitt der Skalen KO, EN, TO, AL, NK ist.

Page 185: R kurs so se 2010 uni bremen   m. heckmann

# Gibt es keine Ahnung Antworten (wie k.A.), die noch nicht als Missing kodiert sind?wow$Geschlecht[wow$Geschlecht==1] <- NA! ! # 1 zu NA umkodierenwow$Zeitaufwand[wow$Zeitaufwand==1] <- NA! # 1 zu NA umkodierenwow$Alter[wow$Alter==1] <- NA!! ! ! # 1 zu NA umkodieren

# Sind alle qualitativen Merkmale als Faktoren definiert?wow$Geschlecht <- as.factor(wow$Geschlecht)! # in Faktor umwandelnlevels(wow$Geschlecht) <- c("m", "w")!! ! # Faktorstufen bennenen

wow$Alter <- as.factor(wow$Alter)!! ! ! # in Faktor umwandelnlevels(wow$Alter) <- c("unter 18", "18-29", "30-40", "41-50", "über 50" )! # Faktorstufen bennenen

wow$Zeitaufwand <- as.factor(wow$Zeitaufwand)! # in Faktor umwandelnlevels(wow$Zeitaufwand) <- c(">7 Std.", "> 14 Std.", "> 20 Std.", ! ! ! ! ! ! ! "20-30 Std.", "30-40 Std.", "> 40 Std.")! !

# Neue Variablen berechnenwow <- transform(wow, KO=(K1 + K2 + K3 + K4)/4) # neue Variable KO mit tranformwow <- 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

# Dummy Variablen anlegen (mehrere Varianten)wow$meanSplitKO <- as.numeric(wow$KO > mean(wow$KO, n=T)) # split am mean

Page 186: R kurs so se 2010 uni bremen   m. heckmann

Your turn!Mache folgende Häufigkeitstabellen für den wow Datensatz mit CrossTable:1) Alter gegen Zeitaufwand2) Geschlecht gegen Zeitaufwand

library(gmodels)attach(wow)CrossTable(Zeitaufwand, Alter)CrossTable(Zeitaufwand, Geschlecht)detach(wow)

Page 187: R kurs so se 2010 uni bremen   m. heckmann

Your turn!Nutze den Datensatz anscombe und berechne eine Regression von y1 auf x1.Plotte die Werte und zeichne die Regressionsgerade ein.

attach(anscombe)! ! # anscombe Datensatz anhängenlm1 <- lm(y1 ~ x1)!! # lineares Modellplot(x1, y1)!! ! # Werte druckenabline(lm1)! ! ! ! # Regressionslinie hinzufügendetach(anscombe)! ! # anscombe Datensatz aushängen

Page 188: R kurs so se 2010 uni bremen   m. heckmann

Your turn!Nutze den Datensatz InsectSprays. Dieser enthält Zählungen von Insekten bei der Nutzung verschiedener Insektensprays.

Schaue, ob sich count über die Faktorstufen von sprays unterscheiden.

Mache einen plot der Mittelwerte und als post-hoc Testeinen Tukey-Test sowie paarweise t-Tests mit Bonferroni Korrektur.

Page 189: R kurs so se 2010 uni bremen   m. heckmann

?InsectSpraysaovobj <- aov(count ~ spray, data = InsectSprays)summary(aovobj)attach(InsectSprays)! ! # Daten InsectSprays anhängenTukeyHSD(aovobj)! ! ! # Tukey Testplotmeans(count ~ spray)! # mean plot mit CI-grenzenpairwise.t.test(count, spray)! # paarweise t-Testspairwise.t.test(count, spray, p.adj = "bonferroni") ! # mit Alpha-Korrekturdetach(InsectSprays)! ! # Daten InsectSprays aushängen

Page 190: R kurs so se 2010 uni bremen   m. heckmann

Your turn!Lade die .csv Datei fa_daten.csv und mache mit ihr eine Faktorenanalyse.

x <- read.csv("fa_daten.csv")fit <- factanal(x, 3, rotation="varimax")fitprint(fit, digits=2, cutoff=.3, sort=FALSE)

Page 191: R kurs so se 2010 uni bremen   m. heckmann

Your turn!Erzeuge einen conditioned plot (coplot) von score (y-Achse) gegen KO(x-Achse) konditioniert mit dem Faktor Zeitaufwand.

coplot(score ~ AL | Zeitaufwand, data=wow)

Mache dann einen weiteren Plot mit den beiden konditionalen Faktoren Zeitaufwand und Geschlecht.

coplot(score ~ AL | Zeitaufwand * Geschlecht, data=wow)

Page 192: R kurs so se 2010 uni bremen   m. heckmann

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.

dotchart(table(Geschlecht, Alter))barplot(table(Geschlecht, Alter))

Page 193: R kurs so se 2010 uni bremen   m. heckmann

Your turn!Erzeuge folgendes barchart mit der Funktion barplot()

mw

unter 1818−2930−4041−50über 50

Altersverteilung

Anzahl an Personen

Ges

chle

cht

0 50 100 150 200 250 300

barplot(table(Alter, Geschlecht), ! ! legend.text=levels(Alter), ! ! cex.names=.8, col=2:8, border=NA, ! ! main="Altersverteilung", xlab="Anzahl an Personen",! ! ylab="Geschlecht",! ! horiz=TRUE)

Page 194: R kurs so se 2010 uni bremen   m. heckmann

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.

●●

●●

●●

●●

●●

●●

●●

●●

●●

●●●

● ●

●●

●●

● ●

●●

●●

● ●

●●

● ●

●●

●●

●●

● ●●

● ●

1.0 1.5 2.0 2.5 3.0 3.5 4.0

1.0

1.5

2.0

2.5

3.0

3.5

Übung

negative Konsequenzen

Such

tsco

re

attach(wow)plot(AL, score, col="blue", main="Übung", xlab="negative Konsequenzen", ylab="Suchtscore") abline(v=mean(AL, n=T), lty=2)abline(h=mean(score, n=T), lty=2)abline(lm(score ~ AL), col=red)detach(wow)

Page 195: R kurs so se 2010 uni bremen   m. heckmann

Your turn!Zeichne den plot score (auf y) gegen TO (auf x) (WoW Daten) und direkt daneben das Histogram von score. Nutze hierzu die par() Einstellung mfrow.Zusatzaufgabe: Füge dem plot vorher noch für den Fall mit dem größten und für kleinsten Suchtwert jeweils einen Punkt hinzu, der rot und gefüllt ist.

●●●

●●●

●●

●●

● ●

●●

●●

●●

●●

●●

●●

●●● ●●

●●●

●●

●●

●●

●●

●●

●●

●●

● ●

● ●

●●●

●●

●●

●●

●●

●●

●●

●●

●●

●●

●●

● ●●

●●

●●

●●

●●

● ●

●●

●●

●●

●●

●●

●●

●●

●●

●●

●●

●●

●● ●●

●●

●●

●●

●●

●●

●●

1.0 2.0 3.0 4.0

1.0

1.5

2.0

2.5

3.0

3.5

TO gegen score

TO

score

Histogram of score

score

Frequency

1.0 1.5 2.0 2.5 3.0 3.5

020

4060

attach(wow)par(mfrow=c(1,2))plot(TO, score, main="TO gegen score")minmax <- c(which.min(score), which.max(score))points(TO[minmax], score[minmax], col="red", pch=16)hist(score)detach(wow)

Page 196: R kurs so se 2010 uni bremen   m. heckmann

Your turn!Übung in eine .pdf Datei aus. Da der Code noch existiert kann der plot ja schnell wiederhergestellt werden :)

pdf()attach(wow)par(mfrow=c(1,2))plot(TO, score, main="TO gegen score")minmax <- c(which.min(score), which.max(score))points(TO[minmax], score[minmax], col="red", pch=16)hist(score)detach(wow)dev.off()

Page 197: R kurs so se 2010 uni bremen   m. heckmann

● ● ●

1 2 3 4 5

12

34

5

pch Symbole von 1 bis 25

x

y

Your turn!Drucke alle pch Symbole von 1 bis 25 mit plot() in einem Raster. Jedes Symbol soll eine

verschiedene Farbe haben. Erstelle eine Überschrift. Es sollte in etwa so aussehen:

x <- rep(1:5, 5)y <- rep(1:5, each=5)plot(x, y, pch=1:(5*5), col=1:25, cex=3, xlim=c(0.8, 5.2), ylim=c(0.8, 5.2), main="pch Symbole von 1 bis 25")