Inhaltsverzeichnis

Installation von R

Die Installationsdatei steht auf „Helios“ in vision\Software\R-2.12.0-win.exe bereit. Nach der Installation kann man R entweder über das Icon auf dem Desktop oder über das Startmenu aufrufen.

Für die Arbeit mit R wird empfohlen, für jedes Experiment einen getrennten Ordner, z.B. unterhalb „Eigene Dateien“ anzulegen.

Die Oberfläche RGui stellt dafür unter „Datei“ einen Menupunkt „Verzeichnis wechseln“ bereit. Ist das Verzeichnis einmal vorhanden, startet man R am besten durch Doppelklick auf den R Workspace in diesem Ordner. Außerdem befindet sich in diesem Ordner regelmäßig eine Datei .Rhistory, welche einige der zuletzt benutzten Befehlszeilen enthält, außerdem die ggfls. von R erzeugten Ausgabedateien, Grafiken etc..

Dateien vom Workshop

Die Dateien aus meinem Ordner R-demo sind auf „Helios“ unter Diverses\R-Demo kopiert.

Für die bisherigen Sitzungen kommentiere ich die leicht gekürzte .Rhistory.

Dataframes, Import aus Excel, Selektieren von Spalten und Zeilen, Regression (nur numerische Variable)

ls()                                           # noch alles leer
aiga.some <- read.csv("some.csv")              # Übernahme einer .csv-Datei von Excel in einen Dataframe
? read.csv                                     # Aufruf der Dokumentation in den Browser
aiga.some <- read.csv("some.csv",sep="\t")     # für Trennung mit Tab-Zeichen
aiga.some
aiga.some <- read.csv("some.csv",dec=",")      # für Dezimalkomma statt Punkt
aiga.some
colnames(aiga.some) <- c("VP","sFD","dynAsym","HPh","NF","X.1","sBaseL")
                                                # neue Spaltennamen
aiga.some$HPh                                   # Auswahl einer Spalte über Namen
aiga.some[3]                                    # " über Spaltennummer
aiga2 <- read.table("aiga2.dat")                # eine sehr breite Datei
aiga2
aiga.some
aiga.some$DV <- aiga2$DV                        # Übernahme einer Spalte aus der breiten Datei
aiga.some$zuf<-rnorm(20)                        # eine Spalte mit 20 normalverteilen Zufallszahlen
aiga.some$zuf = rnorm(20)                       # auch = statt <- ist erlaubt
aiga.some <- read.csv("some.csv")               # Zurücksetzen der versuchsweisen Bearbeitungen
colnames(aiga.some) <- c("VP","sFD","dynAsym","HPh","NF","X.1","sBaseL")
aiga.some$DV <- aiga2$DV
aiga.some <-aiga.some[c(1,2,3,4,5,7,11)]        # nur tatsächlich benötigte Spalten entnehmen
print(aiga.some)                                # Anzeigen eines Objekts auf dem Bildschirm
plot(aiga.some)                                 # Plotten des Objekts
local({fn<-choose.files(filters=Filters[c('R','txt','All'),],index=4)
                                                # Umsetzung eines Aufrufs aus dem File-Menu
file.show(fn,header=fn,title='')})
quit()                                          # Unterbrechung der Sitzung mit Abspeichern
? save                                          # Hilfe zur Save-Funktion
sFD ~ dynAsym + HPh + NF                        # symbolische Formel für die Regressionsgleichung
lm(sFD ~ dynAsym + HPh + NF,aiga.some)          # lm = linear model / Standard-Regressionsfunktion
aiga.lm1 <- lm(sFD ~ dynAsym + HPh + NF,aiga.some) # Ablegen unter dem Namen aiga.lm1
print(aiga.lm1)
summary(aiga.lm1)                               # Aufbereitung mit statistischen Kenngrößen
plot(aiga.lm1)                                  # diagnostische Plots
lm(sFD ~ dynAsym + HPh + NF,aiga.some[-19,])    # Weglassen einzelner Zeilen (neg. Indizes)
lm(sFD ~ dynAsym + HPh + NF,aiga.some[-c(11,19),])
                                                # Bildung eines Subsets ohne Subj. TB
lm(sFD ~ dynAsym + HPh + NF,subset(aiga.some,VP != "TB" ))
lm(sFD ~ dynAsym + HPh + NF,subset(aiga.some,VP != "TB" & VP!="AS" ))
quit()                                          # das war's für heute

Umwandeln zwischen lang und breit, Umsortieren, Zeilennamen

