Einführung in die formale Demographie — Übung Roland Rau mailto:[email protected] 23. November 2015 Inhaltsverzeichnis 1 2 3 Programmierung in R 2 1.1 Referenzieren von Datenbereichen . . . . . . . . . . . . . . . . . . . . . . . . 2 1.2 Schleifen . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2 1.3 if Bedingungen . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3 1.4 Funktionen in R . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4 Berechnung einer Sterbetafel 5 2.1 Daten . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5 2.2 Die Sterberate mx . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 6 2.3 ax . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 6 2.4 Die Sterbewahrscheinlichkeit qx . . . . . . . . . . . . . . . . . . . . . . . . . 6 2.5 Die Überlebenswahrscheinlichkeit px . . . . . . . . . . . . . . . . . . . . . . 7 2.6 Die Überlebensfunktion lx . . . . . . . . . . . . . . . . . . . . . . . . . . . . 7 2.7 Die Gestorbenen in der Sterbetafelbevölkerung dx . . . . . . . . . . . . . . . . 8 Aufgaben 9 1 1 Programmierung in R Wer von Ihnen bereits Erfahrung mit Programmierung hat, wird wissen, dass es in den meisten Programmiersprachen Konstrukte gibt, um sogenannte “Schleifen” zu programmieren. Zudem gibt es aber auch Möglichkeiten, das Programm je nach der augenblicklichen Situation in unterschiedlichen “Programmzweigen” zu verarbeiten. 1.1 Referenzieren von Datenbereichen Eine sehr nützliche Einrichtung ist das Referenzieren von Datenbereichen. In R wird dies mittels eckiger Klammern gemacht ([ und ]). Das erste Element unserer Gestorbenen-Daten Dx ist demnach: Dx[1] ## [1] 1061.17 Negatives Referenzieren geht praktischerweise auch: beispiel <- c("Kenny", "Cartman", "Kyle", "Stan") beispiel ## [1] "Kenny" "Cartman" "Kyle" "Stan" beispiel[-1] ## [1] "Cartman" "Kyle" "Stan" beispiel[-3] ## [1] "Kenny" "Cartman" "Stan" Wie Sie sehen “fehlt” nun das erste bzw. das dritte Element. 1.2 Schleifen In R, wie in den meisten anderen Programmiersprachen auch, gibt es die Möglichkeit Schleifen unterschiedlicher Art zu programmieren. Wir werden hier nur auf eine Möglichkeit eingehen, die sogenannte for Schleife. 2 Eine for-Schleife sieht folgendermaßen aus: for (vari in sequenz) { Anweisungen, die Bezug auf vari nehmen koennen } Ein, zwei Beispiele sollen dies erläutern: for (i in 1:10) { print(i) } ## ## ## ## ## ## ## ## ## ## [1] [1] [1] [1] [1] [1] [1] [1] [1] [1] 1 2 3 4 5 6 7 8 9 10 meine.daten <- c(-213,54,-634,3,67,-234,654,23,-6) summe <- 0 for (i in 1:9) { summe <- summe + meine.daten[i] } summe ## [1] -286 1.3 if Bedingungen Häufig muss ein Programm jedoch unterschiedliche Dinge bewältigen, je nachdem, wie die augenblickliche Situation ist. Für solche Zwecke gibt es die if Bedingung. if (bedingung) { verarbeite hier nur, falls bedingung TRUE 3 } else { verarbeite hier nur, falls bedingung FALSE } Der else Bereich ist optional. Als Beispiel wollen wir einmal zählen, wieviele Zahlen grösser als Null sind und wieviele Zahlen kleiner als Null sind: meine.daten ## [1] -213 54 -634 3 67 -234 654 23 -6 posis <- 0 negis <- 0 for (i in 1:9) { if (meine.daten[i]>=0) { posis <- posis + 1 } else { negis <- negis + 1 } } posis ## [1] 5 negis ## [1] 4 1.4 Funktionen in R Die im vorherigen Abschnitt kennengelernten Techniken lassen sich hervorragend dazu verwenden, eigene Funktionen zu schreiben. Dies erleichtert es nicht nur, repetitives Abtippen zu vermeiden. Zudem muss man sich um die in der Funktion verarbeiteten Details keine Gedanken mehr machen — vorausgesetzt natürlich, dass dabei keine Fehler gemacht wurden. Eine Funktion wird folgendermaßen geschrieben: funktionsname <- function(arg1, arg2, arg3, ...) { ‘‘body der funktion’’ 4 return(ergebniswerte) } Zum Beispiel können wir nun ganz einfach eine Funktion schreiben, die den Durschnitt zweier Werte berechnet: durchschnitt <- function(zahl1, zahl2) { schritt1 <- zahl1 + zahl2 schritt2 <- schritt1 / 2 return(schritt2) } durchschnitt(zahl1=10, zahl=20) ## [1] 15 Oder aber wir können die diskrete und kontinuierliche Zeit bis zur Verdopplung einer Bevölkerung mit gegebener Wachstumsrate berechnen: dopplung <- function(r, typ) { if (typ=="k") { doppelzeit <- log(2) / r } if (typ=="d") { doppelzeit <- 1/log2(1+r) } return(doppelzeit) } dopplung(r=0.01766, typ="k") ## [1] 39.24956 dopplung(r=0.01766, typ="d") ## [1] 39.59512 2 2.1 Berechnung einer Sterbetafel Daten Zuerst wollen wir unsere Daten laden. 5 d2011 <- read.table("DxNx2011Frau2015.csv", header=TRUE, skip=1, sep=",") Dx <- d2011$D Nx <- d2011$N x <- d2011$x Ich halte mich hierbei an die Methoden, wie sie in Preston et al. (2001) beschrieben sind. 2.2 Die Sterberate mx mx ≈ Mx = Dx Nx mx <- Dx/Nx head(mx) ## [1] 0.0032437676 0.0002421441 0.0001474009 0.0001067710 0.0001258235 ## [6] 0.0001198622 2.3 ax Wie bereits in der Vorlesung besprochen, wollen wir davon ausgehen, dass diejenigen Personen, die im Alter x gestorben sind, durchschnittlich noch die Hälfte dieses Jahres erlebt haben. Lediglich bei der Säuglingssterblichkeit gehen wir von einem niedrigeren Wert aus: ax <- rep(0.5, length(mx)) ax[1] <- 0.06 2.4 Die Sterbewahrscheinlichkeit qx qx = mx 1 + (1 − ax )mx qx <- mx/(1+(1-ax)*mx) head(qx) ## [1] 0.0032339070 0.0002421148 0.0001473901 0.0001067653 0.0001258156 ## [6] 0.0001198550 6 head(mx) ## [1] 0.0032437676 0.0002421441 0.0001474009 0.0001067710 0.0001258235 ## [6] 0.0001198622 2.5 Die Überlebenswahrscheinlichkeit px px = 1 − qx px <- 1-qx 2.6 Die Überlebensfunktion lx lx = 100, 000 falls x = 0 lx−1 px−1 sonst. lx.fun <- function(ueberleb) { ergebnis <- rep(0, length(ueberleb)) for (i in 1:(length(ueberleb))) { if (i==1) { ergebnis[i] <- 100000 } else { ergebnis[i] <- ergebnis[i-1] * ueberleb[i-1] } } return(ergebnis) } lx <- lx.fun(ueberleb=px) head(lx) ## [1] 100000.00 99676.61 99652.48 99637.79 lx <- rep(0,length(Dx)) lx[1] <- 100000 for (i in 2:(length(lx))) { lx[i] <- lx[i-1] * px[i-1] } 7 99627.15 99614.62 2.7 Die Gestorbenen in der Sterbetafelbevölkerung dx dx = lx − lx+1 dx.fun <- function(survival) { ergebnis <- rep(0, length(survival)) for (i in 1:(length(survival))) { if (i < length(survival)) { ergebnis[i] <- survival[i] - survival[i+1] } else { ergebnis[i] <- lx[i] } } return(ergebnis) } dx <- dx.fun(survival=lx) head(dx) ## [1] 323.39070 24.13318 14.68779 10.63786 12.53465 11.93931 # Alternativ: dx2 <- lx - c(lx[-1],0) dx - dx2 ## [1] ## [36] ## [71] ## [106] 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 8 3 Aufgaben • Laden Sie den Datensatz UNworldpop2015.csv von meiner Homepage. Dieser Datensatz enthält Bevölkerungssschätzungen der Vereinten Nationen für alle Länder kombiniert.. UN <- read.table("UNworldpop2015.csv", skip=2, sep=",", header=TRUE) • Verwenden Sie als Basisdaten lediglich die Jahre von 1950 bis 2010, d.h. Sie sollen einen neuen Datensatz erzeugen, den Sie beispielsweise UN19502010 nennen könnten. Dies können Sie entweder über die eckigen Klammen bewerkstelligen (da gibt es mehrere Möglichkeiten) oder aber mittels der Funktion subset. Der Datensatz sollte also so aussehen: UN19502010 ## Year Population ## 1 1950 2525779 ## 2 1955 2761651 ## 3 1960 3026003 ## 4 1965 3329122 ## 5 1970 3691173 ## 6 1975 4071020 ## 7 1980 4449049 ## 8 1985 4863602 ## 9 1990 5320817 ## 10 1995 5741822 ## 11 2000 6127700 9 ## 12 2005 6514095 ## 13 2010 6916183 • Schätzen Sie — analog zum Vorgehen bei der US Bevölkerung — die Koeffizienten eines logistischen Bevölkerungsmodells für die Weltbevölkerung. Setzen Sie das Jahr 1950 als t = 0 und skalieren sie die Zeitvariable so, dass eine Zeiteinheit fünf Kalenderjahren entspricht. ## 11310951369968 : ## 204069392268 : 10000000.0 1.1 -0.1 13155628.1617905 1.5411801 -0.1383482 ## 29726351503 : 12028100.5069297 1.3637110 -0.1380568 ## 14607345571 : 12136160.9888317 1.3686535 -0.1382734 ## 14607249901 : 12134002.4869588 1.3684239 -0.1382891 ## 14607249887 : 12134065.6500684 1.3684298 -0.1382887 ## Nonlinear regression model ## model: pop ~ K/(1 + exp(a + b * die.zeit)) ## data: parent.frame() ## K a b ## 12134065.6501 1.3684 -0.1383 ## residual sum-of-squares: 14607249887 ## ## Number of iterations to convergence: 5 ## Achieved convergence tolerance: 0.0000006544 Literatur Preston, S. H., P. Heuveline, and M. Guillot (2001). Demography. Measuring and Modeling Population Processes. Oxford, UK: Blackwell Publishers. 10
© Copyright 2024 ExpyDoc