SlideShare ist ein Scribd-Unternehmen logo

R-Kurs Mark Heckmann WiSe 2010-2011 Uni Bremen

R course for the Bachelor in Psychology at University of Bremen, Germany during winter term 2010/11.

1 von 217
Downloaden Sie, um offline zu lesen
Einführung in
das R Frame-
work




Mark Heckmann
Universität Bremen
WiSe 2010/11         1
Was erwarten wir von dem Kurs?


• Von vorne abholen / Grundlagen
• Grafiken erstellen
• Datensätze speichern / erstellen
• Weniger und genauer statt viel oberflächlich

                                                2
„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
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
R-Appetizer




              4
●
                                                                                Jaw-drop
                                                                                         ping
                     ●
         ●



                                                                                  graphics
                                                                                           !
     5




                                 ●
     4
             ●                               ●
                         ●
                                     ●

                 ●   ●                                                                           factor(cyl)
                          ●
                         ●               ●● ● ●                                                   ●   4
wt




                             ●
                                                           ●       ●
                                                                                                  ●   6
                                                               ●

     3
                                                                                                  ●   8
                                                       ●
                                                  ●        ●

                                                       ●

                                                           ●

                                                               ●
                                                                                         ●
                                                                            ●

     2                                                                          ●
                                                                                             ●


                                                                                     ●
                                                                                     ●




                     15                           20
                                                       mpg
                                                                       25           30                         5

Recomendados

The OpenRepGrid project – Software tools for the analysis and administration...
The OpenRepGrid project – Software tools  for the analysis and administration...The OpenRepGrid project – Software tools  for the analysis and administration...
The OpenRepGrid project – Software tools for the analysis and administration...Mark Heckmann
 
R Knitr - generating reports
R Knitr - generating reportsR Knitr - generating reports
R Knitr - generating reportsMark Heckmann
 
R kurs so se 2010 uni bremen m. heckmann
R kurs so se 2010 uni bremen   m. heckmannR kurs so se 2010 uni bremen   m. heckmann
R kurs so se 2010 uni bremen m. heckmannMark Heckmann
 
Comparing interactive online and face-to-face repertory grid interviews in te...
Comparing interactive online and face-to-face repertory grid interviews in te...Comparing interactive online and face-to-face repertory grid interviews in te...
Comparing interactive online and face-to-face repertory grid interviews in te...Mark Heckmann
 
Übersicht Glm Workshop 2009
Übersicht Glm Workshop 2009Übersicht Glm Workshop 2009
Übersicht Glm Workshop 2009Mark Heckmann
 

Más contenido relacionado

Mehr von Mark Heckmann

A new development in the hierarchical clustering of repertory grid data
A new development in the hierarchical clustering of repertory grid dataA new development in the hierarchical clustering of repertory grid data
A new development in the hierarchical clustering of repertory grid dataMark Heckmann
 
OpenRepGrid and Friends
OpenRepGrid and FriendsOpenRepGrid and Friends
OpenRepGrid and FriendsMark Heckmann
 
The Model I Love - Lyrics (performed at Bremen University, Germany, June, 2013)
The Model I Love - Lyrics (performed at Bremen University, Germany, June, 2013)The Model I Love - Lyrics (performed at Bremen University, Germany, June, 2013)
The Model I Love - Lyrics (performed at Bremen University, Germany, June, 2013)Mark Heckmann
 
OpenRepGrid – An Open Source Software for the Analysis of Repertory Grids
OpenRepGrid – An Open Source Software for the Analysis of Repertory GridsOpenRepGrid – An Open Source Software for the Analysis of Repertory Grids
OpenRepGrid – An Open Source Software for the Analysis of Repertory GridsMark Heckmann
 
Standardizing inter-element distances in repertory grids
Standardizing inter-element distances in repertory gridsStandardizing inter-element distances in repertory grids
Standardizing inter-element distances in repertory gridsMark Heckmann
 

Mehr von Mark Heckmann (6)

Knitr Formeln - R
Knitr Formeln - RKnitr Formeln - R
Knitr Formeln - R
 
A new development in the hierarchical clustering of repertory grid data
A new development in the hierarchical clustering of repertory grid dataA new development in the hierarchical clustering of repertory grid data
A new development in the hierarchical clustering of repertory grid data
 
OpenRepGrid and Friends
OpenRepGrid and FriendsOpenRepGrid and Friends
OpenRepGrid and Friends
 
The Model I Love - Lyrics (performed at Bremen University, Germany, June, 2013)
The Model I Love - Lyrics (performed at Bremen University, Germany, June, 2013)The Model I Love - Lyrics (performed at Bremen University, Germany, June, 2013)
The Model I Love - Lyrics (performed at Bremen University, Germany, June, 2013)
 
