5. Veranstaltung

Werbung
Einführung in die Software R: Unterstützung für Teilnehmer der
Veranstaltung „Statistische Methodenlehre 1“
5. Veranstaltung 05.12.2000
Unsere Funktion wuerfelsim sah zuletzt so aus (dabei habe ich zwei nicht mehr benötigte
Zeilen, die die horizontale Gerade betrafen herausgenommen.
wuerfelsim<-function(n=100,rel=T,...)
{
stich<-sample(1:6,size=n,replace=T)
hauf<-table(stich)
theo<-rep(n/6,6)
Titel<-“Absolute und erwartete Häufigkeiten“
legende<-c(“Abs. Häufigk.“,“Erw. Häufigk.“)
if(rel==T)
{hauf<-hauf/n
theo<-theo/n
Titel<-“Relative Häufigkeiten und Wahrscheinlichkeiten“
legende<-c(“Rel. Häufigk.“,“Wahrscheinlichkeiten“)
}
hoehe<-rbind(hauf,theo)
print(hoehe,digits=4)
barplot(hoehe,main=Titel,col=c(“red“,“blue“),beside=T,...)
abline(h=0)
mtext(paste(“Stichprobenumfang: n=“,n),font=2)
legend(locator(1),legend=legende,fill=c(“red“,“blue“))
}
Jetzt wollen wir die Funktion so abändern, dass nicht nur ein Würfel simuliert werden kann,
sondern eine beliebige diskrete Verteilung, d.h. wir wollen alle Möglichkeiten der Funktion
sample nutzen und dann mit barplot ein Balkendiagramm der relativen bzw. absoluten
Häufigkeiten zusammen mit den Wahrscheinlichkeiten bzw. erwarteten Häufigkeiten zeichnen.
Wir nennen die Funktion jetzt samplebar. Wir brauchen jetzt also weitere Argumente, um die
Grundgesamtheit und die Wahrscheinlichkeiten festzulegen. Nennen wir die Argumente grund
und wahr. Standardmäßig soll der Würfelwurf simuliert werden, also setzen wir grund=1:6
und alle Werte aus grund sollen, wenn nichts anderes vereinbart wird, mit gleicher
Wahrscheinlichkeit gezogen werden. Daher setzen wir wahr=rep(1,length(grund)), d.h.
die Zahl 1 wird so oft wiederholt, wie es der Länge des Vektors grund entspricht. Dies ist
jedoch keine Wahrscheinlichkeit. Daher wird im ersten Befehl unserer Funktion der Vektor wahr
normiert, indem ich jeden Wert des Vektors wahr durch sum(wahr), also durch die Summe
aller Werte in wahr teile.
In der nächsten Zeile setzen wir jetzt bei sample die Grundgesamtheit grund und die
Wahrscheinlichkeit wahr ein. Die theoretischen Werte ändern sich jetzt, d.h. die erwarteten
Häufigkeiten sind jetzt n*wahr (wenn wir die absoluten Häufigkeiten darstellen) und den
relativen Häufigkeiten entsprechen die Wahrscheinlichkeiten, die durch den Vektor wahr
gegeben sind.
samplebar<function(grund=1:6,n=100,wahr=rep(1,length(grund)),rel=T,...) #
HIER
{
wahr<-wahr/sum(wahr) # HIER
stich<-sample(grund,size=n,replace=T,prob=wahr) # HIER
hauf<-table(stich)
theo<-n*wahr # HIER
Titel<-“Absolute und erwartete Häufigkeiten“
legende<-c(“Abs. Häufigk.“,“Erw. Häufigk.“)
if(rel==T)
{hauf<-hauf/n
theo<-wahr # HIER
Titel<-“Relative Häufigkeiten und Wahrscheinlichkeiten“
legende<-c(“Rel. Häufigk.“,“Wahrscheinlichkeiten“)
}
hoehe<-rbind(hauf,theo)
print(hoehe,digits=4)
barplot(hoehe,main=Titel,col=c(“red“,“blue“),beside=T,...)
abline(h=0)
mtext(paste(“Stichprobenumfang: n=“,n),font=2)
legend(locator(1),legend=legende,fill=c(“red“,“blue“))
}
Wir wollen jetzt unsere Funktion ausprobieren, indem wir alle Argumente variieren. Wir
beobachten, dass sich die beobachteten absoluten Häufigkeiten auf die erwarteten Häufigkeiten
und die relativen Häufigkeiten auf die Wahrscheinlichkeiten einpendeln, wenn wir den
Stichprobenumfang immer weiter vergrößern.Vielleicht möchten wir die Höhe der einzelnen
Balken an die Balken schreiben. Dazu könnten wir die Funktion text verwenden. Dazu müssen
wir die Koordinaten angeben, wo der Text stehen soll. Als x-Koordinate möchten wir die Mitte
der Balken verwenden, als y-Koordianate die Höhe der Balken. Die Höhe der Balken steht in der
Variablen hoehe. Wie bekommen wir die Koordinaten der Mittelpunkte der Balken? Schauen
wir in die Hilfe zu barplot unter Value.
Dort erfahren wir, dass ein Vektor oder eine Matrix mit den Balkenmittelpunkten ausgegeben
wird. Probieren wir das an einem einfachen Beispiel aus. Wir verwenden die Daten der
Arbeitslosen und Sozialhilfeempfänger in Göttinger Bezirken, die wir schon in der vorigen
Veranstaltung benutzt hatten.
barplot(rbind(alos,sozi),beside=T,names=bezirk)
Mit diesem Befehl erhalten wir keine Ausgabe in der Console. Erst mit dem folgenden Befehl
werden diese Werte in dem Objekt mp gespeichert.
> mp<-barplot(rbind(alos,sozi),beside=T,names=bezirk)
> mp
[1,]
[2,]
[,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8]
1.5 4.5 7.5 10.5 13.5 16.5 19.5 22.5
2.5 5.5 8.5 11.5 14.5 17.5 20.5 23.5
Wir wollen diese Graphik noch etwas verfeinern und dann die Werte an die Balken schreiben.
> title("Arbeitslose und Sozialhilfeempfänger in Göttinger
Bezirken")
> legend(locator(1),legend=c("Anteil Arbeitslose", "Anteil
Sozialhifeempfänger"), fill=c("red","yellow"))
> text(x=mp,y=rbind(alos,sozi),labels=rbind(alos,sozi))
Wir haben absichtlich die Namen der Argumente dazu geschrieben, obwohl es nicht nötig wäre,
da sie in der richtigen Reihenfolge stehen.
Jetzt wird der Text genau in den Balken geschrieben. Wir haben beim letzten Mal schon gesehen,
dass wir mit den Argumenten adj und pos die Position des Textes relativ zum Punkt
beeinflussen können. Mit pos=3 wird der Text oberhalb des Punktes geschrieben. Außerdem
wollen wir ihn fett und etwas größer. Daher:
>text(x=mp,y=rbind(alos,sozi),labels=rbind(alos,sozi),pos=3,font=
2,cex=1.3)
Wenn wir den Text in halber Balkenhöhe wollen, so verwenden wir den Befehl
>text(x=mp,y=rbind(alos,sozi)/2,labels=rbind(alos,sozi),
font=2,cex=1.3)
In der Hilfe zu text erfahren wir unter Details, dass wir den Text auch drehen können mit
dem graphischen Parameter srt. Versuchen wir also den Text nicht waagerecht, sondern
senkrecht in halber Höhe zu schreiben.
Aus der Hilfe zu text:
Schauen wir unter par in der Hilfe nach srt.
Die Drehung des Textes ist also in Grad einzugeben.
> mp<-barplot(rbind(alos,sozi),beside=T,names=bezirk)
> text(x=mp,y=rbind(alos,sozi)/2, labels=rbind(alos,sozi),
font=2, cex=1.3, srt=90)
Wir möchten den Text lieber anders gedreht, also setzen wir srt=270.
> mp<-barplot(rbind(alos,sozi),beside=T,names=bezirk)
> text(x=mp, y=rbind(alos,sozi)/2, labels=rbind(alos,sozi),
font=2, cex=1.3, srt=270)
Mit dieser Darstellung sind wir jetzt zufrieden und bauen eine entsprechende Änderung in unsere
Funktion samplebar ein. Wir haben noch eine Formatangabe für den Text eingefügt, um nicht
zu viele Nachkommastellen zu erhalten.
samplebar<function(grund=1:6,n=100,wahr=rep(1,length(grund)),rel=T,...)
{
wahr<-wahr/sum(wahr)
stich<-sample(grund,size=n,replace=T,prob=wahr)
hauf<-table(stich)
theo<-n*wahr
Titel<-“Absolute und erwartete Häufigkeiten“
legende<-c(“Abs. Häufigk.“,“Erw. Häufigk.“)
if(rel==T)
{hauf<-hauf/n
theo<-wahr
Titel<-“Relative Häufigkeiten und Wahrscheinlichkeiten“
legende<-c(“Rel. Häufigk.“,“Wahrscheinlichkeiten“)
}
hoehe<-rbind(hauf,theo)
print(hoehe,digits=4)
mp<-barplot(hoehe,main=Titel,col=c(“red“,“blue“),beside=T,...) #
HIER
abline(h=0)
mtext(paste(“Stichprobenumfang: n=“,n),font=2)
text(x=mp, y=hoehe/2, labels=format(hoehe, digits=2), font=2,
srt=270) # HIER
legend(locator(1),legend=legende,fill=c(“red“,“blue“))
}
Wir wollen diese Funktion jetzt noch einmal durchtesten. Es empfiehlt sich, zunächst mit den
Standardwerten zu beginnen.
Schließlich wollen wir die Funktion an folgender Grundgesamtheit betrachten. Die Datei
baltj93 enthält die Anzahl der Bewohner der Bundesrepublik Deutschland im Jahre 1993 in
den Altersjahren von 1 bis 95. Die Datei baltj93w enthält nur die weiblichen Bewohner. Die
Dateien galtj93 und galtj93w enthalten die entsprechenden Daten für die Stadt
Göttingen.
baltj93
[1] 718400 729500 742500 761000 734700 746600 713500 699700 664000
[10] 660600 664700 683400 682600 681500 642800 636500 641800 662100
[19] 659600 691000 718400 810400 908600 969700 1070300 1135600 1170000
[28] 1199200 1200300 1216400 1198800 1155500 1134300 1106600 1068600 1021300
[37] 1002500 973600 935700 923000 893000 902300 884600 909400 902800
[46] 851800 802700 731600 627500 820500 834500 816600 980100 1045900
[55] 1028800 968200 909400 889600 860600 805100 656600 656600 670500
[64] 709400 691300 692700 646800 634900 629400 583200 568100 584500
[73] 595500 570300 424300 272800 254800 269000 334800 405600 384600
[82] 360100 313100 287100 257400 222900 190100 157300 126100 103000
[91]
78800
62300
46200
34300
22200
> baltj93w
[1]
[11]
[21]
[31]
[41]
[51]
[61]
[71]
[81]
[91]
349800
323600
353700
575200
440700
408000
331300
357800
265900
60000
355900
332400
398000
555900
445600
398600
334800
368500
251500
48000
361300
332600
444200
548800
437100
480800
344200
381500
221000
35700
370300
332000
470400
534800
448400
514900
366800
370800
206500
26800
358700
313100
571400
516700
442600
507500
359800
277400
187100
17600
363300
308800
547800
493300
416200
479000
363100
180100
163500
346400
311300
563900
484700
392900
451000
353300
168600
140300
340600
321400
576200
471500
358100
443400
363700
180300
117600
323900
320400
573900
455400
308400
430600
374200
227500
93800
321200
339000
582600
452900
402800
404000
363600
279000
77500
> galtj93
[1] 1196 1207 1238 1193
[16] 947 908 954 1013
[31] 3249 2851 2811 2535
[46] 1424 1268 1204 1042
[61] 953 936 982 1043
[76] 463 496 585 695
[91] 190 136 110
77
1137
1403
2393
1406
1027
836
54
1188
1988
2099
1476
1047
773
1045
2807
2008
1317
1048
785
1050
3394
1911
1568
1002
664
990 972 978 1065 985
3853 4340 4466 4284 4136
1874 1755 1611 1546 1609
1663 1631 1517 1394 1393
1096 959 960 990 1010
596 544 479 373 359
957 935
3712 3482
1505 1510
1260 1227
1026 757
282 216
> galtj93w
[1] 546 621 614 564 565 568 515 491 462 459 462 506 498 486 481
[16] 470 437 491 501 804 1149 1544 1792 1932 2183 2184 1954 1883 1667 1594
[31] 1489 1265 1345 1179 1100 952 928 892 895 852 757 715 769 710 723
[46] 700 623 601 509 686 728 635 791 835 846 738 672 736 670 643
[61] 500 499 526 555 570 584 581 595 649 606 657 672 698 682 513
[76] 340 337 400 483 580 536 534 463 434 374 345 292 263 213 156
[91] 153 107
89
55
42
Als Grundgesamtheit grund verwenden wir die Zahlen von 1 bis 95. Für das Argument wahr
verwenden wir z.B. baltj93. Wir erinnern uns, dass dieser Vektor durch unsere Funktion
normiert wird.
samplebar(grund=1:95,wahr=baltj93,n=100000)
Wir sehen jetzt, dass unsere Ausgabe bei großer Grundgesamtheit und großem n einige Nachteile
hat. Wir wollen also den Text in die Balken nur wahlweise schreiben lassen und die Ausgabe des
Stichprobenumfangs formatieren.
samplebar<function(grund=1:6,n=100,wahr=rep(1,length(grund)),rel=T,
Text=T,...) # HIER
{
wahr<-wahr/sum(wahr)
stich<-sample(grund,size=n,replace=T,prob=wahr)
hauf<-table(stich)
theo<-n*wahr
Titel<-“Absolute und erwartete Häufigkeiten“
legende<-c(“Abs. Häufigk.“,“Erw. Häufigk.“)
if(rel==T)
{hauf<-hauf/n
theo<-wahr
Titel<-“Relative Häufigkeiten und Wahrscheinlichkeiten“
legende<-c(“Rel. Häufigk.“,“Wahrscheinlichkeiten“)
}
hoehe<-rbind(hauf,theo)
print(hoehe,digits=4)
mp<-barplot(hoehe,main=Titel,col=c(“red“,“blue“),beside=T,...)
abline(h=0)
mtext(paste(“Stichprobenumfang:
n=“,formatC(n,format=“f“,digits=0)),font=2) # HIER
if(Text==T) # HIER
{
text(x=mp, y=hoehe/2, labels=format(hoehe, digits=2), font=2,
srt=270) # HIER
}
legend(locator(1),legend=legende,fill=c(“red“,“blue“))
}
Wir probieren unsere Funktion jetzt aus:
samplebar(grund=1:95,wahr=baltj93,n=100000,Text=F)
Wir wollen die Arbeit an der Funktion samplebar jetzt beenden, jedoch noch die
Altersverteilungen mit der Funktion barplot in Gestalt einer Alterspyramide darstellen. Wir
hatten nur die Altersverteilung aller Bewohner und die der weiblichen Bewohner. Berechnen wir
uns also die Altersverteilung der männlichen Bevölkerung:
baltj93m<-baltj93-baltj93w
galtj93m<-galtj93-galtj93w
Die Dateien baltj93m und galtj93m enthalten also die Anzahlen der männlichen Bewohner
in der Bundesrepublik Deutschland bzw. in Göttingen im Jahre 1993.
> barplot(baltj93)
> barplot(baltj93,names=1:95)
> barplot(baltj93,names=1:95,col="red")
> barplot(baltj93m,names=1:95,col="red")
> barplot(baltj93w,names=1:95,col="red")
Wir wollen jetzt die Verteilung des Alters für Männer und Frauen gemeinsam sehen, dabei soll
eine Gruppe (Männer oder Frauen) nach unten abgetragen werden. Dabei ist es in R so, dass
negative Werte für das Argument height nach unten abgetragen werden. Wir wollen die
Balken direkt untereinander, nicht nebeneinander. Deshalb ist es naheliegend, zunächst zu
versuchen, das Argument beside=F zu setzen. Jetzt muss man verstehen, wie R in diesem Fall
rechnet. Ist beside=F gesetzt (es ist vorausgesetzt, dass height eine Matrix ist), so werden
die Teilbalken entsprechend den Werten in den Spalten der Matrix bei positiven Werten
übereinander gesetzt, d.h. zu dem Wert in der ersten Zeilen wird der Wert der zweiten Zeile
(gleiche Spalte) dazuaddiert. Folgende Eingabe liefert nicht das gewünschte Resultat:
> barplot(rbind(baltj93w,-baltj93m),names=1:95)
Richtig wäre:
> barplot(rbind(baltj93w,-baltj93),names=1:95)
Wir zeichnen noch eine horizontale Linie bei Null mit dem folgenden Befehl:
> abline(h=0,col=2)
Es gelingt jedoch nicht, die Balken in unterschiedlichen Farben darzustellen. Deshalb setzen wir
das Argument beside=T und versuchen dann mit dem Argument space den Abstand zu
regulieren.
> barplot(rbind(baltj93w,-baltj93m),col=c(2,3),beside=T)
Um besser zu sehen, was passiert, verwenden wir ein kleines künstliches Beispiel.
> barplot(rbind(1:6,-(6:1)),col=c(2,3),beside=T)
Jetzt werden die negativen Balken direkt rechts neben die Balken für die positiven Balken für 1:6
nach unten gezeichnet. Er muss also um eine Einheit zurückgesetzt werden. Standardmäßig gilt
space=c(0,1). Die erste Zahl steht für den Abstand innerhalb der Gruppen. Das gewünschte
Resultat erhalten wir mit:
> barplot(rbind(1:6,-(6:1)),col=c(2,3),beside=T,space=c(-1,1))
> barplot(rbind(baltj93w,-baltj93m),col=c(2,3),beside=T,space=c(1,1),names=1:95)
Um die Balken horizontal zu erhalten, setzen wir das Argument horiz=T.
barplot(rbind(baltj93w,-baltj93m),col=c(2,3),beside=T,space=c(1,1),names=1:95,horiz=T)
Wir teilen die Werte durch 1000, um eine angenehmere Beschriftung der x-Achse zu erhalten.
Wir beschriften die Graphik mit der Funktion mtext, die Text an den Rand (margin) schreibt.
Mit dem Argument adj bestimmen wir die Position des Textes.
> barplot(rbind(baltj93w,-baltj93m)/1000, col=c(2,3), beside=T,
space=c(-1,1), names=1:95, horiz=T)
> mtext(text="Männer",adj=0.25,col=3,cex=1.5)
> mtext(text="Frauen",adj=0.75,col=2,cex=1.5)
Wir wollen die Altersverteilung in der Bundesrepublik Deutschland vergleichen mit der
Altersverteilung in Göttingen und möchten beide Graphiken nebeneinander sehen. Dazu
verwenden wir den graphischen Parameter mfrow=c(1,2). Das bedeutet, dass unser
Graphikfenster in eine Zeile und 2 Spalten aufgeteilt wird, die sukzessive gefüllt werden (siehe
Hilfe zu par.
> par(mfrow=c(1,2))
> barplot(rbind(baltj93w,-baltj93m)/1000, col=c(2,3), beside=T,
space=c(-1,1), names=1:95, horiz=T)
> mtext(text="Männer",adj=0.25,col=3)
> mtext(text="Frauen",adj=0.75,col=2)
> title(main="Bundesrepublik")
> barplot(rbind(galtj93w,-galtj93m)/1000, col=c(2,3), beside=T,
space=c(-1,1), names=1:95, horiz=T)
> mtext(text="Männer",adj=0.25,col=3)
> mtext(text="Frauen",adj=0.75,col=2)
> title(main="Göttingen")
Herunterladen