SlideShare a Scribd company logo
1 of 197
Download to read offline
Einführung
                   in R
             (Statistik +
          Programmierung)

         Mark Heckmann
        Universität Bremen
    www.markheckmann.de
http://ryouready.wordpress.com
Why R?
• free
• open source
• flexible
• (not yet extensive) documentation
• high-end graphics engine
• packages for (almost) everything
R-Appetizer
●
                     ●
         ●



     5




                                 ●
     4
             ●                               ●
                         ●
                                     ●

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




                             ●
                                                           ●       ●
                                                                                                  ●   6
                                                               ●

     3
                                                                                                  ●   8
                                                       ●
                                                  ●        ●

                                                       ●

                                                           ●

                                                               ●
                                                                                         ●
                                                                            ●

     2                                                                          ●
                                                                                             ●


                                                                                     ●
                                                                                     ●




                     15                           20                   25           30
                                                       mpg
1.2




          1.0




          0.8                                 mpaa
density




                                                 NC−17
                                                 PG
          0.6
                                                 PG−13
                                                 R


          0.4




          0.2




          0.0


                2   4            6   8   10
                        rating
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     64   66   68   70
                               depth
ggplot special
Arbeiten mit R
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 
R Ressources
•   R Project Site: www.r-project.org

•   Blogs
    • www.r-bloggers.com
    • http://ryouready.wordpress.com

•   eBooks/Wikis/Sites
    •Quick-R website
    •http://de.wikibooks.org/wiki/GNU_R
    •http://addictedtor.free.fr

•   R seek (www.rseek.org)
R-user & R-help = beste Freunde!
            R-help


Leer
Die ersten
   beiden Tage
müsst ihr leider
   durchhalten!
### TAG 1 ###
Good to know I
•   R arbeitet im Frage-Anwort Modus

•   Navigieren in R Konsole durch Aufwärts und Abwärts Pfeile

•   Alles hinter der Raute (#) sind Kommentare und wird von R
    nicht ausgewertet

•   Ein Befehl wird durch ein Semikolon oder durch einen
    Zeilenumbruch abgeschlossen

•   Ein Befehl darf über mehrere Zeilen gehen

•   Dezimalstellen sind Punkte, keine Kommas. Kommas haben
    eine andere Funktion
Code 1 : 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
Code 2 : 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 verwedenet werden
a = 2 + 2!!          # Alternative Zuweisung (wird i.d.R.
                     # nicht verwendet).
! ! ! !              # Zuweisung wird 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
Objektbezeichnungen

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

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

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

•   Groß- und Kleinschreibung wird unterschieden (Nutzung
    zum Strukturieren von Objektnamen)
Code 3 : Bezeichnung & Stil


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

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

### Hierarchie der Datentypen in R. ###
# Jede höhere Stufe kann auch die tieferen repräsentieren
NULL! ! ! # die leere Menge, unterstse Stufe
TRUE! ! ! # logische Werte
3.14! ! ! # ganze und reelee Zahlen
2.13+3i! ! ! # komplexe Zahlen
"Hallo"! ! ! # Buchstaben und Zeichen
Code 5 : Logik
#   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
Code 6 : Logik
# logisches ODER
TRUE || TRUE!! # TRUE
TRUE || FALSE
FALSE || TRUE
FALSE || FALSE

# ausschließliches ODER
xor(TRUE, FALSE)! # ausschließliches ODER
xor(TRUE, FALSE)

T !!   !   !   !    # Kurzform von TRUE
F! !   !   !   !    # Kurzform von FALSE

c(T,T) & c(T,T)!!   # vektorwertiger Vergleich, d.h.
                    # für jedes Element einzeln
c(T,F) | c(F,F)
Code 7 : Logik

# Rechnen mit logischen Werten
FALSE + TRUE!! # 1
TRUE + TRUE! ! ! # 2
TRUE * 2! ! ! # 2
TRUE - FALSE - TRUE!
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
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)
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 zurück
a <- plot(1:10)
a
Code 8 : Hilfe!

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

apropos() ! ! ! ! # alle Objekt, die mean enthalten
help.search("mean") ! # oder
??mean
Code 9 :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
                      #
Code 10 : 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)
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
Code 11 : Wichtige Funktionen
# Wichtige Funktionen
all()! ! !      # Sind alle Elemente TRUE
any()! ! !      # Ist mindestens ein Element TRUE
which()! ! ! # Welche Elemente sind TRUE

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
Code 12 : 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
Code 13 : Strings
# Umgang mit Strings / Zeichen
?print
print("Hallo")! ! # Drucken von "Hallo" in der Konsole
print(1+1)! ! ! # Ausruck wird erst ausgewertet, dann gedruckt

?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="_")! # Seperator festlegen
paste(c(1:3), c("A", "B", "C"),
        sep="_", collapse=" ")! ! # Trennzeichen zum Kollabieren
paste(c(1:3), c("A", "B", "C"), sep="_", collapse="_")
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"
Code 14 : Strings
?cat! ! !      # Ausgabe der und Aneinanderhängen der Objekt
cat("Hallo")!! ! ! ! ! ! ! # Ausgabe von Hallo auf der
Konsole
cat("Hallo", "wie gehts?")! ! ! # Ausgabe von EINEM Text
cat("Ich bin Jonny Nr.", 5)! ! ! # Mischen von Zahlen und Text
cat("IQ hat einen mean von :", 100,
! "und eine sd von:", 15)! ! ! # Zahlen und Text
alter <- 31
cat("Ich bin", alter, "Jahre alt.")! # Variablen und Text
                                    !
cat("Eins plus Eins ist", 1 + 1)! ! # Ausdrücke werden erst
                                      # ausgewertet!
cat("Dieser Satz hat einen Umbruch n und geht dann weiter.")
# Umbruch durch n
cat("Ein Tabulator t mitten im Satz.")! # Tabulator durch t
cat("Anführungsstriche 'Test' im Text")! # Anführungsstriche
cat("Anführungsstriche "Test" im Text")! Escape Symbol
                                          #
Your turn!
      Du hast folgenden Vektor: v <- c(1,2,3,4,5).
           Erzeuge folgende Ausgabe in der Konsole:




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


Tip: Benutze hierzu die Funktion cat() und length() und
kombiniere Variablen und Text.
Your turn!
      Erzeuge folgende Ausgabe in der Konsole, indem
Du cat(), paste() und die Konstant 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


       Die Ausgabe soll nun pro Zeile erfolgen
Code 15 : 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
Code 16 : 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
Code 17 : Anwendung BMI
### BMI BEISPIEL FÜR INTERAKTIVE NUTZUNG ###
68/1.70^2   # Body Mass Index.
            # Um den Wert weiterzubenutzen in ein Objekt speichern
myBmi <- 68/1.70^2
myBmi
myBmi.2 <- myBmi
2bmi <- myBmi ! ! ! # Fehler, weil Objektname mit Zahl beginnt
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?
Code 18 : Anwendung BMI
height2 <- c(1.70, 1.63, 1.90)
weight / height2^2! ! ! ! !       # Vektor wird recycled mit warning
height3 <- c(1.70, 1.63)
weight / height3^2! ! ! ! !       # Vektor wird recycled ohne
warninig, da er

# 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)! !   !   !   !   !   !   # Durchscnitt
Code 19 : Anwendung BMI
(bmi[1] – mean.bmi)^2 + (bmi[2] – mean.bmi)^2 +
(bmi[3] – mean.bmi)^2 + (bmi[4] – mean.bmi)^2! # SSQ

(bmi - c(mean.bmi, mean.bmi, mean.bmi, mean.bmi))^2
# wie kann ich es einfacher schreiben

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

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

Selbst wenn etwas nicht in
  R nicht existiert, kann
    man es sich selber
      programmieren!
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)
Code 20 : Navigieren
# Projektordner anlegen /RCourse
# Navigieren in Verzeichnissen
getwd()     !! !      # Unterschied Slash/Backslash
Windows
setwd()    ! ! ! ! # Arbeitsverzechnis setzen
setwd("/Users/markheckmann/RCourse")
                      # in Verzeichnis RCourse wechseln
setwd("..") ! ! ! # ein Verzeichnis runter
setwg("testdir")! ! # ein Verzeichnis hoch
setwd("../testdir")! # eins runter und wieder eins hoch
                   !
Your turn!
     Lege ein Verzeichnis RCourse an und setze es als neues
Arbeitsverzeichnis. Lege eine Unterordner data an und wechsele in
ihn. Wechsel anschließend wieder in den übergeordneten Ordner.
Code 20b : Arbeitsbereich
### Workspace speichern / History speichern
?savehistory()
savehistory("Befehle_von_Tag_1.history")
loadhistory("Befehle_von_Tag_1.history")

?save.image()
save.image("erster Kurstag.RData")! # Arbeitsbereich 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
Your turn!
Berechne die Korrelation für folgende zwei Datenreihen in R „zu
 Fuß“. Konstruiere die Lösung so, dass man x und y (gleich lang)
     austauschen kann, ohne den Code sonst zu verändern.


          x <- c(-2,-1,-1,0,1,1,2)
          y <- c(-1,-2,1,0,2,-1,1)
Code 21 : Datentypen
### Datentypen ###

### Hierarchie der Datentypen in R. ###
# Jede höhere Stufe kann auch die tieferen repräsentieren
NULL! ! !        # die leere Menge, unterste Stufe
TRUE! ! !        # logische Werte
3.14! ! !        # ganze und reelee Zahlen
2.13+3i! ! !     # komplexe Zahlen
"Hallo"! ! !     # Buchstaben und Zeichen

# Datenobjekte   in R – ALLES in R ist ein Objekt
1 !! !       #   numeric
"Hallo"! ! #     characters
NA! ! !      #   missing value
NaN! !
    !        #   Not a number
### TAG 2 ###
Quiz 1 !
Welche Regeln gibt es für die Benennung von Objekten?

Welche Regeln gibt es für leserlichen Code?

Welche Objektnamen sind erlaubt?
a1234
ausdruck
Variable
.Variable
Variable.
_Variable
Variable_
1teVariable
.1Variable

Überlege was folgende Ausdrücke ergeben:
11 %% 5
1:6 %% 2
11 %/% 5
10:19 %/% 5
Quiz 2 !
Überlege was folgende Ausdrücke ergeben:

11 %% 5
1:6 %% 2

11 %/% 5
10:19 %/% 5

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

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

!any(T)
any(c(T, F) | c(F, T))
which(c(T, F) | c(F, T))
Quiz 3 !
Überlege was folgende Ausdrücke ergeben:

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

6 + 1:4
6:1 - 3:1

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

x <- c(1,5,2,0,6,2,9)
Suche die Stelle des Vektors x raus, der zu der niedrigsten
Zahl sowie zu der höchste Zahl gehört. Ordne die beiden
Werte dann in einem Vektor an.
Quiz 4 !
Überlege was folgende Ausdrücke ergeben:

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

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

Erzeuge einen Vektoren mit NV Zufallszahlen der Länge 10 und runde ihn auf eine
Dezimalstelle.
Code 22 :Vektoren
###    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

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

c(TRUE, 2, FALSE)! !     !   !   #   innerhalb eines Vektors stets
                                 #   nur ein Typ möglich
c(T, "A", 1)!!   !   !   !       #   Automatische Umwandlung auf
                                 #   niedrigstes mögliches Datenniveau
Code 23 :Vektoren
# Zugriff auf eine Elemente durch eckige Klammern und Angabe der
Position oder des Namens, sofern es ein „named vector“ ist.
a[1]! ! ! ! !         # Zugriff auf erstes Element des Vektors
a[c(1,2)]!! ! !       # Zugriff auf die ersten beiden Elemente des
Vektors
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
Code 24 :Vektoren

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
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)
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
Code 25 : Matrix
### matrix – zweidimensionales Datenobjekt ###
?matrix
matrix(1:12, nrow=3, ncol=4)!! ! !        # Matrix erstellen
matrix(1:12, nrow=3, ncol=4, byrow=TRUE)! # Matrix reihenweise

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

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

is.matrix()
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



           Quelle: Foliensatz von Peter Ruckdeschel / Matthias Kohl. R/S-plus für Einsteiger und Fortgeschrittene
Code 26 : Matrix
# 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[c(T, F, T), T]! # Auswahl funkioniert auch über T/F
x[c(T, F, T), c(F,F,T,T)]

x > 5! ! !    !   !   # welche Elemente sind größer 5
is.na(x)! !   !   !   # Welche Einträge der Matrix sind NA?
Code 26 : Matrix
# 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