OpenRepGrid – An Open Source Software for the Analysis of Repertory Grids
OpenRepGrid – An Open Source Software for the Analysis of Repertory GridsOpenRepGrid – An Open Source Software for the Analysis of Repertory Grids
OpenRepGrid – An Open Source Software for the Analysis of Repertory Grids
 
Standardizing inter-element distances in repertory grids
Standardizing inter-element distances in repertory gridsStandardizing inter-element distances in repertory grids
Standardizing inter-element distances in repertory grids
 

Último

Präpositionen mit Genitiv - Arbeitsblatt zur PPt
Präpositionen mit Genitiv - Arbeitsblatt zur PPtPräpositionen mit Genitiv - Arbeitsblatt zur PPt
Präpositionen mit Genitiv - Arbeitsblatt zur PPtMaria Vaz König
 
Präpositionen mit Genitiv - interaktive Power Point
Präpositionen mit Genitiv - interaktive Power PointPräpositionen mit Genitiv - interaktive Power Point
Präpositionen mit Genitiv - interaktive Power PointMaria Vaz König
 
Opfervermeidungsstrategien - Wie kann ich mich schützen? Comic für Kids und T...
Opfervermeidungsstrategien - Wie kann ich mich schützen? Comic für Kids und T...Opfervermeidungsstrategien - Wie kann ich mich schützen? Comic für Kids und T...
Opfervermeidungsstrategien - Wie kann ich mich schützen? Comic für Kids und T...LUCO KIDS® - clever und stark
 
Einfach Grammatik Übungsgrammatik Deutsch A1 bis B1.pdf
Einfach Grammatik Übungsgrammatik Deutsch A1 bis B1.pdfEinfach Grammatik Übungsgrammatik Deutsch A1 bis B1.pdf
Einfach Grammatik Übungsgrammatik Deutsch A1 bis B1.pdfHuongNguyen849459
 
Ein Schultag voller Abenteuer Spannende Schulgeschichten
Ein Schultag voller Abenteuer Spannende SchulgeschichtenEin Schultag voller Abenteuer Spannende Schulgeschichten
Ein Schultag voller Abenteuer Spannende SchulgeschichtenOlenaKarlsTkachenko
 
Wie man ein gutes Paper (für das LEGO-Praktikum) schreibt
Wie man ein gutes Paper (für das LEGO-Praktikum) schreibtWie man ein gutes Paper (für das LEGO-Praktikum) schreibt
Wie man ein gutes Paper (für das LEGO-Praktikum) schreibtMathias Magdowski
 

Último (6)

Präpositionen mit Genitiv - Arbeitsblatt zur PPt
Präpositionen mit Genitiv - Arbeitsblatt zur PPtPräpositionen mit Genitiv - Arbeitsblatt zur PPt
Präpositionen mit Genitiv - Arbeitsblatt zur PPt
 
Präpositionen mit Genitiv - interaktive Power Point
Präpositionen mit Genitiv - interaktive Power PointPräpositionen mit Genitiv - interaktive Power Point
Präpositionen mit Genitiv - interaktive Power Point
 
Opfervermeidungsstrategien - Wie kann ich mich schützen? Comic für Kids und T...
Opfervermeidungsstrategien - Wie kann ich mich schützen? Comic für Kids und T...Opfervermeidungsstrategien - Wie kann ich mich schützen? Comic für Kids und T...
Opfervermeidungsstrategien - Wie kann ich mich schützen? Comic für Kids und T...
 
Einfach Grammatik Übungsgrammatik Deutsch A1 bis B1.pdf
Einfach Grammatik Übungsgrammatik Deutsch A1 bis B1.pdfEinfach Grammatik Übungsgrammatik Deutsch A1 bis B1.pdf
Einfach Grammatik Übungsgrammatik Deutsch A1 bis B1.pdf
 
Ein Schultag voller Abenteuer Spannende Schulgeschichten
Ein Schultag voller Abenteuer Spannende SchulgeschichtenEin Schultag voller Abenteuer Spannende Schulgeschichten
Ein Schultag voller Abenteuer Spannende Schulgeschichten
 
