Statistisches Programmieren Session 1 1 Was ist R R ist eine interaktive, flexible Software-Umgebung in der statistische Analysen durchgeführt werden können. Zahlreiche statistische Funktionen und Prozeduren werden zur Verfügung gestellt und die Software ist frei erhältlich. Der Syntax und der grundlegende Aufbau orientiert sich an der kommerziellen Software S. R bietet außer der Möglichkeit statistische Analysen durchzuführen 1. Stukturen einer Programmiersprache (Loops, Branches, Funktionskonstrukt) 2. Möglichkeiten der graphischen Datenanalyse. 3. Schnittstellen zu Datenbanken, Excel,... 2 Die R Console - ein besserer Taschenrechner In der R-Konsole hat man die Möglichkeit einfache Rechnungen durchzuführen und Funktionen aufzurufen. Arithmetische Operationen werden mit den Symbolen +, -, *, / bzw ˆ notiert. > 1+1 [1] 2 > 2^{0.5} [1] 1.414214 > (1+1)*7 [1] 14 > 1+1*7 [1] 8 > 2.1/2 [1] 1.05 Funktionsaufrufe sind von der Form funktionsname(argument1, argument2,... ). Zum Beispiel kann man 2 auch durch den Befehl 1
> sqrt(2) [1] 1.414214 berechnen. Andere Beispiele sind > exp(2) [1] 7.389056 > log(7.389056) [1] 2 > factorial(100) [1] 9.332622e+157 > sin(sqrt(2)) [1] 0.987766 Achtung: R ist case sensitve, d.h. SQRT(2) oder Sqrt(2) würden eine Fehlermeldung produzieren. > Sqrt(2) Fehler: konnte Funktion Sqrt nicht finden R kennt eine Vielzahl von Funktionen. Um die genaue Funktionsweise einer Funktion herauszufinden, kann man sich der Funktion help bedienen. Der Syntax ist help(funktionsname). Zum Beispiel > help(sqrt) Hat eine Funktion mehr als ein Argument, so muss man entweder die genaue Reihenfolge der Argumente kennen oder man benennt die übergebenen Werte entsprechend der Argumentnamen. Die Funktion round() hat zum Beispiel die Argumente x und digits. Nach dem Gesagten sind also folgende Befehle gleichbedeutend > round(sqrt(2),2) [1] 1.41 > round(x=sqrt(2), digits=2) [1] 1.41 > round(digits=2, x=sqrt(2)) [1] 1.41 Manche Argumente in einem Funktionsaufruf werden unbedingt benötigt, während andere Argumente optional sind. Optionale Argumente haben immer 2
einen Standardwert, der verwendet wird, wenn das Argument nicht spezifiziert wird. Das Argument digits der Funktion round() ist zum Beispiel ein optionales Element mit Standardwert 0. > round(sqrt(2)) [1] 1 Die Namen der Argumente und welche Argumente optional sind, ist der sogenannten Signatur der Funktion (Funktionsname und Argumente) zu entnehmen. Die Signatur einer Funktion findet sich in dem entsprechenden Eintrag in der Hilfe. Die Signatur von round() ist zum Beispiel: round(x, digits = 0). Die Tatsache das dem Argument Digits der Wert 0 zugewiesen wird, signalisiert, dass das Argument den Standardwert 0 hat und daher ein optionales Element ist. 3 Variablen und Zuweisungen R bietet die Möglichkeit, Ergebnisse von Berechnungen in Variablen zu speichern. Dies ist offensichtlich bei Rechnungen, die aus mehreren Teilschritten bestehen, eine Notwendigkeit. R kennt folgende grundlegende (atomare) Typen von Variablen 1. numeric: Integer und Double Datentyp, mögliche Werte: Zahlen x zwischen mit x <= 1.7976931348623157 10 308 und (64 bit, double precision) 2. complex: complexe Zahlen 3. logical: logischer Datentyp, mögliche Werte: TRUE und FALSE 4. character: Zeichen, mögliche Werte: Buchstaben, Zahlen, Satzzeichen,... Zuweisungen erfolgen mittels der Operatoren < oder > Operatoren. Der Inhalt einer Variable kann überprüft werden, indem man den Variablennamen eingibt. Wie auch bei Funktionsnamen gilt auch für Variablennamen, dass R case sensitive ist. 3
(> a <- 1) [1] 1 > (sqrt(2) -> b) [1] 1.414214 > (c <- a>b) [1] FALSE > (d <- a<b) [1] TRUE > (e = :) ) [1] :) Um zu überprüfen, von welchem Datentyp eine bestimmte Variable ist, verwendet man die Funktion mode() oder alternativ is.type(). > mode(a) [1] numeric > is.numeric(a) [1] TRUE > is.logical(a) [1] FALSE > is.logical(is.numeric(a)) [1] TRUE Die erzeugte Variablen bleiben im Speicher bis R beendet wird. Um sich einen Überblick über die sich im Speicher befindlichen Variablen zu verschaffen, kann man die Funktion ls() verwenden. Um eine detailliertere Liste zu erhalten, verwendet man ls.str(). > a <- 1 > b <- TRUE > c <- 1:100 > ls() [1] a b c > ls.str() a : num 1 b : logi TRUE c : int [1:100] 1 2 3 4 5 6 7 8 9 10... Um Variablen aus dem Speicher zu löschen, verwendet man den Befehl rm(variablenname). Angewandt auf die obige Situation: 4
rm(a) ls() [1] b c Man kann statt einem Variablennamen auch eine Liste von Variablennamen übergeben. Insbesondere löscht der Befehl rm(list=ls()) alle momentan definierten Variablen aus dem Workspace. 4 Vektoren, Matrizen und Arrays 4.1 Vektoren Einzelne Variablen können zu Vektoren zusammengefasst werden. Hierbei kann man sich der Funktion c() auf folgende Weise bedienen > (a <- c(1,2,3)) [1] 1 2 3 > c(a, 4, 5) [1] 1 2 3 4 5 Mit numerischen Vektoren kann man genauso wie mit Zahlen rechnen. Operationen werden hierbei Punktweise durchgeführt. 5
> (a <- 1:3) [1] 1 2 3 > a+5 [1] 6 7 8 > (b = 4:6) [1] 4 5 6 > a*b [1] 4 10 18 > a+b [1] 5 7 9 > a-b [1] -3-3 -3 > a/b [1] 0.25 0.40 0.50 > fahrenheit <- c( 17, 32, 0, 104, -12) > (celsius <- (fahrenheit - 32) * 5/9) [1] -8.333333 0.000000-17.777778 40.000000-24.444444 > a+b==5 [1] TRUE FALSE FALSE Für logische Vektoren sind die logischen Operatoren & (und), (oder) und! (nicht) definiert. Die Funktion xor() liefert das exklusive Oder. > a <- c(false, TRUE, TRUE, TRUE, FALSE) > b <- c(true, TRUE, TRUE, FALSE, FALSE) > a b [1] TRUE TRUE TRUE TRUE FALSE > a&b [1] FALSE TRUE TRUE FALSE FALSE >!a [1] TRUE FALSE FALSE FALSE TRUE > xor(a,b) [1] TRUE FALSE FALSE TRUE FALSE R bietet zahlreiche Methoden zur Datenkonversion an. Konversionen werden mit der Funktion as.type() durchgeführt. 6
> (a <- 1:10) [1] 1 2 3 4 5 6 7 8 9 10 > as.character(a) [1] 1 2 3 4 5 6 7 8 9 10 > as.numeric(a) [1] 1 2 3 4 5 6 7 8 9 10 > b <- c(0, 1, 2, 3, 0, 0) > as.logical(b) [1] FALSE TRUE TRUE TRUE FALSE FALSE 4.2 Matrizen Matrizen können in R zum Beispiel mit der Funktion matrix(data = NA, nrow = 1, ncol = 1, byrow = FALSE, dimnames = NULL) generiert werden. Das Argument data sollte hierbei eine Vektor sein, der die Einträge der Matrix enthält. Die Argumente nrow und ncol bestimmen die Form der Matrix. > matrix(1:16, ncol=4, nrow=4) [,1] [,2] [,3] [,4] [1,] 1 5 9 13 [2,] 2 6 10 14 [3,] 3 7 11 15 [4,] 4 8 12 16 > matrix(1:16, ncol=8, nrow=2) [,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] [1,] 1 3 5 7 9 11 13 15 [2,] 2 4 6 8 10 12 14 16 Das logische Argument byrow kann verwendet werden, um zu bestimmen, ob Matrizen spalten- oder zeilenweise eingelesen werden sollen (default: spaltenweise). Matrizen können mit den Funktionen cbind und rbind spalten- bzw zeilenweise zusammengefügt werden (siehe Hilfe). In R erlaubt es mit Matrizen wie gewohnt zu rechnen. Die Operatoren +, funktionieren wie erwartet (punktweise), während bei zwischen punktweiser Multiplikation mit und Matrixmultiplikation mit % % unterschieden wird. 7
> A = matrix(1:4, nrow=2, ncol=2) > A%*%A [,1] [,2] [1,] 7 15 [2,] 10 22 > A*A [,1] [,2] [1,] 1 9 [2,] 4 16 4.3 Arrays Vektoren können als eindimensionale Arrays und Matrizen als zweidimensionale Arrays aufgefasst werden. R bietet die Möglichkeit auch Arrays höherer Dimension zu definieren. Analog zu Matrizen gibt kann ein Array mittels der Funktion array(data = NA, dim = length(data), dimnames = NULL) erzeugt werden. Zu beachten ist hierbei, dass die Dimensionen des Arrays hier mittels des Vektors dim spezifiziert werden (vergleiche nrows und ncols im Falle einer Matrix). 4.4 Indizierung Um auf Elemente einer Matrix zugreifen zu könne,n bedient man sich der eckigen Klammern. Die Indizierungsmechanismen sind prinzipiell für Vektoren, Matrizen und Arrays gleich. Es gibt grundsätzlich zwei Arten der Indizierung. Einerseits kann man die Positionen der Werte angeben, die man ansehen oder ändern will... 8
> x=8:1 > x[2] [1] 7 > x[c(2,4)] [1] 7 5 > A = matrix(x, nrow=2, ncol=4) > A[1,3] [1] 4 > A[2, 4] [1] 1 > A[3,1] Fehler: Indizierung außerhalb der Grenzen > A[cbind(c(1,2), c(2,2))] [1] 6 5 > B = array(x, c(2,2,2)) > B[1,2,1] [1] 6... andererseits kann man sich der logischen Indizierung bedienen. Bei der logischen Indizierung wird eine Datenstruktur (Vektor, Matrix, Array) von logischen Variablen übergeben, die die selbe Dimension hat wie die zu indizierende Struktur. Die logische Variable wählt die Elemente aus, an deren Position sie selbst den Wert TRUE aufweist. > x[c(true, FALSE, TRUE, TRUE, FALSE, FALSE, FALSE, TRUE)] [1] 8 6 5 1 > x[x<=3] [1] 3 2 1 > x[x%%3 == 0] [1] 6 3 > A[x<=4 & x%%2==1] [1] 3 1 9
5 Beispiele 1. Generiere einen Vektor, der alle Geraden Zahlen von 2 bis 20 enthält (a) mittels dem : Operator (b) mittels der Funktion seq 2. Generiere die Vektoren aus Beispiel 1 in umgekehrter Reihenfolge. 3. Generiere einen Vektor, der aus allen durch 5 teilbaren und allen durch 3 teilbaren Zahlen von 1 bis 20, und keine Zahl doppelt enthält. Benutze zur Lösung die Funkion union(), um die Vektoren der Zahlen, die durch 3 bzw 5 teilbar sind, zu vereinigen. 4. Löse Beispiel 3 mittels logischer Indizierung des Vektors 1:20. Erstelle hierzu mittels des Modulo-Operators %% einen logischen Indexvektor. 5. Benutze die Funktion sort(), um den Vektor [1, 13, 4, 8, 5, 2] aufsteigend bzw absteigend zu sortieren. 6. Berechne die Stichprobenvarianz von [1 3 13 105], mittels der Funktion sum() und Vektoroperationen. 7. (a) Erzeuge eine (n n) Matrix A = (a ij ) n i,j=1 mit a ij = (j 1) n + i. Benutze die Funktion matrix(). (b) Verwende die Matrix A, um eine Matrix B zu erzeugen, die punktweise multipliziert mit einer beliebigen (n n) Matrix C = (c ij ) n i,j=1, folgendes Ergebnis produziert { c ij, i j B.C = 0, sonst Also die entsprechende obere Dreiecksmatrix extrahiert. 8. Erzeuge eine (n n) Matrix B die punktweise multipliziert mit einer beliebigen Matrix A, eine Matrix C ergibt in der alle Einträge außerhalb eines Bandes um die Diagonale 0 sind und alle Einträge innerhalb des Bandes mit den entsprechenden Einträgen von A übereinstimmen. Zum Beispiel 1 3 5 6 8 10 2 1 0 3 π 2 4 8 7 3 9 6 5 5 4 e 17 2 13.B = 1 3 0 0 0 10 2 1 0 0 0 2 4 8 0 0 0 6 5 5 0 0 0 2 13 extrahiert B 1 aus einer (5 5) Matrix das entsprechende Band der Breite 3. 10
9. Gegeben seien die Datenpunkte y = (17.899, 14.62, 12.79, 6.672012) und x 1 = (12, 19, 22, 12). Bestimme den OLS Schätzer (mit Intercept) ˆβ = ( ˆβ 1, ˆβ 2 ) des linearen Modelles y = Xβ + u durch geeignete Matrixoperationen. 11