Demographie III Übung Roland Rau mailto:roland.rau@uni-rostock.de 15. Oktober 2012 Inhaltsverzeichnis 1 Überblick 2 2 Erste Schritte in R 2 2.1 Woher erhalte ich R?............................... 2 2.2 Ein sehr mächtiger Taschenrechner........................ 2 2.3 Wertezuweisungen, Assignments......................... 4 2.4 Aufrufe von eingebauten Funktionen....................... 5 2.5 Simples Plotten.................................. 6 2.6 Hilfe finden.................................... 9 2.7 Editor für Skripte................................. 10 2.8 Dateneingabe................................... 10 3 Aufgaben: 15 1
1 Überblick WICHTIGER HINWEIS: EIGENER LAPTOP KANN VERWENDET WERDEN!!! In der Vorlesung hatten wir das Thema von diskretem und kontinuierlichem Wachstum bei Bevölkerungen (ohne Einbeziehung einer Altersstruktur) besprochen. Bevor wir auf die Berechnungen derselben eingehen werden, wollen wir zuerst erste Schritte in der Sprache R unternehmen. 2 Erste Schritte in R 2.1 Woher erhalte ich R? Bei R handelt es sich um Free Software. Sie erhalten eine aktuelle Version unter http: //www.r-project.org Download, Packages CRAN; dort wählen Sie einen Mirror in Ihrer Nähe aus und laden die entsprechende Version für Ihr Betriebssytem herunter (Windows, Mac, Linux). 2.2 Ein sehr mächtiger Taschenrechner Nach der erfolgreichen Installation von R, starten Sie R unter Windows einfach durch doppelklicken auf das entsprechende Icon. Das > Zeichen bedeutet, dass R auf Ihre Eingabe wartet. Sie können R wie einen Taschenrechner benutzen. Ihre Eingabe schliessen Sie mit der EN- TER bzw. RETURN Taste ab. Das ist natürlich nur ein kleiner Aspekt, was R kann. Addition, Subtraktion, Multiplikation und Division sollte klar sein. > 3+4 [1] 7 > 4-9 2
[1] -5 > 12*5 [1] 60 > 13 / 5 [1] 2.6 Terme wie 3 2 lassen sich in R folgendermassen schreiben. > 3^2 [1] 9 Falls dies ein längerer Ausdruck wird, können Sie natürlich Klammern verwenden. > 3^(1+1) [1] 9 Bitte beachten Sie, dass der Befehl log den Logarithmus zur Base e berechnet. Zur Berechnung des Logarithmus zur Basis 10 oder Basis 2 beötigen Sie folgende Funktionen. > exp(1) [1] 2.718282 > exp(12) [1] 162754.8 > log(10) [1] 2.302585 > log(exp(1)) 3
[1] 1 > log10(10) [1] 1 > log2(2) [1] 1 Zudem bietet Ihnen R auch noch weitere interessante Operatoren zur Berechnung des Modulus und zur Integer-Division : > 13 / 5 [1] 2.6 > 13 %% 5 [1] 3 > 13 %/% 5 [1] 2 > 2.3 Wertezuweisungen, Assignments Ein wichtige Fähigkeit von (klassischen) Programmiersprachen ist es, Werte einer Variablen zuzuweisen. In R geschieht dies mittels <-. > weltbev2010 <- 6895889000 > weltbev2010 [1] 6895889000 > weltbev1950 <- 2532229000 4
Nun können wir bereits relativ einfach berechnen, mit welcher Rate die Bevölkerung in diesen Jahren gewachsen ist > r <- log(weltbev2010 / weltbev1950) / (2010-1950) > r [1] 0.01669709 Wie groß wäre die Weltbevölkerung denn, wenn wir annehmen würden, sie würde mit derselben Rate weitere 40 Jahre wachsen (damit also das Jahr 2050)? > t <- 40 > Nt <- weltbev2010 * exp(r * t) > Nt [1] 13447713611 > ### in Millionen > Nt / 1000000 [1] 13447.71 2.4 Aufrufe von eingebauten Funktionen Natürlich beherrscht R nicht nur diese Grundrechenarten. Zusätzlich ist eine Vielzahl an Funktionen in R enthalten. Der übliche Weg, diese Funktionen aufzurufen läuft über funktionsname(argument1, argument2,...) Zum Beispiel können wir folgendermassen n Zufallszahlen zwischen 0 und 1 erzeugen. > runif(n=5) [1] 0.0122956 0.1168052 0.2174310 0.2525183 0.3125598 > runif(5) [1] 0.3581863 0.6541881 0.6861648 0.7096947 0.2037646 5
Mit weiteren Argumenten können wir den möglichen Wertebereich auch erweiteren oder einschränken. > runif(n=10, min=0, max=20) [1] 12.0370061 0.6875545 16.5678464 5.0080460 6.6779685 0.7695274 [7] 13.9899051 2.5069434 1.6810864 13.7653628 Bitte beachten Sie auch, dass es R erlaubt, mehrere Funktionen ineinander zu verschachteln : > durchschnitt <- mean(runif(n=100, min=0, max=100)) > durchschnitt [1] 48.14843 2.5 Simples Plotten R erlaubt es auch relativ einfach, die Daten graphisch abzubilden: > meine.daten <- runif(n=1000) > plot(meine.daten) 6
0 200 400 600 800 1000 0.0 0.2 0.4 0.6 0.8 1.0 Index meine.daten Oder ein Histogramm zu erstellen: > meine.daten2 <- rnorm(100000) > hist(meine.daten2) 7
Histogram of meine.daten2 Frequency 0 5000 10000 15000 4 2 0 2 4 meine.daten2 Oder mit mehr bins > meine.daten2 <- rnorm(100000) > hist(meine.daten2, breaks=200) 8
Histogram of meine.daten2 Frequency 0 500 1000 1500 2000 4 2 0 2 4 meine.daten2 2.6 Hilfe finden Sie werden sich nun wohl fragen, woher man erfahren kann, wie die Funktionen heissen und wie die verschiedenen Argumente lauten. Wenn Sie wissen, wie die Funktion lautet, können Sie ganz einfach die Hilfeseite aufrufen, und zwar mittels help(mean) oder ganz einfach?mean Wenn Sie dies nicht wissen, hilft häufig ein (dauert aber ein bisschen, bis Ergebnisse kommen): help.search("mean") Oder aber Sie nutzen das WWW und googeln nach 9
R-project how to calculate the mean 2.7 Editor für Skripte Bisher hatten wir ja alles einfach auf der Kommandoebene eingegeben. Wie Sie vielleicht von SPSS (oder anderen Statistikpaketen) wissen, gibt es normalerweise die Möglichkeit ein Skript zu schreiben (SPSS nennt dies Syntax ). Wenn Sie langfristig mit R arbeiten wollen, kann ich Ihnen unter Windows Tinn-R empfehlen (http://www.sciviews.org/tinn-r/). Der beste Editor für R ist jedoch, meiner Meinung nach, (GNU) Emacs (http://www.gnu.org/software/emacs/) mit dem Statistikmode ESS (http://ess.r-project.org/). Wenn Sie dies unter Windows nutzen möchten, lege ich Ich Ihnen die Version von Vincent Goulet ans Herz, die sozusagen alles bereits beinhaltet, was Sie benötigen (http://vgoulet.act.ulaval.ca/en/ressources/emacs/). Für die Arbeiten hier im Kurs reicht es jedoch völlig aus, dass wir den eingebauten Editor verwenden. Starten Sie ihn via DATEI -> NEUES SKRIPT. 2.8 Dateneingabe Bis jetzt hatten wir ja noch gar nicht darüber gesprochen, wie man Daten eingibt. Sie können Daten selbst eingeben: (c steht dabei für concatenate) > sp <- c("kyle", "Cartman", "Kenny", "Stan") > taschengeld <- c(10,8,na,10) > sp [1] "Kyle" "Cartman" "Kenny" "Stan" > taschengeld [1] 10 8 NA 10 NA steht dabei für missing values. Sequenzen von Daten geben Sie über seq ein: 10
> no1 <- 1:10 > no2 <- seq(from=1, to=10, by=1) > no3 <- seq(from=1, to=10, by=4) > no1 [1] 1 2 3 4 5 6 7 8 9 10 > no2 [1] 1 2 3 4 5 6 7 8 9 10 > no3 [1] 1 5 9 Wenn Sie Daten wiederholt eingeben, müssen Sie dies nicht manuell tun. Dafür gibt es rep: > rep(x=10, times=3) [1] 10 10 10 > rep(no3, times=4) [1] 1 5 9 1 5 9 1 5 9 1 5 9 Dies waren eindimensionale Daten (Skalare und Vektoren). Auch wenn R bis zu 7(?) Dimensionen unterstützt, reichen uns zwei Dimensionen in diesem Kurs aus. R kennt zwei zweidimensionale Arten, wie man Daten darstellen kann: Matrizen und Dataframes. Dataframes sind vergleichbar mit den Datenfenstern, wie Sie sie vielleicht aus SPSS kennen. Zuerst einmal eine Matrix: > meine.matrix <- matrix(1:12, byrow=false, ncol=4) > meine.matrix [,1] [,2] [,3] [,4] [1,] 1 4 7 10 [2,] 2 5 8 11 [3,] 3 6 9 12 11
Wie Sie vielleicht durch eckigen Klammern erkennen können, kann man einzelne Spalten oder Zeilen einer Matrix relativ einfach extrahieren und (evtl.) einer neuen Variablen zuordnen: > meine.matrix[2,] [1] 2 5 8 11 > meine.matrix[,2] [1] 4 5 6 > extrahiert <- meine.matrix[,4] > extrahiert [1] 10 11 12 Dataframes erstellt man mittels: > mein.df <- data.frame(person=sp, einkommen=taschengeld) > mein.df person einkommen 1 Kyle 10 2 Cartman 8 3 Kenny NA 4 Stan 10 Einzelne Variables können Sie durch das $ ansprechen. > names(mein.df) [1] "person" "einkommen" > mein.df$person [1] Kyle Cartman Kenny Stan Levels: Cartman Kenny Kyle Stan 12
Dies ist nötig, da R mehr als nur einen Datensatz im Speicher haben kann. Der hauptsächliche Unterschied zwischen einer Matrix und einem Dataframe ist derjenige, dass in einem Dataframe unterschiedliche Datentypen gespeichert werden können (vereinfacht: Text und Zahlen), während in einer Matrix jeweils nur ein Datentyp verwendet werden kann (Text oder Zahlen). Die meisten Daten tippen Sie jedoch nicht selbst ab. Zum Laden bestehender Datensätze wird in aller Regel die Funktion read.table verwendet: > deutschland <- read.table("http://www.wiwi.uni-rostock.de/uploads/media/deutschland2008.csv", + header=true, skip=1, sep=",") > head(deutschland) Jahr Bev Geburten Tod Immigration Emigration 1 1972 NA 901657 965689 NA NA 2 1973 NA 815969 962988 NA NA 3 1974 NA 805500 956573 NA NA 4 1975 NA 782310 989649 NA NA 5 1976 NA 798334 966873 NA NA 6 1977 NA 805496 931155 NA NA Die Anzahl der Geburten und Sterbefälle in Deutschland lässt sich nun relativ einfach abbilden: > plot(x=deutschland$jahr, y=deutschland$tod, col="blue", type="l", + xlab="jahr", ylab="geburten/sterbef~ad lle", ylim=c(0,1000000)) > lines(x=deutschland$jahr, y=deutschland$geburten, col="red") > #head(colors()) 13
Geburten/Sterbefälle 0 200000 400000 600000 800000 1000000 1975 1980 1985 1990 1995 2000 2005 Jahr Nun können wir beispielsweise ganz einfach berechnen, wieviele Geburten zwischen 1972 und 2008 gezählt wurden. Oder aber wieviele Personen durchschnittlich ausgewandert sind: > sum(deutschland$geburten) [1] 29468952 > mean(deutschland$emigration) [1] NA Was bedeutet nun NA? R ist relativ clever und hat bemerkt, dass es bei der Variablen Emigration missing values gibt (NAs). Somit ist auch der Durchschnitt ein NA. Aber durch ein weiteres Argument, kann der Durchschnitt trotzdem ausgegeben werden. > mean(deutschland$emigration, na.rm=true) [1] 681264.5 14
3 Aufgaben: Diese Aufgaben dienen Ihnen, dass Sie erste Schritte in R machen können. Wir werden die Lösungen nächste Woche diskutieren. Laden Sie sich R herunter und installieren es. Erstellen Sie einen Ordner (Verzeichnis) auf Ihrer Festplatte, wenn Sie Ihren eigenen Laptop verwenden wollen. Oder aber einen Ordner (Verzeichnis) auf Ihrem Netzlaufwerk und geben Sie ihm einen Namen mit Wiedererkennungswert! Bitte verwenden Sie keine Leerzeichen in Ihrem Ordnernamen. Und bitte, bitte nicht einen Ordner auf dem Desktop oder in Eigene Dateien erstellen. Das sorgt leider nur für Schwierigkeiten. Laden Sie den Datensatz UNestimates.csv von meiner Homepage im Internet herunter und speichern ihn Ihrem neuen Verzeichnis. Beispielsweise: C:\\WS1213\\DemoIII\\ Laden Sie diesen Datensatz in R. Öffnen Sie dazu im Editor ein Neues Skript und speichern es in Ihrem neuen Verzeichnis ab. Beispielsweise als C:\\WS1213\\DemoIII\\demo3uebung1.r In der ersten Zeile Ihres Skriptes sollten Sie das Arbeitsverzeichnis, also Ihr Verzeichnis, festlegen. Dazu verwenden Sie die Funktion setwd. Beispielsweise: setwd("c:\\ws1213\\demoiii") Dann laden Sie den Datensatz, den Sie vorhin heruntergeladen haben, mittels: > meine.daten <- read.table("unestimates.csv", header=true, skip=1, sep=",") 15
Finden Sie heraus, was header, skip und sep bedeuten. Oder anders ausgedrückt: Was machen diese Argumente in der Funktion read.table? Ihr Datensatz sieht nun folgendermaßen aus: > head(meine.daten) Year Population 1 1950 2532229 2 1955 2772882 3 1960 3038413 4 1965 3333007 5 1970 3696186 6 1975 4076419 > ## oder > str(meine.daten) 'data.frame': 31 obs. of 2 variables: $ Year : int 1950 1955 1960 1965 1970 1975 1980 1985 1990 1995... $ Population: int 2532229 2772882 3038413 3333007 3696186 4076419 4453007 48632 Die Wachstumrate zwischen 1950 und 1955 war somit: > log(meine.daten[2,2] / meine.daten[1,2])/5 [1] 0.01815745 Dasselbe Ergebnis erhalten Sie auch auf folgende Art und Weise: > log(meine.daten$population[2] / meine.daten$population[1])/5 [1] 0.01815745 16
Berechnen Sie nun auf diese beiden Arten die diskrete Wachstumsrate zwischen 1975 und 2010! Sie müssen sich dafür vermutlich einmal den gesamten Datensatz ansehen. Das geht mittels: meine.daten Keine Sorge: Es geht eleganter in R. Aber ich möchte Ihnen nicht zu viel aufbürden! 17