Einführung in die formale Demographie — Übung

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