Einführung in R - uni-muenchen.de · > a == 2 # FALSE TRUE FALSE 14 Donnerstag, 23. April 2009 14....
Transcript of Einführung in R - uni-muenchen.de · > a == 2 # FALSE TRUE FALSE 14 Donnerstag, 23. April 2009 14....
1
Einführung in R
Felix Schönbrodt
Humboldt-Universität zu Berlin
17.4.2009
1Donnerstag, 23. April 2009
Vorteile von R
• Befreiung von der Tabellenstruktur
• Berechnung und Wiederverwendung aller Variablen(z.B. αs, Faktorenwerte, Varianzanteile, ...)
• alle Berechnungen in einem Programm(kein Exportieren und Re-Importieren der Daten für externe Spezialprogramme wie HLM, SOREMO, etc.)
• bessere, flexiblere und vollständig replizierbare Grafiken
• man kommt schneller zu Ergebnissen (Einschränkung: wenn man es kann)
2
2Donnerstag, 23. April 2009
Vorteile von R• Man kann sich seine eigenen Funktionen schreiben und
diese immer wieder verwenden
• Es gibt bereits eine Unzahl an professionellen Funktionen, zusammengefasst in „packages“
• neue Statistiken oft zuerst (und ausschließlich) in R, z.B.
– Cross-Level-Multilevel-Modeling (package lme4)– Robuste Statistiken (packages rrob, Funktionssammlung von
Wilcox)
• dynamische und hilfsbereite Community
3
3Donnerstag, 23. April 2009
Grafik - Showcase
4
4Donnerstag, 23. April 2009
Grafik - Showcase
5a bagplot (= bivariate boxplot)
5Donnerstag, 23. April 2009
Grafik - Showcase
6
6Donnerstag, 23. April 2009
Grafik - Showcase
7
7Donnerstag, 23. April 2009
Grafik - Showcase
8
8Donnerstag, 23. April 2009
(potentielle) Nachteile von R
• steile Lernkurve: am Anfang braucht man für alles erstmal etwas länger
• anderer Ansatz: Programmierung statt „point & click“ ➙ für viele eher ungewohnt
9
9Donnerstag, 23. April 2009
Setup von R• R Framework: läuft relativ unbemerkt im Hintergrund,
kümmert sich um die Berechnungen
• Texteditor: schickt Befehle an R-Framework; Ergebnisse werden dann in einer Konsole (Textausgabefenster) dargestellt
• packages sind Erweiterungen, die neue Funktionen beinhalten. Man kann mittlerweile sehr viele von CRAN (Comprehensive R Archive Network) herunterladen
• Es gibt GUIs (Graphical User Interfaces), allen voran R Cmdr (http://socserv.mcmaster.ca/jfox/Misc/Rcmdr/). Er bietet etwas SPSS-“look &feel“, allerdings hat der Autor John Fox das Programm auch nur geschrieben, um die Benutzer zum echten Scripting überzuleiten ...
10
10Donnerstag, 23. April 2009
Die wichtigsten Operatoren
11
Operator Beschreibung Beispiel
<- Zuweisung eines Wertesvar1 <- 15
var2 <- c(1,2,5)
+-
Addition; Substraktion a <- (5+var2)-b
*/
Multiplikation; Division var5 <- var1/(var2*5)
==!=
Prüfung auf (Un)Gleichheit; ergibt TRUE oder FALSE
(Achtung, häufiger Fehler: Verwechslung mit einfachem „=“)
1 == 2 #FALSE
a <- 2; a==2; #TRUE
a != 2 # FALSE
<; >; <=; >=
kleiner (gleich), größer (gleich);ergibt TRUE oder FALSE
3 >= 2; #TRUE
%in% ist Element links Teil der Menge rechts?a <- c(1,2,5); b <- 4; c <- 5
(b %in% a) # FALSE
(c %in% a) # TRUE
! NOT (logische Verneinung) !(b %in% a) # TRUE
&|
logisches UND (&) und logisches ODER (|)if (a>3 | b<5) ...
if (a<3 & !(b<4)) ...
11Donnerstag, 23. April 2009
Die Syntax - wichtige Elemente• Missing Values: NA (not available)
> sex <- c(0,1,1,0,NA,0,1)
• Bedingungen: if (Bedingung mit boolschem Wert) {Code1} else {Code2}
– „else“-Teil kann auch weggelassen werden
• Schleifenfor (i in 1:10) {print(i*10)}
• str(obj) gibt die Struktur eines Objektes aus
• summary(obj) gibt bei komplexen Objekten eine Zusammenfassung aus
12
12Donnerstag, 23. April 2009
Die Syntax - wichtige Elemente
• case-sensitive: Array != array
• Kommentarzeilen im Quellcode beginnen mit #
• In Formeln werden runde Klammern () verwendet
• Programmblöcke werden in geschweifte Klammern {} gestelltif (var1 == TRUE) {var2 <- var3*2} else {var2 <- var3/2}
• Subsets werden in eckigen Klammern [ ] angegeben
• Hilfe zu Befehl: ?Befehl (z.B. ?data.frame)
• Gesamthilfe starten: help.start()13
13Donnerstag, 23. April 2009
Grundideen von R
• Environment:
– alle Variablen/ Objekte liegen darin „unsichtbar“ herum Anzeige aller vorhandenen Objekte mit ls() # ls bedeutet „list“
– jedes erstellte Objekt bleibt im Environment bis es explizit überschrieben oder gelöscht wird
Löschen eines Objekts: rm(var1) #rm bedeutet „remove“
• (Fast) alle Berechnungen vektorenbasiert (d.h. die Operation wird auf jedes einzelne Element ausgeführt)> a <- c(1,2,4)
> b <- c(2,3,5)> a+b # 3 5 9
> a == 2 # FALSE TRUE FALSE
14
14Donnerstag, 23. April 2009
Grundideen von R
• Befehle werden durch Funktionen ausgeführt
• Wird eine Funktion einfach so aufgerufen, wird das Ergebnis angezeigt> a <- c(4,6,8)
> mean(a)[1] 6
• Das Ergebnis einer Funktion kann einer Variable zugewiesen werden und bleibt somit gespeichert> a <- c(4,6,8)
> m1 <- mean(a)
> m1[1] 6
15
15Donnerstag, 23. April 2009
Datentypen I: Vektoren
• die Funktion c() erstellt Vektoren> a <- c(1,2,3,4)
> a[1] 1 2 3 4
• Vektor = eindimensionale Aneinanderreihung von Werten, z.B.:a <- c(1, 2, 3, 5, 7, 23, 2)
b <- c(„grün“, „blau“, „rot“)
c <- c(TRUE, TRUE, FALSE, TRUE)
• Vektoren können aus integers, numbers, booleans oder characters bestehen (aber jeweils nur eine Sorte - nicht gemischt!)
16
16Donnerstag, 23. April 2009
Datentypen I: Vektoren
• Sequenzen:> a <- 1:5 # 1:5 = 1 bis 5
[1] 1 2 3 4 5 # geht nur mit ganzen Zahlen
> rep(1:3, 4) # = repeat 1:3 (=1 2 3) 4 mal
[1] 1 2 3 1 2 3 1 2 3 1 2 3
> seq(0.1, 0.9, by=0.2) #Sequenz: start=0.1, Ende=0.9, diff=0.2[1] 0.1 0.3 0.5 0.7 0.9
17
17Donnerstag, 23. April 2009
Datentypen I: Vektoren indizieren
• vector[pos] gibt das Element an Position pos aus (Zählung beginnt bei 1)> a <- c(1,5,8,9)
> a[2] # 5> a[3] == 7 # FALSE
> a[3] == 8 # TRUE; vergleiche aber mit:
> a == 8 # FALSE FALSE TRUE FALSE; hier vektorbasiert!
• im Index in der eckigen Klammer können auch boolsche Formeln oder Vektoren stehen
> a[a>2] # „nimm alle a für die gilt: a>2“ --> 5 8 9> a[c(1,2,4)] # 1 5 9
> sex <- c(1,0,1,1) #beachte: Vektor sex hat die selbe Länge wie a> a[sex == 1] # 1 8 9
18
18Donnerstag, 23. April 2009
Datentypen II: Matrizen
• zweidimensionale Datenstruktur aus einem einheitlichen Datentyp> mat <- matrix(1:12, nrow=3, ncol=4)
[,1] [,2] [,3] [,4][1,] 1 4 7 10
[2,] 2 5 8 11
[3,] 3 6 9 12
• Indizierung über zwei Dimensionen
> mat[row, col]> mat[2,4] # 11
> mat[1:2, 3:4] [,1] [,2]
[1,] 7 10
[2,] 8 1119
19Donnerstag, 23. April 2009
Datentypen II: Matrizen
• Indizierung über alle Elemente einer Dimension: Position in der eckigen Klammer einfach frei lassen (trotzdem Komma schreiben)> mat[1,1] # Zeile 1, Spalte 1
[1] 1> mat[,1] # alle Zeilen, Spalte 1
[1] 1 2 3
> mat[1,] # Zeile 1, alle Spalten[1] 1 4 7 10
> mat[1:2,] # Zeilen 1 bis 2, alle Spalten [,1] [,2] [,3] [,4]
[1,] 1 4 7 10
[2,] 2 5 8 11
20
20Donnerstag, 23. April 2009
Datentypen III: data frames• ähnlich wie zweidimensionale Matrix, nur dass jede Spalte
einen eigenen Datentyp haben kann> id <- c(1:10)
> sex <- c("m",“w“,"w","w", rep("m",6))
> weight <- rnorm(10, 50, 4)
> # rnorm = random norm = ziehe 10 Zufallszahlen mit m=50 und sd = 4
> df <- data.frame(id, sex, weight)
> df
id sex weight
1 1 m 51.12549
2 2 w 60.87886
3 3 w 51.99104
4 4 w 50.65935
5 5 m 54.41373
6 6 m 52.10454
7 7 m 50.02286
8 8 m 53.51057
9 9 m 45.65045
10 10 m 50.9642321
21Donnerstag, 23. April 2009
Datentypen III: data frames> str(df)
'data.frame': 10 obs. of 3 variables:
$ id : int 1 2 3 4 5 6 7 8 9 10
$ sex : Factor w/ 2 levels "m","w": 1 2 2 2 1 1 1 1 1 1
$ weight: num 51.1 60.9 52 50.7 54.4 ...
> summary(df)
id sex weight
Min. : 1.00 m:7 Min. :45.65
1st Qu.: 3.25 w:3 1st Qu.:50.74
Median : 5.50 Median :51.56
Mean : 5.50 Mean :52.13
3rd Qu.: 7.75 3rd Qu.:53.16
Max. :10.00 Max. :60.88
22
22Donnerstag, 23. April 2009
Datentypen III: data frames
• Zugriff auf Spalten im data.frame mit $ oder über Indizierung []
> df$sex
[1] m w w w m m m m m mLevels: m w
> df[,3]
[1] 51.12549 60.87886 51.99104 50.65935 54.41373 52.10454 50.02286 53.51057 45.65045 50.96423
> df[4,3]
[1] 50.65935
> df$weight[4]
[1] 50.65935
23
23Donnerstag, 23. April 2009
Datentypen III: data frames
• Subsets auswählen: Missings entfernen
df[!is.na(df$sex),]
24
24Donnerstag, 23. April 2009
Übung!
• dat <- InsectSprays (=in R vordefiniertes Datenset)
– Tipp: ?mean, ?str– Mittelwert der Stiche von Spray A– Mittelwert der Stiche von Spray A & C zusammengefasst
• Lösung:
– mean(dat$count[dat$spray == „A“])– mean(dat$count[dat$spray == „A“ | dat$spray == „C“]), oder:– mean(dat$count[dat$spray %in% c(„A“, „C“) ] ), oder:– mean(dat[dat$spray == „A“ | dat$spray == „C“,1]
25
25Donnerstag, 23. April 2009
Übung!
• library(psych)data(„sat.act“)dat <- sat.act
– Tipp: ?cor (auf use=“pairwise.complete.obs“ achten)– Korrelationstabelle der Daten– Die Korrelation von SATQ mit education aufgeteilt nach Männern
und Frauen
• Lösung
– cor(dat, use=“p“)– cor(dat$SATQ[dat$gender==1], dat$education[dat$gender==1],
use=“p“) # = 0.078 bzw. 0.032 bei gender == 2– tapply(dat, dat$gender, cor)
26
26Donnerstag, 23. April 2009
Eigene Funktionen
27
• Werden ähnlich wie Variablen definiert; Funktionen haben Parameter (z.B. a und b) und einen Rückgabewert (wird durch return zurückgegeben)
• Bsp.: Summe zweier Werte, auf maximal 10 begrenzenmyFunc <- function(a,b) {
res <- a+b if (res > 10) {res <- 10}
return(res)
}
#Test:myFunc(3,5)
var3 <- myFunc(5,8)
myFunc(c(1,3,4), c(5,7,8))
27Donnerstag, 23. April 2009
Eigene Funktionen
28
• bessere Variante (weil vektortauglich):myFunc <- function(a,b) {
res <- a+b # vorher: if (res > 10) {res <- 10}
res[res>10] <- 10
return(res)}
VORHER:
> myFunc(c(1,3,4), c(5,7,8))
[1] 6 10 12Warning message: In if (res > 10) { :
Bedingung hat Länge > 1 und nur das erste Element wird benutztNACHHER:
> myFunc(c(1,3,4), c(5,7,8))
[1] 6 10 10
28Donnerstag, 23. April 2009
Eigene Funktionen: Übung• dat <- InsectSprays
• ?sd; ?length; ?sqrt; ?qt
• Erstellt eine Funktion, die von einem Vektor (z.B. dat$count)
– den Mittelwert und Konfidenzintervall für Mittelwert als data.frame zurückgibt, mit den Variablennamen m und c_upper und c_lower
– die Breite des CI wird durch den Parameter CI bestimmt (z.B. 0.95)
• Tip: CI = x ± t(0.975; df=n-1) * (σ / sqrt(n))
• gewünschtes Ergebnis:res <- myFunc(dat$count, CI=0.95)
29
29Donnerstag, 23. April 2009
Eigene Funktionen: Übungdat <- InsectSprays
myFunc <- function(x, CI=0.95) {
m <- mean(x, na.rm=TRUE)
se <- sd(x, na.rm=TRUE) / sqrt(length(x)) tvalue <- abs(qt((1-CI)/2, length(x)))
c_lower <- m - tvalue*se c_upper <- m + tvalue*se
return(data.frame(m,c_lower,c_upper))
}
res <- myFunc(dat$count)res:
m c_lower c_upper
9.5 7.807718 11.19228
30
30Donnerstag, 23. April 2009
Nachtrag: Dateien laden und speichern
• source(): lädt eine Datei mit Quellcode und führt diesen direkt aus
• read.table(): liest Daten aus einer Datei ein, wenn diese im Tabellenformat vorliegen; gibt einen data.frame zurückdf <- read.table(„Bla.dat“)
• write.table(): speichert ein Objekt als Dateiwrite.table(df, „Bla.dat“)
• Praktisch zum Datenaustausch mit SPSS: read.csv
– Dateien in SPSS als .csv-Datei exportieren; dann in R importieren:df <-read.csv(„SPSS.csv“)
31
31Donnerstag, 23. April 2009
Was jetzt nicht behandelt wurde ...
• fast alles (wurde nicht behandelt) ...
• Lineare Regression
• ANOVAs
• Faktorenanalysen
• Plots
• Dateien lesen und schreiben / Ergebnisse auf Festplatte speichern
• ...
32
32Donnerstag, 23. April 2009
Cheatsheet
33
?befehl Hilfe zu befehl zeigen mean() Mittelwert; na.rm = TRUE beachten
ls() alle Objekte auflisten sd() Streuung; na.rm = TRUE beachten
rm(obj) Objekt aus Environment entfernen
aov() ANOVA
str() Struktur eines Objektes anzeigen
lm() lineare Regression
c() Vektor erstellen cor() Korrelationsmatrix
matrix() Matrix erstellen library() ein package laden
data.frame()
data frame erstellen summary() Zusammenfassung eines Objekts (hängt von Art des Objekts ab; besonders sinnvoll bei lm oder aov)if () {}
else {}
bedingte Codeausführung
summary() Zusammenfassung eines Objekts (hängt von Art des Objekts ab; besonders sinnvoll bei lm oder aov)
for (i in 1:10) {}
Schleife; 10 Wiederholungen, Index i läuft von 1 bis 10
33Donnerstag, 23. April 2009
34
Vielen Dank!
PerSoc: Mitja Back; Anna Baumert, Jaap Denissen, Freda-Marie Hartung, Lars Penke, Stefan Schmuckle, Felix Schönbrodt, Michaela Schröder- Abé, Manja Vollmann, Jenny Wagner, Cornelia Wrzus www.persoc.net
Gefördert durch die
34Donnerstag, 23. April 2009