x[c(T, F, T), T]            # Auswahl funkioniert auch über
                            # TRUE/FALSE
x[c(T, F, T), c(F,F,T,T)]
Code 27 : Matrix
# 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
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
Code 28 : Matrix

# 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)]
Code 29 : Matrix
# 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
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) Folgende Zellen sollen nun durch 999 ersetzt werden:
(1,1) (4,3) (4,4) (1,7)

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




           Quelle: Foliensatz von Peter Ruckdeschel / Matthias Kohl. R/S-plus für Einsteiger und Fortgeschrittene
Code 30 : Matrix
### 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
Your turn!
Berechne die Matrix 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!
Code 31 : Faktoren
### factors - für qualitativ unterschiedliche Merkmale
val <- c(1,2,1,1,1,2,3,3)!! ! ! # neuer Vektor
f <- factor(val, levels=1:3)!! ! # factor erzeugen mit
                                   # Levels 1 bis 3
f
levels(f)!! ! ! ! ! ! # Bezeichnung der Levels
levels(f) <- c("Treatment 1", "Treatment 2", "Control")
                             # Neue Level Bezeichnungen
f

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

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

l[1]! ! !      # Listenelement 1 noch als Liste
l[1:2] ! !     # Listenelemente 1 und 2
l[-1]! ! !     # negatives indzieren
Code 32 : Listen
l <- list(mathe=bmi.class1, bio=bmi.class2,
           deutsch=bmi.class3)!    # benannte Liste
names(l)! ! ! ! ! # Namen der Liste anzeigen
l[["deutsch"]]! ! ! # Zugriff auf Listeneintrag per Namen
l$deutsch!! ! ! ! # äquivalent: Zugriff mit Dollar
Operator
l$deutsch[5]!! ! ! # Fünftes Element des Listenelements
                        # deutsch

l <- list(bmi.class1, bmi.class2, bmi.class3) # Liste ohne
                                              # Namen erzeugen
names(l) <- c("mathe", "bio", "deutsch")! # Namen nachträglich
                                          # hinzufügen
l
Code 33 : Listen
l <- list(Jahreszeiten=m, mathe=bmi.class1)!
     # Liste kann unterschiedliche Objekt enthalten
l[[1]]!
      ! !              # Erstes Listenelement ist eine Matrix
is.matrix(l[[1]]) ! ! # Ist das erste L-Element eine Matrix?
is.matrix(l$mathe)! ! # Ist L-Element mathe eine matrix?
is.vector(l$mathe)! ! # Ist L-Element mathe ein Vektor?

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

l <- l[3:1]! !   !   !   # Reihenfolge der Listenelemente ändern
l<- rev(l)! !    !   !   # Listenreihenfolge umkehren
Your turn!
Erstelle eine Liste l, bei der:
das erste Element ein Vektor der Großbuchstaben A bis M ist
das zweite Element die Zeichenkette "Ich bin das zweite Element"
das dritte Element eine Matrix (5x5) mit zufälligen Werten mit 1
Dezimalkommastelle enthält. Z.B. so:
      [[1]]
       [1] "A" "B" "C" "D" "E" "F" "G" "H" "I" "J" "K" "L" "M"

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

      [[3]]
              [,1]   [,2] [,3] [,4] [,5]
      [1,]     0.9    0.3 0.5 0.6 2.4
      [2,]    -0.9   -0.7 1.5 -1.1 -1.2
      [3,]    -1.2    0.9 0.4 -1.7 0.2
      [4,]    -0.4   -0.1 0.2 0.0 0.8
      [5,]     1.3   -1.1 -0.7 0.0 1.1
Your turn!
Füge nun noch folgende Namen zu den Listenelementen hinzu:
Buchstaben, Text, Matrix.
Dann ändere alle Einträge der Matrix, die kleiner als 0 sind, in NAs
um, kürze den Vektor Buchstaben auf A bis F und kehre die
Reihenfolge der letzten beiden Listenelemente um.
                 $Buchstaben
                 [1] "A" "B" "C" "D" "E" "F"

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

                 $Text
                 [1] "Ich bin das zweite Element"
Code 34 : data frames
### data frames ###
# in Matrizen müssen alle Einträge vom selben Typ sein. Z.B
# alles numerisch oder alles characters. data frames sind
# spezielle Listen und können deshalb pro Spalte
# unterschiedliche Typen enthalten (Faktoren, numerische Werte,
# Characters). Im Ggs. zur Liste müssen sie jedoch stets
dieselbe Anzahl von Einträgen pro Spalte aufweisen.

treat <- c(20, 21, 23, 18, 30)
control <- c(19, 21, 20, 23, 18)

d <- data.frame(treat=treat,   control=control)
d$treat! ! ! ! ! ! !           # Zugriff mit Dollaroperator
d[["treat"]]!! !    ! !        # gibt Vektor zurück
is.vector(d[["treat"]])! !     # gibt Vektor zurück
d[,1]
Code 35 : data frames
d["treat"]! ! ! ! ! !          # gibt data frame zurück
is.data.frame(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

f <- factor(c("m", "m", "w", "w", "w"))
data.frame(Geschlecht= f, treat, control)
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
### TAG 3 #
Quiz 1 !
Kehre die Elemente des folgenden Vektors um
[1] 1 1 1 2 2 3

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

Erzeuge folgenden data frame mit beliebigen Werten

      IQ schulnote
1   95.9         3
2   83.0         2
3 104.7          4
4   99.6         3
5   87.0         3
6   88.4         5
7   84.1         3
8 106.5          5
9 108.6          3
10 105.6         3
Quiz 2 !
Ändere folgende Zellen des data frame in NA: (1,1) (5,2)

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

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

Ändere nun die Zelle (2,2) des data frames (erstes Listenelement)
in der Liste auf NA
Code 36-37 : Subsets
### 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
Your turn!
        baue den vorher erzeugten Datensatz um: a) erst die
ungeraden, dann die geraden Zeilen kommen 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
Code 38 : Subsets
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
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
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
Code 39 : subset()

?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
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
Your turn!
 Wähle aus dem Datensatz mit subset alle Fälle aus, die a) einen IQ
          außerhalb des Durchschnitts (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
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)
packages installieren
     CRAN server




     >3000 additional     on
                             de
        packages               man
                                     d   My Computer



Installation per Kommandozeile
> install.packages("package.name")
                                         R-Base installation
oder per R-Konsolenmenü                    basic packages
Code 40 : 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
Code 41 : Daten einlesen
### EINLESEN VON DATEN IN R ###
?read.csv!! ! ! # Einlesen einer .csv Datei (englisch)
?read.csv2! ! ! # Einlesen einer .csv Datei (deutsch)
?read.table        # für .txt Dateien
?read.spss         # für .sav Dateien
?spss.get          # im Hmisc package

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

df <- read.table("mieten.txt")   # mieten.txt einlesen
head(df)              # Zeilen haben keine Überschrift
df <- read.table("mieten.txt", header = TRUE)
                      # Einlesen mit header=TRUE
head(df)
Code 42 : Daten einlesen

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

library(Hmisc)
mydata <- spss.get("wow.sav", use.value.labels=TRUE)
Code 42 : attach data
# Objekte/Datensätze in den Suchpfad hängen

y1! ! ! ! ! !       #   Objekt unbekannt
attach(anscombe)!   #   Datensätze in den Suchpfad hängen
y1! ! ! ! ! !       #   Objekt nun im Suchpfad
detach(anscombe)!   #   Datensatz aus Suchpfad entfernen
y1! ! ! ! ! !       #   Objekt wieder unbekannt

search()            # packages im Suchpfad
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.
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
nKsB4
Editoren nutzen


                     R Editor

Mac OS Textmate                  Windows Tinn-R


Datei wird als .R Datei gespeichert und kann so
immer wieder genutzt werden
Code 43 : EDA

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

hist(wow[1:9])! !   !   !   # Histogramme der ersten neuen
Variablen
hist(wow[10:17])!   !   !   # Histogramme
hist(wow[18:23])!   !   !   # Histogramme
Code 44 : missings
# Gibt es keine Ahnung Antworten (wie k.A.),
# die noch nicht als Missing kodiert sind?

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

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

table(wow$Alter)! ! ! ! !        !   !       # Häufigkeitstabelle
wow$Alter[wow$Alter==1] <- NA!   !   !   !   # 1 zu NA umkodieren
Code 45 : Rekodieren

### Rekodieren ###
library(memisc)!! # eine Funktion unter verschiedenen
                   # zum Rekodieren
recode(wow$K1,! ! # rekodieren von K1
  A = 1 <- 4,
  B = 2 <- 3,
  C = 3 <- 2,
  D = 4 <- 1)
Code 46 : als Faktor
# 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 bennennen


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


wow$Zeitaufwand
wow$Zeitaufwand <- as.factor(wow$Zeitaufwand)# in Faktor umwandeln
levels(wow$Zeitaufwand) <- c(">7 Std.", "> 14 Std.", "> 20 Std.",
   ! ! ! !
   !                       "20-30 Std.", "30-40 Std.", "> 40 Std.")
                           # Faktorstufen bennenen
Code 47 : neue Variablen
# Neue Variablen berechnen

wow$KO <- (wow$K1 + wow$K2 + wow$K3 + wow$K4)/4!!
                       # Skala bilden über vier Werte K1-K4

?transform! ! !        # zur Berechnung von 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
Code 48 : Dummy Variable
# Dummy Variablen anlegen (mehrere Varianten)

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

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

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

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

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

# an SPSS program to read it
library(foreign)
write.foreign(d, "test.txt", "test.sps", package="SPSS")
                                # ohne Gewähr !!!
Code 50 : Deskriptive Statistiken

### Deskriptive Statistiken ###

summary(wow)!! !        # summaries der Variablen
attach(wow)
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, meanSplitKO))
      # Basisstatisiken pro Faktorstufe von Geschlecht
      # und meanSplitKO
detach(wow)
Your turn!
Lies den Datensatz wow_excerpt.csv ein und
durchlaufe die Schritte:
a) missings Na setzen
b) Faktoren in Faktoren verwandeln und bennenen
c) Skala berechnen
d) eine Variable (0,1) anlegen, die KO am mean splittet
e) einen Gesamtwert berechnen über die fünf Skalen
namens „score“, der der Durchschnitt der Skalen KO,
EN, TO, AL, NK ist.
Code 51 : crosstabs
### Häufigkeiten ###

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

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

# 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
Code 52 : crosstabs

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

# Tables mit CrossTable
library(gmodels)
CrossTable(Geschlecht, Alter)
CrossTable(Geschlecht, Alter, format="SPSS")
Your turn!
Mache folgende Häufigkeitstabellen für den wow
Datensatz mit CrossTable:
1) Alter gegen Zeitaufwand
2) Geschlecht gegen Zeitaufwand
Code 53 : Formulas
### 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
Code 54 : Formulas

y   ~   x1 ! ! !            #   Modell mit einem Regressor
y   ~   x1 + x2             #   zwei Regressoren, keine Interaktion
y   ~   x1 + x2 + x1:x2 !   #   zwei Regressoren plus Interaktion
y   ~   x1 * x2! ! ! !      #   identisch
Code 55 : lm
# lineare Modelle schätzen
?lm! ! ! ! ! ! ! !
   !                                    #   lineare Modelle
lm1 <- lm(score ~ KO, data=wow)!!       #   Modell mit 1 Regressor
lm1! ! ! ! ! ! ! !
   !                                    #   Modell ausgeben
summary(lm1)!! ! ! ! !                  #   summary des Modells

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

attach(wow)! ! !    !   !   !   !   #   wow anhängen
plot(KO, score)!!   !   !   !   !   #   KO gegen score plotten
abline(lm1)! ! !    !   !   !   !   #   Regressionsgerade hinzufügen
detach(wow)! ! !    !   !   !   !   #   wow aushängen
Code 56 : Modelle vergleichen



  # Modelle vergleichen

  fit1 <- lm(x1 ~ y1 + y2, data=anscombe)
  fit2 <- lm(x1 ~ y1, data=anscombe)
  anova(fit1, fit2)
Your turn!
Nutze den Datensatz anscombe und berechne eine
Regression von y1 auf x1.
Plotte die Werte und zeichne die Regressionsgerade
ein.
Code 57 : One-Way-Anova
##### 1-WAY-ANOVA ######
wowAnova <- aov(score ~ Alter, data=wow)
summary(wowAnova)

