SlideShare a Scribd company logo
1 of 217
Download to read offline
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
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
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
8
9




    http://learnr.wordpress.com/2009/04/09/ggplot2-sales-dashboard/
http://learnr.wordpress.com/2009/04/09/ggplot2-sales-dashboard/
10
11
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
13
14
DAY 1
Learning grammar
   - Basics of the R
         language




                  15
Erster Ta
          g=
Hürde ne
         hmen




                16
17
“Nurse, get on the internet, go to SURGERY.COM,
scroll down and click on the ,‘Are you totally lost?‘
                      icon.“
                                                        18
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
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
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
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
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
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
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
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
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
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
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
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
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
“Nurse, get on the internet, go to SURGERY.COM,
scroll down and click on the ,‘Are you totally lost?‘
                      icon.“
                                                        32
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
R-help = an R-user best friend !
             R-help


Leer




                                      34
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
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
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
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
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
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
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
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
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
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
Editoren nutzen


                     R Editor

Mac OS Textmate                  Windows Tinn-R


Datei wird als .R Datei gespeichert und kann so
immer wieder genutzt werden
                                                  45
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
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
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
Take along!

  Selbst wenn etwas nicht in R
nicht existiert, kann man es sich
     selber programmieren!



                                    49
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
68
DAY 2
From ABC to
sentences -
getting started
with data analysis



                     69
70
http://people.hofstra.edu/steven_r_costenoble/MontyHall/MontyHallSim.html   71
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
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
74
Geek Hum
           or!

                 74
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
Your turn!
Lies den Datensatz wow_excerpt.csv ein und
        speichere ihn in der Variablen df




                                             94
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
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
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
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
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
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
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
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
WoW Fragebogen




                 103
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
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
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
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
108
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
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
Gigerenzer, G. (2008). Das Einmaleins der Skepsis: Über den richtigen
      Umgang mit Zahlen und Risiken. Berlin: Berliner Taschenbuch-Verl.
111
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
113
DAY 3
SPSS - das A
fehlt nicht umsonst

„und dann rechnen wir
mit dem Taschenrechner
weiter... !“




                         114
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
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
Pakete installieren
•   HH

•   car

•   sm

•   gmodels

•   nortest

•   perturb

•   sfsmisc

•   QuantPsyc

•   TeachingDemos

•   gplots

•   lmtest

                      117
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
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
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
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
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
Your turn!
Mache jeweils einen t-Test auf Mittelwertsunterschiede
zwischen allen Stufen des Faktors gr und gender
bezüglich der Variablen IQ.




                                                         123
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
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
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
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
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
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
Your turn!
Schaue in einer zweifaktoriellen Anova, ob sich die
Variable height über die Faktoren gr und
gender unterscheidet.

Gebe die Interaktionsplots aus.




                                                      130
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
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
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)
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
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
Code: Modelle vergleichen




# Modelle vergleichen

fit1 <- lm(y1 ~ x1, data=df)
fit2 <- lm(y1 ~ x1 + x2, data=df)
anova(fit1, fit2)




                                    137
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
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
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
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
Kovarianzanalyse als ALM




                           142
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
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
Kontraste




            145
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
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
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
Your turn!
Lade die .csv Datei fa_daten.csv und mache mit ihr eine
Faktorenanalyse.




                                                          149
Code: Hauptkomponenten-
         analyse (PCA)

### PCA ###

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

fit <- princomp(wow[4:23])
loadings(fit)
print(loadings(fit), cut=.3)




                                                      150
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
152
library(Rcmdr)
Rcmdr()          153
154
155
156
157
158
DAY 4
Great Graphics




                 DAY 4


                 Charles J. Minard. Verluste der französischen Armee im
                                                                   159
                         Russlandfeldzug 1812-1813. Paris, 20. Nov. 1869
Minard‘s
plot made in R




                 Muenchen, R. (2009). R for SAS and SPSS users. New
                                               York: Springer, p. 160
                                                                  276.
Peter Aldhous, Haiti Earthquake in R
http://www.readwriteweb.com/hack/2011/01/how-a-science-journalist-creat.php   161
Peter Aldhous, Earthquakes in R
http://www.readwriteweb.com/hack/2011/01/how-a-science-journalist-creat.php   162
„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
Hans Rosling‘s Gapminder
The Power of Visualization




                     Hans Rosling in action: http://www.youtube.com/
                                                watch?v=hVimVzgtD6w164
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
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
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
Graphic Systems
                R Graphic Systems

base graphics                   grid graphics

                      lattice               ggplot2

   various
  packages

many graphic
  function

                                                      167
Graphic Systems
                R Graphic Systems

base graphics                   grid graphics

                      lattice               ggplot2

   various
  packages

many graphic
  function

                                                      167
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
Grafische Bereiche




                    184
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
R-Kurs Mark Heckmann WiSe 2010-2011 Uni Bremen
R-Kurs Mark Heckmann WiSe 2010-2011 Uni Bremen
R-Kurs Mark Heckmann WiSe 2010-2011 Uni Bremen
R-Kurs Mark Heckmann WiSe 2010-2011 Uni Bremen
R-Kurs Mark Heckmann WiSe 2010-2011 Uni Bremen
R-Kurs Mark Heckmann WiSe 2010-2011 Uni Bremen
R-Kurs Mark Heckmann WiSe 2010-2011 Uni Bremen
R-Kurs Mark Heckmann WiSe 2010-2011 Uni Bremen
R-Kurs Mark Heckmann WiSe 2010-2011 Uni Bremen
R-Kurs Mark Heckmann WiSe 2010-2011 Uni Bremen
R-Kurs Mark Heckmann WiSe 2010-2011 Uni Bremen
R-Kurs Mark Heckmann WiSe 2010-2011 Uni Bremen
R-Kurs Mark Heckmann WiSe 2010-2011 Uni Bremen
R-Kurs Mark Heckmann WiSe 2010-2011 Uni Bremen
R-Kurs Mark Heckmann WiSe 2010-2011 Uni Bremen
R-Kurs Mark Heckmann WiSe 2010-2011 Uni Bremen
R-Kurs Mark Heckmann WiSe 2010-2011 Uni Bremen
R-Kurs Mark Heckmann WiSe 2010-2011 Uni Bremen
R-Kurs Mark Heckmann WiSe 2010-2011 Uni Bremen
R-Kurs Mark Heckmann WiSe 2010-2011 Uni Bremen
R-Kurs Mark Heckmann WiSe 2010-2011 Uni Bremen
R-Kurs Mark Heckmann WiSe 2010-2011 Uni Bremen
R-Kurs Mark Heckmann WiSe 2010-2011 Uni Bremen
R-Kurs Mark Heckmann WiSe 2010-2011 Uni Bremen
R-Kurs Mark Heckmann WiSe 2010-2011 Uni Bremen
R-Kurs Mark Heckmann WiSe 2010-2011 Uni Bremen
R-Kurs Mark Heckmann WiSe 2010-2011 Uni Bremen
R-Kurs Mark Heckmann WiSe 2010-2011 Uni Bremen

More Related Content

More from 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
 

More from 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
 

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
  • 133.
  • 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