?reshape                                        # Hilfe zur reshape-Funktion
summary(Indometh)                               # Nachvollziehen des dort angegebenen Beispiels 
plot(Indometh)
Indometh
wide <- reshape(Indometh,dir="wide",idvar="Subject") # Umwandlung in Breitformat
aiga2.long <-                                   # erste 4 Spalten der breiten Datei in Langformat wandeln  reshape(aiga2[1:4],dir="long",v.names="Cv",varying=2:4,idvar="VP")
plot(conc~time,Indometh)                        # 2 Spalten plotten (Scatterplot)
plot(conc~time,Indometh,col=as.numeric(Subject)) # Einfärbung nach Subject
plot(aiga2[c(1,4,7)])                           # Spalten 1,4,7 matrixartig plotten
c(1,4,7)                                        # Konstruktion verschiedener Vektoren
c(1,4,7,13:16)
13:16
c(1,4,7,13:16,"a2")                             # Einmischung eines char-Strings
c(1,4,7,13:16,a2)                               # Fehler, weil kein Objekt a2 vorhanden
fix(aiga.some)                                  # Aufruf des internen Editors
aiga.some$tmp <-NA                              # eine Spalte mit NA
aiga.some
aiga.some$tmp <-NULL                            # Entfernung einer Spalte
sort(aiga.some$HPh)                             # sortierte Werte einer Spalte
order(aiga.some$HPh)                            # zugehörige Umordnung der Zeilenindizes
ai <-aiga.some[order(aiga.some$HPh),]           # Anwendung: umgeordneter dataframe
ai$DV2 <- aiga2$DV                              # man beachte den Unterschied durch die Umordnung
rownames(aiga2)
rownames(aiga2) <-aiga2$VP                      # die breite Datei erhält hier Zeilennamen
rownames(aiga2)
ai$DV2 <- aiga2[ai$VP,]$DV                      # das ist jetzt richtig, aber leider nur zufällig
quit()                                          # Ende der Sitzung

Aggregieren nach Faktoren, Varianzanalyse, Regression mit Faktoren

ai$DV2 <- aiga2[as.character(ai$VP),]$DV        # jetzt ist es wirklich richtig
as.character(ai$VP)
ai$VP                                           # so sieht ein Faktor aus
as.numeric(ai$VP)
aiga2[order(aiga2$DV),]
aiga2 <-aiga2[order(aiga2$DV),]                 # Umsortieren des Dataframe aiga2
ai$DV3 <- aiga2[as.character(ai$VP),]$DV
ai
ai$DV2 <- aiga2[ai$VP,]$DV                      # Beweis daß es ohne as.character() falsch ist
ai
aiga.some$VP <- as.character(aiga.some$VP)      # dauernde Entfaktorisierung von aiga.some$VP
? read.table                                    # Hilfe zur Vermeidung der Umwandlung in Faktor
?merge                                          # empfohlene Funktion für Zusammenführung von Dataframes
contrasts(aiga.some$VP)                         # Faktoren definieren Kontrastmatrizen 
contrasts(factor(c("m","w")))                   # Faktor mit 2 Leveln
contrasts(factor(c("j","m","a")))               # Faktor mit 3 Leveln
levels(factor(c("j","m","a")))
options()
options()$contrasts
contrasts(ordered(c("j","m","a")))              # ordinal geordnete Faktoren
plot(conc~time,Indometh)                        # Beispiel für nichtlinearen Zusammenhang
lm(conc~time,Indometh)                          # Regression
abline(lm(conc~time,Indometh))                  # Plotten der Regressionslinie
lm(1/conc~time,Indometh)                        # reziprok nahezu linear
plot(1/conc~time,Indometh)
abline(lm(1/conc~time,Indometh))
plot(conc~1/time,Indometh)                      # so geht es leider nicht
plot(conc~I(1/time),Indometh)                   # Abhilfe mit Funktion I()
plot(conc~(1/time),Indometh)
lm(conc~Subject,Indometh)                       # wenig brauchbar, da Indometh$Subject geordneter Faktor ist
Indometh$Subject
lm(conc~Subject-1,Indometh)                     # Weglassen des Intercept-Terms ergibt sinnvolles Ergebnis
                                                # allgemeine Aggregatfunktion
aggregate(Indometh$conc,list(Indometh$Subject),FUN=mean)
aggregate(Indometh$conc,list(Indometh$Subject),FUN=median)
aggregate(Indometh$conc,list(Indometh$Subject),FUN=sd)
                                                # Spaltennamen im Ergebnis vergeben
aggregate(Indometh$conc,list(VP=Indometh$Subject),FUN=sd)
aggregate(list(co.sd=Indometh$conc),list(VP=Indometh$Subject),FUN=sd)
                                                # zusätzliche Parameter für die aggregierende Funktion
aggregate(Indometh$conc,list(Indometh$Subject),FUN=mean,trim=0.2)

robuste Verfahren

s. Fallbeispiel eines Datensatzes, bei dem gewöhnliche und robuste Statistik völlig unterschiedliche Ergebnisse liefern.

noch zu erklären

- Mixed-effects-Modelle (package lme4)