Wie man ein gutes Paper (für das LEGO-Praktikum) schreibt
Wie man ein gutes Paper (für das LEGO-Praktikum) schreibtWie man ein gutes Paper (für das LEGO-Praktikum) schreibt
Wie man ein gutes Paper (für das LEGO-Praktikum) schreibt
 

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
  • 6. Jaw-drop ping ● ● graphics ! 5 ● 4 ● ● ● ● ● ● factor(cyl) ● ● ●● ● ● ● 4 wt ● ● ● ● 6 ● 3 ● 8 ● ● ● ● ● ● ● ● 2 ● ● ● ● 15 20 mpg 25 30 5
  • 7. 1.2 1.0 0.8 mpaa density NC−17 PG 0.6 PG−13 R 0.4 0.2 0.0 2 4 rating 6 8 10 6
  • 8. 0.6 0.5 0.4 cut Fair density Good 0.3 Very Good Premium Ideal 0.2 0.1 0.0 56 58 60 62 depth 64 66 68 70 7
  • 9. 8
  • 10. 9 http://learnr.wordpress.com/2009/04/09/ggplot2-sales-dashboard/
  • 12. 11
  • 13. Revenue Profit $200k $50k Sales Dashboard $40k All Currency in USD http://learnr.wordpress.com/2009/04/09/ggplot2-sales-dashboard/ $150k $30k $100k $20k $50k $10k $0 $0 Q1 Q2 Q3 Q4 Q1 Q2 Q3 Q4 Order Size New Customers Customer Satisfaction Market Share On−Time Delivery 400 400 3.0 25% 80% 2.5 20% 300 300 2.0 60% 15% 200 200 1.5 40% 1.0 10% 100 100 0.5 5% 20% 0 0 0.0 0% 0% Q1 Q2 Q3 Q4 Q1 Q2 Q3 Q4 Q1 Q2 Q3 Q4 Q1 Q2 Q3 Q4 Q1 Q2 Q3 Q4 Chardonnay Cabernet Merlot Sauvignan Blanc Zinfandel $100k $100k $100k $100k $100k $80k $80k $80k $80k $80k $60k $60k $60k $60k $60k $40k $40k $40k $40k $40k $20k $20k $20k $20k $20k $0 $0 $0 $0 $0 Q1 Q2 Q3 Q4 Q1 Q2 Q3 Q4 Q1 Q2 Q3 Q4 Q1 Q2 Q3 Q4 Q1 Q2 Q3 Q4 North America Asia Europe Middle East South America $100k $100k $100k $100k $100k $80k $80k $80k $80k $80k $60k $60k $60k $60k $60k $40k $40k $40k $40k $40k $20k $20k $20k $20k $20k $0 $0 $0 $0 $0 Q1 Q2 Q3 Q4 Q1 Q2 Q3 Q4 Q1 Q2 Q3 Q4 Q1 Q2 Q3 Q4 Q1 Q2 Q3 Q4 Sales Pipeline Top 10 Customers Probability Happy Hour Middle East of Sale Cheers Barrel and Keg South America 25% American Vintner's Best Sips and Bites Asia 50% The Beverage Company Spirits of the Age Europe 75% Fruit of the Vine 12 Wines 'R Us North America 90% The Big Wine Store $0 $2k $4k $6k $8k $10k$12k$14k $0 $20k $40k $60k $80k
  • 14. 13
  • 15. 14
  • 16. DAY 1 Learning grammar - Basics of the R language 15
  • 17. Erster Ta g= Hürde ne hmen 16
  • 18. 17
  • 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
  • 23. Code : Arithmetik ### Grundlegende arithmetische Operatoren ### 4 + 4! ! ! ! ! # Addition 4 - 1! ! ! ! # Subtraktion 4 / 2! ! ! ! ! # Division 2 * 2! ! ! ! ! # Multiplikation 2^2 ! ! ! ! # ! Potenz 2 ** 2!! ! ! # ! alternative für Potenz 5 %/% 2 ! ! ! # ! Ganzzahlige Division 5 %% 2!! ! ! # ! Modulo Division 2 + 2 * 3!! ! # ! Rechenregeln werden beachtet 2 * 2^3! ! ! # ! (2-1) * (2+2)! ! # Klammern können gesetzt werden wo nötig 22
  • 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
  • 27. Code : Bezeichnung & Stil neueVariable1 <- 7 neueVariable2=neueVariable1+2! ! # kaum lesbar! schlechter ! ! ! ! ! ! ! ! ! ! ! # Stil! neueVariable2 <- neueVariable1 + 2! # besser, sauber getrennt Ein R-Styleguide http://google-styleguide.googlecode.com/svn/trunk/google-r- style.html 26
  • 28. Code : Logik I # Logische Operationen 1 == 2! ! ! ! # logischer Vergleich 1 != 2 ! ! ! # ist ungleich? 1 > 2 ! ! ! ! # 1 größer 2? 1 >= 2 ! ! ! # 1 größer gleich 2? 1 < 2 ! ! ! ! # 1 kleiner 2 1 <= 2 ! ! ! # 1 kleiner gleich 2 ! 1 <= 2! ! ! # Negierung von 1 kleiner gleich 2 # logisches UND TRUE & TRUE! ! # TRUE TRUE & FALSE!! # FALSE FALSE & TRUE!! # FALSE FALSE & FALSE! # FALSE 27
  • 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
  • 38. Your turn! Erzeuge folgende Vektoren, mit jeweils mit 10 Elementen [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 37
  • 39. Code : Wichtige Funktionen # Wichtige Funktionen a <- c(1.2, 3.3, 6.1, 4.6) max()! ! # Maximum min()! ! # Minimum sqrt()!! # Quadratwurzel round()! ! # runden sum()! ! # Summe mean()!! # Mittelwert length()! # Länge des Vektors rnorm()! ! # zufällige NV Werte generieren 38
  • 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
  • 42. Code : Strings # Umgang mit Strings / Zeichen ?paste! ! ! ! ! # Konvertierung in characters und verbinden paste(1)! ! ! ! ! ! ! ! ! ! ! ! paste(1:3) paste(1, "A") paste(c(1:3), c("A", "B", "C"))!! # Vektorweise paste(c(1:3), c("A", "B"))! ! ! # recycling des kürzeren # Vektors bei ungleicher Länge paste(1, "A", sep="")! ! ! ! ! # Seperatorzeichen festlegen paste(c(1:3), c("A", "B", "C"), sep="_")! # Seperator festlegen paste(c(1:3), c("A", "B", "C"), sep="_", collapse=" ")! ! # Trennzeichen zum Kollabieren 41
  • 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
  • 48. Code : Anwendung BMI II ### Standardabweichung "zu Fuss" berechnen sum.bmi <- bmi[1] + bmi[2] + bmi[3] + bmi[4]!! # Summe der Werte mean.bmi <- sum.bmi/4! ! # Mittelwert sum(bmi)! ! ! ! ! ! # Summe sum(bmi)/4! ! ! ! ! # Mittelwert mean(bmi)!! ! ! ! ! # Mittelwert length(bmi)! ! ! ! ! ! ! ! ! ! # Länge des Vektors sum(bmi)/length(bmi)! ! ! ! ! ! ! # Durchschnitt 47
  • 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
  • 60. Code : Matrix I ### matrix – zweidimensionales Datenobjekt ### ?matrix matrix(1:12, nrow=3, ncol=4)!! ! ! # Matrix erstellen matrix(1:12, nrow=3, ncol=4, byrow=TRUE)! # Matrix reihenweise e <- matrix(c(1,0,0,0,1,0,0,0,1), 3, 3)! ! # Einheitsmatrix diag(3)! ! ! ! ! ! ! # Einheitsmatrix per Funktion is.matrix() 59
  • 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
  • 65. Your turn! Erstelle folgende Matrix (mit zufälligen Werten): Tip: nutze rnorm() und round() Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec Woche 1 0 0 1 1 0 3 0 -1 0 -1 -1 0 Woche 2 -2 -1 1 0 0 0 1 1 2 -2 -1 -1 Woche 3 -1 2 -1 -1 -3 0 3 3 1 -1 0 -1 Woche 4 1 0 -2 0 0 0 1 2 1 0 0 0 Woche 5 1 1 1 -2 0 -1 1 0 -2 0 0 -2 Woche 6 0 0 0 -1 -1 0 0 1 1 1 -1 0 Woche 7 1 1 -1 -1 -1 0 0 0 0 -1 1 -1 Woche 8 0 1 -3 0 -1 1 2 0 -1 0 0 0 Woche 9 -1 0 0 0 -1 0 0 0 2 -1 0 1 Woche 10 -1 1 1 0 0 1 0 0 0 1 0 1 Woche 11 0 -2 0 0 0 0 0 0 1 0 1 0 Woche 12 -1 0 1 -2 -1 -1 0 2 1 1 1 -2 Woche 13 2 3 -1 -1 2 1 0 0 1 2 0 -1 Woche 14 0 0 0 1 -1 -1 -2 -1 0 1 1 1 Woche 15 -1 0 0 1 0 1 -1 0 -1 0 -1 -2 Woche 16 0 1 0 -1 0 2 0 -1 -2 -2 -2 -2 Woche 17 -1 0 0 -1 0 3 1 1 0 -1 -2 0 Woche 18 0 1 -1 0 1 1 -2 -1 2 0 -1 1 Woche 19 -3 0 1 1 -2 -2 0 0 1 -2 1 -1 Woche 20 2 1 0 -1 2 0 0 1 1 0 -1 2 64
  • 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
  • 69. 68
  • 70. DAY 2 From ABC to sentences - getting started with data analysis 69
  • 71. 70
  • 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
  • 75. 74
  • 76. Geek Hum or! 74
  • 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
  • 88. Code: subset() ### subsets mit subset() erstellen ?subset! ! ! ! ! ! ! ! ! # die subset Funktion subset(d, subset=IQ < 100 & Geschlecht=="m")!! ! # Logische Auswahl subset(d, IQ > 120 | IQ < 80)! ! # Logische Auswahl subset(d, select=c(IQ, Geschlecht))! # Variablenauswahl mit select subset(d, select=c("IQ", "Geschlecht")) # identisch subset(d, IQ > 120, select=c(IQ, Geschlecht))! # kombiniert 86
  • 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
  • 93. packages installieren ### packages installieren und laden install.packages("plyr")! # plyr installieren library(plyr)! ! ! ! # package laden detach(package:plyr)! ! # package entfernen describe()! ! ! ! ! # Funktion existiert nicht install.packages("psych")!# psych installieren library(psych)! ! ! ! # Paket laden describe(rnorm(100))! ! # nun existiert sie search() ! packages im Suchpfad # 91
  • 94. Code: Daten einlesen I ### 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/data") ! ! ! ! ! ! # Arbeitsverzeichnis wechseln df <- read.table("ngo.txt") # mieten.txt einlesen head(df) # Zeilen haben keine Überschrift df <- read.table("ngo.txt", header = TRUE) # Einlesen mit header=TRUE head(df) 92
  • 95. Code: Daten einlesen II ?read.csv2 ! ! ! ! # für deutsche .csv Dateien df <- read.csv2("mieten.csv") head(df) library(Hmisc)! ! ! wow <- spss.get("wow.sav", use.value.labels=TRUE) library(foreign) wow <- read.spss("wow.sav", to.data.frame=T) 93
  • 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
  • 106. Missings NA setzen # Gibt es „keine Angabe“ Antworten (wie k.A.), # die noch nicht als Missing kodiert sind? attach(wow) table(Geschlecht)! ! ! ! !! # Häufigkeitstabelle wow$Geschlecht[Geschlecht==1] <- NA! ! ! # 1 zu NA umkodieren table(Geschlecht) table(Alter)!! ! ! ! ! ! ! ! # Häufigkeitstabelle wow$Alter[wow$Alter==1] <- NA! ! ! ! # 1 zu NA umkodieren detach(wow) 104
  • 107. Rekodieren ### Rekodieren ### # verschiedene Funktionen zum Rekodieren library(car) wow$K1 <- recode(wow$K1, "1=6; 2=5; 3=4; 4=3; 5=2; 6=1") library(memisc)!! recode(wow$K1,! ! # rekodieren von K1 A = 1 <- 4, B = 2 <- 3, C = 3 <- 2, D = 4 <- 1) detach(package:memisc) 105
  • 108. Faktor definieren # Sind alle qualitativen Merkmale als Faktoren definiert? wow$Geschlecht wow$Geschlecht <- as.factor(wow$Geschlecht)! # in Faktor umwandeln levels(wow$Geschlecht) <- c("m", "w")! ! ! # F-stufen benennen wow$Alter wow$Alter <- as.factor(wow$Alter)! ! ! ! # in Faktor umwandeln levels(wow$Alter) <- ! ! ! ! ! ! ! ! # F-stufen benennen ! ! c("unter 18", "18-29", "30-40", "41-50", "über 50" )! wow$Zeitaufwand wow$Zeitaufwand <- as.factor(wow$Zeitaufwand)# in Faktor umwandeln levels(wow$Zeitaufwand) <- ! ! ! ! ! ! # F-Stufen benennen ! c("<7 Std.", "< 14 Std.", "< 20 Std.", ! "20-30 Std.", "30-40 Std.", "> 40 Std.") 106
  • 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
  • 110. 108
  • 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
  • 115. 113
  • 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
  • 119. Pakete installieren • HH • car • sm • gmodels • nortest • perturb • sfsmisc • QuantPsyc • TeachingDemos • gplots • lmtest 117
  • 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
  • 122. z-Test # Datensatz laden x <- read.csv2("test.csv") x$gr <- as.factor(x$gr) attach(x) # z-Test library(TeachingDemos) z <- rnorm(25, 99, 5) d <- density(z)!! # Dichteschätzung plot(d) abline(v=100) z.test(z, 100, 5) z.test(z, 100, 5, alternative="g") z.test(z, 100, 5, alternative="l") 120
  • 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
  • 124. t-Test # t-Test library(sm) ! ! ! ! g1 <- x[gr==1,]$iq g2 <- x[gr==2,]$iq plot(iq ~ gr)! ! ! ! ! # Boxplot sm.density.compare(iq, gr)! # Dichte vergleichen t.test(g1, g2)! ! ! ! ! ! # unabhängig, zweiseitig t.test(g1, g2, alternative="g")!# einseitig greater t.test(g1, g2, alternative="l")!# einseitig lesser t.test(g1, g2, paired=TRUE)! ! # abhängig, zweiseitig t.test(iq ~ gender)! ! ! ! ! # Formel interface 122
  • 125. Your turn! Mache jeweils einen t-Test auf Mittelwertsunterschiede zwischen allen Stufen des Faktors gr und gender bezüglich der Variablen IQ. 123
  • 126. Varianzhomogenitätstests # Varianzhomogenität library(car)! leveneTest(iq ~ gr, data=x)! ! # Levene Test ! m <- lm(iq ~ gr, x) leveneTest(m)! ! ! ! ! ! ! ! # mit lm Objekt bartlett.test(iq ~ gr, data=x)! ! ! ! ! ! ! ! ! ! ! ! ! ! ! # Bartlett Test library(HH) hov(iq ~ gr, data=x)! ! ! ! ! # Brown-Forsyth plot.hov(iq ~ gr, data=x)! ! ! # visuelle Inspektion
  • 127. Normalverteilungstests # Normalverteilungstests qqnorm(iq) qqline(iq) shapiro.test(iq)! # Shapiro-Wilk Test library(nortest) lillie.test(iq)!! # Lilliefors / KS-Test # Tip: weitere Tests im nortest package
  • 128. One-Way-ANOVA I ### Einfaktorielle Varianzanalyse library(sm) plot(iq ~ gr)! ! ! ! ! # Box plot sm.density.compare(iq, gr)! # Dichten vergleichen library(gplots) plotmeans(iq ~ gr)! ! ! ! # mean plot mit CIs m <- aov(iq ~ gr, x)! ! ! # ANOVA summary(m)! ! ! ! ! ! # Zusammenfassung Anova(m)! ! ! ! ! ! # in package car Anova(m, white=TRUE)! ! # bei Heteroskedastizität 126
  • 129. Posthoc-Tests # Post-hoc Tests plotmeans(iq ~ gr)! # mean plot mit Konfidenzgrenzen pairwise.t.test(iq, gr) pairwise.t.test(iq, gr, p.adj = "none")! ! # ohne Alpha Korrektur pairwise.t.test(iq, gr, p.adj = "none", pool=F)! ! # ohne Alpha Korrektur pairwise.t.test(iq, gr, p.adj = "bonf") ! ! # Bonferroni Korrektur
  • 130. Your turn! Mache eine Anova über die Variable height über den Faktor gr. Mache als Post-Hoc Tests paarweise t-Tests mit Bonferroni Korrektur. 128
  • 131. Two-Way-ANOVA ### 2-WAY-ANOVA ### fit <- aov(iq ~ gr*gender, data=x) summary(fit) # Two-way Interaction Plot interaction.plot(gr, gender, iq) interaction.plot(gender, gr, iq) 129
  • 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
  • 134. Code: Lineare Modelle / Regression # lineare Modelle schätzen m1 <- lm(iq ~ height, data=x)! ! # Modell mit 1 Regressor m1! ! ! ! ! ! ! ! ! ! Modell ausgeben # summary(m1)! ! ! ! ! ! ! summary des Modells # m2 <- lm(iq ~ gender*height, data=x) ! ! # zwei Regressoren + Interaktion m2! ! ! ! ! ! ! ! # Modell ausgeben summary(m2)! ! ! ! ! # summary des Modells plot(iq ~ height)! ! ! # iq gegen height plotten abline(m1)! ! ! ! ! # Regressionsgerade hinzufügen 132
  • 135. Funktionen für lineare Modelle # Konfidenzintervalle ausgeben und plotten library(sfsmisc) attach(df) m <- lm(y1 ~ x1) plot(y1 ~ x1) abline(m) linesHyperb.lm(m, conf=TRUE, col="blue")! # für Mitten linesHyperb.lm(m)! ! ! ! ! ! ! ! # für Individuum confint(m)! ! # CIs für Paramaterschätzungen library(QuantPsyc) lm.beta(m) !! # Standardisierte Koeffizienten
  • 136. Kollinearität # collinearity diagnostics library(perturb) n <- 30 x1 <- rnorm(n) x2 <- x1*.5 + rnorm(n, , .2) y1 <- 2 + .3*x1 + .7*x2 + rnorm(n, ,.4) df <- data.frame(y1, x1, x2) m <- lm(y1 ~ x1 + x2, df) summary(m) vif(m) colldiag(m)
  • 137. Linearitätstests # linearity diagnostics library(lmtest) harvtest(m)! ! ! ! ! ! ! ! # Harvey-Collier Test resettest(m, power=2:3)! ! ! ! # RESET Test raintest(y1 ~ x1 + x2, data=df)!! # Rainbow Test
  • 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
  • 139. Code: Modelle vergleichen # Modelle vergleichen fit1 <- lm(y1 ~ x1, data=df) fit2 <- lm(y1 ~ x1 + x2, data=df) anova(fit1, fit2) 137
  • 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
  • 141. Datensatz ngo aufbereiten # Daten Schul Beispiel Kähler einlesen x <- read.csv2("ngo.csv") # Kategoriale Variablen definieren x$jahrgang <- factor(x$jahrgang, labels=11:13) x$geschl <- factor(x$geschl, ! ! ! ! ! ! labels=c("männlich", "weiblich")) 139
  • 142. Kontraste # Dummy- / treatment Kodierung contr.treatment(3)! ! ! ! # baseline ist erste contr.treatment(3, base=3)! # baseline ist dritte contr.SAS(3)!! ! ! ! ! # baseline ist letzte # Effektkodierung (sum-to-zero coding) contr.sum(2) contr.sum(3) # Helmert Kontraste contr.helmert(4) # Benutzerdefinierte Kontraste make.constrast 140
  • 143. Varianzanalyse als ALM # Effektkodierung (sum-to-zero) wählen contrasts(x$jahrgang) <- contr.sum(3) # Modelle berechnen m1 <- lm(deutsch ~ jahrgang, x) # Modelle vergleichen summary(m1) anova(m1) ! # Vergleich Gesamt- und Nullmodell 141
  • 145. Kovarianzanalyse als ALM # Modelle berechnen m0 <- lm(deutsch ~ 1, x) m1.j <- lm(deutsch ~ jahrgang, x) m1.m <- lm(deutsch ~ mathe, x) m2 <- lm(deutsch ~ mathe + jahrgang, x) # Modelle vergleichen anova(m1.j, m2) # Kovariate mathe anova(m1.m, m2) # Haupteffekt von jahrgang anova(m0, m2) # Vergleich Gesamt- und Nullmodell 143
  • 146. Kovarianzanalyse als ALM # Dummy Codierung (treatment coding; Jahrgang 13 als baseline) contrasts(x$jahrgang) <- contr.treatment(3, base = 3) # Modell berechnen m3 <- lm(deutsch ~ mathe + jahrgang, x) summary(m3) anova(m3)!! ! # Gesamtmodelltest 144
  • 147. Kontraste 145
  • 148. Kontraste # Neue Variable berechnen attach(x) x$jahrges[jahrgang==11 & geschl=="männlich"] <- 1 x$jahrges[jahrgang==11 & geschl=="weiblich"] <- 2 x$jahrges[jahrgang==12 & geschl=="männlich"] <- 3 x$jahrges[jahrgang==12 & geschl=="weiblich"] <- 4 x$jahrges[jahrgang==13 & geschl=="männlich"] <- 5 x$jahrges[jahrgang==13 & geschl=="weiblich"] <- 6 x$jahrges <- factor(x$jahrges) detach(x) # Modell con <- cbind("vergleich 1" = c( .5, -.5, 0, .5, 0, -.5)) contrasts(x$jahrges) <- con m1 <- lm(mathe ~ jahrges, x) summary(m1) 146
  • 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
  • 152. Code: Hauptkomponenten- analyse (PCA) ### PCA ### wow <- na.omit(wow)! ! ! ! # Missings entfernen fit <- princomp(wow[4:23]) loadings(fit) print(loadings(fit), cut=.3) 150
  • 153. Code: KTT ### Cronbachs Alpha: interne Konsistenz ### library(psych) fit <- fa(wow[4:23], 6)! ! # Polung der Variablen print(fit, cut=.3) names(wow) alpha(wow[4:7])!! ! ! ! # Item K4 raus alpha(wow[4:6]) alpha(wow[8:11]) alpha(wow[12:15]) 151
  • 154. 152
  • 156. 154
  • 157. 155
  • 158. 156
  • 159. 157
  • 160. 158
  • 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
  • 169. Google Visualization APIs require(datasets) states <- data.frame(state.name, state.x77) G3 <- gvisGeoMap(!states, "state.name", "Illiteracy", !options=list(region="US", ! ! ! ! ! ! ! dataMode="regions", ! ! ! ! ! ! ! width=1200, height=800)) plot(G3) 166
  • 170. Graphic Systems R Graphic Systems base graphics grid graphics lattice ggplot2 various packages many graphic function 167
  • 171. Graphic Systems R Graphic Systems base graphics grid graphics lattice ggplot2 various packages many graphic function 167
  • 172. Wiederholung # Datensatz World of Warcraft laden setwd("/Users/markheckmann/data")! ! # Verzeichnis wechseln wow <- read.csv2("wow_excerpt.csv")! ! # Daten einlesen # neue Variablen anlegen wow <- transform(wow, K=(K1 + K2 + K3 + K4)/4 ) wow <- transform(wow, E=(E1 + E2 + E3 + E4)/4 ) wow <- transform(wow, AL=(AL1 + AL2 + AL3 + AL4)/4 ) wow <- transform(wow, T=(T1 + T2 + T3 + T4)/4 ) wow <- transform(wow, nKsB=(nKsB1 + nKsB2 + nKsB3 + nKsB4)/4 ) wow <- transform(wow, score=(K + E + AL + T + nKsB)/5 ) attach(wow)! ! ! ! ! ! ! # wow in den Suchpfad hängen 168
  • 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
  • 174. Grafiken I ### einfache Visualisierungen ### library(ggplot2)! ! ! # ggplot2 laden ?diamonds!! ! ! ! ! # diamonds data set attach(diamonds)! ! ! # diamonds in den Suchpfad ?plot! ! ! ! ! ! plot(carat, price)! ! ! # einfacher Scatterplot plot(price ~ carat)!! ! # identisch aber mit Formel ! ! ! ! ! ! ! ! # Interface geschrieben ?hist! ! ! ! ! ! ! Histogramm # library(Hmisc)! ! ! ! # Hmisc Paket laden hist(score) hist.data.frame(wow[1:16])! # mehrere Histogramme ?qqplot! ! ! ! ! ! # QQ-Plots qqnorm(score)! ! ! ! # gegen Normalverteilung 170
  • 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
  • 179. Grafikoptionen ändern I #### Grafikoptionen verändern ### # Jede Funktion hat viele Parameter, die verändert # werden können, siehe ?plot und ?par attach(wow) plot(KO, score)!! ! ! ! ! ! ! ! # scatter plot plot(KO, score, xlab="Kontrollverlust", ! # Achsen beschriften ! ! ylab="Suchtscore") plot(KO, score, ! ! ! ! ! ! ! ! # Überschrift setzen ! main="Kontrollverlust vs. Sucht", ! xlab="Kontrollverlust", ylab="Suchtscore") plot(KO, score, col=3)! ! ! ! ! ! ! # Farbe ändern plot(KO, score, col=3, pch=15)! ! ! ! # Symbol ändern plot(KO, score, col=3, pch=15, cex=.5)!! # Schriftgröße ändern 175
  • 180. Grafikoptionen ändern II ?barplot barplot(table(Geschlecht, Zeitaufwand))! # stacked / übereinander ! barplot(table(Geschlecht, ! ! ! ! ! # Gruppen nebeneinander ! ! Zeitaufwand), beside=TRUE)! barplot(table(Geschlecht, Zeitaufwand), ! # Farbe und Überschrift ! ! col=3:4, ! ! main="Zeitaufwand vs. Geschlecht")! barplot(table(Geschlecht, Zeitaufwand), ! # Gekippt ! ! horiz=TRUE)! ! barplot(table(Geschlecht, Zeitaufwand), ! Achsenbeschriftung # ! ! cex.names=.7)!! ! ! ! ! ! # kleiner barplot(table(Geschlecht, Zeitaufwand),! # Legende hinzufügen ! legend.text=c("männlich", "weiblich"),! ! ! cex.names=.8) detach(wow) 176
  • 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
  • 189. base graphics V ### par settings ### par()! ! ! ! ! # Parameter settings anschauen oldPar <- par()!! ! # Parameter settings speichern plot(1:10)! ! ! ! # einfacher plot par(mar=c(4,4,4,8))! ! # Margin verändern plot(1:10)! ! ! ! # einfacher plot par(mfrow=c(1,2))! ! # mfrow ändern plot(1:10)! ! ! ! # plot 1 plot(1:10)! ! ! ! # plot 2 par(oldPar)! ! ! ! # alte Parameter wieder laden 185