### Post-hoc Tests ###
TukeyHSD(wowAnova)! !           # Tukey Test
library(gplots)!! ! ! !      ! # gplots laden
attach(wow)! ! ! ! ! !       ! # Datensatz wow aushängen
plotmeans(score ~ Alter)! !  ! # mean plot mit
                                # Konfidenzgrenzen
pairwise.t.test(score, Alter, p.adj = "none")!
                  # paarweise t-Tests ohne Alpha Korrektur
pairwise.t.test(score, Alter, p.adj = "bonf") !
                  # mit Alpha Bonferroni Korrektur
detach(wow)! ! ! ! ! ! ! # Datensatz wow aushängen
Your turn!
Nutze den Datensatz InsectSprays. Dieser enthält
Zählungen von Insekten bei der Nutzung
verschiedener Insektensprays.

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

Mache einen plot der Mittelwerte und als post-hoc Test
einen Tukey-Test sowie paarweise t-Tests mit
Bonferroni Korrektur.
Code 58 : Two-Way-Anova

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

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

# Two-way Interaction Plot
attach(wow)
interaction.plot(Geschlecht, Zeitaufwand,
                 AL, type="b", col=1:3)
interaction.plot(Zeitaufwand, Geschlecht,
                 AL, type="b", col=1:3)
detach(wow)
Code 59 : Faktorenanalyse

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

names(wow)
fit <- factanal(wow[4:23], 6, rotation="varimax")
fit
print(fit, digits=2, cutoff=.3, sort=FALSE)
Your turn!
Lade die .csv Datei fa_daten.csv und mache mit ihr eine
Faktorenanalyse.
### TAG 4 ###
Graphic Systems
                R Graphic Systems

base graphics                   grid graphics

                      lattice               ggplot2

   various
  packages

many graphic
  function
Code 60 : Datensätze
### Daten zum ausprobieren ###

# Viele Datensätze sind bereits in R vorhanden

data()!
      ! !     !   #   zeigt an welche Datensätze existieren
anorexia! !   !   #   Daten anorektischer Patienten aus
                  #   package MASS
insectsprays!!    #   package datasets

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

install.packages("datasets")!!     # installieren
library(datasets)! ! ! ! !         # laden des Pakets
Code 61 : Grafiken I
### einfache Visualisierungen ###

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

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

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

?qqplot! ! ! ! ! !            # QQ-Plots
qqnorm(precip)
qqnorm(wow[,"score"])
Code 62 : Grafiken II
?boxplot! ! ! ! !              # Boxplot
boxplot(count ~ spray, data = InsectSprays)
boxplot(score ~ Alter, data=wow, col="lightgray")

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

?barplot! ! ! ! !              # Barchart
barplot(VADeaths)
barplot(1:10)
barplot(matrix(1:9,3))
barplot(table(Geschlecht, Zeitaufwand))
Code 63 : Grafiken III

?coplot! ! ! ! ! !             # condition plot
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)
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.
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.
Code 64 : Grafikoptionen ändern I
#### Grafikoptionen verändern ###

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

attach(wow)

plot(KO, score)
plot(KO, score, xlab="Kontrollverlust", ylab="Suchtscore")
plot(KO, score, main="Kontrollverlust vs. Sucht",
 !   xlab="Kontrollverlust", ylab="Suchtscore")
plot(KO, score, col=3)
plot(KO, score, col=3, pch=15)
plot(KO, score, col=3, pch=15, cex=.5)
plot(KO, score, col=3, pch=15, cex=.5)
Code 65 : Grafikoptionen ändern II
?barplot
barplot(table(Geschlecht, Zeitaufwand))! !
                             # stacked

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

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

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

barplot(table(Geschlecht, Zeitaufwand), cex.names=.7) !
                              # Achsenbeschriftung kleiner
barplot(table(Geschlecht, Zeitaufwand),
     ! legend.text=c("männlich", "weiblich"),!cex.names=.8)
                              # Legende
detach(wow)
Code 66 : Grafikbeispiel
#### iris dataset #######

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

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

pairs(wow[c(24:28, 30)], col=meanSplitKO + 10)
                                       # Neue Farben WoW
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
Code 67 : base graphics I
### Einführung ins base Grafik System ###

# grafische Basiselemente
?plot! ! ! ! ! ! !           # welche Optionen gibt es?
! ! ! ! !
set.seed(5)! ! ! ! ! ! # Ausgangspunkt für Zufallszahl
iq <- rnorm(30, 100, 15)! !
pisa <- x*.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
Code 68 : 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), col=3)
                       # andere Farbe
! ! !
# die par() (Parameter) Einstellungen
lines(x=c(60,130), y=c(40,80), col=3, lty=3, lwd=2)
Code 69 : base graphics III
?abline
plot(iq, pisa, col="brown", pch=16)!
                                   !
                          # plotten von x gegen y

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

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

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

abline(lm(pisa ~ iq))!
                     !
!            ! ! ! !     # Regressionslinie pisa ~ iq
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
Code 70 : 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,78, "test text", col="blue")!
                                # Text an Position (72,78)

?mtext!
      ! ! ! ! ! ! ! ! # für margin text
mtext(side=3, "test mtext", col="red")!
                                # margin text oben
Code 70b : Grafische Bereiche
Code 71 : 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
Your turn!
Zeichne den plot score (auf y) gegen TO (auf x) (WoW Daten) und direkt
daneben das Histogram von score. Nutze hierzu die par() Einstellung
mfrow.
Zusatzaufgabe: Füge dem plot vorher noch für den Fall mit dem größten
und für kleinsten Suchtwert jeweils einen Punkt hinzu, der rot und gefüllt
ist.

                                                  TO gegen score                                                 Histogram of score

                                                                                   ● ●
              1.0 1.5 2.0 2.5 3.0 3.5




                                                      ●
                                                                                 ● ●




                                                                                                      60
                                                                    ●
                                                                    ●        ●   ●
                                                                                   ●
                                              ●                                ● ●
                                                          ●                  ●




                                                                                          Frequency
                                                                ●   ●        ●
                                                                ●        ●
                                                                         ●   ● ●
      score




                                                                                                      40
                                                          ●         ●    ●     ●   ● ●
                                                  ●             ●   ●    ●
                                                                         ●   ● ● ● ●
                                                                               ●
                                        ●                 ●         ●    ●   ●
                                                  ●
                                                  ●   ●
                                                      ●   ●     ●
                                                                ●   ●    ●   ● ● ● ●
                                                  ●   ●
                                                      ●   ●
                                                          ●     ●
                                                                ●   ●    ●   ● ● ● ●
                                                                             ●
                                              ●       ●   ●
                                                          ●     ●
                                                                ●   ●
                                                                    ●    ●
                                                                         ●   ● ● ●
                                        ●     ●   ●
                                                  ●   ●
                                                      ●   ●
                                                          ●     ●   ●
                                                                    ●    ●
                                                                         ●     ● ●
                                        ●     ●   ●   ●   ●     ●   ●    ●



                                                                                                      20
                                        ●
                                        ●     ●   ●
                                                  ●   ●
                                                      ●   ●     ●
                                                                ●   ●
                                                                    ●    ●
                                        ●
                                        ●     ●
                                              ●   ●
                                                  ●   ●
                                                      ●   ●
                                                          ●     ●
                                                                ●   ●
                                        ●
                                        ●     ●
                                              ●   ●
                                                  ●   ●
                                                      ●   ●
                                                          ●     ●
                                                                ●        ●
                                        ●
                                        ●     ●
                                              ●   ●
                                                  ●   ●
                                                      ●   ●     ●
                                                                ●   ●
                                        ●
                                        ●     ●
                                              ●   ●   ●
                                                      ●
                                        ●
                                        ●     ●
                                              ●   ●   ●
                                                      ●   ●
                                        ●
                                        ●     ●
                                              ●
                                        ●
                                        ●
                                                                                                      0


                                        1.0               2.0                3.0    4.0                    1.0    1.5   2.0   2.5   3.0   3.5

                                                                    TO                                                   score
Normskala IQ
Pisa Ergebnisse geschätzt durch den IQ


              Normskala R
80
                                                                           ●




                                                                       ●


70                             ●
     ●
                          ●
                                                           ●

                     ●                 ●                                       ●
                                                                               ●
                                                     ●●
                                   ●       ●
                 ●            ●        ●
60




                                                                                   ●
                                                                  ●
                                           ●                    ●●
                          ●                                                ●


                              ●        ●
                               ●                    ●
50




                     ●
                          ●
40




                                                                                             IQ Werte

         70     80            90               100        110          120             130
                                                                                             z−Werte

         −2          −1                         0                 1                     2
                                                                                             T−Werte

         30          40                        50                 60                   70
Code 72 : plot from scratch I
# plot from scratch
oldPar <- par()!! !     # alte Parameter speichern
par(oma=c(3,0,0,4))!!   # outer margin verändern

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

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

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

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

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

par(oldPar)          # Parameter settigs wiederherstellen
Code 73 : Grafik als Datei
 ### Grafik-Output in Datei erzeugen ###

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

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

 dev.list()!     # welche devices sind noch offen?
Your turn!
Übung in eine .pdf Datei aus. Da der Code noch existiert kann
der plot ja schnell wiederhergestellt werden :)
Your turn!
Drucke alle pch Symbole von 1 bis 25 mit plot() in einem Raster. Jedes Symbol soll eine
   verschiedene Farbe haben. Erstelle eine Überschrift. Es sollte in etwa so aussehen:

                                    pch Symbole von 1 bis 25



                     5   ●


                         ●                                 ●   ●
                     4




                                              ●
                     3
                 y




                                                               ●
                     2




                         ●
                     1




                          1        2           3           4   5

                                               x
Code 74 : R Commander


#############    R Commander   ################

library(Rcmdr)
Commander()
Es ist geschafft!
### Lösungen Your Turn! ###
Your turn!
   Erzeuge folgende Vektoren, mit jeweils mit 10 Elementen



> seq(10,1)
 [1] 10 9 8 7 6            5     4   3   2   1
> rep(1,t=10)
 [1] 1 1 1 1 1 1 1 1       1 1
> rep(c(1,2), t=5)
 [1] 1 2 1 2 1 2 1 2       1 2
> rep(c(1,2), e=5)
 [1] 1 1 1 1 1 2 2 2       2 2
> rep(1:4, 4:1)
 [1] 1 1 1 1 2 2 2 3       3 4
Your turn!
        Erzeuge folgende Ausgabe in der Konsole, indem
     Du paste() und die Konstante month.name nutzt.



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

"January is month number 1"     "February is month number 2"
"March is month number 3"       "April is month number 4"
"May is month number 5"         "June is month number 6"
"July is month number 7"        "August is month number 8"
"September is month number 9"   "October is month number 10"
"November is month number 11"   "December is month number
12"
Your turn!
      Du hast folgenden Vektor: v <- c(1,2,3,4,5).
           Erzeuge folgende Ausgabe in der Konsole:



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


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

> cat("Der Vektor v hat die Länge", length
(v), "nEr besteht aus folgenden Elementen",
v)
Your turn!
        Erzeuge folgende Ausgabe in der Konsole, indem
  Du cat(), paste() und die Konstant month.name nutzt.

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

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


          Die Ausgabe soll nun pro Zeile erfolgen
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)




> sum((x-mean(x))*(y-mean(y)))/6
> cov(x,y) ! ! # zur Kontrolle
Your turn!
     Lege ein Verzeichnis RCourse an und setze es als neues
Arbeitsverzeichnis. Lege eine Unterordner data an und wechsele in
ihn. Wechsel anschließend wieder in den übergeordneten Ordner.




        setwd("users/mark/RCourse")
        setwd("data")
        setwd("..")
Your turn!
Berechne die Korrelation für folgende zwei Datenreihen in R „zu
 Fuß“. Konstruiere die Lösung so, dass man x und y (gleich lang)
     austauschen kann, ohne den Code sonst zu verändern.


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




> kovarianz <- sum((x-mean(x))*(y-mean(y)))/(length(x)-1)
> kovarianz/(sd(x)*sd(y))
> cor(x,y) ! ! # zur Kontrolle
Quiz 1 !
Welche Regeln gibt es für die Benennung von Objekten?
(s. Folie Objektbezeichnungen)
Welche Regeln gibt es für leserlichen Code?

