Dr. Felix Ballani SoSe 2018 Material zur Vorlesung Räumliche Statistik Einführung in R Während der folgenden Übungen sollen Sie ab und zu mit dem Statistik-Programm R arbeiten. Das Statistik-Programm R kann kostenlos von der R-Homepage www.r-project.org bezogen werden. Ebenfalls frei erhältlich sind verschiedene Arbeitsoberflächen und Editoren sowie Erweiterungen, welche das Arbeiten und die Programmierung mit R vereinfachen, z. B. die Entwicklungsumgebung RStudio, siehe www.rstudio.com. In den PC-Pools ist an allen Rechnern die R-Core-Version vorhanden und an den meisten das etwas komfortablere RStudio. Arbeiten Sie den gesamten Abschnitt durch und führen Sie die R-Befehle entweder in der Konsole oder aber einfacher im begleitenden R-Skript intro.r durch. Speichern Sie das begleitende R-Skript intro.r, starten Sie R und öffnen Sie dann (s. u.) die Datei intro.r. Allgemeines Die R-Core-Version öffnet sich mit einem Fenster namens R Console, welches auch (neben weiteren) nach dem Starten von RStudio vorhanden ist. In diesem Fenster werden alle Rechnungen durchgeführt, indem man hier einzelne Befehlszeilen eingibt und anschließend die Enter-Taste drückt. In der R-Core-Version kann man weiterhin im Menü über Datei > Neues Skript einen R- Editor öffnen, in diesem schreiben und das Geschriebene über Datei > Speichern unter... abspeichern. Ebenso kann man ein bereits vorhandenes sogenanntes R-Skript über Datei > Öffne Skript... öffnen. Eine Skriptdatei hat üblicherweise die Endung.r. In RStudio erhält man eine neue Skriptdatei über File > New File > R Script. In einem R-Skript kann man eine einzelne Befehlszeile ausführen, indem man den Cursor in dieser Zeile platziert und dann die Tastenkombination Strg+R (R-Core-Version) bzw. Strg+Enter (RStudio) drückt oder über das Menü Bearbeiten > Ausführung Zeile oder Auswahl (R-Core-Version) bzw. Code > Run Selected Line(s) (RStudio, hier gibt es zusätzlich einen Run -Button) ansteuert. Der Vorteil eines R-Skripts besteht u. a. darin, dass man aber auch mehrere Befehlszeilen zusammen ausführen kann. Dazu markiert man die betreffenden Zeilen mit Hilfe der linken Maustaste und drückt dann Strg+R bzw. Strg+Enter. Alle Zeichen, die in einer Zeile (einer Skriptdatei) hinter dem Zeichen # stehen, interpretiert R als Kommentar und ignoriert diese bei der Ausführung. Die Pfeiltaste nach oben bringt in der Konsole den letzen Befehl zurück. R unterscheidet kleine und große Buchstaben.
R besitzt eine umfangreiche Hilfe. Alle bereits in R vorhandenen ( built-in -) Funktionen sind hinsichtlich der möglichen Argumente und Rückgabewerte dokumentiert und mit Beispielen unterlegt. Das Gleiche gilt für Funktionen, die in Zusatzpaketen implementiert sind. Es gibt verschiedene Möglichkeiten, die Hilfe aufzurufen. Neben der formalen Beschreibung des/der entsprechenden Kommandos/Funktion gibt es hilfreiche Beispiele. help(sum)?sum # Hilfe für die "built-in"-funktion sum # das Gleiche wie help(sum) Grundlegendes R als Taschenrechner 1+1 # Addieren 2*3 # Multiplizieren 3/2 # Dividieren 3^2 # Potenzieren (1+2)*3 # Klammern setzen 1.3*2 # Der Punkt fungiert als Dezimalzeichen. pi # Die Konstante 3.141592... pi/4 # Rechnen mit der Konstanten 1/0 # Inf = Infinity (unendlich) 0/0 # NaN = Not a Number: Platzhalter bzw. Fehlermeldung pi[2] # NA = Not Available: Platzhalter bzw. Fehlermeldung Variablen erstellen a <- 2*3 # eine Variable a anlegen, gleichzeitig einen Wert zuweisen a # den Wert der Variablen a anzeigen lassen a^2 # mit der Variable rechnen... b <- a^2 #... und das Ergebnis einer weiteren Variablen zuweisen Baum <- "Eiche" # Wert einer Variablen kann auch eine Zeichenkette... Baum w.wert <- TRUE #... oder ein Wahrheitswert (oder noch komplexer) sein w.wert Als Namen von Variablen können nahezu beliebige Zeichenketten verwendet werden. Einige Zeichenketten sind allerdings in R bereits belegte Konstanten (wie pi) oder Funktionen (wie sum), die man möglichst nicht neu belegt. Im Zweifelsfall kann man dies testen: exists( for ) exists( mein_name ) Funktionen verwenden log(2.7182818) # der natürliche Logarithmus log(16,2) # der Logarithmus von 16 zur Basis 2 objects() # alle vorhandenen Variablen und Objekte anzeigen
Funktionen werden in R durch ihren Namen aufgerufen, gefolgt von ihren Argumenten, die in runden Klammern durch Komma(ta) getrennt hinter dem Namen angegeben werden. Beim Aufruf der Funktion objects wird hier keine Spezifizierung von Argumenten benötigt, daher bleibt die Klammer leer. Wenn es mehrere Parameter gibt, bestimmt normalerweise die Reihenfolge, welche Zahl für welches Argument steht. log(16,2) und log(2,16) unterscheiden sich also. Man kann aber Parameter dann in beliebiger Reihenfolge angeben, wenn man die Namen der Argumente mit angibt. Im Beispiel wäre also log(base=2,x=16) das Gleiche wie log(16,2) bzw. log(x=16,base=2). In R ist das Verwenden von Funktionen ganz wesentlich. Daher ist es oftmals nötig, eigene Funktionen zu definieren. Dies geschieht immer nach dem Schema Funktionsname <- function(arg1name,arg2name,...,argnname) {... wobei innerhalb der geschweiften Klammern angegeben wird, was mit den Argumenten Arg1Name, Arg2Name usw. gemacht werden soll, z. B. BspFunktion <- function(a,b) { # zwei Argumente w <- 5*a+b return(w) # Rückgabewert Das Ergebnis der Funktion wird mit return zurückgegeben. BspFunktion(1,0) BspFunktion(2,2) Es ist auch oft üblich, bei der Definition der Funktion einigen Argumenten sinnvolle Standardwerte zuzuweisen. BspFunktion <- function(a=0,b=0) { w <- 5*a+b return(w) BspFunktion() BspFunktion(1) # erstes Argument wird auf 1 gesetzt Schleifen for(i in 1:10) print(i^2) for( name in c("i", "want", "to", "go", "home!") ) { cat(name,"\n") while(rnorm(1) < 1) print("hallo") Bedingungen if(rnorm(1) > 0) { print("rnorm erzeugte einen positiven Wert.") else { print("rnorm erzeugte einen negativen Wert.")
Vektoren, Matrizen, Listen Erzeugung von Vektoren x <- c(1, 2, 3, 4, 5) # c kommt von concatenate. x y <- exp(x)-2 # exp wird auf jedes Element von x angewendet. y y[2] # zweites Element von y y[2] <- 1 # Ändern des zweiten Elements von y Möglichkeiten, verschiedene Arten von Vektoren zu erzeugen rep(1,5) # Wiederholung 1:5 # das Gleiche wie c(1, 2, 3, 4, 5) seq(1,20,by=4) # Folge mit Abstand by=4 seq(1,20,length=5) # Folge mit length=5 Elementen in gleichen Abständen verschiedene Wege, um auf Elemente von Vektoren zuzugreifen x <- 1:30/10 length(x) # Anzahl der Elemente von x x[1:10] # die ersten zehn Elemente von x x[c(1,10,15)] # die Elemente an Position 1, 10,15 x[c(10,1,15)] # die gleichen Element in anderer Reihenfolge x[ x > 2.5 ] # alle Elemente von x, die > 2.5 sind x > 2.5 # Vektor von Wahrheitswerten x[-(1:10)]; # alle Elemente außer den Elementen 1 bis 10 Matrizen x <- c(1,2,3,4) matrix(x,nrow=2,ncol=2) # Elemente spaltenweise angeordnet matrix(x,2,2,byrow = T) # Elemente zeilenweise angeordnet A <- matrix(1:15,3) B <- matrix(1:3,3,5) B Matrixoperationen A + B A * B A %*% t(b) # elementweise Summe # elementweise Multiplikation # Matrixprodukt, t(b) ist transponierte Matrix B Zugriff auf Matrizen und Dimension dim(b) # Dimension (Anzahl der Zeilen bzw. Spalten) NROW(B) # Zeilenanzahl NCOL(B) # Spaltenanzahl A[,1] # erste Spalte A[1,] # erste Zeile A[3,1] # erstes Element der dritten Zeile
Zusammenfassen von Vektoren zu Matrizen cbind(c(1,2), c(3,4)) rbind(c(1,2), c(3,4)) # spaltenweise # zeilenweise Listen; sind nützlich, um Informationen verschiedenen Typs zusammenzufassen. course.info <- list(students = c("sandra", "Karl", "Thomas", "Nadine"), nr.of.exercises = 15, rooms = c("seminarraum","pc-pool")) course.info$rooms course.info[[3]] course.info$students[2] Zufallszahlen und einfache Statistiken Generierung von (Pseudo-)Zufallszahlen und Verwendung von Quantil-, Verteilungs- und Wahrscheinlichkeitsdichtefunktionen rnorm(10) qnorm(0.975) pnorm(0) dnorm(0) # Generiert 10 Zufallszahlen zur N(0,1)-Verteilung # 97.5 %-Quantil der Standardnormalverteilung # Verteilungsfunktion # Wahrscheinlichkeitsdichtefunktion In ähnlicher Weise erhält man z. B. mit runif Zufallszahlen zur stetigen Gleichverteilung, mit rexp Zufallszahlen zur Exponentialverteilung und mit rbinom Zufallszahlen zur Binomialverteilung. einfache Statistiken x <- rnorm(20) y <- rnorm(20,mean=2,sd=2) # 20 Zufallszahlen zur N(2,4)-Verteilung mean(x) # empirischer Mittelwert mean(y) sd(x) # empirische Standardabweichung sd(y) var(x) # empirische Varianz var(y) z <- 2*(0.5*x + sqrt(0.75)*rnorm(20)) cov(x,z) # empirische Kovarianz von x und z cor(x,z) # empirischer Korrelationskoeffizient Einfache Grafiken hist(rnorm(100)) # Histogramm plot(x,z) # Streudiagramm xx <- seq(-3,3,by=0.1) plot(xx,dnorm(xx),type="l",main="dichtefkt. der N(0,1)-Vert.",xlab="x",ylab="f(x)") Über?par können Sie herausfinden, mit welchen weiteren optionalen Argumenten man die Grafikausgabe beeinflussen kann.
Dateiverwaltung getwd() zeigt und setwd("meinpfad") setzt das Arbeitsverzeichnis von R. Sofern nicht mit weiteren Pfadangaben versehen, werden in diesem Verzeichnis alle Dateien gespeichert, für die man einen solchen Befehl ausführt. getwd() # aktuelles Arbeitsverzeichnis A <- matrix(rnorm(20),4,5) write.table(a,file="amatrix.txt",row.names=false,col.names=false) # Speichern AA <- read.table("amatrix.txt") # Einlesen class(aa) # Typ data.frame AA <- as.matrix(aa) # Umwandeln in den Typ matrix class(aa) Nicht alle Daten sind in Form einer Matrix vorhanden. Sie lassen sich mit save abspeichern und mit load wieder einlesen. save(course.info,file="ci.rdata") remove(course.info) course.info load(file="ci.rdata") course.info # Abspeichern im.rdata-format # Löschen des Objekts course.info # Einlesen Der Befehl save.image() speichert alle Objekte in der Datei.RData im aktuellen Arbeitsverzeichnis. Somit kann man auf bereits erzeugte Objekte auch nach einer Sitzungsunterbrechung wieder zugreifen. In der Regel wird man beim Schließen der R-Core-Version oder von RStudio gefragt, ob man die aktuelle Sitzung in dieser Weise speichern möchte.