Welche Objektnamen sind erlaubt?
a1234              JA
ausdruck           JA
Variable           JA
.Variable          JA
Variable.          JA
_Variable          NEIN
Variable_          JA
1teVariable        NEIN
.1Variable         NEIN

Überlege was folgende Ausdrücke ergeben:
11 %% 5
1:6 %% 2
11 %/% 5
10:19 %/% 5
Quiz 2 !
Überlege was folgende Ausdrücke ergeben:

11 %% 5
1:6 %% 2

11 %/% 5
10:19 %/% 5

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

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

!any(T)
any(c(T, F) | c(F, T))
which(c(T, F) | c(F, T))
Quiz 3 !
Überlege was folgende Ausdrücke ergeben:

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

6 + 1:4
6:1 - 3:1

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

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

> c(which.min(x), which.max(x))
Quiz 4 !
Überlege was folgende Ausdrücke ergeben:

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

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

Erzeuge einen Vektoren mit NV Zufallszahlen der Länge 10 und runde ihn auf eine
Dezimalstelle.
> round(rnorm(10),1)
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)

> x[x==99 | x==999] <- NA
> x
 [1] 1 4 3 NA 4 3 NA NA                 3   6 NA
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

>    v[v<=3] <- 0
>    v[v>=4 & v<=7] <- 1
>    v[v>7] <- NA
>    v
    [1] 0 0 0 1 1 1              1 NA NA NA
Your Turn!
    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

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

                  Quelle: Foliensatz von Peter Ruckdeschel / Matthias Kohl. R/S-plus für Einsteiger und Fortgeschrittene
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
...

>   m <- round(matrix(rnorm(20*12), ncol=12), 0)
>   colnames(m) <- month.abb
>   rownames(m) <- paste("Woche", 1:20)
>   m
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) Folgende Zellen sollen nun durch 999 ersetzt werden:
(1,1) (4,3) (4,4) (1,7)

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

       M <- matrix(round(rnorm(7*7),1), ncol=7)
       M[1,1] <- 999
       M[4,3] <- 999
       M[4,4] <- 999
       M[1,7] <- 999
       M[M==999] <- NA
Your turn!
       Berechne die Matrix b der Regression y
          regridiert 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!
X <- cbind(rep(1,7), x)! !    # Design Matrix erstellen
Y <- y
solve(t(X)%*% X)%*%t(X)%*%Y   # Berechnung
lm(y~x) # zur Kontrolle
Your turn!
     Erzeuge einen factor der folgenden Form:



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

[1] Gruppe 4 Gruppe 4 Gruppe 4 Gruppe 4
Gruppe 3 Gruppe 3 Gruppe 3 Gruppe 2 Gruppe 2
Gruppe 1
Levels: Gruppe 1 Gruppe 2 Gruppe 3 Gruppe 4
Your turn!
Erstelle eine Liste l, bei der: a) das erste Element ein Vektor der
Großbuchstaben A bis M ist b) das zweite Element die Zeichenkette
"Ich bin das zweite Element" c) das dritte Element eine Matrix (5x5) mit
zufälligen Werten mit 1 Dezimalkommastelle enthält.
            > e1 <- LETTERS[1:13]
            > e2 <- "Ich bin das zweite Element"
            > e3 <- matrix(round(rnorm(5*5),1), ncol=5)
            > l <- list(e1,e2,e3)
            > l
            [[1]]
             [1] "A" "B" "C" "D" "E" "F" "G" "H" "I" "J" "K" "L" "M"

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

            [[3]]
                    [,1]   [,2] [,3] [,4] [,5]
            [1,]     0.9    0.3 0.5 0.6 2.4
            [2,]    -0.9   -0.7 1.5 -1.1 -1.2
            [3,]    -1.2    0.9 0.4 -1.7 0.2
            [4,]    -0.4   -0.1 0.2 0.0 0.8
            [5,]     1.3   -1.1 -0.7 0.0 1.1
Your turn!
Füge nun noch folgende Namen zu den Listenelementen hinzu:
Buchstaben, Text, Matrix.
Dann ändere alle Einträge der Matrix, die kleiner als 0 sind, in NAs um, kürze
den Vektor Buchstaben auf A bis F und kehre die Reihenfolge der letzten beiden
Listenelemente um.
                     > names(l) <- c("Buchstaben", "Text", "Matrix")
                     > l$Matrix[l$Matrix < 0] <- NA
                     > l$Buchstaben <- l$Buchstaben[1:6]
                     > l <- l[c(1,3,2)]
                     > l
                     $Buchstaben
                     [1] "A" "B" "C" "D" "E" "F"

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

                     $Text
                     [1] "Ich bin das zweite Element"
Your turn!
                       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
               ...
>   f1 <- factor(rep(c("m", "w"), each=10))
>   f2 <- factor(rep(c("Control", "Treat", "Placebo"), l=20))
>   r1 <- round(rnorm(20)*15+100, 1)
>   r2 <- round(rnorm(20, mean=20, sd=5), 1)
>   d <- data.frame(Geschlecht=f1, Intervention=f2, IQ=r1, BMI=r2)
>   d
Quiz 1 !
Kehre die Elemente des folgenden Vektors um
v <- rep(1:3, 3:1)
v[6:1]
[1] 1 1 1 2 2 3

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

Erzeuge folgenden data frame mit beliebigen Werten

         IQ schulnote
1      95.9         3
2      83.0         2
3     104.7         4
...
> d1 <- data.frame(IQ=round(rnorm(10), 1),
!               schulnote=round(rnorm(10), 1))
> d1
Quiz 2 !
Ändere folgende Zellen des data frame in NA: (1,1) (5,2)
d1[1,1] <- NA
d1[5,2] <- NA

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

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

Ändere nun die Zelle (2,2) des data frames (erstes Listenelement)
in der Liste auf NA
l1[[1]][2,2] <- NA
Your turn!
        baue den vorher erzeugten Datensatz um: a) erst die
ungeraden, dann die geraden Zeilen kommen 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
           ...

   > d[c(seq(1,19,2), seq(2,20,2)), c(3,4,1,2)]! !        !
   > # oder auch
   > rbind(d[c(T,F),c(3,4,1,2)],
           d[c(F,T),c(3,4,1,2)])
Your turn!
     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

> d[d$Intervention == "Treat"        &   d$Geschlecht=="w" ,]
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
> d[d$IQ > 90 & d$IQ < 110 & d$Geschlecht=="m" ,]
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
...

> subset(d, IQ > mean(IQ))
R kurs so se 2010 uni bremen   m. heckmann
R kurs so se 2010 uni bremen   m. heckmann
R kurs so se 2010 uni bremen   m. heckmann
R kurs so se 2010 uni bremen   m. heckmann
R kurs so se 2010 uni bremen   m. heckmann
R kurs so se 2010 uni bremen   m. heckmann
R kurs so se 2010 uni bremen   m. heckmann
R kurs so se 2010 uni bremen   m. heckmann
R kurs so se 2010 uni bremen   m. heckmann
R kurs so se 2010 uni bremen   m. heckmann
R kurs so se 2010 uni bremen   m. heckmann
R kurs so se 2010 uni bremen   m. heckmann
R kurs so se 2010 uni bremen   m. heckmann
R kurs so se 2010 uni bremen   m. heckmann
R kurs so se 2010 uni bremen   m. heckmann
R kurs so se 2010 uni bremen   m. heckmann

More Related Content

More from Mark Heckmann

Comparing interactive online and face-to-face repertory grid interviews in te...
Comparing interactive online and face-to-face repertory grid interviews in te...Comparing interactive online and face-to-face repertory grid interviews in te...
Comparing interactive online and face-to-face repertory grid interviews in te...Mark Heckmann
 
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
 
R-Kurs Mark Heckmann WiSe 2010-2011 Uni Bremen
R-Kurs Mark Heckmann WiSe 2010-2011 Uni BremenR-Kurs Mark Heckmann WiSe 2010-2011 Uni Bremen
R-Kurs Mark Heckmann WiSe 2010-2011 Uni BremenMark Heckmann
 

More from Mark Heckmann (6)

Comparing interactive online and face-to-face repertory grid interviews in te...
Comparing interactive online and face-to-face repertory grid interviews in te...Comparing interactive online and face-to-face repertory grid interviews in te...
Comparing interactive online and face-to-face repertory grid interviews in te...
 
Knitr Formeln - R
Knitr Formeln - RKnitr Formeln - R
Knitr Formeln - R
 
R base graphics
R base graphicsR base graphics
R base graphics
 
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
 
R-Kurs Mark Heckmann WiSe 2010-2011 Uni Bremen
R-Kurs Mark Heckmann WiSe 2010-2011 Uni BremenR-Kurs Mark Heckmann WiSe 2010-2011 Uni Bremen
R-Kurs Mark Heckmann WiSe 2010-2011 Uni Bremen
 

R kurs so se 2010 uni bremen m. heckmann

  • 1. Einführung in R (Statistik + Programmierung) Mark Heckmann Universität Bremen www.markheckmann.de http://ryouready.wordpress.com
  • 2. Why R? • free • open source • flexible • (not yet extensive) documentation • high-end graphics engine • packages for (almost) everything
  • 4. ● ● 5 ● 4 ● ● ● ● ● ● factor(cyl) ● ● ●● ● ● ● 4 wt ● ● ● ● 6 ● 3 ● 8 ● ● ● ● ● ● ● ● 2 ● ● ● ● 15 20 25 30 mpg
  • 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 6 8 10 rating
  • 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 64 66 68 70 depth
  • 8.
  • 9.
  • 10.
  • 12. 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 
  • 13. R Ressources • R Project Site: www.r-project.org • Blogs • www.r-bloggers.com • http://ryouready.wordpress.com • eBooks/Wikis/Sites •Quick-R website •http://de.wikibooks.org/wiki/GNU_R •http://addictedtor.free.fr • R seek (www.rseek.org)
  • 14. R-user & R-help = beste Freunde! R-help Leer
  • 15. Die ersten beiden Tage müsst ihr leider durchhalten!
  • 16. ### TAG 1 ###
  • 17. Good to know I • R arbeitet im Frage-Anwort Modus • Navigieren in R Konsole durch Aufwärts und Abwärts Pfeile • Alles hinter der Raute (#) sind Kommentare und wird von R nicht ausgewertet • Ein Befehl wird durch ein Semikolon oder durch einen Zeilenumbruch abgeschlossen • Ein Befehl darf über mehrere Zeilen gehen • Dezimalstellen sind Punkte, keine Kommas. Kommas haben eine andere Funktion
  • 18. Code 1 : 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
  • 19. Code 2 : 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 verwedenet werden a = 2 + 2!! # Alternative Zuweisung (wird i.d.R. # nicht verwendet). ! ! ! ! # Zuweisung wird 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
  • 20. Objektbezeichnungen • Variablen/Objekt-benennung: können alphanumerisch sein sowie, Punkte und Unterstriche enthalten • Darf keine Operatoren enthalten (+, - *, / etc.) • Objektname darf nicht mit Zahl beginnen bzw. Punkt gefolgt von einer Zahl. # • Groß- und Kleinschreibung wird unterschieden (Nutzung zum Strukturieren von Objektnamen)
  • 21. Code 3 : Bezeichnung & Stil varone <- 1 varOne <- 2! ! # ist eine andere Variable als varone neueVariable1 <- 7 neueVariable2=neueVariable1+2! ! # kaum lesbar! schlechter Stil! neueVariable2 <- neueVariable1 + 2! # besser, sauber getrennt
  • 22. Code 4 : Logik ### Hierarchie der Datentypen in R. ### # Jede höhere Stufe kann auch die tieferen repräsentieren NULL! ! ! # die leere Menge, unterstse Stufe TRUE! ! ! # logische Werte 3.14! ! ! # ganze und reelee Zahlen 2.13+3i! ! ! # komplexe Zahlen "Hallo"! ! ! # Buchstaben und Zeichen
  • 23. Code 5 : Logik # 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
  • 24. Code 6 : Logik # logisches ODER TRUE || TRUE!! # TRUE TRUE || FALSE FALSE || TRUE FALSE || FALSE # ausschließliches ODER xor(TRUE, FALSE)! # ausschließliches ODER xor(TRUE, FALSE) T !! ! ! ! # Kurzform von TRUE F! ! ! ! ! # Kurzform von FALSE c(T,T) & c(T,T)!! # vektorwertiger Vergleich, d.h. # für jedes Element einzeln c(T,F) | c(F,F)
  • 25. Code 7 : Logik # Rechnen mit logischen Werten FALSE + TRUE!! # 1 TRUE + TRUE! ! ! # 2 TRUE * 2! ! ! # 2 TRUE - FALSE - TRUE!
  • 26. 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
  • 27. 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)
  • 28. 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 zurück a <- plot(1:10) a
  • 29. Code 8 : Hilfe! ### HELP R ### help.start()!! ! # Hilfe aufrufen. Auch über das # Menü möglich ?mean! ! ! ! ! # Hilfe zur Funktion "mean" help(mean)! ! # identisch! ! help("mean")!! # identisch! ! apropos() ! ! ! ! # alle Objekt, die mean enthalten help.search("mean") ! # oder ??mean
  • 30. Code 9 :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 #
  • 31. Code 10 : 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)
  • 32. 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
  • 33. Code 11 : Wichtige Funktionen # Wichtige Funktionen all()! ! ! # Sind alle Elemente TRUE any()! ! ! # Ist mindestens ein Element TRUE which()! ! ! # Welche Elemente sind TRUE 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
  • 34. Code 12 : 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
  • 35. Code 13 : Strings # Umgang mit Strings / Zeichen ?print print("Hallo")! ! # Drucken von "Hallo" in der Konsole print(1+1)! ! ! # Ausruck wird erst ausgewertet, dann gedruckt ?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="_")! # Seperator festlegen paste(c(1:3), c("A", "B", "C"), sep="_", collapse=" ")! ! # Trennzeichen zum Kollabieren paste(c(1:3), c("A", "B", "C"), sep="_", collapse="_")
  • 36. 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"
  • 37. Code 14 : Strings ?cat! ! ! # Ausgabe der und Aneinanderhängen der Objekt cat("Hallo")!! ! ! ! ! ! ! # Ausgabe von Hallo auf der Konsole cat("Hallo", "wie gehts?")! ! ! # Ausgabe von EINEM Text cat("Ich bin Jonny Nr.", 5)! ! ! # Mischen von Zahlen und Text cat("IQ hat einen mean von :", 100, ! "und eine sd von:", 15)! ! ! # Zahlen und Text alter <- 31 cat("Ich bin", alter, "Jahre alt.")! # Variablen und Text ! cat("Eins plus Eins ist", 1 + 1)! ! # Ausdrücke werden erst # ausgewertet! cat("Dieser Satz hat einen Umbruch n und geht dann weiter.") # Umbruch durch n cat("Ein Tabulator t mitten im Satz.")! # Tabulator durch t cat("Anführungsstriche 'Test' im Text")! # Anführungsstriche cat("Anführungsstriche "Test" im Text")! Escape Symbol #
  • 38. Your turn! Du hast folgenden Vektor: v <- c(1,2,3,4,5). Erzeuge folgende Ausgabe in der Konsole: Der Vektor v hat die Länge 5 Er besteht aus folgenden Elementen: 1 2 3 4 5 Tip: Benutze hierzu die Funktion cat() und length() und kombiniere Variablen und Text.
  • 39. Your turn! Erzeuge folgende Ausgabe in der Konsole, indem Du cat(), paste() und die Konstant 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 Die Ausgabe soll nun pro Zeile erfolgen
  • 40. Code 15 : 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
  • 41. Code 16 : 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
  • 42. Code 17 : Anwendung BMI ### BMI BEISPIEL FÜR INTERAKTIVE NUTZUNG ### 68/1.70^2 # Body Mass Index. # Um den Wert weiterzubenutzen in ein Objekt speichern myBmi <- 68/1.70^2 myBmi myBmi.2 <- myBmi 2bmi <- myBmi ! ! ! # Fehler, weil Objektname mit Zahl beginnt 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?
  • 43. Code 18 : Anwendung BMI height2 <- c(1.70, 1.63, 1.90) weight / height2^2! ! ! ! ! # Vektor wird recycled mit warning height3 <- c(1.70, 1.63) weight / height3^2! ! ! ! ! # Vektor wird recycled ohne warninig, da er # 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)! ! ! ! ! ! ! # Durchscnitt
  • 44. Code 19 : Anwendung BMI (bmi[1] – mean.bmi)^2 + (bmi[2] – mean.bmi)^2 + (bmi[3] – mean.bmi)^2 + (bmi[4] – mean.bmi)^2! # SSQ (bmi - c(mean.bmi, mean.bmi, mean.bmi, mean.bmi))^2 # wie kann ich es einfacher schreiben (bmi – mean.bmi)^2! ! ! ! ! ! # mit recycling! ! sum((bmi – mean.bmi)^2)! ! ! ! # SSQ sd.bmi <- sqrt(sum(bmi – mean.bmi)^2)/n-1)# Wurzel aus SSQ geteilt # durch n-1 n <- 4 sd.bmi <- sqrt(sum(bmi – mean.bmi)^2)/n-1) sd(bmi)! ! ! ! # so ist es natürlich viel einfacher
  • 45. Take along! Selbst wenn etwas nicht in R nicht existiert, kann man es sich selber programmieren!
  • 46. 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)
  • 47. Code 20 : Navigieren # Projektordner anlegen /RCourse # Navigieren in Verzeichnissen getwd() !! ! # Unterschied Slash/Backslash Windows setwd() ! ! ! ! # Arbeitsverzechnis setzen setwd("/Users/markheckmann/RCourse") # in Verzeichnis RCourse wechseln setwd("..") ! ! ! # ein Verzeichnis runter setwg("testdir")! ! # ein Verzeichnis hoch setwd("../testdir")! # eins runter und wieder eins hoch !
  • 48. Your turn! Lege ein Verzeichnis RCourse an und setze es als neues Arbeitsverzeichnis. Lege eine Unterordner data an und wechsele in ihn. Wechsel anschließend wieder in den übergeordneten Ordner.
  • 49. Code 20b : Arbeitsbereich ### Workspace speichern / History speichern ?savehistory() savehistory("Befehle_von_Tag_1.history") loadhistory("Befehle_von_Tag_1.history") ?save.image() save.image("erster Kurstag.RData")! # Arbeitsbereich 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
  • 50. Your turn! Berechne die Korrelation für folgende zwei Datenreihen in R „zu Fuß“. Konstruiere die Lösung so, dass man x und y (gleich lang) austauschen kann, ohne den Code sonst zu verändern. x <- c(-2,-1,-1,0,1,1,2) y <- c(-1,-2,1,0,2,-1,1)
  • 51. Code 21 : Datentypen ### Datentypen ### ### Hierarchie der Datentypen in R. ### # Jede höhere Stufe kann auch die tieferen repräsentieren NULL! ! ! # die leere Menge, unterste Stufe TRUE! ! ! # logische Werte 3.14! ! ! # ganze und reelee Zahlen 2.13+3i! ! ! # komplexe Zahlen "Hallo"! ! ! # Buchstaben und Zeichen # Datenobjekte in R – ALLES in R ist ein Objekt 1 !! ! # numeric "Hallo"! ! # characters NA! ! ! # missing value NaN! ! ! # Not a number
  • 52. ### TAG 2 ###
  • 53. Quiz 1 ! Welche Regeln gibt es für die Benennung von Objekten? Welche Regeln gibt es für leserlichen Code? Welche Objektnamen sind erlaubt? a1234 ausdruck Variable .Variable Variable. _Variable Variable_ 1teVariable .1Variable Überlege was folgende Ausdrücke ergeben: 11 %% 5 1:6 %% 2 11 %/% 5 10:19 %/% 5
  • 54. Quiz 2 ! Überlege was folgende Ausdrücke ergeben: 11 %% 5 1:6 %% 2 11 %/% 5 10:19 %/% 5 T & F | T T | (T | F) (T | T) & (T | F) c(T, F) | c(F, T) xor(T, F) xor(c(T,F), c(F,F)) !any(T) any(c(T, F) | c(F, T)) which(c(T, F) | c(F, T))
  • 55. Quiz 3 ! Überlege was folgende Ausdrücke ergeben: 1:5 > 2 c(-1,2,3,5) == min(c(-1,2,3,5)) 6 + 1:4 6:1 - 3:1 3*FALSE - TRUE*5 c(T,F,T,F,T) == 1 c(T,F,T,F,T) == FALSE x <- c(1,5,2,0,6,2,9) Suche die Stelle des Vektors x raus, der zu der niedrigsten Zahl sowie zu der höchste Zahl gehört. Ordne die beiden Werte dann in einem Vektor an.
  • 56. Quiz 4 ! Überlege was folgende Ausdrücke ergeben: seq(10, 1, -1) seq(10, 1, 1) rep(1:3, times=3:1) rep(rep(1:2, t=1:2), t=1:3) rep(1:3, l=5) LETTERS[2:4] Erzeuge folgende Vektoren: [1] "a" "c" "e" "g" "i" "k" "m" "o" "q" "s" "u" "w" "y" [1] "B=2" "D=4" "F=6" "H=8" "J=10" Erzeuge einen Vektoren mit NV Zufallszahlen der Länge 10 und runde ihn auf eine Dezimalstelle.
  • 57. Code 22 :Vektoren ### 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 ?vector! ! ! ! ! ! ! # Hilfe zu vector() aufrufen vector("logical", length=10)!# log. Vektor der Länge 10 erzeugen vector("numeric", length=10)!# num. Vektor der Länge 10 erzeugen vector("character", length=10)! # char Vektor d. L. 10 erzeugen c(TRUE, 2, FALSE)! ! ! ! # innerhalb eines Vektors stets # nur ein Typ möglich c(T, "A", 1)!! ! ! ! # Automatische Umwandlung auf # niedrigstes mögliches Datenniveau
  • 58. Code 23 :Vektoren # Zugriff auf eine Elemente durch eckige Klammern und Angabe der Position oder des Namens, sofern es ein „named vector“ ist. a[1]! ! ! ! ! # Zugriff auf erstes Element des Vektors a[c(1,2)]!! ! ! # Zugriff auf die ersten beiden Elemente des Vektors 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
  • 59. Code 24 :Vektoren 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
  • 60. 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)
  • 61. 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
  • 62. Code 25 : Matrix ### matrix – zweidimensionales Datenobjekt ### ?matrix matrix(1:12, nrow=3, ncol=4)!! ! ! # Matrix erstellen matrix(1:12, nrow=3, ncol=4, byrow=TRUE)! # Matrix reihenweise x <- 1:12 dim(x) <- c(3,4)! ! ! ! # Dimensionsattribut ändern x dim(x) <- c(12)!! ! ! ! # zurück zu Vektor dim(x) <- c(3,4)! ! ! ! # Wieder als Matrix e <- matrix(c(1,0,0,0,1,0,0,0,1), 3, 3)! ! # Einheitsmatrix diag(3)! ! ! ! ! ! ! # Einheitsmatrix per Funktion is.matrix()
  • 63. 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 Quelle: Foliensatz von Peter Ruckdeschel / Matthias Kohl. R/S-plus für Einsteiger und Fortgeschrittene
  • 64. Code 26 : Matrix # 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[c(T, F, T), T]! # Auswahl funkioniert auch über T/F x[c(T, F, T), c(F,F,T,T)] x > 5! ! ! ! ! # welche Elemente sind größer 5 is.na(x)! ! ! ! # Welche Einträge der Matrix sind NA?
  • 65. Code 26 : Matrix # 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 x[c(T, F, T), T] # Auswahl funkioniert auch über # TRUE/FALSE x[c(T, F, T), c(F,F,T,T)]
  • 66. Code 27 : Matrix # 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
  • 67. 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
  • 68. Code 28 : Matrix # 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)]
  • 69. Code 29 : Matrix # 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
  • 70. 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) Folgende Zellen sollen nun durch 999 ersetzt werden: (1,1) (4,3) (4,4) (1,7) 3) Alle Einträge die 999 enthalten sollen NA gesetzt werden. Quelle: Foliensatz von Peter Ruckdeschel / Matthias Kohl. R/S-plus für Einsteiger und Fortgeschrittene
  • 71. Code 30 : Matrix ### 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
  • 72. Your turn! Berechne die Matrix 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!
  • 73. Code 31 : Faktoren ### factors - für qualitativ unterschiedliche Merkmale val <- c(1,2,1,1,1,2,3,3)!! ! ! # neuer Vektor f <- factor(val, levels=1:3)!! ! # factor erzeugen mit # Levels 1 bis 3 f levels(f)!! ! ! ! ! ! # Bezeichnung der Levels levels(f) <- c("Treatment 1", "Treatment 2", "Control") # Neue Level Bezeichnungen f # 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
  • 74. 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
  • 75. Code 31 : Listen ### lists / Listen - Datentyp ### bmi.class1 <- c(20,23,26,18) bmi.class2 <- seq(20, 30, by=2) bmi.class3 <- 20:35 # --> passen nicht in Matrix, da sie unterschiedliche Anzahl an Einträgen haben l <- list(bmi.class1, bmi.class2, bmi.class3)! # Erstellen einer Liste l! ! ! ! l[[1]] ! ! ! # Auf Listenelemente wird mit einer # doppelten eckigen Klammer zugegriffen l[[1]][1:3]! ! # Auswahl des ersten Listenelements und # innerhalb diesem das erste bis dritte Element l[1]! ! ! # Listenelement 1 noch als Liste l[1:2] ! ! # Listenelemente 1 und 2 l[-1]! ! ! # negatives indzieren
  • 76. Code 32 : Listen l <- list(mathe=bmi.class1, bio=bmi.class2, deutsch=bmi.class3)! # benannte Liste names(l)! ! ! ! ! # Namen der Liste anzeigen l[["deutsch"]]! ! ! # Zugriff auf Listeneintrag per Namen l$deutsch!! ! ! ! # äquivalent: Zugriff mit Dollar Operator l$deutsch[5]!! ! ! # Fünftes Element des Listenelements # deutsch l <- list(bmi.class1, bmi.class2, bmi.class3) # Liste ohne # Namen erzeugen names(l) <- c("mathe", "bio", "deutsch")! # Namen nachträglich # hinzufügen l
  • 77. Code 33 : Listen l <- list(Jahreszeiten=m, mathe=bmi.class1)! # Liste kann unterschiedliche Objekt enthalten l[[1]]! ! ! # Erstes Listenelement ist eine Matrix is.matrix(l[[1]]) ! ! # Ist das erste L-Element eine Matrix? is.matrix(l$mathe)! ! # Ist L-Element mathe eine matrix? is.vector(l$mathe)! ! # Ist L-Element mathe ein Vektor? l[[2]] <- diag(3)! ! # L-element 2 d. Einheitsmatrix ersetzt l[[1]][1] <- 999! ! # einen einzelnen Eintrag verändern l <- l[3:1]! ! ! ! # Reihenfolge der Listenelemente ändern l<- rev(l)! ! ! ! # Listenreihenfolge umkehren
  • 78. Your turn! Erstelle eine Liste l, bei der: das erste Element ein Vektor der Großbuchstaben A bis M ist das zweite Element die Zeichenkette "Ich bin das zweite Element" das dritte Element eine Matrix (5x5) mit zufälligen Werten mit 1 Dezimalkommastelle enthält. Z.B. so: [[1]] [1] "A" "B" "C" "D" "E" "F" "G" "H" "I" "J" "K" "L" "M" [[2]] [1] "Ich bin das zweite Element" [[3]] [,1] [,2] [,3] [,4] [,5] [1,] 0.9 0.3 0.5 0.6 2.4 [2,] -0.9 -0.7 1.5 -1.1 -1.2 [3,] -1.2 0.9 0.4 -1.7 0.2 [4,] -0.4 -0.1 0.2 0.0 0.8 [5,] 1.3 -1.1 -0.7 0.0 1.1
  • 79. Your turn! Füge nun noch folgende Namen zu den Listenelementen hinzu: Buchstaben, Text, Matrix. Dann ändere alle Einträge der Matrix, die kleiner als 0 sind, in NAs um, kürze den Vektor Buchstaben auf A bis F und kehre die Reihenfolge der letzten beiden Listenelemente um. $Buchstaben [1] "A" "B" "C" "D" "E" "F" $Matrix [,1] [,2] [,3] [,4] [,5] [1,] 0.7 0.5 NA 0.8 0.7 [2,] NA 0.9 NA NA 1.5 [3,] NA 1.3 1.3 NA NA [4,] 0.7 NA 1.1 NA 0.0 [5,] NA 1.1 NA NA 1.6 $Text [1] "Ich bin das zweite Element"
  • 80. Code 34 : data frames ### data frames ### # in Matrizen müssen alle Einträge vom selben Typ sein. Z.B # alles numerisch oder alles characters. data frames sind # spezielle Listen und können deshalb pro Spalte # unterschiedliche Typen enthalten (Faktoren, numerische Werte, # Characters). Im Ggs. zur Liste müssen sie jedoch stets dieselbe Anzahl von Einträgen pro Spalte aufweisen. treat <- c(20, 21, 23, 18, 30) control <- c(19, 21, 20, 23, 18) d <- data.frame(treat=treat, control=control) d$treat! ! ! ! ! ! ! # Zugriff mit Dollaroperator d[["treat"]]!! ! ! ! # gibt Vektor zurück is.vector(d[["treat"]])! ! # gibt Vektor zurück d[,1]
  • 81. Code 35 : data frames d["treat"]! ! ! ! ! ! # gibt data frame zurück is.data.frame(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 f <- factor(c("m", "m", "w", "w", "w")) data.frame(Geschlecht= f, treat, control)
  • 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
  • 84. Quiz 1 ! Kehre die Elemente des folgenden Vektors um [1] 1 1 1 2 2 3 Schreibe dann eine Befehlsfolge, die die Reihenfolge der Elemente eines beliebigen Vektors umkehrt, also auch funktioniert, wenn der Vektor ein anderer ist Erzeuge folgenden data frame mit beliebigen Werten IQ schulnote 1 95.9 3 2 83.0 2 3 104.7 4 4 99.6 3 5 87.0 3 6 88.4 5 7 84.1 3 8 106.5 5 9 108.6 3 10 105.6 3
  • 85. Quiz 2 ! Ändere folgende Zellen des data frame in NA: (1,1) (5,2) Füge eine Spalte an, in dem sich 0 und 1 abwechseln an den data frame an und gib ihr den Namen "dummy" Erzeuge eine Liste, die den data frame als ersten Eintrag enthält Ändere nun die Zelle (2,2) des data frames (erstes Listenelement) in der Liste auf NA
  • 86. Code 36-37 : Subsets ### 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
  • 87. Your turn! baue den vorher erzeugten Datensatz um: a) erst die ungeraden, dann die geraden Zeilen kommen 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
  • 88. Code 38 : Subsets 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
  • 89. 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
  • 90. 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
  • 91. Code 39 : subset() ?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
  • 92. 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
  • 93. Your turn! Wähle aus dem Datensatz mit subset alle Fälle aus, die a) einen IQ außerhalb des Durchschnitts (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
  • 94. 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)
  • 95. packages installieren CRAN server >3000 additional on de packages man d My Computer Installation per Kommandozeile > install.packages("package.name") R-Base installation oder per R-Konsolenmenü basic packages
  • 96. Code 40 : 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
  • 97. Code 41 : Daten einlesen ### EINLESEN VON DATEN IN R ### ?read.csv!! ! ! # Einlesen einer .csv Datei (englisch) ?read.csv2! ! ! # Einlesen einer .csv Datei (deutsch) ?read.table # für .txt Dateien ?read.spss # für .sav Dateien ?spss.get # im Hmisc package setwd("/Users/markheckmann/Documents/Magic Briefcase/R/ 2010 R Einführung/data") # Arbeitsverzeichnis wechseln df <- read.table("mieten.txt") # mieten.txt einlesen head(df) # Zeilen haben keine Überschrift df <- read.table("mieten.txt", header = TRUE) # Einlesen mit header=TRUE head(df)
  • 98. Code 42 : Daten einlesen ?read.csv2 ! ! ! ! # für deutsche .csv Dateien df <- read.csv2("mieten.csv") head(df) library(Hmisc) mydata <- spss.get("wow.sav", use.value.labels=TRUE)
  • 99. Code 42 : attach data # Objekte/Datensätze in den Suchpfad hängen y1! ! ! ! ! ! # Objekt unbekannt attach(anscombe)! # Datensätze in den Suchpfad hängen y1! ! ! ! ! ! # Objekt nun im Suchpfad detach(anscombe)! # Datensatz aus Suchpfad entfernen y1! ! ! ! ! ! # Objekt wieder unbekannt search() # packages im Suchpfad
  • 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.
  • 101. 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 nKsB4
  • 102. Editoren nutzen R Editor Mac OS Textmate Windows Tinn-R Datei wird als .R Datei gespeichert und kann so immer wieder genutzt werden
  • 103. Code 43 : EDA ### Anschauen der WoW Daten ### library(psych)! ! ! ! # library psych laden describe(wow)! ! ! ! # Überblick über Datensatz hist(wow[1:9])! ! ! ! # Histogramme der ersten neuen Variablen hist(wow[10:17])! ! ! # Histogramme hist(wow[18:23])! ! ! # Histogramme
  • 104. Code 44 : missings # Gibt es keine Ahnung Antworten (wie k.A.), # die noch nicht als Missing kodiert sind? table(wow$Geschlecht)! ! ! ! # Häufigkeitstabelle wow$Geschlecht[wow$Geschlecht==1] <- NA! # 1 zu NA umkodieren table(wow$Geschlecht) table(wow$Zeitaufwand)! ! ! ! # Häufigkeitstabelle wow$Zeitaufwand[wow$Zeitaufwand==1] <- NA! # 1 zu NA umkodieren table(wow$Alter)! ! ! ! ! ! ! # Häufigkeitstabelle wow$Alter[wow$Alter==1] <- NA! ! ! ! # 1 zu NA umkodieren
  • 105. Code 45 : Rekodieren ### Rekodieren ### library(memisc)!! # eine Funktion unter verschiedenen # zum Rekodieren recode(wow$K1,! ! # rekodieren von K1 A = 1 <- 4, B = 2 <- 3, C = 3 <- 2, D = 4 <- 1)
  • 106. Code 46 : als Faktor # 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 bennennen wow$Alter wow$Alter <- as.factor(wow$Alter)! ! ! ! # in Faktor umwandeln levels(wow$Alter) <- c("unter 18", "18-29", "30-40", "41-50", "über 50" )! # F-stufen bennennen wow$Zeitaufwand wow$Zeitaufwand <- as.factor(wow$Zeitaufwand)# in Faktor umwandeln levels(wow$Zeitaufwand) <- c(">7 Std.", "> 14 Std.", "> 20 Std.", ! ! ! ! ! "20-30 Std.", "30-40 Std.", "> 40 Std.") # Faktorstufen bennenen
  • 107. Code 47 : neue Variablen # Neue Variablen berechnen wow$KO <- (wow$K1 + wow$K2 + wow$K3 + wow$K4)/4!! # Skala bilden über vier Werte K1-K4 ?transform! ! ! # zur Berechnung von 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
  • 108. Code 48 : Dummy Variable # Dummy Variablen anlegen (mehrere Varianten) mean(wow$KO, na.rm=TRUE)! # Mittelwert der Variablen wow$KO > 1.967054! ! ! # welche Werte größer als Mittelwert? wow$meanSplit.KO <- wow$KO > mean(wow$KO, na.rm=TRUE) # neuer Variable zuweisen wow$meanSplit.KO <- as.numeric(wow$meanSplit.KO)! ! # in numerische Variable wandeln! wow$meanSplitKO <- as.numeric(wow$KO > mean(wow$KO, n=T)) # einfache Variante wow <- transform(wow, meanSplitKO=as.numeric(KO > mean(KO, n=T))) # einfache Variante
  • 109. Code 49 : Datenausgabe ### Datenausgabe ### ?write.table!! ! ! ! ! ! # zum speichern als .txt file write.table(d, "test.txt", sep="t") write.csv2(d, "test.csv")!! ! # als .scv datei speichern # an SPSS program to read it library(foreign) write.foreign(d, "test.txt", "test.sps", package="SPSS") # ohne Gewähr !!!
  • 110. Code 50 : Deskriptive Statistiken ### Deskriptive Statistiken ### summary(wow)!! ! # summaries der Variablen attach(wow) 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, meanSplitKO)) # Basisstatisiken pro Faktorstufe von Geschlecht # und meanSplitKO detach(wow)
  • 111. Your turn! Lies den Datensatz wow_excerpt.csv ein und durchlaufe die Schritte: a) missings Na setzen b) Faktoren in Faktoren verwandeln und bennenen c) Skala berechnen d) eine Variable (0,1) anlegen, die KO am mean splittet e) einen Gesamtwert berechnen über die fünf Skalen namens „score“, der der Durchschnitt der Skalen KO, EN, TO, AL, NK ist.
  • 112. Code 51 : crosstabs ### Häufigkeiten ### # One Way Table attach(wow) table(Alter)!! # Häufigkeitstabelle von Alter u <- subset(wow, meanSplitKO==1, select=Geschlecht) # nur KO größer als mean table(u)! ! ! # Häufigkeitstabelle! # 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
  • 113. Code 52 : crosstabs # Three Way Tables mt <- table(Geschlecht, Alter, meanSplitKO) ftable(mt) # Tables mit CrossTable library(gmodels) CrossTable(Geschlecht, Alter) CrossTable(Geschlecht, Alter, format="SPSS")
  • 114. Your turn! Mache folgende Häufigkeitstabellen für den wow Datensatz mit CrossTable: 1) Alter gegen Zeitaufwand 2) Geschlecht gegen Zeitaufwand
  • 115. Code 53 : Formulas ### 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
  • 116. Code 54 : Formulas y ~ x1 ! ! ! # Modell mit einem Regressor y ~ x1 + x2 # zwei Regressoren, keine Interaktion y ~ x1 + x2 + x1:x2 ! # zwei Regressoren plus Interaktion y ~ x1 * x2! ! ! ! # identisch
  • 117. Code 55 : lm # lineare Modelle schätzen ?lm! ! ! ! ! ! ! ! ! # lineare Modelle lm1 <- lm(score ~ KO, data=wow)!! # Modell mit 1 Regressor lm1! ! ! ! ! ! ! ! ! # Modell ausgeben summary(lm1)!! ! ! ! ! # summary des Modells lm2 <- lm(score ~ KO*AL, data=wow)) # zwei Regressoren + Interaktion lm2! ! ! ! ! ! ! ! # Modell ausgeben ! summary(lm2)!! ! ! ! ! # summary des Modells attach(wow)! ! ! ! ! ! ! # wow anhängen plot(KO, score)!! ! ! ! ! # KO gegen score plotten abline(lm1)! ! ! ! ! ! ! # Regressionsgerade hinzufügen detach(wow)! ! ! ! ! ! ! # wow aushängen
  • 118. Code 56 : Modelle vergleichen # Modelle vergleichen fit1 <- lm(x1 ~ y1 + y2, data=anscombe) fit2 <- lm(x1 ~ y1, data=anscombe) anova(fit1, fit2)
  • 119. Your turn! Nutze den Datensatz anscombe und berechne eine Regression von y1 auf x1. Plotte die Werte und zeichne die Regressionsgerade ein.
  • 120. Code 57 : One-Way-Anova ##### 1-WAY-ANOVA ###### wowAnova <- aov(score ~ Alter, data=wow) summary(wowAnova) ### Post-hoc Tests ### TukeyHSD(wowAnova)! ! # Tukey Test library(gplots)!! ! ! ! ! # gplots laden attach(wow)! ! ! ! ! ! ! # Datensatz wow aushängen plotmeans(score ~ Alter)! ! ! # mean plot mit # Konfidenzgrenzen pairwise.t.test(score, Alter, p.adj = "none")! # paarweise t-Tests ohne Alpha Korrektur pairwise.t.test(score, Alter, p.adj = "bonf") ! # mit Alpha Bonferroni Korrektur detach(wow)! ! ! ! ! ! ! # Datensatz wow aushängen
  • 121. Your turn! Nutze den Datensatz InsectSprays. Dieser enthält Zählungen von Insekten bei der Nutzung verschiedener Insektensprays. Schaue, ob sich count über die Faktorstufen von sprays unterscheiden. Mache einen plot der Mittelwerte und als post-hoc Test einen Tukey-Test sowie paarweise t-Tests mit Bonferroni Korrektur.
  • 122. Code 58 : Two-Way-Anova ##### 2-WAY-ANOVA ###### fit <- aov(KO ~ Geschlecht * Alter, data=wow) summary(fit) # Two-way Interaction Plot attach(wow) interaction.plot(Geschlecht, Zeitaufwand, AL, type="b", col=1:3) interaction.plot(Zeitaufwand, Geschlecht, AL, type="b", col=1:3) detach(wow)
  • 123. Code 59 : Faktorenanalyse ##### FAKTORENANALYSE ####### wow <- na.omit(wow)! # Missings entfernen ! names(wow) fit <- factanal(wow[4:23], 6, rotation="varimax") fit print(fit, digits=2, cutoff=.3, sort=FALSE)
  • 124. Your turn! Lade die .csv Datei fa_daten.csv und mache mit ihr eine Faktorenanalyse.
  • 125. ### TAG 4 ###
  • 126. Graphic Systems R Graphic Systems base graphics grid graphics lattice ggplot2 various packages many graphic function
  • 127. Code 60 : Datensätze ### Daten zum ausprobieren ### # Viele Datensätze sind bereits in R vorhanden data()! ! ! ! # zeigt an welche Datensätze existieren anorexia! ! ! # Daten anorektischer Patienten aus # package MASS insectsprays!! # package datasets # Es kann auch das package datasets installiert # werden, in dem viele Datensätze inkl. # Beschreibung hinterlegt sind install.packages("datasets")!! # installieren library(datasets)! ! ! ! ! # laden des Pakets
  • 128. Code 61 : Grafiken I ### einfache Visualisierungen ### ?plot! ! ! ! ! ! # einfacher Scatterplot plot(wow$KO, wow$score) ?hist! ! ! ! ! ! # Histogramm hist(islands) hist(wow[1:16]) library(Hmisc)! ! ! ! hist.data.frame(wow[1:16])! # Alternative ?qqplot! ! ! ! ! ! # QQ-Plots qqnorm(precip) qqnorm(wow[,"score"])
  • 129. Code 62 : Grafiken II ?boxplot! ! ! ! ! # Boxplot boxplot(count ~ spray, data = InsectSprays) boxplot(score ~ Alter, data=wow, col="lightgray") ?pairs! ! ! ! ! ! # Viele Scatterplots pairs(USJudgeRatings) pairs(wow[c("KO","EN","TO","AL","NK","score")]) ?barplot! ! ! ! ! # Barchart barplot(VADeaths) barplot(1:10) barplot(matrix(1:9,3)) barplot(table(Geschlecht, Zeitaufwand))
  • 130. Code 63 : Grafiken III ?coplot! ! ! ! ! ! # condition plot 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)
  • 131. 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.
  • 132. 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.
  • 133. Code 64 : Grafikoptionen ändern I #### Grafikoptionen verändern ### # Jede Funktion hat viele Parameter, die verändert # werden können attach(wow) plot(KO, score) plot(KO, score, xlab="Kontrollverlust", ylab="Suchtscore") plot(KO, score, main="Kontrollverlust vs. Sucht", ! xlab="Kontrollverlust", ylab="Suchtscore") plot(KO, score, col=3) plot(KO, score, col=3, pch=15) plot(KO, score, col=3, pch=15, cex=.5) plot(KO, score, col=3, pch=15, cex=.5)
  • 134. Code 65 : Grafikoptionen ändern II ?barplot barplot(table(Geschlecht, Zeitaufwand))! ! # stacked barplot(table(Geschlecht, Zeitaufwand), beside=TRUE)! # Gruppen nebeneinander barplot(table(Geschlecht, Zeitaufwand), col=3:4, ! ! main="Zeitaufwand vs. Geschlecht") # Farbe und Überschrift barplot(table(Geschlecht, Zeitaufwand), horiz=TRUE)! ! # Gekippt barplot(table(Geschlecht, Zeitaufwand), cex.names=.7) ! # Achsenbeschriftung kleiner barplot(table(Geschlecht, Zeitaufwand), ! legend.text=c("männlich", "weiblich"),!cex.names=.8) # Legende detach(wow)
  • 135. Code 66 : Grafikbeispiel #### iris dataset ####### ?iris hist(iris) pairs(iris[1:4]) pairs(iris[1:4], pch=21) # Character ändern pairs(iris[1:4], pch=21, col=iris$Species) # Farben ändern col <- c("red", "green3", "blue")[iris$Species] pairs(iris[1:4], pch=21, col=col) # Neue Farben pairs(wow[c(24:28, 30)], col=meanSplitKO + 10) # Neue Farben WoW
  • 136. 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
  • 137. Code 67 : base graphics I ### Einführung ins base Grafik System ### # grafische Basiselemente ?plot! ! ! ! ! ! ! # welche Optionen gibt es? ! ! ! ! ! set.seed(5)! ! ! ! ! ! # Ausgangspunkt für Zufallszahl iq <- rnorm(30, 100, 15)! ! pisa <- x*.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
  • 138. Code 68 : 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), col=3) # andere Farbe ! ! ! # die par() (Parameter) Einstellungen lines(x=c(60,130), y=c(40,80), col=3, lty=3, lwd=2)
  • 139. Code 69 : base graphics III ?abline plot(iq, pisa, col="brown", pch=16)! ! # plotten von x gegen y abline(v=mean(iq), col="grey", lty=2)! ! # vertikale Linine bei MW IQ abline(h=mean(pisa), col="grey", lty=2)! ! # hor. Linie bei MW pisa abline(v=c(90, 110), col="blue", lty=3)! ! ! vert Linie bei x=90 und x=110 # abline(lm(pisa ~ iq))! ! ! ! ! ! ! # Regressionslinie pisa ~ iq
  • 140. 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
  • 141. Code 70 : 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,78, "test text", col="blue")! # Text an Position (72,78) ?mtext! ! ! ! ! ! ! ! ! # für margin text mtext(side=3, "test mtext", col="red")! # margin text oben
  • 142. Code 70b : Grafische Bereiche
  • 143. Code 71 : 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
  • 144. Your turn! Zeichne den plot score (auf y) gegen TO (auf x) (WoW Daten) und direkt daneben das Histogram von score. Nutze hierzu die par() Einstellung mfrow. Zusatzaufgabe: Füge dem plot vorher noch für den Fall mit dem größten und für kleinsten Suchtwert jeweils einen Punkt hinzu, der rot und gefüllt ist. TO gegen score Histogram of score ● ● 1.0 1.5 2.0 2.5 3.0 3.5 ● ● ● 60 ● ● ● ● ● ● ● ● ● ● Frequency ● ● ● ● ● ● ● ● score 40 ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● 20 ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● 0 1.0 2.0 3.0 4.0 1.0 1.5 2.0 2.5 3.0 3.5 TO score
  • 146. Pisa Ergebnisse geschätzt durch den IQ Normskala R 80 ● ● 70 ● ● ● ● ● ● ● ● ●● ● ● ● ● ● 60 ● ● ● ●● ● ● ● ● ● ● 50 ● ● 40 IQ Werte 70 80 90 100 110 120 130 z−Werte −2 −1 0 1 2 T−Werte 30 40 50 60 70
  • 147. Code 72 : plot from scratch I # plot from scratch oldPar <- par()!! ! # alte Parameter speichern par(oma=c(3,0,0,4))!! # outer margin verändern plot(iq, pisa, type="n", axes=FALSE, ! # leerer plot xlab="", ylab="", xlim=c(70,130), ylim=c(39,81)) rect(90, 0, 110, 100, col = "#FCF0F1", border=NA)! # Rechteck zeichnen points(iq, pisa, col="lightgrey", pch=16)! ! # Punkte hinzufügen axis(side=2)!! ! ! ! ! ! ! ! # y-Achse axis(1, cex.axis=.8)! ! ! ! ! ! # x-Achse 1 at <- c(70, 85, 100, 115, 130)! # Punkte der 2. x-Achse axis(side=1, at=at, labels=-2:2, ! # 2. x-Achse ! line=2.5, cex.axis=.8) axis(side=1, at=at, labels= ((at-100)/15)*10+50,! line=5, cex.axis=.8) # 3. x-Achse
  • 148. Code 73 : plot from scratch II abline(lm(pisa ~ iq), lty=2)!! ! # Regressionslinie title(main="Pisa Ergebnisse geschätzt durch den IQ") # Titel mtext(side=1, "IQ Werte", line=-.5, at=135, ! adj=0, cex=.8, col="darkgrey") # Text 1. Achse mtext(side=1, "z-Werte", line=2.0, at=135, ! ! ! adj=0, cex=.8, col="darkgrey") # Text 2. Achse mtext(side=1, "T-Werte", line=4.5, at=135, ! ! ! adj=0, cex=.8, col="darkgrey") # Text 3. Achse par(oldPar) # Parameter settigs wiederherstellen
  • 149. Code 73 : Grafik als Datei ### Grafik-Output in Datei erzeugen ### jpeg()!! # öffnet einen jpeg device bmp()! ! # öffnet einen bmp device pdf()! ! # öffnet einen pdf device png()! ! # öffnet einen png device pdf()! ! # pdf device öffnen plot(1:10) dev.off()! device schließen # dev.list()! # welche devices sind noch offen?
  • 150. Your turn! Übung in eine .pdf Datei aus. Da der Code noch existiert kann der plot ja schnell wiederhergestellt werden :)
  • 151. Your turn! Drucke alle pch Symbole von 1 bis 25 mit plot() in einem Raster. Jedes Symbol soll eine verschiedene Farbe haben. Erstelle eine Überschrift. Es sollte in etwa so aussehen: pch Symbole von 1 bis 25 5 ● ● ● ● 4 ● 3 y ● 2 ● 1 1 2 3 4 5 x
  • 152. Code 74 : R Commander ############# R Commander ################ library(Rcmdr) Commander()
  • 154. ### Lösungen Your Turn! ###
  • 155. Your turn! Erzeuge folgende Vektoren, mit jeweils mit 10 Elementen > seq(10,1) [1] 10 9 8 7 6 5 4 3 2 1 > rep(1,t=10) [1] 1 1 1 1 1 1 1 1 1 1 > rep(c(1,2), t=5) [1] 1 2 1 2 1 2 1 2 1 2 > rep(c(1,2), e=5) [1] 1 1 1 1 1 2 2 2 2 2 > rep(1:4, 4:1) [1] 1 1 1 1 2 2 2 3 3 4
  • 156. Your turn! Erzeuge folgende Ausgabe in der Konsole, indem Du paste() und die Konstante month.name nutzt. > paste(month.name, "is month number", 1:12) "January is month number 1" "February is month number 2" "March is month number 3" "April is month number 4" "May is month number 5" "June is month number 6" "July is month number 7" "August is month number 8" "September is month number 9" "October is month number 10" "November is month number 11" "December is month number 12"
  • 157. Your turn! Du hast folgenden Vektor: v <- c(1,2,3,4,5). Erzeuge folgende Ausgabe in der Konsole: Der Vektor v hat die Länge 5 Er besteht aus folgenden Elementen: 1 2 3 4 5 Tip: Benutze hierzu die Funktion cat() und length() und kombiniere Variablen und Text. > cat("Der Vektor v hat die Länge", length (v), "nEr besteht aus folgenden Elementen", v)
  • 158. Your turn! Erzeuge folgende Ausgabe in der Konsole, indem Du cat(), paste() und die Konstant month.name nutzt. > cat(paste(month.name, "is month number", 1:12, "n"), sep="") 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 Die Ausgabe soll nun pro Zeile erfolgen
  • 159. 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) > sum((x-mean(x))*(y-mean(y)))/6 > cov(x,y) ! ! # zur Kontrolle
  • 160. Your turn! Lege ein Verzeichnis RCourse an und setze es als neues Arbeitsverzeichnis. Lege eine Unterordner data an und wechsele in ihn. Wechsel anschließend wieder in den übergeordneten Ordner. setwd("users/mark/RCourse") setwd("data") setwd("..")
  • 161. Your turn! Berechne die Korrelation für folgende zwei Datenreihen in R „zu Fuß“. Konstruiere die Lösung so, dass man x und y (gleich lang) austauschen kann, ohne den Code sonst zu verändern. x <- c(-2,-1,-1,0,1,1,2) y <- c(-1,-2,1,0,2,-1,1) > kovarianz <- sum((x-mean(x))*(y-mean(y)))/(length(x)-1) > kovarianz/(sd(x)*sd(y)) > cor(x,y) ! ! # zur Kontrolle
  • 162. Quiz 1 ! Welche Regeln gibt es für die Benennung von Objekten? (s. Folie Objektbezeichnungen) Welche Regeln gibt es für leserlichen Code? Welche Objektnamen sind erlaubt? a1234 JA ausdruck JA Variable JA .Variable JA Variable. JA _Variable NEIN Variable_ JA 1teVariable NEIN .1Variable NEIN Überlege was folgende Ausdrücke ergeben: 11 %% 5 1:6 %% 2 11 %/% 5 10:19 %/% 5
  • 163. Quiz 2 ! Überlege was folgende Ausdrücke ergeben: 11 %% 5 1:6 %% 2 11 %/% 5 10:19 %/% 5 T & F | T T | (T | F) (T | T) & (T | F) c(T, F) | c(F, T) xor(T, F) xor(c(T,F), c(F,F)) !any(T) any(c(T, F) | c(F, T)) which(c(T, F) | c(F, T))
  • 164. Quiz 3 ! Überlege was folgende Ausdrücke ergeben: 1:5 > 2 c(-1,2,3,5) == min(c(-1,2,3,5)) 6 + 1:4 6:1 - 3:1 3*FALSE - TRUE*5 c(T,F,T,F,T) == 1 c(T,F,T,F,T) == FALSE x <- c(1,5,2,0,6,2,9) Suche die Stelle des Vektors x raus, der zu der niedrigsten Zahl sowie zu der höchste Zahl gehört. Ordne die beiden Werte dann in einem Vektor an. > c(which.min(x), which.max(x))
  • 165. Quiz 4 ! Überlege was folgende Ausdrücke ergeben: seq(10, 1, -1) seq(10, 1, 1) rep(1:3, times=3:1) rep(rep(1:2, t=1:2), t=1:3) rep(1:3, l=5) LETTERS[2:4] Erzeuge folgende Vektoren: > letters[seq(1,26,2)] # oder alternativ > letters[c(T,F)] [1] "a" "c" "e" "g" "i" "k" "m" "o" "q" "s" "u" "w" "y" [1] "B=2" "D=4" "F=6" "H=8" "J=10" Erzeuge einen Vektoren mit NV Zufallszahlen der Länge 10 und runde ihn auf eine Dezimalstelle. > round(rnorm(10),1)
  • 166. 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) > x[x==99 | x==999] <- NA > x [1] 1 4 3 NA 4 3 NA NA 3 6 NA
  • 167. 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 > v[v<=3] <- 0 > v[v>=4 & v<=7] <- 1 > v[v>7] <- NA > v [1] 0 0 0 1 1 1 1 NA NA NA
  • 168. 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 > z1 <- 1:20 > z2 <- seq(2,40,2) > z3 <- rep(1:2, e=10) > z4 <- rep(1:2, e=2, t=5) > z5 <- rep(1:6, c(2,2,2,4,4,6)) > z6 <- rep(rep(1:3, c(1,3,6)), 2) > m <- matrix(c(z1, z2, z3, z4, z5, z6), ncol=20, byrow=T) > m Quelle: Foliensatz von Peter Ruckdeschel / Matthias Kohl. R/S-plus für Einsteiger und Fortgeschrittene
  • 169. 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 ... > m <- round(matrix(rnorm(20*12), ncol=12), 0) > colnames(m) <- month.abb > rownames(m) <- paste("Woche", 1:20) > m
  • 170. 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) Folgende Zellen sollen nun durch 999 ersetzt werden: (1,1) (4,3) (4,4) (1,7) 3) Alle Einträge die 999 enthalten sollen NA gesetzt werden. M <- matrix(round(rnorm(7*7),1), ncol=7) M[1,1] <- 999 M[4,3] <- 999 M[4,4] <- 999 M[1,7] <- 999 M[M==999] <- NA
  • 171. Your turn! Berechne die Matrix b der Regression y regridiert 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! X <- cbind(rep(1,7), x)! ! # Design Matrix erstellen Y <- y solve(t(X)%*% X)%*%t(X)%*%Y # Berechnung lm(y~x) # zur Kontrolle
  • 172. Your turn! Erzeuge einen factor der folgenden Form: > f <- factor(rep(4:1, 4:1)) > levels(f) <- paste("Gruppe", 1:4) [1] Gruppe 4 Gruppe 4 Gruppe 4 Gruppe 4 Gruppe 3 Gruppe 3 Gruppe 3 Gruppe 2 Gruppe 2 Gruppe 1 Levels: Gruppe 1 Gruppe 2 Gruppe 3 Gruppe 4
  • 173. Your turn! Erstelle eine Liste l, bei der: a) das erste Element ein Vektor der Großbuchstaben A bis M ist b) das zweite Element die Zeichenkette "Ich bin das zweite Element" c) das dritte Element eine Matrix (5x5) mit zufälligen Werten mit 1 Dezimalkommastelle enthält. > e1 <- LETTERS[1:13] > e2 <- "Ich bin das zweite Element" > e3 <- matrix(round(rnorm(5*5),1), ncol=5) > l <- list(e1,e2,e3) > l [[1]] [1] "A" "B" "C" "D" "E" "F" "G" "H" "I" "J" "K" "L" "M" [[2]] [1] "Ich bin das zweite Element" [[3]] [,1] [,2] [,3] [,4] [,5] [1,] 0.9 0.3 0.5 0.6 2.4 [2,] -0.9 -0.7 1.5 -1.1 -1.2 [3,] -1.2 0.9 0.4 -1.7 0.2 [4,] -0.4 -0.1 0.2 0.0 0.8 [5,] 1.3 -1.1 -0.7 0.0 1.1
  • 174. Your turn! Füge nun noch folgende Namen zu den Listenelementen hinzu: Buchstaben, Text, Matrix. Dann ändere alle Einträge der Matrix, die kleiner als 0 sind, in NAs um, kürze den Vektor Buchstaben auf A bis F und kehre die Reihenfolge der letzten beiden Listenelemente um. > names(l) <- c("Buchstaben", "Text", "Matrix") > l$Matrix[l$Matrix < 0] <- NA > l$Buchstaben <- l$Buchstaben[1:6] > l <- l[c(1,3,2)] > l $Buchstaben [1] "A" "B" "C" "D" "E" "F" $Matrix [,1] [,2] [,3] [,4] [,5] [1,] 0.7 0.5 NA 0.8 0.7 [2,] NA 0.9 NA NA 1.5 [3,] NA 1.3 1.3 NA NA [4,] 0.7 NA 1.1 NA 0.0 [5,] NA 1.1 NA NA 1.6 $Text [1] "Ich bin das zweite Element"
  • 175. 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 ... > f1 <- factor(rep(c("m", "w"), each=10)) > f2 <- factor(rep(c("Control", "Treat", "Placebo"), l=20)) > r1 <- round(rnorm(20)*15+100, 1) > r2 <- round(rnorm(20, mean=20, sd=5), 1) > d <- data.frame(Geschlecht=f1, Intervention=f2, IQ=r1, BMI=r2) > d
  • 176. Quiz 1 ! Kehre die Elemente des folgenden Vektors um v <- rep(1:3, 3:1) v[6:1] [1] 1 1 1 2 2 3 Schreibe dann eine Befehlsfolge, die die Reihenfolge der Elemente eines beliebigen Vektors umkehrt, also auch funktioniert, wenn der Vektor ein anderer ist v[length(v):1] # oder auch: rev(v) Erzeuge folgenden data frame mit beliebigen Werten IQ schulnote 1 95.9 3 2 83.0 2 3 104.7 4 ... > d1 <- data.frame(IQ=round(rnorm(10), 1), ! schulnote=round(rnorm(10), 1)) > d1
  • 177. Quiz 2 ! Ändere folgende Zellen des data frame in NA: (1,1) (5,2) d1[1,1] <- NA d1[5,2] <- NA Füge eine Spalte an, in dem sich 0 und 1 abwechseln an den data frame an und gib ihr den Namen "dummy" d1 <- cbind(d1, dummy=0:1) Erzeuge eine Liste, die den data frame als ersten Eintrag enthält l1 <- list(d1) Ändere nun die Zelle (2,2) des data frames (erstes Listenelement) in der Liste auf NA l1[[1]][2,2] <- NA
  • 178. Your turn! baue den vorher erzeugten Datensatz um: a) erst die ungeraden, dann die geraden Zeilen kommen 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 ... > d[c(seq(1,19,2), seq(2,20,2)), c(3,4,1,2)]! ! ! > # oder auch > rbind(d[c(T,F),c(3,4,1,2)], d[c(F,T),c(3,4,1,2)])
  • 179. 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 > d[d$Intervention == "Treat" & d$Geschlecht=="w" ,]
  • 180. 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 > d[d$IQ > 90 & d$IQ < 110 & d$Geschlecht=="m" ,]
  • 181. 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 ... > subset(d, IQ > mean(IQ))