Einführung in die Statistik ∗ Christian W. Hoffmann Swiss Federal Research Institute WSL 2009-02-17, 17:40:51 ∗ Dieses Manuskript implementiert eine Einführung in die grundlegende Statistik und ausgewählte Themen, unter Benutzung der Programmiersprache "R". Copyright (C) 2008 WSL Birmensdorf, Switzerland This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see http: //www.gnu.org/licenses/. Inhaltsverzeichnis 1 Einleitung 1.1 Vorbemerkung zum Manuskript . . . . . . . . . . . . . . . . . . . 1.2 Ziele des Kurses . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1.3 Handwerkzeug . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1.4 Notmassnahmen . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1.5 Wie man sich Hilfe holt . . . . . . . . . . . . . . . . . . . . . . . . 1.6 R, eine Übersicht . . . . . . . . . . . . . . . . . . . . . . . . . . . 1.6.1 R ist ein Rechner . . . . . . . . . . . . . . . . . . . . . . . 1.6.2 Anweisungsfolgen . . . . . . . . . . . . . . . . . . . . . . 1.6.3 Wert-Zuweisung zu Variablen, Vektoren . . . . . . . . . . . 1.6.4 Erzeugen von Wiederholungen . . . . . . . . . . . . . . . . 1.6.5 Dataframes: Einlesen und Schreiben von Dateien . . . . . . 1.6.6 Vektoren, Matrizen, Arrays, Dataframes, cbind, rbind, apply 1.6.7 Listen . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1.6.8 Funktionen . . . . . . . . . . . . . . . . . . . . . . . . . . 1.6.9 Strukturoperationen . . . . . . . . . . . . . . . . . . . . . . 1.6.10 Programmablauf . . . . . . . . . . . . . . . . . . . . . . . 1.6.11 Plots . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1.7 Sortieren etc. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1 1 1 1 2 2 3 3 4 4 7 8 9 11 12 15 15 17 20 2 Übersicht über die Statistik 23 3 Beschreibende Statistik 3.1 Zweck . . . . . . . . . . . . . . . . . . . . . . . . . 3.2 Methoden . . . . . . . . . . . . . . . . . . . . . . . 3.3 Kennzahlen für Stichproben . . . . . . . . . . . . . 3.4 Ein Datenbeispiel . . . . . . . . . . . . . . . . . . . 3.5 Programmierung: Modalwert, Mittelwert und Median 3.6 Variabilität, Varianz und Standardabweichung . . . . . . . . . . 25 25 25 26 27 32 34 . . . . . . . . . 39 39 39 40 40 41 42 42 44 47 4 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Etwas Theorie 4.1 Kombinatorik . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4.1.1 Elementare, zusammengesetzte und unabhängige Ereignisse 4.1.2 Bedingte Wahrscheinlichkeiten . . . . . . . . . . . . . . . . 4.2 Zufallsvariable, Erwartungswert und Varianz . . . . . . . . . . . . 4.2.1 Generatoren von Zufallszahlen . . . . . . . . . . . . . . . . 4.3 Verteilungen . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4.3.1 Bernoulli- und Binomialverteilung . . . . . . . . . . . . . . 4.3.2 Übersicht über die wichtigsten Verteilungen . . . . . . . . . 4.3.3 Veranschaulichung des zentralen Grenzwertsatzes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . I Inhaltsverzeichnis 4.4 4.5 5 4.3.4 Herleitung des zentralen Grenzwertsatzes . . . . . . . . . . . . . . . . . . . . . . . 53 Der Zusammenhang zwischen Normal-, t- und Cauchy-Verteilung . . . . . . . . . . . . . . 54 Zufallsexperimente mit Schiefe und Kurtosis . . . . . . . . . . . . . . . . . . . . . . . . . 57 Schliessende Statistik 5.1 Ziel . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5.2 Voraussetzungen . . . . . . . . . . . . . . . . . . . . . . . . . 5.3 Methoden . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5.3.1 Problembeschreibung . . . . . . . . . . . . . . . . . . . 5.3.2 Formulierung der zu prüfenden Hypothese . . . . . . . 5.3.3 Berechnung der Testgrösse . . . . . . . . . . . . . . . . 5.3.4 Interpretation der Testgrösse . . . . . . . . . . . . . . . 5.4 Unterschied zweier Mittelwerte aus unabhängigigen Stichproben 5.4.1 Der t-Test von Student . . . . . . . . . . . . . . . . . . 5.4.2 Wilcoxon’s Rangsummentest . . . . . . . . . . . . . . . 5.5 Kontingenztafeln, Chi-Quadrat-Test . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 61 61 61 63 63 63 64 65 65 65 66 67 Varianzanalyse, ANOVA 6.1 Zweck der Varianzanalyse . . . . . . . . . . . . 6.2 Einfache Varianzanalyse . . . . . . . . . . . . . 6.3 Bemerkungen zum T3-plot vs. Normal Q-Q Plots 6.4 Mehrfache Varianzanalyse . . . . . . . . . . . . 6.5 Multiples oder paarweises Testen . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 71 71 71 77 77 78 Korrelation, Regression 7.1 Zweck . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 7.2 Methoden . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 7.3 Regressionsanalyse . . . . . . . . . . . . . . . . . . . . . . . . . 7.3.1 Syntax of linear models in R . . . . . . . . . . . . . . . . 7.3.2 Beispiel für die einfache Regression und Residuenanalyse 7.4 Box-Cox-Exponenten-Transformationen . . . . . . . . . . . . . . 7.5 Reisigdaten zum Pipe-Modell . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 81 81 81 81 82 82 85 88 8 Multiple Regression 8.1 Einfacheres Baummodell, GAM und lineare Modelle . . . . . . . . . . . . . . . . . . . . . 8.2 Alternatives Vorgehen . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 8.3 Automatische schrittweise Regression . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 95 95 108 108 9 Bootstrap 109 9.1 Motivation . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 109 9.2 Beispiel . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 109 6 7 10 Anhang 10.1 Literatur . . . . . . . . . . . . 10.2 Dank . . . . . . . . . . . . . . 10.3 Hinweis für das Plotten . . . . 10.4 Informationsfluss . . . . . . . 10.5 Erzeugung der R-Kodedatei . 10.6 Interne Daten und Funktionen II . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 113 113 113 114 115 115 115 Abbildungsverzeichnis 1.1 1.2 Baumhöhen gegen Umfang . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 17 Alle Variablen gegen alle (Scatterplot-Matrix) . . . . . . . . . . . . . . . . . . . . . . . . . 19 3.1 3.2 3.3 3.4 3.5 Baumhöhen in Davos . . . . . . . . . . . . . . . . . . Histogramm der Baumhöhen in Davos . . . . . . . . . Verschieden gelegene Klassengrenzen im Histogramm Verschieden breite Klassen im Histogramm . . . . . . Daten, die multiplikativ variieren . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 28 29 30 31 35 4.1 4.2 4.3 4.4 4.5 4.6 4.7 4.8 4.9 10000 zufällige binomialverteilte Werte . . . . . . . . . . . . . . Realisierung von theoretischen Verteilungen . . . . . . . . . . . . Summen von Ziehungen aus der Gleichverteilung . . . . . . . . . Summen von Ziehungen aus der Betaverteilung . . . . . . . . . . Summen von Ziehungen aus der Exponentialverteilung . . . . . . Summen von Ziehungen aus der Cauchy-Verteilung . . . . . . . . Summen von Ziehungen aus der Normalverteilung . . . . . . . . t-, Normal-, und Cauchy-Verteilungen, eine Familie . . . . . . . . Wahrscheinlichkeiten für die Schiefe von normalen Zufallszahlen . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 43 47 48 49 50 51 52 56 58 5.1 5.2 Ungleiche Erfassungswahrscheinlichkeiten . . . . . . . . . . . . . . . . . . . . . . . . . . 62 Punktewolken und Boxplots der Baumhöhen . . . . . . . . . . . . . . . . . . . . . . . . . . 69 6.1 6.2 Baumhöhen der Standorte Alptal, Davos, Lägern . . . . . . . . . . . . . . . . . . . . . . . 75 Diagnostische Plots von Modell modh2 . . . . . . . . . . . . . . . . . . . . . . . . . . . . 76 7.1 7.2 7.3 7.4 7.5 7.6 7.7 7.8 Verschieden Approximationen an die Baumhohen . . . . Bei der Box-Cox-Transformation verwendete Funktionen Das Pipe-Modell . . . . . . . . . . . . . . . . . . . . . Reisigdaten . . . . . . . . . . . . . . . . . . . . . . . . Bestimmung von λ . . . . . . . . . . . . . . . . . . . . Reisigtrockenmasse vs d and dc . . . . . . . . . . . . . Diagnostics for model "lmdc" . . . . . . . . . . . . . . Diagnostiken für Modell "lmd" . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 84 86 88 89 90 92 93 94 8.1 8.2 8.3 8.4 8.5 8.6 8.7 Ozondaten . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Grundmodell modelG, gam mit Glättung . . . . . . . . . . . . . . . . . . . . . . Grundmodell modelT0 zum Aufspüren von Wechselwirkungen . . . . . . . . . . Residualsen und getrimmte Residuen (mittlere 95%) des Baummodells modelT0. Diagnostiken für Modell 6 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Diagnostiken für Modell 8 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Diagnostiken für Modell 9 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 96 97 98 99 104 106 107 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . III Abbildungsverzeichnis 9.1 9.2 Schief verteilte Daten . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 110 Bootstrap-Vertrauensintervalle . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 111 10.1 Dateien und Programme . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 115 IV Tabellenverzeichnis 1.1 Datenstrukturen . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 10 2.1 Skalen, Methoden, Themen . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 24 4.1 Verteilungen und ihe Eigenschaften . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 45 4.2 Erklärungen zu den Verteilungen . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 46 4.3 Vertrauensintervalle von t-Verteilungen . . . . . . . . . . . . . . . . . . . . . . . . . . . . 55 5.1 Beispiele für Testgrössen . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 64 5.2 Augenfarbe und Haarfarbe . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 67 5.3 Erwartete Häufigkeiten . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 67 6.1 Einfache ANOVA . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 74 6.2 Anzahl Vergleiche . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 78 V 1 Einleitung 1.1 Vorbemerkung zum Manuskript Dieses Manuskript ist in LATEX verfasst, das die Platzierung von Text und Abbildungen automatisch erledigt. Daher kann es passieren, dass Abbildungen je nach Grösse erst auf der nächsten oder gar übernächsten Seite zu finden sind. Oder dass Seiten fast leer sind. Die ideale Reihenfolge ist nur mit erheblicher Handarbeit zu erzielen. Man verzeihe daher diese Unannehmlichkeit. 1.2 Ziele des Kurses Dieser Kurs soll dazu dienen • den Zweck des Themenkreises "Statistik" zu umreissen, • die Methoden zu nennen, die angewandt werden, • Beispiele zu erklären, • Literatur zur Weiterführung zu zitieren. 1.3 Handwerkzeug Für den Kurs wird die Programmiersprache S-Plus verwendet, und zwar in der Open-SourceImplementation R. S-Plus wird als kommerzielles Paket angeboten und kann auf dem Porta-Server der WSL benutzt werden. R ist auf dem Netz unter r-project.org zu finden. Es läuft ebenfalls unter allen gängigen Betriebssystemen (Windows, Mac, Unix, Linux) und wird von zahllosen Profi-Statistikern und Benutzern laufend weiterentwickelt. Auswertungen können interaktiv oder durch sogenannte Skripte ausgeführt werden, diese wiederum entweder zeilenweise oder als Ganzes. Zu diesem Kurs gibt es ein Begleitdokument Kurs.Liesmich.pdf, in dem erklärt wird, wie die Quelltexte des Kurses benutzt werden können. Eine grafische Übersicht findet man in Abb. 10.1 on page 115. Ich werde hier nur eine relativ knappe Einführung in Rgeben, da weitergehende Informationen in Fülle vorhanden sind und auch aus den Musterbeispielen hervorgehen. Das Hauptzitat für R ist > citation() To cite R in publications use: R Development Core Team (2008). R: A language and environment for statistical computing. R Foundation for Statistical Computing, Vienna, Austria. ISBN 3-900051-07-0, URL http://www.R-project.org. A BibTeX entry for LaTeX users is 1 title = {R: A Language and Environment for Statistical Computing}, author = {{R Development Core Team}}, organization = {R Foundation for Statistical Computing}, 1 1 Einleitung address = {Vienna, Austria}, year = {2008}, note = {{ISBN} 3-900051-07-0}, url = {http://www.R-project.org}, } We have invested a lot of time and effort in creating R, please cite it when using it for data analysis. See also 'citation("pkgname")' for citing R packages. In den Beispielen wird die Eingabeaufforderung, der Prompt, von R mit > bezeichnet; er wird nicht eingetippt. 1.4 Notmassnahmen Wenn in der R-Konsole nichts mehr geht, kann man probieren, mit Ctrl-g die Rechnungen abzubrechen. Man verlässt R mittels q(), antwortet auf die Frage nach der Speicherung mit yes und startet R neu. 1.5 Wie man sich Hilfe holt Gute Anleitungen: • http://www.statistik.wiso.uni-erlangen.de/download/Datenanalyse/ r-uebung/Reinf20B.pdf • http://cran.r-project.org/doc/contrib/refcard.pdf Vorsicht: Stücke von Links, die über Zeilenenden hinweggehen, müssen ohne die Zeilenenden in der Adresszeile des Browsers zusammengesetzt werden (ohne die unsichtbare Endzeilenmarkierung). • Wenn die Hilfe im Browser fehlt: > help.start() ausführen, um das Hilfesystem erneut zu starten. • R> help(read.table) holt Hilfe über read.table, • R> find(read.table) zeigt das Paket, in dem read.table aufgeführt ist, • R> apropos(read.table) liefert weitere Information über read.table, • R> args(read.table) zeigt die Argumente, die read.table als Funktion akzeptiert, • R> read.table ohne (): zeigt die internen Anweisungen und evtl. in welchem Paket sich die Funktion befindet, • R> methods(read.table) und R> getAnywhere() zeigen, welche Methoden implementiert sind für read.table und wo sie angesiedelt sind. Funktionen können aber ünsichtbarßein. • R> help(help) Hilfe über das Hilfesystem selbst, öffnet die "R Documentation" und erklärt, wie man sich Hilfe holen kann über Funktionen der zur Zeit lokal installierten Pakete. In der Klammer gibt man den Namen der gesuchten Funktion an; bei Namen, die keine Funktion benennen, z.B. for, benötigt man doppelte Hochkommas: help("for"). • R> help.search("data input") hilft bei Dateneingabe. 2 1.6 R, eine Übersicht • Google mit einem geeigneten Suchbegriff unter Einschluss von "r-project", • refcard.pdf. Flexibler ist man über den Einstieg im Browser, so wie er sich beim Start nach help.start() in (z.B.) file:///C:/PROGRA~1/R/R-26~1.2/doc/html/index.html öffnet: "Statistical Data Analysis R", dann weiter über > Packages >. Die meistgebrauchten Pakete sind "base", "utils", "graphics", "lattice", "stats". http://cran.r-project.org/ führt auf CRAN = Comprehensive R Archive Network". Hier findet man: • "An Introduction to R" • "R Language Definition" • "Writing R extensions" • "R Data Import/Export" • "R Installation and Administration" • "R: A Language an Environment for Statistical Computing" • "Frequently Asked Questions" (FAQs), "R News" Es lohnt sehr, sich bei der R-Hilfeliste anzumelden: https://stat.ethz.ch/mailman/ listinfo/r-help, und die Frage "Would you like to receive list mail batched in a daily digest?" mit Yes anzuklicken. 1.6 R, eine Übersicht 1.6.1 R ist ein Rechner Direkt nach dem Prompt > kann man Berechnungen durchführen. Addition, Subtraktion, Multiplikation und Division werden wie in anderen Sprachen durch +, -, *, / ausgedrückt; ^ bedeutet "hoch". Klammern werden von innen nach aussen abgearbeitet. Man nennt das, was nach dem Prompt schreibt, eine Anweisung. Eine Anweisung ist zum Beispiel die Formel > (13 + 7)^(2/7) [1] 2.35355 Es gibt eine grosse Menge von mathematischen Funktionen. Die wir am häufigsten verwenden werden, sind log, der Logarithmus zur Basis e (= 2.71828), nicht zur Basis 10, exp (die Exponentialfunktion) und sqrt (die Quadratwurzel): > log(10) [1] 2.30259 > exp(1) [1] 2.71828 3 1 Einleitung > 3^(-1) [1] 0.333333 > 1/3 [1] 0.333333 > sqrt(2) [1] 1.41421 Komplizierter: 3 2· sin( π3 ) + 3.5 geschrieben als > 3/(2 * sin(pi/3) + 3.5) [1] 0.573389 1.6.2 Anweisungsfolgen Mehrere Anweisungen schreibt man untereinander in mehreren Zeilen mit je einer Anweisung pro Zeile: > 13 + 7 [1] 20 > 2 * pi [1] 6.28319 oder auf einer Zeile (dann nennt man das eine Anweisungfolge) mittels ; getrennt: 1+2+3+4+5; 6+5-4+3-2+1; 8/9; Schliesst man eine Anweisungsfolge in geschweifte Klammern { } ein, so wird sie als Einheit behandelt. Informelles Beispiel (Autofahrer): Wenn (Ampel = rot) dann { bleibe stehen; beobachte die Ampel, bis sie grün wird } oder wenn (Ampel = grün) dann { fahre weiter; beobachte die Ampel, ob sie grün bleibt } sonst { sei vorsichtig; Bremsbereitschaft }. 1.6.3 Wert-Zuweisung zu Variablen, Vektoren Der Zuweisungsoperator in R heisst ’wird’ <- (zusammengesetzt aus ’weniger als’ < und ’minus’ direkt neben einander), und nicht ’ist gleich’ =. Der Lesbarkeit wegen fügen wir je ein Leerzeichen vor und nach <- ein. Die Eingabe der Variablen nach dem Prompt gibt ihren Wert aus, ebenso das Einklammern der Zuweisung. In Funktionen muss man print(a) schreiben. > a <- 12.5 > a 4 1.6 R, eine Übersicht [1] 12.5 > (b <- pi) [1] 3.14159 Die Variable a steht jetzt für den Wert 12.5, bis wir den Wert in einer weiteren Zuweisung ändern. Typen von einfachen Objekten sind: • Ganzzahlen: 0, 5, -99, • reelle Zahlen: • logische Werte: 2.5, 77.0, pi (vordefiniert) = π, TRUE, FALSE, NA (nicht vorhandener Wert), • nicht darstellbare Zahlen: Inf, -Inf, entstehen aus 1/0, -1/0, • "Not a number": NaN, entsteht aus 0/0, • Character Strings "A", ... "z", "Anton", "@", "", " ", also kein, ein oder mehrere druckbare Zeichen eingeschlossen in " ". • Strukturmanipulator: NULL. Operationen dazu: • Arithmetik: +, -, *, / , ^ bedeutet "hoch", • Folgen: : "von bis", • Logische Operationen: ! ("not"), < ("kleiner"), <= ("kleiner oder gleich"), ==, ("gleich"), >= ("grösser oder gleich"), > ("grösser"), != ("verschieden"), %in% ("ist Element von"), &, && ("und"), |, || ("oder") • paste("A","nt","o","n"): zusammensetzen, match(): Muster finden • Abfragen: is.na(), is.nan(), is.NULL(), is.character(), is.numeric(), ..., names(), class() Die Stärke von R wird jedoch erst sichtbar, wenn man mit Vektoren arbeitet, d.h. Variablen, die mehrere gleichartige Objekte enthalten (als Spezialfall solche mit nur einem Wert), siehe 1.6.3. Am einfachsten schreibt man alle diese Werte nach einander, durch Kommas getrennt, und wandelt dies durch die (Verkettungs-) Konkatenations-Funktion c() in einen (eindimensionalen) Vektor um: > (a <- c(1, 3, 4, 7)) [1] 1 3 4 7 Hier tritt schon ein sehr hilfreiches Merkmal von R zu Tage: Faustregel 1. Das Echo einer Variablen gibt an, wie die einzelnen Elemente einer Variablen anzusprechen sind. > a[3] 5 1 Einleitung [1] 4 > a[c(1, 4)] [1] 1 7 > a[-2] [1] 1 4 7 > a[] [1] 1 3 4 7 Die Zahlen in den eckigen Klammern (textslIndex, Mehrzahl Indizes) geben die Positionen der Elemente an, mit 1 beginnend. Negative Indizes geben wegzulassende Elemente an. Leere Indizes bedeuten: Nimm alle! Wenn Folgen (regelmässige Muster) eingegeben werden sollen, z.B. die ganzen Zahlen von 1 bis 6, bietet sich an: > (a <- 1:6) [1] 1 2 3 4 5 6 > length(a) [1] 6 > (aa <- c(a, 3 * a)) [1] 1 2 3 4 5 6 3 6 9 12 15 18 8 10 12 4 8 12 16 20 24 > length(aa) [1] 12 > a + aa [1] 2 4 6 > (aa1 <- c(aa, 28, 100)) [1] 1 2 3 4 5 6 3 6 9 12 15 18 28 100 4 8 12 16 20 24 29 102 > length(aa1) [1] 14 > opo <- options(warn = -1) > a + aa1 [1] 6 2 4 6 8 10 12 1.6 R, eine Übersicht > options(opo) Setzt man warn=0, so erhält man die Warnung: In a + aa1 : Länge des längeren Objekts ist kein Vielfaches der Länge der kürzeren Objektes. Das Ergebnis wird sehr wohl korrekt geliefert. R versteht also den Operator : als ’eine Folge von Ganzzahlen zwischen’. Benötigt man eine Folge mit nicht-ganzzahligen Schritten (z.B. 0.1), so benutzt man die Funktion seq. Für abnehmende Folgen setzt man die Schrittweite negativ. Der Vektor b enthält sieben Werte von 0.6 abwärts bis 0: > (b <- seq(0.6, 0, -0.1)) [1] [6] 6.00000e-01 5.00000e-01 1.00000e-01 -1.11022e-16 4.00000e-01 3.00000e-01 2.00000e-01 Dass hier als letzter Wert nicht 0 erscheint, ist ein Thema der numerischen Mathematik. Prinzipiell schreibt man hier: > (b <- seq(6, 0, -1)/10) [1] 0.6 0.5 0.4 0.3 0.2 0.1 0.0 Faustregel 2. So lange wie möglich mit Ganzzahlen rechnen! 1.6.4 Erzeugen von Wiederholungen Beschreibung: > help(rep) Die Funktion rep wiederholt das erste Argument so oft, wie das zweite Argument abgibt. So erzeugt > rep("A", 10) [1] "A" "A" "A" "A" "A" "A" "A" "A" "A" "A" zehn Kopien von "A". Das wiederholte Objekt kann eine Folge sein: > rep(1:5, 3) [1] 1 2 3 4 5 1 2 3 4 5 1 2 3 4 5 Das heisst, "Wiederhole die ganze Folge 1,2,3,4,5 dreimal". Wenn wir aber wollen, dass die Elemente der Folge unmittelbar hinter einander wiederholt werden sollen (anstatt die ganze Folge), dann muss das zweite Argument von rep ein Vektor sein, gleich lang wie das erste Argument. Also, wir wollen dreimal 1, dreimal 2, usw. bis dreimal 5: > rep(1:5, rep(3, 5)) [1] 1 1 1 2 2 2 3 3 3 4 4 4 5 5 5 Noch komplizierter wird es, wenn jedes Element der ersten Folge unterschiedlich oft wiederholt werden soll, z.B. > rep(1:5, 1:5) [1] 1 2 2 3 3 3 4 4 4 4 5 5 5 5 5 > rep(c(7, 4, 5, 1), c(1, 2, 3, 5)) [1] 7 4 4 5 5 5 1 1 1 1 1 Hier zeigt sich schon in ’einfachen’ Funktionen die starke Ausdruckskraft von R. 7 1 Einleitung 1.6.5 Dataframes: Einlesen und Schreiben von Dateien Bei Praxisanwendungen liest man typischerweise Daten nach R ein, die man vorher in z.B. Excel erzeugt und geprüft hat. Natürlich würde es keinen Sinn machen, hunderte oder Tausende von Daten über die Tastatur (mit der Funktion scan) einzutippen. Die Funktion in RR, die Daten einliest, heisst read.table, vgl. Hilfe (1.5). > help(read.table) Sie wird im einfachsten Fall so verwendet (Excel-Tabelle, tab-delimited): > timb <- read.table("./Data/timber.txt", header = TRUE) Punkte zur Beachtung • Wichtig: Im Pfad verdoppelte \ angeben für Windows: \\, / für Mac. • Die Datei muss am angegebenen Ort existieren. • header=TRUE: Die erste Zeile enthält den/die Namen der Spalten-Variable(n), die keine Leerzeichen enthalten dürfen. Am einfachsten ersetzt man das Leerzeichen durch einen Punkt .. • Die Spalten sind Vektoren, die alle die gleiche Länge haben müssen, aber von verschiedenem Typ sein dürfen. • Fehlende Werte dürfen nicht durch Leerzeichen dargestellt werden, man benutze NA. Will man explizit einen String "NA" als fehlenden Wert verwenden, so benutze man NA_character_. > class(timb) [1] "data.frame" > names(timb) [1] "volume" "girth" > dim(timb) [1] 31 3 > timb[1:5, ] 1 2 3 4 5 volume 0.7458 0.7458 0.7386 1.1875 1.3613 girth height 66.23 21.0 68.62 19.5 70.22 18.9 83.79 21.6 85.38 24.3 > sum(is.na(timb)) [1] 0 8 "height" 1.6 R, eine Übersicht timb ist also von der Klasse (dem Typ) "data.frame", zweidimensional und enthält keine fehlenden Werte. Elemente von timb werden mit den eckigen Klammern [ , ] angesprochen, leere Zeilen oder Spalten bedeuten wieder alle. Die Spalten können ebenfalls über ihre Namen mittels des $-Operators angesprochen werden. Wir zeigen auch logische Bedingungen, um Zeilen auszuwählen: > > > > > > > > > > > + timb[] timb[1:5, ] timb[, 1:2] timb[, -c(1:2)] timb$height > 20 (Lg <- timb$girth > 100) timb[timb$height > 20, ] timb[Lg, ] timb[timb$height > 20 | Lg, ] timb[timb$height > 20 & Lg, ] timb1 <- cbind(timb, volComp = pi/4 * timb$girth^2 * timb$height/3) Schreiben der neuen Daten in eine Datei: > write.table(timb1, file = "timb1.dat", row.names = TRUE) > list.files() 1.6.6 Vektoren, Matrizen, Arrays, Dataframes, cbind, rbind, apply Rekapitulation: (Details in der Hilfe) • Vektoren bestehen aus mehreren Elemente gleichen Typs, • Matrizen sind rechteckige Anordnungen von Elementen gleichen Typs, • Arrays sind Matrizen mit mehr als zwei Dimensionen, • Dataframes bestehen aus gleich langen Vektoren mit Elementen evtl. verschiedenen Typs. Sie sind die geeigneten Gefässe für Daten, Zeilen entsprechen Beobachtungen, die Kolonnen sind meist mit den (eindeutigen) Variablennamen benannt. Fehlende Werte sollten durch NA gekennzeichnet sein, Vektoren gleicher Länge lassen sich spaltenweise mit cbind oder zeilenweise mit rbind "zusammenbinden". Ebenso lassen sich Vektoren, Matrizen und Dataframes kombinieren, wenn sie konform, engl. comformant sind, das heisst wenn ihre entsprechenden Dimensionen gleiche Länge haben: > cbind(1:5, 6:2) [1,] [2,] [3,] [4,] [5,] [,1] [,2] 1 6 2 5 3 4 4 3 5 2 9 1 Einleitung Tabelle 1.1: Datenstrukturen Vektor Matrix Array Dataframe Erzeugung Abfrage Beispiele length() Ansprache von Untereinheiten [] vector(mode = "logical", length = 0) mode kann sein: "logical", "integer", "numeric", "complex", "character" und "raw" explizit: c(0,4,-7) matrix(data = NA, nrow = 1, ncol = 1, byrow = FALSE, dimnames = NULL) array(data = NA, dim = length(data), dimnames = NULL) read.table(,header=TRUE,) dim() [,] [2,5] dim() [„] [1,7,3] dim(), names() $, [,] $x, [,4] [7] > rbind(1:5, 6:2) [,1] [,2] [,3] [,4] [,5] [1,] 1 2 3 4 5 [2,] 6 5 4 3 2 > rbind(LETTERS[4:9], 4:9) [,1] [,2] [,3] [,4] [,5] [,6] [1,] "D" "E" "F" "G" "H" "I" [2,] "4" "5" "6" "7" "8" "9" Zahlen werden beim Beispiel mit rbind in Character, den Typ der ersten Zeile, umgewandelt. Bei Dataframes sollten natürlich auch neue Kolonnen durch dimnames mit Namen versehen werden. Die Funktion apply ist sehr praktisch, in Matrizen zeilenweise oder spaltenweise Operationen zu automatisieren. Es lohnt sich, in ?apply die Beispiele anzusehen und zu verstehen. > x <- cbind(x1 = 3, x2 = c(4:1, 2:5)) > dimnames(x)[[1]] <- letters[1:8] > apply(x, 2, mean, trim = 0.2) x1 x2 3 3 > col.sums <- apply(x, 2, sum) > row.sums <- apply(x, 1, sum) > rbind(cbind(x, Rtot = row.sums), Ctot = c(col.sums, sum(col.sums))) a b c d 10 x1 x2 Rtot 3 4 7 3 3 6 3 2 5 3 1 4 1.6 R, eine Übersicht e 3 2 f 3 3 g 3 4 h 3 5 Ctot 24 24 5 6 7 8 48 Um bei Matrizen Zeilen und Spalten zu vertauschen, verwendet man t(). 1.6.7 Listen Listen sind die allgemeinsten Datenstrukturen. Ihre Elemente können selbst wieder beliebig strukturiert und von beliebigem Typ sein, verboten sind zirkuläre Strukturen. Mit anderen Worten: Eine Liste ist eine Verkettung von Elementen, die Zahlen, Variable oder selbst wieder Listen sein können. Wegen ihrer Flexibilität sind sie nicht ganz einfach zu verstehen. Aber es gilt wieder Faustregel 1. Liste: listname <- list(Kompon1 = Wert1, Kompon2 = Wert2, Wert3, .... ) Beispiel: > (Li <- list(k1 = 3, k2 = NULL, c(5, 1, 0), g = "string7")) $k1 [1] 3 $k2 NULL [[3]] [1] 5 1 0 $g [1] "string7" > str(Li) List of 4 $ k1: num 3 $ k2: NULL $ : num [1:3] 5 1 0 $ g : chr "string7" Die Abfragefunktion str gibt eine etwas handlichere Darstellung, mit den Namen (sofern vorhanden), Typen der Listenelemente und den (ersten paar) Werten in jeder Zeile. Benannte Elemente können über $ angesprochen werden, unbenannte nur über die Position mittels doppelter eckiger Klammern [[]]. > Li$k1 [1] 3 > Li[[2]] 11 1 Einleitung NULL > Li[[3]] [1] 5 1 0 > Li$g [1] "string7" > Li$k2 <- list(55, pi, "Q") > Li $k1 [1] 3 $k2 $k2[[1]] [1] 55 $k2[[2]] [1] 3.14159 $k2[[3]] [1] "Q" [[3]] [1] 5 1 0 $g [1] "string7" > Li[[3]] <- NULL 1.6.8 Funktionen Funktionen sind sehr mächtige Konstrukte in jeder Programmiersprache. Sie kapseln und automatisieren Rechenabläufe, die immer wieder auf dieselbe Art ablaufen sollen, aber auf unterschiedlich benannte Objekte angewendet werden sollen, den Argumenten oder Eingabe-Parametern. Wenn eine Funktion ihre Berechnung beendet hat, dann gibt sie ein Ergebnis zurück, das auch eine Liste oder NULL sein kann. Alle internen Variablen, die für die Berechnungen vorübergehend benötigt wurden, werden zerstört. Ein Ergebnis NULL oder invisible() kann durchaus sinnvoll sein. Besteht der Hauptzweck einer Funktion in einem Nebeneffekt, nämlich darin, einen Plot zu zeichnen, Zahlen auszudrucken oder eine Datei zu erzeugen, so liegt ein rechnerisches Ergebnis im eigentlichen Sinn nicht vor. Man unterscheidet zwischen der Definition und dem Aufruf einer Funktion. 12 1.6 R, eine Übersicht Definition: fctname <- function( Argumentenlliste,. . . ) { Anweisungsfolge(n) return( Ausdruck ), oder return( Liste), oder return( NULL), oder invisible() } Die Liste der Argumente oder Eingabeparameter kann leer sein oder aus einem oder mehreren Argumenten bestehen. Man unterscheidet zwei Arten von Argumenten, solche, die aus einem Namen allein bestehen, und solche, die aus einem Paar Name=Wert bestehen. Erstere sollen vor denen der zweiten Sorte stehen. Die drei Punkte ’. . .’ stehen für Parameter, die in der Form Name=Wert an intern verwendete Funktionen weitergereicht werden sollen. Aufruf: fctname( arg1, arg2, ... ) varname <- fctname( arg1, arg2=blabla, ... ) Im Aufruf müssen die Ausdrücke, die für Argumente eingesetzt werden sollen, genau in derselben Reihenfolge wie die Argumente in in der Definition aufgeführt werden. Argumente, die als Name= definiert sind, können dann auch ohne Name= verwendet werden. Name=-Argumente dürfen in der Form Name=Wert in beliebiger Reihenfolge am Ende der Liste stehen. Sie dürfen sogar fehlen, wenn der in der Definition definierte Vorgabewert Wert von Name=Wert verwendet werden soll. Dieser Mechanismus erlaubt es, für sehr universell einsetzbare Funktionen einerseits dem anspruchslosen Benutzer ein knappes Standard-Interface anzubieten, andererseits jedoch dem Fortgeschrittenen sehr viele zusätzliche Einflussmöglichkeiten zu geben, ohne den Anfänger damit zu belasten. Beispiel: > + + + + > + + + + > + + > meanstd.1 <- function(vec) { mm <- mean(vec) std <- sd(vec) return(list(m = mm, s = std)) } meanstd.2 <- function(vec) { m <- mean(vec) s <- sd(vec) return(list(m = m, s = s)) } meanstd <- function(vec) { return(list(m = mean(vec), s = sd(vec))) } meanstd(rnorm(1000)) $m [1] -0.0133083 $s [1] 0.951926 13 1 Einleitung Eine Funktion mit Vorgabewert: > test.1 <- function(n, m, dec = 4) { + for (ii in 1:n) { + erg <- unlist(meanstd(rnorm(m))) + print(format(erg, digits = dec)) + } + return(invisible()) + } > test.1(3, 10) m s "-0.5444" " 1.2750" m s "-0.1454" " 0.5713" m s "-0.1448" " 0.8816" > (t2 <- test.1(3, 10, dec = 2)) m s "-0.53" " 0.92" m s "0.78" "0.93" m s "0.24" "1.13" NULL return(invisible()) erzwingt NULL als Ausgabewert, sonst wird das zuletzt berechnete Ergebnis erg geliefert. Eine Funktion mit einer Liste als Resultat: > test.2 <- function(n, m) { + ergm <- ergs <- vector(mode = "numeric", length = n) + for (ii in 1:n) { + ms <- meanstd(rnorm(m)) + ergm[ii] <- ms$m + ergs[ii] <- ms$s + } + return(list(m = ergm, s = ergs)) + } > (t2 <- test.2(3, 500)) $m [1] 0.0111057 -0.1098026 -0.0402297 $s [1] 0.997059 0.993017 0.959721 > str(t2) 14 1.6 R, eine Übersicht List of 2 $ m: num [1:3] 0.0111 -0.1098 -0.0402 $ s: num [1:3] 0.997 0.993 0.96 1.6.9 Strukturoperationen In R sind Operationen vorhanden, um Sprachelemente zu manipulieren. In vielen der bereitgestellten Funktionen werden sie angewendet, zum Beispiel in den Routinen für Plotten oder in der Regressionsrechnung. Als Beispiel zeigen wir, wie man Textausdrücke schrittweise auswerten kann: > 3/(2 * sin(pi/3) + 3.5) [1] 0.573389 > z <- "3 / (2*sin(pi/3) + 3.5)" > (yp <- parse(text = z)) expression(3/(2 * sin(pi/3) + 3.5)) > eval(yp) [1] 0.573389 Dabei bedeuten: Parsen = syntaktisch auswerten, expression = Ausdruck in interner Darstellung, eval = Auswertung zu einer ’einfacheren’ Form, hat meist eine Zahl als Resultat. 1.6.10 Programmablauf Will man den Programmablauf vom konkreten Wert von Variablen abhängig machen und Teile systematisch wiederholen, so benötigt man Entscheidungen und Schleifen. Man sollte unbedingt die Hilfe konsultieren, z.B.: > help("for") Strukturelemente, die vorkommen müssen, programmabhängige Elemente, die selbst gewählt werden. • if ( Bedingung ) { Anweisungsfolge } • if ( Bedingung ) { Anweisungsfolge } else { alternative Anweisungsfolge } • for ( Variable in Folge ) { Anweisungsfolge } • while ( Bedingung ) { Anweisungsfolge } • repeat { Anweisungsfolge if (Bedingung) break; Anweisungsfolge } Beispiele: 15 1 Einleitung > > + + > + + + + x <- 0 if (x < 0) { print("x kleiner 0") } if (x < 0) { print("x kleiner als 0") } else { print("x groesser als 0") } [1] "x groesser als 0" > if (x < 0) { + print("x kleiner als 0") + } else { + if (x == 0) { + print("x gleich 0") + } + else { + print("x groesser als 0") + } + } [1] "x gleich 0" > for (i in 1:3) { + print(i^2) + } [1] 1 [1] 4 [1] 9 > k <- 0 > while (k < 10) { + print(k^2) + k <- k + 4 + } [1] 0 [1] 16 [1] 64 > m <- 25 > repeat { + print(m) + if (m < 6) + break + m <- m - 9 + } 16 1.6 R, eine Übersicht [1] [1] [1] [1] 25 16 7 -2 1.6.11 Plots Baumhöhen gegen Umfang, Abb.1.1: 26 > plot(timb$girth, timb$height, xlab = "Umfang", xlim = c(40, + 170), ylim = c(16, 27)) ● ● ● ● ● ● 24 ● ● ● ● ● ● ● 22 ● ● ● ● ● ● ● 20 timb$height ● ● ●● ● ● ● ● 16 18 ● 40 60 80 100 120 140 160 Umfang Abbildung 1.1: Baumhöhen gegen Umfang Eine meist bessere Übersicht gibt die Darstellung "Alle Variablen gegen alle" in der Scatterplot-Matrix, Abb.1.2. Sie stellt auf kleinstem Raum die wesentlichen Eigenschaften der Daten dar: • Histogramme und (abgekürzte) Namen der Variablen in der Diagonalen, 17 1 Einleitung • die zweidimensionalen Punktewolken und geglättete Kurven in beiden Richtungen (y gegen x, x gegen y) in der unteren Hälfte, • die paarweisen Korrelationskoeffizienten in der oberen Hälfte. Das Histogramm zeigt in x-Richtung (horizontal) die Werte einer Variablen, die y-Richtung (vertikal) die Anzahl beobachteter Werte innerhalb (der x-Grenzen) der Balken, siehe Kap. 3. Die Namen der Variablen sind aus Platzgründen stark verkürzt. Ein nicht-diagonaler Eintrag bezieht sich auf diejenigen Variablen, die in derselben Zeile und derselben Spalte in der Diagonalen stehen. So gehört der Korrelationskoeffizient in der 2. Zeile und 3. Spalte zur Punktewolke in der 3. Zeile und 2. Spalte, die die 3. Variable (height, vertikal) gegen die 2. Variable (girth, horizontal) zeigt. Zum Korrelationskoeffizient siehe Kap. 7. Die geglätteten Kurven zeigen den Trend der Daten. Eine fast horizontale Kurve (rot) bedeutet, dass die y-Werte praktisch nicht von den x-Werten abhängen, und eine fast vertikale Kurve (blau), dass die x-Werte praktisch nicht von den y-Werten abhängen. Dies entspricht einem kleinen Korrelationskoeffizienten nahe Null, die Punktewolke ist praktisch kreisrund oder liegt horizontal. Je besser die beiden geglätteten Kurven übereinstimmen, desto näher liegt der Korrelationskoeffizient bei ±1 und die Punktewolke ist sehr schlank. Der Aufruf für die Scatterplotmatrix lautet SplomT(timb1,cex.diag=0.5) benötigt das Paket cwhmisc. 18 1.6 R, eine Übersicht timb1 volm 0.97 grth 0.6 0.99 0.52 0.98 hght 0.6 vlCm 2008−04−15, 00:11:02 Abbildung 1.2: Alle Variablen gegen alle (Scatterplot-Matrix) 19 1 Einleitung 1.7 Sortieren etc. Die Funktion sort.list liefert die Indizes des kleinsten, nächst grösseren, . . . Wertes in einem Vektor. Mit der so gewonnenen Reihenfolge lassen sich ganze Matrizen oder Dataframes nach einer Spalte sortieren: > timb$volume [1] [10] [19] [28] 0.7458 1.4410 1.8610 4.2216 0.7458 1.7524 1.8030 3.7292 0.7386 1.5206 2.4982 3.6930 1.1875 1.3613 1.4265 1.1296 1.3179 1.6365 1.5496 1.5424 1.3831 1.6075 2.4475 1.9841 2.2954 2.6285 2.7734 3.0847 4.0116 4.0333 5.5757 > (ind <- sort.list(timb$volume)) [1] 3 1 2 7 4 8 5 15 6 10 12 14 13 16 [23] 23 24 25 30 29 26 27 28 31 9 11 20 19 18 22 17 21 > sort(timb$volume) [1] [10] [19] [28] 0.7386 1.4410 1.9841 4.0116 0.7458 1.5206 2.2954 4.0333 0.7458 1.5424 2.4475 4.2216 1.1296 1.1875 1.3179 1.3613 1.3831 1.4265 1.5496 1.6075 1.6365 1.7524 1.8030 1.8610 2.4982 2.6285 2.7734 3.0847 3.6930 3.7292 5.5757 0.7458 1.5424 2.4475 4.2216 1.1296 1.1875 1.3179 1.3613 1.3831 1.4265 1.5496 1.6075 1.6365 1.7524 1.8030 1.8610 2.4982 2.6285 2.7734 3.0847 3.6930 3.7292 5.5757 > timb$volume[ind] [1] [10] [19] [28] 0.7386 1.4410 1.9841 4.0116 0.7458 1.5206 2.2954 4.0333 > timb[ind, ][1:12, ] 3 1 2 7 4 8 5 15 6 10 12 14 volume 0.7386 0.7458 0.7458 1.1296 1.1875 1.3179 1.3613 1.3831 1.4265 1.4410 1.5206 1.5424 girth height 70.22 18.9 66.23 21.0 68.62 19.5 87.78 19.8 83.79 21.6 87.78 22.5 85.38 24.3 95.76 22.5 86.18 24.9 89.37 22.5 90.97 22.8 93.36 20.7 Die Umfänge der 5 höchsten Bäume bekommt man mit: > timb$girth[sort.list(timb$height, decreasing = TRUE)][1:5] 20 1.7 Sortieren etc. [1] 164.38 106.13 102.94 86.18 139.64 > timb[sort.list(timb$height, decreasing = TRUE), ][1:5, + ] 31 18 17 6 27 volume 5.5757 1.9841 2.4475 1.4265 4.0333 girth height 164.38 26.1 106.13 25.8 102.94 25.5 86.18 24.9 139.64 24.6 21 1 Einleitung 22 2 Übersicht über die Statistik Dieser Kurs soll eine einführende Auswahl in einige grundlegende Problemkreise der Statistik geben, siehe dazu das Inhaltsverzeichnis und Tab. 2.1. Er wird daher nicht erschöpfend sein. Er speist sich aus meinen Erfahrungen von 30 Jahren an der WSL und ist entsprechend einseitig. Er lehnt sich zum Teil an die unten aufgeführte Literatur an. Der schwierigste Teil der Statistik ist es, die richtige Methode zu wählen. Diese hängt von der Art der Daten und der Fragestellung ab, die man beantworten will. Je mehr Erfahrung man sammelt, um so sicherer und schneller findet man zum Ziel. Der Schlüssel ist, die Art der zu erklärenden Variablen (Response, Zielgrösse) verstehen und die erklärenden Variablen (Einflussgrössen) richtig angeben zu können. Eine kontinuierliche oder metrische Variable nimmt reelle Werte an, z.B. Höhe, Temperatur. Sie wird entweder verhältnisskalliert genannt, wenn sie einen absoluten Nullpunkt hat wie Temperaturen gemessen in K (Kelvin) oder Länge, Gewicht, oder intervallskaliert, wenn sie einen willkürlichen Nullpunkt hat wie Temperaturen gemessen in ◦ C oder ◦ F . Eine (nicht-kontinuierliche) diskrete oder qualitative Variable kann entweder geordnete Werte haben wie Ränge, oder ungeordnete oder nominale Werte. In beiden Fällen wird solch eine Variable Faktor oder kategoriell genannt, und ihre Werte werden Stufen genannt: Postleitzahlen sind ungeordnet, Schulnoten sind geordnet, ebenso wie die Farben des Farbkreises mit seinen sieben Stufen "rot", "orange", "gelb", "grün", "blau", "indigo", "violett". Diese Unterscheidung widerspiegelt den abnehmenden Gehalt an Information und abnehmende Empfindlichkeit 23 2 Übersicht über die Statistik Tabelle 2.1: Skalen, Methoden, Themen, Kapitel des Vorkommens 1. 2. (a) Die erklärenden Variablen (EV) alle EV kontinuierlich alle EV kategoriell die EV sind kontinuierlich und kategoriell Die Zielvariablen (ZV) kontinuierlich (b) (c) Verhältnisse Anzahlen (d) 3. (a) (b) (c) (d) (e) (f) Binär Allgemeinere Themen beobachtend manipulativ zeitlich räumlich Ausfallzeiten Hypothesentests, dynamisch Robuste Statistics (a) (b) (c) (g) 24 Methoden (Kapitel) Regression (7) Varianzanalyse ’Anova’ (6), Kontingenztafeln (5.5) Kovariananalyse (Ancova) Einfache, mehrfachen verallgemeinerte Lineare Regression ’lm’, ’glm’ (7, 8), Anova (6), Ancova, Verallgemeinerte Additive Modelle ’gam’ (8.1), Hauptkomponenten-, Faktor-, Cluster-, Diskriminanzanalyse, Baumartige Modelle (Tree models) (8.1) Logistische Regression Log-lineare Modelle ’glm’, Kontingenztafeln (5.5), Verlaufskurven Binäre logistische Analyse (glm+binomial) Erhebungen Versuchsplanung Zeitreihen Geostatistik Überlebensanalyse Bootstrap (9), Simulation Verfahren weniger empfindlich auf Ausreisser zu machen 3 Beschreibende Statistik 3.1 Zweck Die beschreibende Statistik bietet den geeigneten Einstieg in die Statistik. Zahlreiche grafische und rechnerische Möglichkeiten erlauben es uns, einen Einblick in die Struktur und Eigenheiten von Daten zu gewinnen. Ich möchte der verbreiteten Meinung entgegen arbeiten, dass mit Mittelwert, Standardabweichung und tTest das Wesentliche erreicht sei. Durch die Möglichkeiten der Programmierung in R lassen sich diese grundlegenden Begriffe jedoch auf experimentell-anschauliche Art einführen. Die Beurteilung von Daten beginnt mit Grafiken. Punktewolken zeigen oft sehr rasch, ob • die Daten erkennbare Muster bilden, • Klumpungen aufweisen, • zusammenhängend sind, • der Übergang in den Randgebieten allmählich oder abrupt verläuft. • die Daten einfach beschreibbare Zusammenhänge zulassen, • sich systematische und zufällige Effekte erkennen lassen. 3.2 Methoden Es sollen möglichst viele Eigenschaften der Daten gleichzeitig und unverfälscht dargestellt werden. • Stamm-und-Blatt-Diagramme (Stem-and-Leaf) • Streudiagramme (Scatterplots) • Histogramme, Balken- und Kuchendiagramme • Kistendiagramme (Box-Plots) • Summenhäufigkeits- und Quantil-Quantil-Diagramme • Kontingenztafeln • kompliziertere grafische Methoden 25 3 Beschreibende Statistik 3.3 Kennzahlen für Stichproben Die Darstellungen können durch Kennzahlen ergänzt werden, die sich (oft) leicht interpretieren lassen. Wir zählen sie hier auf: Masszahl des Stichprobenumfangs: • N := Anzahl gezogene Individuen Stichprobenwerte: • xi , i = 1..N Masszahlen der Lage: • Minimalwert min, Maximalwert max, • Modalwert modus := am häufigsten vorkommender Wert, P • Mittelwert x̄ := α̂1 := N1 N i=1 xi , • Quantile: Das p%-Quantil xp ist in der Reihe der aufsteigend sortierten Werte derjenige Wert mit der Nummer p · N . Ungefähr p % der Werte liegen unterhalb, (100-p)% liegen oberhalb, • Median med := x0.5 := 50%-Quantil, • unteres, oberes Quartil: x0.25 , x0.75 , 25%-, bzw. 75%-Quantil Masszahlen der Streuung: Definition 1. Residuum oder Abweichung := xi − x̄ • Spannweite (= Wertebereich, Range) r := max − min, P • durchschnittliche absolute Abweichung (mad) := N1 N i=1 |xi − x̄|, • Varianz var := α̂2 := s2 := N 1−1 √ • Standardabweichung s := var PN 2 i=1 (xi −x̄) /(N −1) (∼ Durchschnitt der quadrierten Residuen), • Interquartildistanz IQR := x0.75 − x0.25 Masszahlen der Form: • Schiefe oder Skewness: α̂3 := 1 N 1 N PN − x̄)3 3/2 PN 2 i=1 (xi − x̄) i=1 (xi Symmetrische Verteilungen haben Schiefe = 0. • Wölbung (-süberschuss) oder (Excess) Kurtosis: α̂4 := verteilung hat α̂4 = 0. PN i=1 (xi Experimente mit Schiefe und Kurtosis werden in 4.5 angeboten. 26 − x̄)4 /(N ∗ s4 ) − 3. Die Normal- 3.4 Ein Datenbeispiel 3.4 Ein Datenbeispiel Am Anfang interessieren uns Daten, die nur einen Datenwert pro Individuum aufweisen. Meistens wird noch eine Identifikation zugewiesen, die jetzt aber nicht berücksichtigt wird. Beispiel: Baumhöhen gemessen in Davos. Die folgenden Daten stammen aus der ehemaligen Gruppe Ertragskunde der WSL. Von 40 Fichten auf Messflächen für Luftschadstoffe in Davos wurden die Höhen in m gemessen (W.Keller, 1985): > dav <- read.table("./Data/Davos.h", header = TRUE) > table(dav$h) 10 12 13.3 13.6 14.2 14.8 15 15.8 16.7 1 1 1 1 1 1 1 1 1 19.5 20.6 21.2 21.3 22.8 23.4 23.7 23.8 24.5 1 1 2 1 1 1 1 1 1 27.2 28 28.3 28.4 28.7 32.4 33 35.5 1 1 1 2 1 1 1 1 17 17.3 17.5 18.1 18.2 1 1 1 1 1 25 25.1 26.2 26.3 26.5 1 1 1 3 1 > summary(dav$h) Min. 1st Qu. 10.0 17.2 Median 23.1 Mean 3rd Qu. 22.2 26.4 Max. 35.5 Abb. 3.1 stellt die Baumhöhen dar in der Reihenfolge der Messung, auf der x-Achse ist die Position (Index) innerhalb der Liste aufgetragen. Die rechte Figur behandeln wir später. Noch bevor wir irgendetwas rechnen, verschaffen wir uns eine Übersicht über die Daten, die sehr einfach von Hand zu erledigen ist. Das Stamm-und-Blatt-Diagramm stellt alle Werte in Zeilen dar, jeder einzelne Wert kann identifiziert werden. (Im Allgemeinen sind die Werte nicht geordnet.) Die erste wesentliche (d.h. von Null verschiedene) Ziffer wird vor einem senkrechten Strich angeschrieben. Nach dem Strich wird für jeden vorkommenden Einzelwert die zweite (gerundete) wesentliche Ziffer notiert. Die Stellung des Dezimalpunktes (-kommas) wird vernachlässigt, jedoch in der Legende erwähnt. Je nach Spannweite der Daten werde für jede erste wesentliche Ziffer eine, 2 oder 5 Zeilen eingerichtet, d.h. Klassen der Breite 10, 5 oder 2 gebildet. Solche Darstellungen durch gedruckte Zeichen waren besonders nützlich zur Zeit vor den Grafikprogrammen, als echte grafische Darstellungen noch nicht vorhanden oder umständlich handzuhaben waren. > stem(dav$h) The decimal point is 1 digit(s) to the right of the | 1 1 2 2 3 3 | | | | | | 02344 556777888 011113344 55566667788889 23 6 Histogramme wie Abb. 3.2 sind leicht zu lesen, sie sind gedrehte Stamm-und-Blatt-Diagramme. 27 3 Beschreibende Statistik op <- par(mfrow = c(1, 2)) plot(dav$h) op <- options(warn = 2) boxplot(dav$h) lines(c(0.8, 1.2), rep(mean(dav$h), 2), col = "blue") options(op) 35 ● 35 > > > > > > ● 30 30 ● ● ● ● ● ● ● 25 ● ● ● dav$h ●● ● ● ● ● ● ● 20 ● ● ● ● ● ● ● ● ● ● 15 15 ● ● ● ● ● 20 25 ● ● ● 10 10 ● ● 0 10 20 30 40 Index Abbildung 3.1: Baumhöhen [m] in Davos, links Datenreihenfolge wie in der Liste, rechts Boxplot mit Median (dick) und Mittelwert (blau). 28 3.4 Ein Datenbeispiel > hi <- hist(dav$h, plot = FALSE) > plot(hi) 6 4 2 0 Frequency 8 10 12 Histogram of dav$h 10 15 20 25 30 35 40 dav$h Abbildung 3.2: Histogramm der Baumhöhen in Davos 29 3 Beschreibende Statistik Histogramme sind empfindlich auf die Lage der Klassengrenzen. Um ein Gefühl dafür zu bekommen, experimentieren wir mit der Lage der Klassengrenzen bei gleichleibender Klassenbreite, (Abb. 3.3), und mit der Klassenbreite (Abb. 3.4). Dabei beobachten wir die Lage der Summenkurven für die ursprünglichen Daten (gestrichelte Linien) und die Histogramme (strichpunktierte Linien). > > + + + > op <- par(mfrow = c(2, 3)) for (ii in seq(0, 5, length = 6)) { hist.cum(dav$h, breaks = seq(min(dav$h) - 5, max(dav$h) + 5, length = 7) + ii) } par(op) Histogram of x Histogram of x 8 4 6 Frequency 10 5 Frequency 10 5 15 25 35 0 0 0 2 5 Frequency 10 15 12 15 Histogram of x 5 15 25 35 10 20 30 40 x x Histogram of x Histogram of x Histogram of x 8 4 6 Frequency 10 5 Frequency 6 4 10 20 30 x 40 0 0 0 2 2 Frequency 8 10 10 12 15 x 10 20 30 x 40 10 20 30 40 x Abbildung 3.3: Verschieden gelegene Klassengrenzen im Histogramm Es ist deutlich zu sehen, dass die Summenkurven der Histogramme wesentlich glatter sind als die Histogramme selbst. Sie stimmen an den Klassengrenzen mit den Summenkurven der Originaldaten überein. Die Summenkurven stellen also eine robustere Darstellung der Daten dar als die entsprechenden Histogramme selbst. 30 3.4 Ein Datenbeispiel op <- par(mfrow = c(2, 3)) for (ii in c(3, 5, 7, 10, 15, 20)) { hist.cum(dav$h, breaks = seq(min(dav$h), max(dav$h), length = ii)) } par(op) Histogram of x Histogram of x 10 8 6 4 Frequency 10 20 30 0 0 0 2 5 5 10 Frequency 10 Frequency 15 15 20 12 Histogram of x 10 20 30 10 20 30 Histogram of x Histogram of x Histogram of x 5 4 3 2 Frequency 4 3 2 10 20 30 x 1 0 0 1 2 4 Frequency 6 5 6 x 6 x 8 x 0 Frequency > > + + + > 10 20 30 10 x 20 30 x Abbildung 3.4: Verschieden breite Klassen im Histogramm 31 3 Beschreibende Statistik 3.5 Programmierung: Modalwert, Mittelwert und Median Rückblende: Trotz aller Variabilität und Unvorhersagbarkeit ist es naheliegend zu fragen: Wo befindet sich die grösste Konzentration der Daten? Diese Frage haben wir teilweise schon durch Betrachtung des Histogramms Abb. 3.2 beantwortet. Der Modalwert ist dort, wo das Histogramm seinen maximalen Häufigkeitswert hat: > hi$mids[which.max(hi$counts)] [1] 27.5 Es kann aber auch sein, dass der Modalwert nur einer der Gipfel des Histogramms ist. Wegen dieser Unschönheit wird der (arithmetische) Mittelwert weitaus häufiger angegeben, er ist auch wesentlich einfacher zu berechnen: > arithmetic.mean <- function(x) { + sum(x)/length(x) + } > arithmetic.mean(dav$h) [1] 22.1775 Vergleiche die "eingebaute"Funktion mean bzw. deren Standardversion mean.def ault: > mean.default function (x, trim = 0, na.rm = FALSE, ...) { if (!is.numeric(x) && !is.complex(x) && !is.logical(x)) { warning("argument is not numeric or logical: returning NA") return(NA_real_) } if (na.rm) x <- x[!is.na(x)] if (!is.numeric(trim) || length(trim) != 1) stop("'trim' must be numeric of length one") n <- length(x) if (trim > 0 && n > 0) { if (is.complex(x)) stop("trimmed means are not defined for complex data") if (trim >= 0.5) return(stats::median(x, na.rm = FALSE)) lo <- floor(n * trim) + 1 hi <- n + 1 - lo x <- sort.int(x, partial = unique(c(lo, hi)))[lo:hi] } .Internal(mean(x)) } <environment: namespace:base> 32 3.5 Programmierung: Modalwert, Mittelwert und Median die immer dann durch mean(x) aufgerufen wird, wenn z.B. Vektoren aus Zahlen für x eingesetzt werden. Dieser Mechanismus fällt unter das Stichwort Methoden bei der Technik der objektorientierten Programmierung. Leider hat das so beliebte arithmetische Mittel einen schwerwiegenden Nachteil: es wird schon durch eine extrem kleinen oder grossen Wert, Ausreisser genannt, stark beeinflusst. Eine Abhilfe schafft das "beschnittene Mittel" > x <- rcauchy(200) > mean(x) [1] 0.200296 > mean(x, trim = 0.3) [1] 0.0231828 Hier werden ca. 0.3/2 = 15% der Anzahl Werte am oberen und unteren Ende weggelassen, äbgeschnitten". Ebenso ist der Median, der "mittlere Wert", robust gegen Ausreisser. Um ihn zu berechnen, muss man die Daten sortieren und dann den mittleren heraussuchen. Eine Schwierigkeit ergibt sich, wenn der Vektor eine gerade Anzahl Werte hat. Dann gibt es keinen mittleren Wert, und man nimmt den Mittelwert der beiden rechts und links von der Mitte: > med <- function(x) { + srt <- sort(x) + mi <- length(x)/2 + if (length(x)%%2 == 1) + srt[ceiling(mi)] + else (srt[mi] + srt[mi + 1])/2 + } > (1:15) [1] 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 > (1:15)%%2 [1] 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 > (1:15)%/%2 [1] 0 1 1 2 2 3 3 4 4 5 5 6 6 7 7 > (1:15) [1] 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 > (1:15)%%3 [1] 1 2 0 1 2 0 1 2 0 1 2 0 1 2 0 > (1:15)%/%3 33 3 Beschreibende Statistik [1] 0 0 1 1 1 2 2 2 3 3 3 4 4 4 5 > (1:15) [1] 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 > (1:15)%%4 [1] 1 2 3 0 1 2 3 0 1 2 3 0 1 2 3 > (1:15)%/%4 [1] 0 0 0 1 1 1 1 2 2 2 2 3 3 3 3 Die Operatoren %/% und %% heissen div, ganzzahlige Division und modulo. Bei Vorgängen, die sich multiplikativ ändern, ist weder der Median, noch der Mittelwert ein geeignetes Mass der Lage der Daten. Um auf Additivität zurückzuführen, logarithmiert man, bildet das arithmetische Mittel und exponenziert anschliessend wieder. Das heisst, man bildet das geometrische Mittel: Pn v u n i=1 log xi uY n n xi = e x̂ = t i=1 Insektenpopulationen können als Beispiel dienen: > insects <- c(1, 10, 1000, 50, 300, 10, 70, 700, 1) > mean(insects) [1] 238 > exp(mean(log(insects))) [1] 34.7295 Um solche Daten zu visualisieren, wählt man ebenfalls einen logarithmischen Massstab in y-Richtung, ausgedrückt durch log="y" in plot: 3.6 Variabilität, Varianz und Standardabweichung Ein Mass für die Variabilität von Daten zu haben ist eine der Grundlagen der Statistik. Je grösser die Variablität, desto grösser die Ungenauigkeit von geschätzten Parametern und desto geringer die Sicherheit, zwischen verschiedenen Hypothesen unterscheiden zu können. Ein sehr einfaches Mass für die Variabilität ist die Spannweite ("range") : > range(dav$h) [1] 10.0 35.5 > diff(range(dav$h)) 34 3.6 Variabilität, Varianz und Standardabweichung > plot(insects, log = "y") > lines(c(0, 10), rep(exp(mean(log(insects))), 2), lty = 2) ● 500 ● 50 100 ● ● 10 insects ● ● 1 5 ● ● ● 2 4 6 8 Index Abbildung 3.5: Daten, die multiplikativ variieren, in logarithmierter Darstellung [1] 25.5 Dieses Mass hängt aber zu stark von extremen Werten ("Ausreissern", "outlyers") ab und sollte doch gemäss Vorgabe alle Werte berücksichtigen (Suffizienz, siehe 5.2). Wir schauen uns nach einander an und diskutieren: > > > > res <- dav$h - mean(dav$h) resa <- abs(res) res2 <- res^2 res[1:6] [1] -5.4775 6.2225 6.5225 4.3225 4.1225 6.2225 > resa[1:6] [1] 5.4775 6.2225 6.5225 4.3225 4.1225 6.2225 > res2[1:6] 35 3 Beschreibende Statistik [1] 30.0030 38.7195 42.5430 18.6840 16.9950 38.7195 > sum(res) [1] 6.21725e-14 > sum(resa) [1] 208.145 > sum(res2) [1] 1492.07 > (df <- length(dav$h) - 1) [1] 39 > (varz <- sum(res2)/df) [1] 38.2582 Kommentare: • sum(res) = 0: dies folgt aus der Definition des Mittelwertes, • Der Absolutbetrag eignet sich nicht gut für die mathematische Analyse, er macht Optimierungen aufwendiger, wird aber dank schnellerer Computer bei robusten Verfahren immer häufiger eingesetzt. • "Summe der Quadrate", genauer der quadrierten Abweichungen (Residuen), wird am meisten verwendet. • Anzahl Freiheitsgrade = Anzahl Daten minus Anzahl geschätzte Parameter, • Division durch Anzahl Freiheitsgrade liefert eine erwartungstreue Schätzung (vgl. 2) für die Varianz einer Stichprobe: sum of squares s2 = variance = degrees of freedom und die Standardabweichung als s. Eine eigens definierte Funktion ist z.B. > variance <- function(x) sum((x - mean(x))^2)/(length(x) + 1) > variance(rnorm(1000)) [1] 0.88158 Die in R definierte Funktion var hat noch die fakultativen Parameter y, na.rm, und use: > var 36 3.6 Variabilität, Varianz und Standardabweichung function (x, y = NULL, na.rm = FALSE, use) { if (missing(use)) use <- if (na.rm) "na.or.complete" else "everything" na.method <- pmatch(use, c("all.obs", "complete.obs", "pairwise.complete.obs" "everything", "na.or.complete")) if (is.data.frame(x)) x <- as.matrix(x) else stopifnot(is.atomic(x)) if (is.data.frame(y)) y <- as.matrix(y) else stopifnot(is.atomic(y)) .Internal(cov(x, y, na.method, FALSE)) } <environment: namespace:stats> > options(op) 37 3 Beschreibende Statistik 38 4 Etwas Theorie Dieses Kapitel ist speziell aufgebaut. Zuerst werde ich einige grundlegende Begriffe betreffend Zufallsereignisse einführen und über die Erzeugung von Zufallszahlen auf dem Computer sprechen. Dann werde ich zwei wichtige einfache Zufallsverteilungen besprechen und mit Tabellen die am meisten gebrauchten Verteilungen vorstellen. Programmstücke sollen es dem Leser erlauben, mit diesen Verteilungen zu experimentieren. Da der Zentrale Grenzwertsatz (1) eine so bedeutende Rolle in der theoretischen und praktischen Statistik spielt, zeigen wir erst einige eindrückliche Experiment und dann die theoretische Herleitung. Den Zusammenhang der "verrückten"Cauchy-Verteilung, der viel gebrauchten t-Verteilung und der Normalverteilung zeigt eine Grafik, und mit Schiefe und Kurtosis kann experimentiert werden. 4.1 Kombinatorik Ein beliebter Gegenstand, um kombinatorische Ereignisse darzustellen, ist der gewöhnliche sechs-seitige Würfel. Wir denken ihn uns ideal, das heisst, jede der Augenzahlen 1,2,3,4,5,6 tritt mit derselben Wahrscheinlichkeit 1 pi := P rhi ∈ 1 : 6) := 6 auf. 4.1.1 Elementare, zusammengesetzte und unabhängige Ereignisse Elementare Ereignisse werden durch einzelne Würfel dargestellt. Als zusammengesetzte Ereignisse werden mehrere Würfel gemeinsam betrachtet. Kann man vom Eintreten eines Ereignisses nicht auf das Eintreten eines anderen Ereignisses schliessen, so nennt man die Ereignisse unabhängig. Ihre Wahrscheinlichkeiten multiplizieren sich. Die Wahrscheinlichkeiten sich gegenseitig ausschliessender Ereignisse addieren sich. > sample(1:6, 100, replace = TRUE) [1] [33] [65] [97] 3 1 1 5 5 4 2 1 3 6 1 1 2 4 1 3 1 6 2 1 3 5 1 1 6 6 3 6 5 5 3 6 3 5 4 3 1 5 4 4 3 2 5 4 4 5 6 1 3 1 4 2 5 3 2 3 4 3 1 3 3 3 4 2 2 6 1 3 2 6 5 3 4 6 2 4 2 4 2 5 5 1 3 5 2 6 2 5 6 3 4 4 1 1 2 2 1 5 2 4 > for (ii in 1:10) cat(mean(sample(1:6, 100, replace = TRUE)), + " ") 3.48 3.51 3.67 3.55 3.45 3.4 3.74 3.69 3.51 3.71 > for (ii in 1:8) cat(mean(sample(1:6, 10000, replace = TRUE)), + " ") 3.5209 3.5401 3.4902 3.5154 3.5167 3.5008 3.4875 3.5176 39 4 Etwas Theorie Ein zusammengesetztes Ereignis ist z.B. der Wurf zweier Würfel "A" und "B", wobei die Summe der oben liegenden Augenzahlen gleich 9 sein soll. Seine Auftretenswahrscheinlichkeit beträgt (pi = p = 1/6) P rhA = 3 ∧ B = 6i + P rhA = 4 ∧ B = 5i + P rhA = 5 ∧ B = 4i + P rhA = 6 ∧ B = 3i = 4p2 = 1 9 4.1.2 Bedingte Wahrscheinlichkeiten Man spricht von bedingter Wahrscheinlichkeit, wenn das Eintreten eines Ereignisses abhängig gemacht wird vom Eintreten eines anderen Ereignisses. Geschrieben P rhA|Bi = P rhA ∩ Bi P rhBi "Die Wahrscheinlichkeit von A, gegeben B". Sie ist die Wahrscheinlichkeit des gemeinsamen Auftretens geteilt durch die Wahrscheinlichkeit des anderen Ereignisses. Ein guter Artikel ist http://en.wikipedia.org/wiki/Conditional_probability. Die Anekdote vom "Schlauen Flugreisenden". 4.2 Zufallsvariable, Erwartungswert und Varianz Eine Variable wird Zufallsvariable genannt, wenn sie direkt oder indirekt von einem oder mehreren zufälligen Ereignissen abhängt, sie wird mit einem grossen Buchstaben bezeichnet, z.B. X. Eine Zufallvariable wird diskret genannt, wenn sie höchstens abzählbar viele, K (verschiedene) Werte xi annehmen kann, d.h. die Werte können durchnummeriert werden. Die zugehörigen Wahrscheinlichkeiten P rhX = xi i müssen bekannt sein und die Summe 1 haben. Die pmf ist die Punktmassefunktion (point mass function), die Funktion cdf X cdf (x) := P rhX ≤ xi = pmf (xi ) xi ≤x ist die Kumulative Verteilungsfunktion (cumulative distribution function), mit cdf (max xi ) = 1 (Normalisierung). Eine Zufallsvariable X heisst stetig oder kontinuierlich, wenn sie nicht diskret ist. Hier tritt die Dichtefunktion (probability density function, pdf) an die Stelle der pmf, und die cdf nimmt die Form an Z x cdf (x) := pdf (ξ)dξ. −∞ mit cdf (∞) = 1. Informell kann man die Dichtefunktion als eine "geglättete" Version des Histogramms ansehen: Wenn man empirisch eine genügende Anzahl von Stichproben einer stetigen Zufallsvariablen zieht und das entsprechende Histogramm der relativen Anzahlen der Ergebnisse betrachtet, dann wird das Histogramm der Wahrscheinlichkeitsdichte unserer Zufallsvariablen ähneln, wenn wir annehmen, dass die Zellenbreite genügend schmal gewählt wird. Der Erwartungswert µX einer Zufallsvariablen X ist definiert als 40 4.2 Zufallsvariable, Erwartungswert und Varianz µX := EhXi := PK i=1 xi pmf (xi ) diskret R∞ stetig −∞ x pdf (x)dx 2 ist definiert als Die Varianz σX 2 σX := Eh(X − µX )2 i := PK 2 i=1 (xi − x̄) pmf (xi ) diskret R∞ stetig −∞ (x − x̄)2 pdf (x)dx Definition 2. Erwartungstreuer Schätzer: µ = µX . Für immer grössere Stichprobengrössen strebt der Erwartungswert gegen den theoretischen Wert der Grundgesamtheit. Erwartungstreue Schätzer sind die in Kap. 3.3 erwähnten Grössen: der arithmetische Mittelwert x̄ für den 2 . Erwartungswert, die Varianz s2 für σX Wenn klar ist, von welcher Zufallsvariablen man spricht, dann lässt man den Index X bei µ und σ weg. Aus den Definitionen lassen sich die Additions- und Multiplikationsgesetze von unabhängigen, identisch verteilten Zufallsvariablen herleiten. Seien a, b, n Konstanten. So ist: (4.1) EhX ± Y i = EhXi ± EhY i (4.2) EhaX ± bY i = aEhXi ± bEhY i (4.3) σ 2 hX ± Y i = σ 2 hXi + σ 2 hY i (4.4) (4.5) σ 2 haX ± bY i = a2 σ 2 hXi + b2 σ 2 hY i n σ 2 hXi 1X Xk i = σ2h n n k=1 (4.6) n 1X σh Xk i = n k=1 σhXi √ n Man beachte, dass sich Varianzen nicht subtrahieren, und dass die Standardabweichung eines Durchschnitts mit der Wurzel aus n abnimmt. Daraus folgt das Bemühen, für die Berechnung eines Mittelwertes möglichst viele Werte zu verwenden. 4.2.1 Generatoren von Zufallszahlen Für die Simulation von Zufallsereignissen braucht man Generatoren von Zufallszahlen, die eine Reihe von statistischen Gütetests bestehen. Solche sind in R implementiert. Man unterscheidet dabei die grundlegenden Generatoren von gleichverteilten Zufallszahlen (base package "RNG"), und die Funktionen, die aus gleichverteilten Zufallszahlen solche aus anderen Verteilungen erzeugen. Die Namen letzterer findet man in Tabelle 4.2 in Spalte 3, indem man den Buchstaben "r" vor den Namen stellt, also rnorm für den Generator von normalverteilten Zufallszahlen. Meist will man, dass die Zufallszahlen jedes Mal mit einem anderen Startwert, seed genannt, beginnen. Sollen jedoch die Ergebnisse einer Simulation exakt reproduziert werden, so setzt man mit set.seed den Zufallsgenerator: > save.seed <- 403 > set.seed(save.seed) 41 4 Etwas Theorie > runif(5) [1] 0.435882 0.304504 0.225121 0.823904 0.154283 > runif(5) [1] 0.264830 0.704438 0.630276 0.120108 0.178535 > set.seed(save.seed) > runif(10) [1] 0.435882 0.304504 0.225121 0.823904 0.154283 0.264830 0.704438 [8] 0.630276 0.120108 0.178535 Nach dem Neustart des Generators wird die ursprüngliche Sequenz wiederholt, auch ohne Unterbrechung nach der 5. Zufallszahl. 4.3 Verteilungen 4.3.1 Bernoulli- und Binomialverteilung Die wichtigsten Verteilungen stammen aus der Kombinatorik, die sich mit der Anordnung von Objekten befasst, die bestimmten Regeln entsprechen, und die Anzahl möglicher Anordnungen bestimmt. Am ehesten bekannt schon bei Kindern ist die Gleichverteilung, z.B. der Augen eines (idealen) Würfels, den wir oben schon eingeführt haben. Andererseits wird zum Wetten eine Münze benutzt. Diese spezielle Verteilung von zwei einander ausschliessenden Ereignissen ("Kopf", SZahl") oder ("Ja","Nein") ist unter dem Namen "Bernoulli-Verteilung" mit Parameter p bekannt: http://en.wikipedia.org/wiki/Bernoulli_distribution: (4.7) p = P rhX = 1i = 1 − P rhX = 0i = 1 − q. Um die Wette "fairßu gestalten, wird Pr = Prob = Probability = Wahrscheinlichkeit p := P robh”Kopf ”i = P robh”Zahl”i = 0.5. angenommen. Für die Bernoulli-Verteilung gilt: µ=1·p+0·q =p σ 2 = (1 − p)2 · p + (0 − p)2 · q = q 2 p + p2 q = pq Wiederholt man solche "Bernoulli-Experimente", so erhält man die Binomial-Verteilung, die angibt, wie viele Erfolge ("Ja") man bei n unabhängigen Versuchen mit identischem p erhält. Siehe auch http:// en.wikipedia.org/wiki/Binomial_distribution. Die Anzahl k der Erfolge ist: n k f (k; n, p) = p (1 − p)n−k k mit dem Binomial-Koeffizienten ("n über k" oder "n tief k") k T erme }| { z n n! n n(n − 1)(n − 2) · · · (n − k + 1) := = = k k!(n − k)! n−k k(k − 1)(k − 2) · · · 2 · 1 42 4.3 Verteilungen n 0 mit = := 1, k! := k(k − 1)(k − 2) · · · 2 · 1, 0! := 1 0 0 der angibt, auf wie viele Arten man n Elemente zu Gruppen mit k Mitgliedern zusammenstellen kann: Für das erste Element hat man n Auswahlmöglichkeiten, für das nächste n − 1, für das übernächste n − 2,. . . , für das kte n − k + 1. Da es auf die Reihenfolge der k Elemente, die man gezogen hat, nicht ankommt, muss man noch durch die Anzahl Permutationen von k Elementen teilen: k!. Man sagt für n! "n Fakultät". Ein Film über zufällige binomialverteilte Werte wird in Abb. 4.1 gezeigt (in der interaktiven Version). NBIN <- 6 dela <- 0.2 N <- 10000 n <- 10 p <- 0.3 for (ii in 1:NBIN) { delayt(dela) hist(rbinom(N, n, p), breaks = ncC, main = paste("binom(N=", N, ",n=", n, ",p=", p, ")", sep = ""), xlab = "k", xlim = c(0, n)) } 0 500 1000 1500 2000 2500 binom(N=10000,n=10,p=0.3) Frequency > > > > > > + + + + + 0 2 4 6 8 10 k Abbildung 4.1: 10000 zufällige binomialverteilte Werte aus (r)binom(10000,10,0.3). 43 4 Etwas Theorie 4.3.2 Übersicht über die wichtigsten Verteilungen Die wichtigsten Verteilungsfunktionen, die in R standardmässig angeboten werden, sind in den Tabellen 4.1 und 4.2 (knapp) erklärt. Quelle: http://en.wikipedia.org/wiki/Portal:Mathematics, dann suche nach den verschiedenen Verteilungen. In Abb. 4.2 werden Realisationen der wichtigsten Verteilungen gezeigt. > fp <- function(n) { + pltRCT(4, 4, paste("Dichten von n = ", n, " Zufallsziehungen"), + { + hist(runif(n, 0, 1), main = "unif(n,0,1)", + xlab = "x") + hist(rbinom(n, 10, 0.4), breaks = ncS, main = "binom(n,10,0.4)", + xlab = "k") + hist(rnbinom(n, 10, 0.4), breaks = ncC, main = "nbinom(n,10,0.4)", + xlab = "k") + hist(rhyper(n, 10, 7, 8), breaks = ncC, main = "nhyper(n,10,0.4)", + xlab = "k") + hist(rgeom(n, 0.4), breaks = ncC, main = "geom(n,0.4)", + xlab = "k") + hist(rpois(n, 2), breaks = ncC, main = "pois(n,2)", + xlab = "k") + hist(rbeta(n, 5, 2), breaks = ncC, main = "beta(n,5,2)", + xlab = "x") + hist(rgamma(n, 2), breaks = ncC, main = "gamma(n,2)", + xlab = "x") + hist(rexp(n, 1), breaks = ncF, main = "exp(n,1)", + xlab = "x") + hist(rf(n, 20, 50), breaks = ncF, main = "f(n,20,50)", + xlab = "x") + hist(rnorm(n), breaks = ncC, main = "norm(0,1)", + xlab = "x") + hist(rlnorm(n), breaks = ncC, main = "lnorm(n)", + xlab = "x") + hist(rt(n, 4), breaks = ncF, main = "t(n,4)", + xlab = "k") + hist(rlogis(n), main = "logis(n)", xlab = "x") + hist(rchisq(n, 2), main = "chisq(n,2)", xlab = "x") + hist(rcauchy(NNC <- 50, 0, 1), breaks = ncF, + main = paste("Cauchy(", NNC, ",0,1)", + sep = ""), xlab = "x") + }, mar = c(5, 4, 2, 1), cex = ceX) + } 44 4.3 Verteilungen Tabelle 4.1: Verteilungen und ihe Eigenschaften. N:= natürliche Zahlen 1, 2, . . . , N0 := alle nicht-negativen ganzen Zahlen, R:= reelle Zahlen, RIBF := regularisierte unvollständige Betafunktion. c = Normalisierungskonstante. Name Def.bereich Dichte Verteilung Mittelwert k∈ Pr(.) pmf D(.) cdf µ k−a n a+b 2 q, 1 p RIBF np npq RIBF kq p kq p2 - nm N mn(N −m)(N −n) N (N −1) diskret Varianz σ2 n2 −1 12 1 Uniform 2 Bernoulli 3 Binomial {a, a + 1, . . . , n1 b = a + n − 1} 0, 1 pk q 1−k n k n−k 0, 1, . . . , n k p q 4 Neg.binom. N 5 Hypergeom. N 6 Geometrisch N p qr RIBF q p q p2 6a Geometrisch N qr RIBF q q p pdf cdf stetig k+r−1 r pk q r −m (mk)(Nn−k ) N (n) 1 b−a −λ λk ek! 7 Uniform x ∈ [a, b] 8 Poisson λ ∈ R, k ∈ N0 9 Beta x ∈ (0, 1), α, β > 0 10 chi2 , χ2 x≥0 (1/2)k/2 Γ(k/2) 11 Gamma x≥0 bp p−1 e−bx Γ(p) x 12 Exponential x≥0 λe−λx 13 Fischers F x≥0 c· 14a Std Normal N R 14b Normal N R 15 Log-Normal x>0 16 Student’s t R c· 1+ 17 Cauchy R γ/π (x−x0 )2 +γ 2 =: λ λ RIBF α α+β αβ (α+β)2 (α+β+1) reg. Gamma k 2k γ(p,bx Γ(p) p b p b2 1 − e−λx 1 λ 1 λ2 m −1 2 m+n (mx+n) 2 x a+b 2 (b−a)2 12 x−a b−a Γ(bk+1c,λ) bkc! Beta(α, β) · xα−1 (1 − x)( β − 1) xk/2−1 e−x/2 pq n n−2 , n>2 2n2 (m+n−2) m(n−2)2 (n−4) n>4 2 x √1 e− 2 2π 1 x−µ 2 √1 e− 2 ( σ ) σ 2π √1 e− σ 2πx (ln x−µ)2 2σ 2 x2 n n+1 2 Φ(x) 0 1 Φ( x−µ σ ) µ σ2 Rx 0 Rx pdf (x)dx −∞ pdf (x)dx x−x0 1 1 π arctan γ + 2 σ2 2 2 2 0 n n−2 , n >2 - - eµ+ e2µ+σ (eσ 1) 45 − 4 Etwas Theorie Tabelle 4.2: Erklärungen zu den Verteilungen. ’Funktion’ = Funktionsname in R, davor zu stellen sind ’d’, ’p’, ’q’, ’r’ für ’Dichte’, ’Verteilung = distribution’, ’Quantile’, ’Zufallszahlen = random deviates’, z.B. ’runif’, ’pbinom’, ’qt’, ’rnorm’. Siehe "help(binom)ëtc. N n: N ist sehr gross gegenüber n. Name R-funktion Bemerkung p := Pr(success) diskret unif n := b − a + 1, Anzahl der Werte (Würfel: 6), jedes Ereignis gleich wahrscheinlich p = 1/n q = 1 − p = Pr(Misserfolg ) Binomial binom 4 Negativ binomial nbinom k Erfolge in n Versuchen.n 1 ⇒ N (np, npq), s. ’14’ (Normal) k Erfolge nach r Misserfolgen 5 Hypergeom. hyper 6 Geometrisch geom 6a Geometrisch 1 Uniform 2 Bernoulli 3 Eine Urne enthält N Kugeln, davon sind m weiss. Zieht man n Kugeln, wieviele Kugeln sind weiss? n = 1 ist Bernoulli ’2’. Falls p := m/N 6= 0 or 1 und a) N, m n ⇒ Binomial, s. ’3’. b) N, m n 1 ⇒ N (np, npq), s. ’14’ (Normal) Erster Erfolg nach r Misserfolgen. Ist Spezialfall von negat. binomial ’4’ für k = 1. r Misserfolge hinter einander. vgl. die Rolle von q in ’5’ stetig 7 Uniform unif Alle Ereignisse in [a, b] gleich wahrscheinlich 8 Poisson’s pois 9 Beta beta 10 chi2 , χ2 chisq 11 Gamma gamma 12 Exponentiell exp Pr(k Erfolge) = λ für seltene Ereignisse. k = 0: P r(0) = e−λ ist Grenzfall von Binomial ’3’für n 1, und λ := np bleibt fest modelliert Eregnisse beschränkt auf ein Intervall P Wenn Xi ∈ N (0,1), i = 1..k, dann ist χ2k := ki=1 Xi2 χ2k verteilt Ist stetiges Analog zur diskreten negativen Binomialvert. und gibt die Zeit an zum pth seltenen Poissonereignis. Ist ein "flexibles"χ2 . Die Summe von unabhängigen Gammaverteillungen ist gammaverteilt. Modelliert Zeiten zur nächsten Ankunft, radioaktiven Zerfall 13 Fischer’s F f 14a Standard Normal N (0, 1) norm 14b Normal N (µ, σ) norm 15 Log-Normal lnorm 16 Student’s tn t 17 Cauchy-Lorentz cauchy 46 Quotient von zwei χ2 -Verteilungen, wird in Varianzanalyse benutzt. "Glockenkurve", standardisiert so dass µ = 0, σ = 1, auch geschrieben als N 0,1 Wichtig wegen Zentralem Grenzwertsatz (1). Die Summe von unabhängigen Normalverteillungen ist normalverteilt. ln x ist normalverteilt q 2 ist N (0, 1)/ χnn , limn→∞ tn = N (0, 1), t1 ist die Cauchyvert., s. ’17’. Falls Xi , Yj ∈ N (0, 1), unabhängig, dann ist X/Y in Cauchy mit x0 = 0, γ = 1. Cauchy ist t1 . 4.3 Verteilungen > fp(n = 2000) Dichten von n = 2000 Zufallsziehungen 0.8 2 4 6 8 700 500 0 10 30 50 1 2 3 4 5 6 7 geom(n,0.4) pois(n,2) beta(n,5,2) gamma(n,2) 6 8 12 0 2 4 6 250 0 50 8 0.2 0.6 1.0 0 2 4 6 8 x x exp(n,1) f(n,20,50) norm(0,1) lnorm(n) 50 Frequency Frequency 100 200 150 100 Frequency 300 200 6 8 10 0.5 1.5 2.5 0 0 50 0 4 10 100 200 300 400 500 k 150 k 100 −3 −1 1 2 3 0 5 10 15 20 x x x t(n,4) logis(n) chisq(n,2) Cauchy(50,0,1) 5 k 15 −10 −5 0 x 5 0 5 10 Frequency 600 400 0 0 200 200 400 Frequency Frequency 600 150 100 50 0 25 15 800 x 800 2 150 Frequency Frequency 100 150 200 250 50 0 4 0 Frequency 600 400 2 8 350 k 100 200 300 400 500 k 800 k 0 −10 300 Frequency 0 100 Frequency 0 0 0 0 Frequency nhyper(n,10,0.4) x 0 0 50 100 150 200 250 300 300 200 Frequency 100 0 0.4 200 Frequency nbinom(n,10,0.4) 400 200 150 100 Frequency 50 0 0.0 Frequency binom(n,10,0.4) 500 unif(n,0,1) 0 2 4 6 8 12 −1000 x −600 −200 x 2009−02−17, 17:40:56 Abbildung 4.2: Realisierung von theoretischen Verteilungen 4.3.3 Experimente zur Summe von identisch verteilten Zufallsvariablen, Veranschaulichung des zentralen Grenzwertsatzes (1) Es werden Histogramme von je einer grösseren Ziehung von Zufallszahlen gezeigt, die aus Verteilungen stammen, die in R zur Verfügung stehen. Für jede Verteilung wird eine Figur gezeichnet mit der Zufallsziehung und der theoretische Verteilung als Kurve. Im selben Gesamtbild werden die Histogramme von Mittelwerten aus einer steigenden Anzahl Termen = Summanden gezeigt, die aus dieser Verteilung gezogen wurden. Zum Vergleich wird jeweils die approximierende Normalverteilung eingezeichnet. Je nach Stärke der Nichtnormalität der ursprünglichen Verteilung konvergieren diese Mittelwerte mehr oder weniger schnell gegen die Normalverteilung. Die angegebene Schiefe sk soll als Mass dafür dienen. Allerdings kommt es auf Grund der Zufälligkeiten vor, dass die sk nicht immer konsequent abnehmen. Siehe Abb. 4.3, 4.4, 4.5, 4.6, 4.7. 47 4 Etwas Theorie > > > > + n <- 10000 a <- 0 b <- 1 pl(paste("Gleichverteilung in [", a, ",", b, "]", sep = ""), xlab = "x", fct = "runif", n, , , , a, b) Gleichverteilung in [0,1] 400 0 0.2 0.4 0.6 0.8 1.0 0.0 0.4 0.6 0.8 5 Terme, sk = 0.390 0.4 0.6 0.8 0 200 Frequency 0.2 1.0 0.2 0.4 0.6 0.8 30 Terme, sk = 0.681 300 Terme, sk = 0.673 0 200 200 400 x Frequency x 0 1.0 500 3 Terme, sk = 0.241 400 x 200 0.0 0.2 x 0 Frequency 0.0 Frequency 2 Terme, sk = 0.012 200 Frequency 500 200 0 Frequency Dichte+Funktion, sk = 0.166 0.3 0.4 0.5 x 0.6 0.7 0.44 0.48 0.52 0.56 x 2009−02−17, 17:40:57 Abbildung 4.3: Die Summe von 1, 2, 3, 5, 30, und 300 Realisationen von n=10000 Ziehungen aus der Gleichverteilung in [0,1]. sk = Skewness = Schiefe. Variante "2 Terms" hat eine Dreiecksverteilung. 48 4.3 Verteilungen > > > > + + n <- 10000 a <- 5 b <- 2 pl(paste("Beta-Verteilung mit a = ", a, ", b = ", b, sep = ""), xlab = "x", fct = "rbeta", n, , , , a, b) Beta−Verteilung mit a = 5, b = 2 0.4 0.6 0.8 600 1.0 0.3 0.4 0.5 0.6 0.7 0.8 0.9 3 Terme, sk = 0.509 5 Terme, sk = 0.642 0 200 Frequency 200 1.0 500 x 400 x 0 0.5 0.6 0.7 0.8 0.9 0.4 0.5 0.6 0.7 0.8 0.9 x 30 Terme, sk = 0.796 300 Terme, sk = 0.618 0 Frequency 0 400 x 300 600 0.4 200 Frequency 0.2 Frequency 300 0 200 Frequency 500 2 Terme, sk = 0.392 0 Frequency Dichte+Funktion, sk = 0.230 0.60 0.65 0.70 x 0.75 0.80 0.68 0.70 0.72 0.74 x 2009−02−17, 17:40:59 Abbildung 4.4: Die Summe von 1, 2, 3, 5, 30, und 300 Realisationen von n=10000 Ziehungen aus der Betaverteilung in [0, 1] mit α = 5, β = 2. 49 4 Etwas Theorie > n <- 10000 > a <- 1 > pl(paste("Exponential distribution with lambda = ", a, + sep = ""), xlab = "x", fct = "rexp", n = n, , , , + a) Exponential distribution with lambda = 1 2 4 6 8 0 1 2 3 4 5 3 Terme, sk = 0.937 5 Terme, sk = 0.830 0 200 Frequency 200 6 500 x 400 x 0 1 2 3 4 0.0 0.5 1.0 1.5 2.0 2.5 3.0 x 30 Terme, sk = 0.676 300 Terme, sk = 0.674 Frequency 0 200 0 600 x 400 0 300 Frequency 0 Frequency 400 0 Frequency 400 800 2 Terme, sk = 1.323 0 Frequency Dichte+Funktion, sk = 2.165 0.6 0.8 1.0 1.2 x 1.4 1.6 1.8 0.8 0.9 1.0 1.1 1.2 x 2009−02−17, 17:41:01 Abbildung 4.5: Die Summe von 1, 2, 3, 5, 30, und 300 Realisationen von n=10000 Ziehungen aus der Exponentialverteilung mit λ = 1. 50 4.3 Verteilungen > > > > + n <- 2000 a <- 0 b <- 1 pl(paste("Standard Cauchy distribution", sep = ""), xlab = "x", fct = "rcauchy", n = n, , , , a, b) Standard Cauchy distribution 2000 4000 6000 250 8000 −6000 −4000 −2000 0 3 Terme, sk = 36.851 5 Terme, sk = 14.945 0 100 Frequency 100 250 x 250 x 0 −2000 −1000 0 1000 −500 −100 0 100 30 Terme, sk = 32.703 300 Terme, sk = 36.730 Frequency 100 0 500 1000 x 2000 250 x 250 x 0 −1000 −300 0 100 Frequency 0 Frequency 100 0 100 Frequency 250 2 Terme, sk = 49.882 0 Frequency Dichte+Funktion, sk = 53.692 0 500 1500 2500 x 2009−02−17, 17:41:03 Abbildung 4.6: Die Summe von 1, 2, 3, 5, 30, und 300 Realisationen von n=2000 Ziehungen aus der StandardCauchy-Verteilung mit x0 = 0, γ = 1. Median und Mode sind immer 0. 51 4 Etwas Theorie > > > > + + n <- 10000 a <- 0 b <- 1 pl(paste("Normalverteilung mit Mittel = ", a, ", var = ", b, sep = ""), xlab = "x", fct = "rnorm", n, , , , a, b) Normalverteilung mit Mittel = 0, var = 1 −2 0 2 500 4 −2 −1 0 1 2 3 Terme, sk = 0.728 5 Terme, sk = 0.842 0 200 Frequency 300 3 400 x 600 x 0 −1 0 1 2 −1 0 1 x 30 Terme, sk = 0.797 300 Terme, sk = 0.691 0 Frequency 0 2 600 x 200 400 −2 300 Frequency −4 Frequency 200 0 200 Frequency 400 2 Terme, sk = 0.801 0 Frequency Dichte+Funktion, sk = 0.744 −0.6 −0.2 0.2 x 0.4 0.6 0.8 −0.2 −0.1 0.0 0.1 0.2 x 2009−02−17, 17:41:05 Abbildung 4.7: Die Summe von 1, 2, 3, 5, 30, und 300 Realisationen von n=10000 Ziehungen aus der Normalverteilung N (0, 1). 52 4.3 Verteilungen 4.3.4 Die allgegenwärtige Normalverteilung: Warum ist sie so "normal"? Der zentrale Grenzwertsatz. Im vorangehenden Kapitel haben wir mit verschiedenen verschiedene Verteilungen experimentiert, um ihr Verhalten in Bezug auf den Zentralen Grenzwertsatz zu untersuchen. Dieser sagt aus: Satz 1. Der Durchschnitt aus unabhängigen Ziehungen aus ein und derselben Verteilung mit endlicher Varianz tendiert mit wachsendem Umfang zu einer Normalverteilung. Warum das so ist, untersuchen wir mit Hilfe der Binomialverteilung als Modell für die Summierung, und die Division durch die Anzahl der Elemente vernachlässigen wir. Die gezogenen Zufallsvariablen (sie sind Bernoulli-verteilt) sind die gröbste Näherung für eine Variable mit endlicher Varianz, nämlich eine Bernoulli-Variable mit unspezifizierter Wahrescheinlichkeit p für Erfolg. Betrachtet man die Form (der Verteilungsfunkton, d.h. des Histogramms) der Binomialverteilung, Abb. 4.1 , so hat sie einen schönen runden Gipfel. Um diese Form zu beschreiben, benötigen wir eine geeignete Beschreibung für die Gestalt der Verteilungsfunktion in der Umgebung des Gipfels und einen Grenzüberggang. http://mathforum.org/library/drmath/view/56600.html Gegeben sei eine Variable mit den Werten k, 2k, 3k, ..., nk mit den Wahrscheinlichkeiten gegeben durch die Binomialverteilung. Dann sind der Mittelwert m = npk und die Varianz s2 = npqk 2 . Wir nehmen an: n r n−r (4.8) y := PrhAuftreten von rki = p q r n 0 (4.9) y := PrhAuftreten von (r + 1)ki = pr+1 q n−r−1 r+1 Dann sind: y0 − y = = n n r n−r pr+1 q n−r−1 − p q r+1 r n! pr q n−r−1 [(n − r)p − (r + 1)q] (r + 1)!(n − r)! Und: (4.10) y0 − y y = np − r(p + q) − q np − r − q = (r + 1)q (r + 1)q Sei: x := rk − npk (4.11) der Abstand gemessen vom Mittelwert. Dann sind r + 1 = xk + np + 1 und k(r + 1) = x + k + npk. Multiplikation von Zähler und Nenner der rechten Seite der Gleichung (4.10) mit k 2 und Substitution im Nenner von (np − r)k = −x: y0 − y y (4.12) = = (np − r)k − qk [x + k + npk]qk (−x − kq)k npqk 2 + (x + k)qk 53 4 Etwas Theorie Wir setzen nun k =: dx, so dass y 0 − y =: dy und lassen lim k → 0 und lim n → ∞ so, dass nk 2 endlich s2 bleibt =: pq . Gleichung (4.12) kann dann geschrieben werden als: dy [−x − qdx] dx = 2 y s + (x + dx)q dx (4.13) Mit lim dx → 0 wir dies dy y = −xdx . s2 Integration liefert: ln y = (4.14) −x2 + constant 2s2 x2 y = Ae− 2s2 Integration von −∞ to +∞ liefert die Fläche unter der Kurve g = y(x), und wir wählen die Konstante A so, dass die Fläche gleich 1 wird. Siehe auch: Algebraic Integration of Standard Normal Distribution Function http://mathforum.org/library/drmath/view/53628.html Wir erhalten 1 A= √ , s 2π und damit die Formel für die Verteilungsfunktion für die Normalverteilung ( pdf = probability distribution function): (4.15) x2 1 pdf (x) = √ e− 2s2 s 2π 4.4 Der Zusammenhang zwischen Normal-, t- und Cauchy-Verteilung Die Cauchy-Verteilung ist identisch mit der t1 -Verteilung und hat ’dicke’ Schwänze, so dass Mittelwert und alle höheren Momente nicht definiert sind und daher nicht eindeutig berechnet werden können. Die Annäherung der t-Verteilung mit wachsendem Freiheitsgrad an die Normalverteilung ist aus Abb. 4.8 ersichtlich, die Konvergenz der 95%-Grenzen aus Tab.4.3: > > > > + > > > > > > > > > 54 part <- c(Inf, 25, 10, 6, 3, 2, 1) rp <- rev(part) lab <- c("Normal", paste("t_", part[-1], sep = "")) colr <- c("black", "blue", "green", "magenta", "red", "black", "black") ltyp <- c(1, 3, 2, 4, 5, 6, 1) lwdp <- c(1, 3, 3, 2, 1, 1, 1) par(mfrow = c(1, 1)) pc <- c(0.025, 0.975) prc <- matrix(0, nrow = length(rp), ncol = 2) prc[1, ] <- q <- qnorm(pc) q <- c(q[1], NA, q[2]) d <- dnorm(q) * 1.4 zus <- d[1] - dt(q[1], df = rev(part)[1]) 4.4 Der Zusammenhang zwischen Normal-, t- und Cauchy-Verteilung > ctn <- function() { + curve(dnorm(x, mean = 0, sd = 1), from = -5, to = 5, + xlim = c(-5, 5), ylim = c(0, 0.5), lty = ltyp[1], + lwd = lwdp[1], col = colr[1], ylab = "Dichte") + lines(rep(q, rep(2, length(q))), c(0, d[1], 0, d[2], + 0, d[3]), lty = ltyp[1], lwd = lwdp[1], col = colr[1]) + for (ii in seq(along = lwdp)[-1]) { + df <- part[ii] + curve(dt(x, df = df), from = -5, to = 5, xlim = c(-5, + 5), ylim = c(0, 0.5), lty = ltyp[ii], lwd = lwdp[ii], + col = colr[ii], ylab = "", add = TRUE) + prc[ii, ] <- q <- qt(pc, df) + q <- c(q[1], NA, q[2]) + d <- dt(q, df = rev(part)[1]) + zus + lines(rep(q, rep(2, length(q))), c(0, d[1], 0, + d[2], 0, d[3]), lty = ltyp[ii], lwd = lwdp[ii], + col = colr[ii]) + } + curve(x - x, from = -5, to = 5, xlim = c(-5, 5), + ylim = c(0, 0.5), ylab = "", add = TRUE) + legend(2.8, 0.48, cex = 1, lty = ltyp, lwd = lwdp, + legend = lab, col = colr, merge = TRUE) + } Tabelle 4.3: Vertrauensintervalle von t-Verteilungen. ∞ bedeutet Standard-Normalverteilung, ν = Freiheitsgrade; ν 6 Varianz = ν−2 , ν > 2; Schiefe = 0, ν > 3; Kurtosis = ν−4 ,ν >0 ν 1 2 3 6 10 25 ∞ 2.5% 0.000 0.000 0.000 0.000 0.000 0.000 -1.960 97.5% 0.000 0.000 0.000 0.000 0.000 0.000 1.960 55 4 Etwas Theorie 0.5 > ctn() 0.0 0.1 0.2 Dichte 0.3 0.4 Normal t_25 t_10 t_6 t_3 t_2 t_1 −4 −2 0 2 4 x Abbildung 4.8: Annäherung der t-Verteilung an die Normalverteilung, zweiseitige 95%-Intervalle für alle Kurven, ausser für t1 = Cauchyverteilung. 56 4.5 Zufallsexperimente mit Schiefe und Kurtosis Die t-Verteilung ist besonders für kleine Freiheitsgrade weniger hoch und hat dickere Schwänze als die Standard-Normalverteilung N (0, 1), und zwar umso mehr, je kleiner der Freiheitsgrad. Ihre Kurtosis ist also grösser als 0. Die Annäherung an N (0, 1) ist bei df = 12 schon sehr gut, bei 25 praktisch ununterscheidbar. Wir formulieren daher die folgende Faustregel 3. Ein Mittelwert aus mindestens 12 Werten, die aus einer symmetrischen Verteilung stammen, verhält sich praktisch normalverteilt, 30 Werte genügen praktisch unabhängig von der Verteilung der Einzelwerte, Ausnahmen: "pathologische"Verteilungen mit nicht definierten Momenten: Mittelwert, Varianz,. . . . 4.5 Zufallsexperimente mit Schiefe und Kurtosis Jede Ausführung liefert die Schiefe von n standard-normalverteilten Zufallszahlen und die Irrtumswahrscheinlichkeit, dass sie nicht 0 ist (t-Test), siehe Crawley, The R Book, p.285, 288. Siehe Abb. 4.9. > > > + + + + > NN <- 8 sk1 <- pr1 <- numeric(NN) for (ii in 1:NN) { n <- 10000 sk1[ii] <- skew(rnorm(n)) pr1[ii] <- 1 - pt(abs(sk1[ii]) * sqrt(n/6), n - 1) } (cbind(sk1, pr1)) [1,] [2,] [3,] [4,] [5,] [6,] [7,] [8,] > > > + + + + > sk1 -0.02696111 -0.01677571 -0.01596372 0.00250657 -0.05127838 -0.00940813 0.00181833 0.02058889 pr1 0.1355307 0.2467223 0.2572997 0.4592483 0.0181679 0.3504617 0.4704133 0.2003134 NN <- 6 sk2 <- pr2 <- numeric(NN) for (ii in (1:NN) + 1) { n <- 10^ii sk2[ii] <- skew(rnorm(n)) pr2[ii] <- 1 - pt(abs(sk2[ii]) * sqrt(n/6), n - 1) } (cbind(sk2, pr2)) [1,] [2,] [3,] [4,] [5,] [6,] [7,] sk2 0.00000e+00 2.19236e-01 8.39024e-02 -4.62193e-02 8.39051e-04 -6.88580e-04 -3.60538e-06 pr2 0.0000000 0.1864719 0.1394959 0.0296016 0.4568706 0.3893124 0.4981431 57 4 Etwas Theorie 0.5 > plot(abs(sk1), pr1, xlim = range(abs(c(sk1, sk2))), ylim = range(abs(c(pr1, + pr2))), xlab = "Schiefe", ylab = "P(Schiefe <> 0)") > points(abs(sk2), pr2, pch = as.character(seq(along = sk2))) 7 ● 0.4 5● 6 0.3 ● ● 0.2 P(Schiefe <> 0) ● ● 2 3 0.0 0.1 ● 4● 1 0.00 0.05 0.10 0.15 0.20 Schiefe Abbildung 4.9: [Wahrscheinlichkeiten, dass die Schiefe von normalen Zufallszahlen verschieden von Null ist. Kreise bezeichnen verschiedene Ziehungen von je n = 10000 Zufallszahlen, Zahlen stehen für k in Stichproben von je n = 10k . Dasselbe für Kurtosis, aber nur die Zahlen. > > > + + + + + > NN <- 8 ku1 <- pk1 <- numeric(NN) for (ii in 1:NN) { n <- 10000 ku1[ii] <- kurtosis(rnorm(n)) pk1[ii] <- 1 - pt(abs(ku1[ii]) * sqrt(n/24), n 1) } (cbind(ku1, pk1)) ku1 pk1 [1,] -0.02245706 0.3233365 [2,] -0.05700091 0.1223219 [3,] -0.09603213 0.0249973 58 4.5 Zufallsexperimente mit Schiefe und Kurtosis [4,] 0.00401537 0.4673387 [5,] 0.04300680 0.1900170 [6,] 0.00149141 0.4878570 [7,] -0.08729225 0.0374024 [8,] 0.00943093 0.4236741 > > > + + + + + > NN <- 6 ku2 <- pk2 <- numeric(NN) for (ii in 1:NN) { n <- 10^ii ku2[ii] <- kurtosis(rnorm(n)) pk2[ii] <- 1 - pt(abs(ku2[ii]) * sqrt(n/24), n 1) } (cbind(ku2, pk2)) ku2 pk2 [1,] -1.365708454 0.2004722 [2,] -0.143035981 0.3854599 [3,] 0.068551009 0.3291135 [4,] -0.087347746 0.0373101 [5,] 0.007828091 0.3066742 [6,] 0.000223579 0.4817995 Beide Grössen sind mehrheitlilch nicht von Null verschieden. 59 4 Etwas Theorie 60 5 Schliessende Statistik 5.1 Ziel Die schliessende Statistik will mit Hilfe Stichproben "gesicherte" Aussagen über vermutete Zusammenhänge in einer Grundgesamtheit, GG, machen. Gesichert soll heissen, dass wir uns damit abfinden, nur genäherte Aussagen machen zu können, dafür aber eine Irrtumswahrscheinlichkeit angeben können, mit der unsere Aussagen "im Durchschnitt" als falsch zu erwarten sind. Unter einer Grundgesamtheit versteht man die Gesamtheit aller Elemente, die man in einer statistischen Untersuchung betrachten möchte. Die Elemente bestehen vielleicht selbst wieder aus Unterelementen, aber dies soll in diesem Zusammenhang bedeutungslos sein. Eine Stichprobe, SP, ist eine Auswahl von Elementen aus der Grundgesamtheit. 5.2 Voraussetzungen Es lässt sich zeigen, dass unter folgenden wünschbaren Voraussetzungen eine geeignete Schätzung besonders günstige Eigenschaften besitzt: • Jedes Element der Grundgesamtheit hat dieselbe Chance, erfasst zu werden, Repräsentativität, vgl. Abb. 5.1. • Die Schätzgrösse soll keinen oder einen möglichst kleinen systematischen Fehler haben, Erwartungstreue. • Je mehr Elemente der GG in die SP aufgenommen werden, desto besser soll die Annäherung der Schätzgrösse an die wahre gesuchte Grösse sein, Konsistenz. • Schon für kleine Stickprobenumfänge soll die Schätzgrösse möglichst kleine Streuung haben, Effizienz. • Alle Information aus der Stichprobe soll genutzt werden, Suffizienz. Anekdote von der gepressten Kluppe. 61 5 Schliessende Statistik Abbildung 5.1: Ungleiche Erfassungswahrscheinlichkeiten durch Einzugsgebiete. Punkte in kleinen Einzugsgebieten haben eine kleinere Erfassungswahrscheinlichkeit als solche in grossen. 62 5.3 Methoden 5.3 Methoden Wie man bei der Beschäftigung mit der Wahrscheinlichkeitsrechnung feststellen kann, führt die tägliche Erfahrung kaum zu einer logisch korrekten Auseinandersetzung mit zufälligen Ereignissen. Da wir alle dazu neigen, die Dinge durch unsere Brille zu sehen, führen Aussagen der Statistik leicht zu Missverständnissen. Wofür der Vollmond verantwortlich sein soll: http://skepdic.com/fullmoon.html. Die einzelnen Schritte zur Erarbeitung einer überprüfbaren statistischen Aussage müssen daher sehr sorgfältig formuliert werden. Diese Schritte umfassen: • Problembeschreibung, • Formulierung der zu prüfenden Hypothese, • Berechnung der Testgrösse, • Vergleich der Testgrösse mit der zugehörigen theoretischen Verteilung und Interpretation, • Interpretation der Relevanz des Ergebnisses. 5.3.1 Problembeschreibung In der Problembeschreibung werden alle für die statistische Analyse wichtigen Tatsachen und Grundannahmen festgehalten. Ganz wesentlich dabei sind • die Definition der Grundgesamtheit und deren Elemente, • die Annahme, die man über die Verteilung der (Werte der) Elemente trifft. Der erste Punkt (Grundgesamtheit, Elemente) scheint trivial zu sein. Oft wird aber übersehen, dass erst die Beschränkung auf gröbere Einheiten eine sinnvolle Aussage möglich macht. Beispiel: Die Höhen von Bäumen werden zu mehreren Zeitpunkten gemessen. Dabei werden den Bäumen verschiedene "Behandlungen" am Standort bei der Pflege zuteil. Problem: Sollen nur die "Endhöhen" massgebend sein, sollen es die Höhen zu jedem Zeitpunkt oder die gesamten Verläufe sein, eingeteilt in brauchbare Gruppen? In der Statistik sind Aussagen nur möglich mit dem (meist unterdrückten Zusatz) Zusatz: "Die Aussage gilt mit einer Wahrscheinlichkeit von 95%" (der am meisten gewählte Wert), oder gleichbedeutend: "Diese Aussage gilt mit einer Irrtums-Wahrscheinlichkeit von 5%". Je mehr man über die Verteilung der Grundgesamtheit im Voraus weiss, desto schärfere statistische Aussagen sind später möglich, d.h. desto enger sind die Fehlerschranken für die gewünschten Grössen. Wegen der Variabilität der gesuchten Grössen hat dieser Gewinn doch seine Grenzen. Es ist also sehr nützlich, vorhandene Information kritisch zu sichten. Liegt nur spärliche oder gar keine vor, so versucht man, sie in einem Vorversuch bzw. einer Vorerhebung zu gewinnen, oder man weicht auf die Methoden der verteilungsfreien, sogenannten "robusten" Tests aus. Letztere können jedoch naturgemäss nicht so scharfe Aussagen machen, wie solche mit Verteilungsannahmen. 5.3.2 Formulierung der zu prüfenden Hypothese Die zu prüfende Hypothese muss genau formuliert werden, z.B. • Der Mittelwert ist grösser als (kleiner als, verschieden von) eine(r) vorgegebene Zahl, • Eine bestimmte Verteilung mit festgelegten Parametern liegt vor, • Eine bestimmte Verteilung mit noch zu bestimmenden Parametern liegt vor, 63 5 Schliessende Statistik • Die Standardabweichung einer vorliegenden Verteilung ist grösser als ein vorgegebener Wert. Fragestellungen unterscheidet man: "grösser, kleiner" sind einseitige, "verschieden" ist eine zweiseitige. Im letzteren Fall soll eine Abweichung nach unten genauso interessieren wie eine nach oben. Bemerkung zu Hypothesen In der Statistik spricht man nicht gern vom "Beweisen" von Hypothesen. Wegen der Unsicherheit der Daten kann praktisch jedes Ergebnis von einer beliebigen Hypothese stammen, wenn auch sehr selten. Deshalb spricht man so: "Wir lehnen eine Hypothese mit der Irrtumswahrscheinlichkeit von 5% ab", "Wir lehnen eine Hypothese wegen der hohen Irrtumswahrscheinlichkeit von 25% nicht ab". Eine Hypothese kann mehrere Alternativen haben. Deshalb ist die Ablehnung einer Hypothese nicht gleichbedeutend mit der Annahme irgendeiner diese Alternativen. Es ist meist einfacher, das Nichtvorhandensein einer Eigenschaft nachzuweisen, als bei einer sehr grossen Menge von Individuen auf das Vorhandensein zu prüfen. Im ersten Fall genügt das Vorhandensein der Eigenschaft bei einem Individuum, um das Nichtvorhandensein zu verwerfen, im zweiten Fall muss man alle Individuen anschauen. 5.3.3 Berechnung der Testgrösse Zur vorliegenden Hypothese muss eine Testgrösse berechnet werden, eine geeignete Zahl, die die Abweichung von der Hypothese messen kann. Oft gibt es mehrere solche "Testgrössen", die sich darin unterscheiden, wie empfindlich sie auf die Verletzung von Voraussetzungen sind (empfindliche / robuste). Erstere benötigen meist (relativ) wenige, dafür gute Daten, letztere benötigen mehr Daten. Die empfindlichen Tests gehen vorwiegend von den Messwerten selbst aus, die robusten verwenden Ränge oder ähnliche Konstrukte. Ordnet man alle Messungen der Grösse nach, so bekommt die höchste Zahl den Rang "1", die nächsten "2", die niedrigste den Rang "N", das ist die Anzahl der Beobachtungen. Gleichen Zahlen gibt man gemeinsam den Durchschnitt ihres gemeinsamen Ranges. Zählt man von den Gruppen, die man unterscheiden will, die Ränge zusammen, so gibt die Anordnung der Rangsummen darüber Aufschluss, ob die Werte eher getrennt oder eher gemischt liegen. In der Praxis betrachtet man verschiedene Testgrössen, Tab. 5.1: Tabelle 5.1: Beispiele für Testgrössen Definition Rangsumme beabachtet t= p V ar(beobachtet) P RSi = Gruppei Ränge Chi-Quadrat χ2 = P (beabachtet − erwartet)2 erwartet Chi-Quadrat χ2Y = P (|beabachtet − erwartet| − 0.5)2 erwartet Fisher’s F F = Student’s t 64 s21 s22 Einsatzgebiete, Kap. () t-test, Mittelwertvergleich (5.4.1) Wilcoxon-Test, Mittelwertvergleich (5.4.2) Kontingenztafeln (5.5) Kontingenztafeln, Yates’ Korrektur für kleine Besetzungszahlen (5.5) Varianzanalyse (6), Tab. 6.1 5.4 Unterschied zweier Mittelwerte aus unabhängigigen Stichproben 5.3.4 Vergleich der Testgrösse mit der theoretischen Verteilung und Interpretation Jede Auswahl von Elementen für eine Stichprobe ist dem Zufall zu unterwerfen, und zwar in dem Sinn, dass jedes Element dieselbe Chance hat, in die Stichprobe aufgenommen zu werden, siehe Kap. 5.2. Sämtliche aus der Stichprobe erhobenen Grössen sind somit ebenfalls Zufallsgrössen. Mit Hilfe der Information über die Verteilung der Grundgesamtheit lässt sich ein Überblick über diejenigen Stichproben gewinnen, die mit dem abgefragten Modell, der behaupteten Eigenschaft, verträglich sind. Die am seltensten zu erwartenden Stichproben, so z.B. die 5%, 1% oder 0.1% extremsten Fälle, fasst man zum Ablehnungsbereich zusammen. 5.4 Unterschied zweier Mittelwerte aus unabhängigigen Stichproben Wir betrachten Baumhöhen der drei Standorte Alptal, Davos, und Lägern. > > > > > > > alp <- read.table("./Data/alptal.h", header = TRUE) dav <- read.table("./Data/davos.h", header = TRUE) lae <- read.table("./Data/laegern.h", header = TRUE) alp1 <- cbind(alp, loc = rep("a", nrow(alp))) dav1 <- cbind(dav, loc = rep("d", nrow(dav))) lae1 <- cbind(lae, loc = rep("l", nrow(lae))) dat <- rbind(alp1, dav1, lae1) Aus den Boxplots (Abb. 5.2) sieht man an sich schon, welche Unterschiede zwischen den Standorten bestehen. Wir wollen diese aber durch die Statistik bestätigen. 5.4.1 Der t-Test von Student Die Differenz x̄1 − x̄2 zwischen zwei Mittelwerten aus unabhängigigen Stichproben kann mit dem t-Test geprüft werden, wenn die Durchschnitte je aus mindestens 12 Werten gerechnet werden können (um gemäss Faustregel 3 die Normalität der Mittelwerte zu garantieren), und beide Grundgesamtheiten dieselbe unbekannte Varianz σ 2 aufweisen (das mag nicht immer zutreffen). Dann sind s21 und s22 unabhängige Schätzungen dafür. Eine genauere Schätzung für σ 2 bekommt man durch eine (quasi-)gewichtete Addition der beiden Werte: (N1 − 1)s21 + (N2 − 1)s22 s2 = . N2 + N2 − 1 Mit V ar(x̄1 − x̄2 ) = s2 · 1 1 + N1 N2 bekommen wir: > > > > > > > + mdav <- mean(dav$h) vdav <- var(dav$h) ndav <- length(dav$h) mlae <- mean(lae$h) vlae <- var(lae$h) nlae <- length(lae$h) vcmb <- ((ndav - 1) * vdav + (nlae - 1) * vlae)/(ndav + nlae - 1) 65 5 Schliessende Statistik > > > > vdif <- vcmb * (1/ndav + 1/nlae) tx <- (mdav - mlae)/sqrt(vdif) df <- ndav + nlae - 2 ptx <- pt(tx, df) x̄1 − x̄2 = t= p s V ar(x̄1 − x̄2 ) x̄1 − x̄2 r N1 · N2 N1 + N2 Die Zahl der Freiheitsgrade ist jetzt f = N1 + N2 − 2, da die beiden Grössen s21 und s22 geschätzt haben. In Zahlen (1: Davos, 2: Lägern): N1 = 40, N2 = 21 x̄1 = 22.178, x̄2 = 33.190, x̄1 − x̄2 = −11.013 s21 = 38.258, s22 = 122.459, s2 = 65.687 V ar(x̄1 − x̄2 ) = 4.770 t = −5.042, df = 59 Wir schliessen also aus der Irrtumswahrscheinlichkeit p-value von 0.00000, dass die Mittelwerte sehr signifikant verschieden sind. Mit dem internen t.test() erhalten wir > (tt <- t.test(dat$h[dat$loc == "d"], dat$h[dat$loc == + "l"])) Welch Two Sample t-test data: dat$h[dat$loc == "d"] and dat$h[dat$loc == "l"] t = -4.2271, df = 26.73, p-value = 0.0002462 alternative hypothesis: true difference in means is not equal to 0 95 percent confidence interval: -16.36123 -5.66472 sample estimates: mean of x mean of y 22.1775 33.1905 Da hier eine Modifikation des Tests verwendet wird, ist auch die Anzahl der Freiheitsgrade anders und sogar nicht-ganzzahlig. 5.4.2 Wilcoxon’s Rangsummentest Die umständlichen Rechnungen nimmt uns die eingebaute Funktion wilcox.test ab: > (wt <- wilcox.test(dat$h[dat$loc == "d"], dat$h[dat$loc == + "l"])) 66 5.5 Kontingenztafeln, Chi-Quadrat-Test Wilcoxon rank sum test with continuity correction data: dat$h[dat$loc == "d"] and dat$h[dat$loc == "l"] W = 165, p-value = 0.0001118 alternative hypothesis: true location shift is not equal to 0 Dieser Test ergibt dasselbe statistische Ergebnis, sein p-Wert ist sogar kleiner als der des vorangegangenen t-Tests. Falls gleiche Ränge (ties) gemeldet werden, ist das nicht von wesentlicher Bedeutung. 5.5 Kontingenztafeln, Chi-Quadrat-Test Will man die relative Häufigkeit von Merkmalen in Abhängigkeit von mehreren (kategoriellen) Faktoren analysieren, so bieten sich Kontingenztafeln an. Zum Zusammenhang zwischen Augenfarbe und Haarfarbe haben wir folgende Zahlen erhalten (Tab. 5.2): Tabelle 5.2: Augenfarbe und Haarfarbe. blonde Haare dunkle Haare Spaltensumme blaue Augen 38 14 52 braune Augen 11 51 62 Zeilensumme 49 65 114 Das einfachste Modell im Sinne von Occam ist, dass Augenfarbe und Haarfarbe unabhängig sind. Unter dieser Voraussetzung sind die erwarteten Häufigkeiten das Produkt der entsprechenden Wahrscheinlichkeiten und der Gesamtanzahl (Tab. 5.3): Um den Unterschied zwischen beobachteten und erwarteten HäufigTabelle 5.3: Erwartete Häufigkeiten. blonde Haare dunkle Haare Spaltensumme blaue Augen = 22.35 49 52 114 114 114 65 52 114 114 114 52 = 29.65 braune Augen = 26.65 49 62 114 114 114 65 62 114 114 114 62 = 35.35 Zeilensumme 49 65 114 keiten zu bewerten, bilden wir χ2 = (38 − 22.35)2 (11 − 26.65)2 (14 − 29.65)2 (62 − 35.35)2 + + + = 35.33 22.35 26.65 29.65 35.35 Die Anzahl Freiheitsgrade ist (Stufenzahl Augenfarbe -1)*(Stufenzahl Haarfarbe -1) = 1*1 = 1. Wir schliessen aus der extrem kleinen Irrtumswahrscheinlichkeit 1-pchisq(35.33,1)= 2.783e − 09, dass das beobachtete χ2 kaum für Unabhängigkeit spricht. Im Blick auf die Tabelle formulieren wir, dass blaue Augen vorwiegend mit blonden Haaren und braune Augen mit dunklen Haaren vorkommen. Die abweichenden Fälle machen einen Anteil von (11 + 14)/114 = 21.9% aus. Mit der Funktion chisq.test(): > (count <- matrix(c(38, 11, 14, 51), nrow = 2, byrow = TRUE)) 67 5 Schliessende Statistik [,1] [,2] [1,] 38 11 [2,] 14 51 > chisq.test(count) Pearson's Chi-squared test with Yates' continuity correction data: count X-squared = 33.112, df = 1, p-value = 8.7e-09 Yates’ Korrektur, s. Tab. 5.1, wird hier standardmässig verwendetIhr Einfluss ist eher gering hier, da die erwarteten Einträge einiges grösser sind als 10: χ2 = 68 (|38 − 22.35| − 0.5)2 (|11 − 26.65| − 0.5)2 (|14 − 29.65| − 0.5)2 (|51 − 35.35| − 0.5)2 + + + = 33.1159 22.35 26.65 29.65 35.35 5.5 Kontingenztafeln, Chi-Quadrat-Test opo <- options(warn = -1) boxplot(dat$h ~ dat$loc, names = c("Alptal", "Davos", "Laegern"), notch = TRUE, xlab = "Standort", ylab = "Hoehe in [m]") points(as.numeric(dat$loc), dat$h) options(opo) ● ● ● ● ● ● ● ● ● 40 > > + > > 35 ● 30 25 15 20 Hoehe in [m] ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● 10 ● ● ● ● ● ● ● Alptal Davos ● ● ● ● ● ● Laegern Standort Abbildung 5.2: Baumhöhen der Standorte, Punkte und Boxplots. Die schrägen, von den Medianen ausgehenden Kerben geben ihre angenäherte Vertrauensintervalle an. 69 5 Schliessende Statistik 70 6 Varianzanalyse, ANOVA Gemäss Übersicht in Kap.2 sind bei der Varianzanalyse alle erklärenden Variablen kategoriell. Sie wurde von R.A.Fisher (1890–1962) zur Planung und Auswertung von Feldversuchen in der Landwirtschaft entwickelt und erwies sich inzwischen als geeignetes Verfahren für viele andere Anwendungsbereiche. 6.1 Zweck der Varianzanalyse Die ANOVA (= Analysis Of VAriance) erlaubt es, genauere Aussagen über den Einfluss verschiedener Einflussgrössen zu machen, indem diese in systematischer Weise gleichzeitig verändert werden, als wenn diese einzeln verändert werden. Vorausgesetzt werden die Normalverteilung und die Gleichheit der Varianzen, damit sich Mittelwerte auf einfache Weise miteinander vergleichen lassen. Je nach Versuchsanordnung kann die Methode angepasst werden. 6.2 Einfache Varianzanalyse Die einfache Varianzanalyse wird verwendet, wenn auf Grund des Einflusses eines Faktors die Mittelwerte in verschiedenen Gruppen als verschieden vermutet werden. Sie ist die direkte Verallgemeinerung des Vergleichs zweier empirischer Mittelwerte normaler Grundgesamtheiten, siehe 5.4. Die Varianzanalyse ist empfindlich darauf, ob in allen Gruppen genügend Elemente gemessen wurden (n > 30), siehe Faustregel 3. Falls diese Voraussetzung verletzt ist, muss man bei der Interpretation vorsichtig sein. Es seien g Gruppen gegeben, die mit i = 1, . . . , g nummeriert seien. In der Gruppe mit der Nummer i seien die Ni Messwerte xik , k = 1, . . . , Ni erhoben worden. Das Modell der einfachen Varianzanalyse wird so formuliert: xik = µ + ai + ik Die einzelnen Messwerte werden also als eine Summe aus den drei Termen aufgefasst: xik = µ + ai + ik (6.1) Die individuellen Messungen werden als Summe von drei Termen dargestellt: (6.2) µ = gemeinsamer Mittelwert aller Gruppen, (6.3) ai = konstanter Zusatz für die Gruppe i, (6.4) ik = zufälliger Fehler, normalverteilt aus N (0, σ 2 ) Hier heisst "Fehler"nicht "falsch", sondern unerklärter Rest. In diesem Zusammenhang definieren wir die Modellwerte, predicted value, als die rechte Seite von 6.1 ohne den Fehlerterm: x̂i = µ + ai und die Residuen als die Differenzen rik = xik − x̂i 71 6 Varianzanalyse, ANOVA Obwohl formal rik = ik ist, erfüllen beide verschiedene Zwecke. Die ik werden postuliert als zu einer spezifischen Verteilung gehörig, meist der Normalverteilung. Die rik hängen hingegen von den berechneten Modellwerten a ab. Natürlich sollte man nachtr"glich kontrollieren, dass die rik angenähert der postulierten Verteilung für die ik folgen. Man bildet für jede Gruppe das Gruppenmittel x̄i. und für alle Gruppen das Gesamtmittel x̄.. . (Man setzt einen Punkt in demjenigen Index, über den summiert wird.) Sodann berechnet man die Varianz s2I ("I" für i nnerhalb der Gruppen) Pg PNi (xik − x̄i. )2 2 sI = i=1 k=1 N −g stellt die Varianz der Punkte xik in Bezug auf ihre jeweiligen Gruppenmittel x̄i. dar. Die Varianz s2Z ("Z" für zwischen den Gruppen) wird berechnet als Pg Ni (x̄i. − x̄.. )2 2 sZ = i=1 . g−1 Die Gesamtvarianz ist s2T (6.5) Pg = i=1 PNk k=1 (xik − x̄.. )2 N −1 Die Testgrösse Fx = s2Z s2I beschreibt, wie stark sich die Varianz zwischen den Gruppen von derjenigen innerhalb der Gruppen unterscheidet. Wenn die Überschreitungswahrscheinlichkeit für das beobachtete Fobs grösser zu sein als F kleiner ist als 5%, so wird man die Verschiedenheit zwischen den Gruppen nicht ablehnen, sie ist signifikant. Beispiel: Baumhöhen in Davos, Alptal und auf den Lägern in [m]. Für Modellspezifikationen s. Kap. 7.3. > > > > xmg <- c(mean(alp$h), mean(dav$h), mean(lae$h)) modh1 <- lm(h ~ 1, data = dat) modh2 <- lm(h ~ loc, data = dat) summary(modh1) Call: lm(formula = h ~ 1, data = dat) Residuals: Min 1Q -17.231 -6.631 Median 0.169 3Q 4.569 Max 17.769 Coefficients: Estimate Std. Error t value Pr(>|t|) (Intercept) 24.831 0.875 28.4 <2e-16 Residual standard error: 8.79 on 100 degrees of freedom > summary(modh2) 72 6.2 Einfache Varianzanalyse Call: lm(formula = h ~ loc, data = dat) Residuals: Min 1Q Median -25.59 -4.68 1.62 3Q 6.00 Max 13.32 Coefficients: Estimate Std. Error t value Pr(>|t|) (Intercept) 23.095 1.223 18.89 < 2e-16 locd -0.918 1.729 -0.53 0.6 locl 10.095 2.084 4.84 4.7e-06 Residual standard error: 7.73 on 98 degrees of freedom Multiple R-squared: 0.242, Adjusted R-squared: 0.226 F-statistic: 15.6 on 2 and 98 DF, p-value: 1.28e-06 > > > > > > anov12 <- anova(modh1, modh2) SSQ <- c(anov12$"Sum of Sq"[2], anov12$RSS[2:1]) names(SSQ) <- c("Z", "I", "T") Df <- c(anov12$Df[2], anov12$Res.Df[2:1]) names(Df) <- names(SSQ) s2 <- SSQ/Df Zur Demonstration der Komplexität eines Objekts der Klasse "lm" führe man aus: R> str(modh1); str(modh2). Die Irrtumswahrscheinlichkeit, dass die mittlere Höhe h unabhängig ist vom Standort loc, beträgt 0.0000, ist also wesentlich kleiner als 5%. Also verwerfen wir die Annahme, dass alle Standorte dieselbe mittlere Höhe haben. Mindestens eine sticht heraus, aber welche? Diese Frage können wir mit der Varianzanalyse allein nicht beantworten, siehe dazu Kap. 6.5. Aus der Zeit vor dem Computer stammt die Darstellung der Varianzanalyse in Tabellenform. Sie geht von den anschaulichen Grössen SSQ aus, "Quadratsummen" genannt (genauer wäre SSumme der quadrierten Abweichungen"): (6.6) SSQT = g X Ni X (xik − x̄.. )2 , Freiheitsgrad = N − 1 i=1 k=1 (6.7) (6.8) SSQZ SSQI = = g X Ni (x̄i. − x̄.. )2 , Freiheitsgrad = g − 1 i=1 g X Ni X (xik − x̄i. )2 , Freiheitsgrad = N − g i=1 k=1 SSQT setzt sich also additiv aus SSQZ und SSQI zusammen ("Varianz"-Zerlegung). Das ist so, weil sich bei (xik − x̄.. )2 = ({xik − x̄i. } + {x̄i. − x̄.. })2 die doppelten Produkte wegen der Definition der entsprechenden Mittelwerte x̄i. und x̄.. wegheben. 73 6 Varianzanalyse, ANOVA Tabelle 6.1: Einfache ANOVA, DF = Anzahl Freiheitsgrade zwischen innerhalb total SSQ DF SSQ F p SSQZ g−1 s2Z s2Z /s2I p 1869.7 2 934.8 15.64 0.0000 SSQI N −g s2I 5859.4 98 59.8 SSQT N −1 7729.1 100 In R bekommen wir die leicht abgeänderte Form > anov12 Analysis of Variance Table Model 1: Model 2: Res.Df 1 100 2 98 h ~ 1 h ~ loc RSS Df Sum of Sq F Pr(>F) 7729 5859 2 1870 15.64 1.28e-06 Abb. 5.2 stellt die Punkte und die Kistendiagramme (box plots) der drei Standorte dar. In Abb. 6.2, 2. Bild, sieht man, dass alle Resuduen zusammengenommen mit einer Irrtumswahrscheinlichkeit von knapp über 5% (3. Bild) recht gut einer Normalverteilung folgen. Von den Gruppengrössen 40, 40 und 21 ist nur die von Lägern etwas kleiner als 30, So ist die Faustregel 3 für die Normalität der Verteilungen der Mittelwerte leidlich erfüllt. Diagnostische Plots für Lineare Modelle lm, Fig 6.2 74 6.2 Einfache Varianzanalyse > > > + > + > + > + plot(dat$h, xlab = "Index", ylab = "Hoehe in [m]", col = as.numeric(dat$loc)) abline(mean(dat$h), 0) lines(range(which(dat$loc == "a")), rep(mean(dat$h[dat$loc == "a"]), 2), col = 1) lines(range(which(dat$loc == "d")), rep(mean(dat$h[dat$loc == "d"]), 2), col = 2) lines(range(which(dat$loc == "l")), rep(mean(dat$h[dat$loc == "l"]), 2), col = 3) for (ii in seq(along = dat$h)) lines(c(ii, ii), c(mean(dat$h), dat$h[ii]), col = as.numeric(dat$loc)) 40 ● 35 ● ● ● ● ● ● 25 30 ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ●● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● 15 ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● 20 Hoehe in [m] ● ● ● ● ●● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● 10 ● ● 0 ● ● ● ● ● ● 20 40 ● 60 80 100 Index Abbildung 6.1: Baumhöhen der Standorte Alptal, Davos, Lägern (von links nach rechts), entsprechende Mittelwerte (horizontale Linien) und Residuenzerlegung (vertikale Linien). 75 6 Varianzanalyse, ANOVA > > > + > > op <- par(mfrow = c(3, 3)) plot(modh2, which = 1:2) T3plot(residuals(modh2), lab = "T3-plot der Residuen", legend.pos = "top") plot(modh2, which = 3:6) par(mfrow = op) ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● 22 26 30 0.20 20 0 −20 2 −1.0 0.0 0.5 1.0 Theoretical Quantiles t Cook's distance Residuals vs Leverage 100 89 91 0.10 ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● 1 0.00 1.0 ● 100 ● 89 91 Cook's distance Scale−Location 0.0 Standardized residuals Fitted values 0 T3 1 −2 0 Fitted values 20 40 60 80 Obs. number 2 30 ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● 0 26 5% 1% −2 22 ● ● ● ● ● ● ● ● ● ● ● ● 89 91 Cook's distance ● 100 −4 ● 89 91 ● 100 ●●●●●●● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● 91●● 89 ● 100 Standardized residuals ● ● −1 ● ● ● ● ● ● ● ● Normal Q−Q −3 10 −10 ● ● ● ● ● ● ● ● ● ● ● ● ● ● −30 Residuals ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● Standardized residuals T3−plot der Residuen Residuals vs Fitted 0.00 0.02 0.04 Leverage 0.20 3.53 2.5 2 ● 100 ● 89 91 ● 1.5 0.10 0.00 Cook's distance "Cook's dist vs Leverage " * h[ii]/(1 − h[ii]) ● ● ● ● ● ● ● ● ● ● ● ● 1 0.5 0 0.0250000000000000 Leverage hii Abbildung 6.2: (Von oben nach unten, links nach echts) a) Residuals vs Fitted, "Tukey-Anscombe-Plot", b) Normal Q-Q-Plot, die Winkelhalbierende ist der ideale Ort für normalverteilte Residuen, c) T3-Plot, s. Kap. 6.3, d) standardisisierte Residuen (die Residuen werden so skaliert, dass ihre Standardabweichung gleich Eins wird) über Fitted, e) Cook’s distance gibt ein Mass für den Einfluss jeder einzelnen Messung, "leave one out", f) Leverage ist der Einfluss eines Datenpunktes durch seine Lage weit entfernt vom Schwerpunkt, g) Cook’s distance vs Leverage, haben die beiden Grössen etwas miteinander zu tun? (Leider sind Titel und Achsen nicht richtig skaliert) 76 6.3 Bemerkungen zum T3-plot vs. Normal Q-Q Plots Bemerkungen: Hebelwirkung (Leverage), zeigt den relativen Einfluss eines einzelnen Punktes xi in der x-Richtung: (6.9) hi = (xi − x̄)2 1 + Pn 2 n k=1 (xk − x̄) Eine gute Faustregel sagt, dass ein Punkt einen sehr starken Einfluss hat, wenn hi > 2p n ist, wobei p die Anzahl Parameter im Modell ist. Cook’s Distance: s (6.10) Ci = |r(i) | n − p hi p 1 − h1 Dabei ist r(i) dasjenige Residuum, das der Punkt xi hat, wenn man dasselbe Modell an alle Punkte mit Ausnahme dieses betrachteten Punktes anpasst. 6.3 Bemerkungen zum T3-plot vs. Normal Q-Q Plots Der Normal-Q-Q-Plot mit qqnorm gibt einen groben Eindruck, wie gut die Daten einer Normalverteilung folgen. Man benötigt jedoch Erfahrung, um diese Art der Darstellung zu beurteilen, siehe norm.test {asuR}. Von S.Ghosh (1996) wurde eine grafische Methode entwickelt, die auf der erzeugenden Funktion einer Verteilung basiert. Sie kann für einen Datensatz die Konfidenzintervalle aufzeichnen, dass er normalverteilt ist, s. T3plot {cwhmisc}. Dieses Hilfsmittel ist leichter zu interpretieren als der Q-Q-Plot. 6.4 Mehrfache Varianzanalyse Bei der mehrfachen Varianzanalyse betrachtet man mehrere Faktoren, deren Einfluss auf die Zielgrösse additiv sein soll. Das Modell für die zweifachen ANOVA wird so formuliert: xijk = µ + ai + bj + cij + ijk So schreibt man growth ~ diet + coat + diet : coat oder kürzer growth ~ diet * coat wobei der *-Operator bedeutet "alle Haupteffekte (ai und bj ) und ihre Wechselwirkungen (cij )", und der Doppelpunkt bedeutet "Wechselwirkung zwischen". Weitere Operatoren in linearen Modellen werden in Kap.7.3 besprochen. > fact <- read.table("./Data/factorial.txt", header = TRUE) > names(fact) [1] "growth" "diet" "coat" > fact 77 6 Varianzanalyse, ANOVA 1 2 3 4 5 6 7 8 9 10 11 12 growth diet coat 6.6 A light 7.2 A light 6.9 B light 8.3 B light 7.9 C light 9.2 C light 8.3 A dark 8.7 A dark 8.1 B dark 8.5 B dark 9.1 C dark 9.0 C dark > model <- aov(growth ~ diet * coat, data = fact) > summary(model) diet coat diet:coat Residuals Df 2 1 2 6 Sum Sq Mean Sq F value Pr(>F) 2.6600 1.3300 3.677 0.0907 2.6133 2.6133 7.226 0.0361 0.6867 0.3433 0.949 0.4383 2.1700 0.3617 6.5 Multiples oder paarweises Testen Die Varianzanalyse sagt uns, ob mindestens eine Gruppe verschieden von den übrigen ist, sie sagt uns aber nicht, welche der Gruppen verschieden ist. Paarweise Tests bieten sich an, aber es gibt zwei Punkte zu bedenken. Die Anzahl der Vergleiche aller Gruppen gegen alle steigt quadratisch mit der Anzahl n der Gruppen, Tab. 6.2. Tabelle 6.2: Anzahl Vergleiche 2 1 3 3 4 6 5 10 10 45 20 190 n − 1) n 2 (n Multiple Vergleiche verringern die Trennschärfe jedes einzelnen Tests. Man argumentiert so: Eine Irrtumswahrscheinlichkeit von p = 5% bedeutet, dass durchschnittlich jeder 20-te Test an Daten aus derselben Grundgesamtheit zur Verwerfung der Nullhypothese führt, obwohl sie zutrifft. Um die globale Irrtumswahrscheinlichkeit (die "family wise error rate") p bei k Tests zu erzwingen, muss jeder Einzeltest auf einem geringeren Niveau als p durchgeführt werden. Das konservativste Vorgehen wählt p/k, genannt nach Bonferroni. Man kann jedoch mit weniger strikten Niveaus durchkommen, nämlich mitp/k, p/(k − 1), p/(k − 2), . . . , p/2, p/1. Dieses Vorgehen ist nach Holm benannt. Wir berechnen die k = 3 Tests für die Höhendaten: > (tad <- t.test(alp$h, dav$h)) Welch Two Sample t-test 78 6.5 Multiples oder paarweises Testen data: alp$h and dav$h t = 0.6206, df = 76.801, p-value = 0.5367 alternative hypothesis: true difference in means is not equal to 0 95 percent confidence interval: -2.02673 3.86173 sample estimates: mean of x mean of y 23.0950 22.1775 > (tal <- t.test(alp$h, lae$h)) Welch Two Sample t-test data: alp$h and lae$h t = -3.7992, df = 28.67, p-value = 0.0006976 alternative hypothesis: true difference in means is not equal to 0 95 percent confidence interval: -15.53287 -4.65808 sample estimates: mean of x mean of y 23.0950 33.1905 > (tdl <- t.test(dav$h, lae$h)) Welch Two Sample t-test data: dav$h and lae$h t = -4.2271, df = 26.73, p-value = 0.0002462 alternative hypothesis: true difference in means is not equal to 0 95 percent confidence interval: -16.36123 -5.66472 sample estimates: mean of x mean of y 22.1775 33.1905 > pval <- c(tad$p.value, tal$p.value, tdl$p.value) > names(pval) <- c("A-D", "A-L", "D-L") und ordnen die p-Werte p1 , p2 , . . . , pk aufsteigend: p(1) ≤ p(2) , . . . , ≤ p(k) . Dann werden diese geordneten Werte mit den aufsteigenden Niveaus p/k, p/(k − 1), . . . p/2, p/1 verglichen: (6.11) p(1) < p/k, p(2) < p/(k − 1), . . . , p(k−1) < p/2, p(k) < p/1 oder, was dasselbe ist, die adjustierten Wahrscheinlichkeiten p(1) ∗ k, p(2) ∗ (k − 1), . . . , p(k−1) ∗ 2, p(k) werden mit dem globalen p verglichen: 79 6 Varianzanalyse, ANOVA p(1) ∗ k < p, p(2) ∗ (k − 1) < p, . . . , p(k−1) ∗ 2 < p, p(k) < p (6.12) Dann zeigen die erfolgreichen Tests (TRUE) die gewünschten Differenzen: > p <- 0.05 > (testp <- (sort(pval) <= p/(3:1))) D-L TRUE A-L A-D TRUE FALSE > cumprod(testp) == 1 D-L TRUE A-L A-D TRUE FALSE > p.adjust(pval, "holm") < p A-D FALSE A-L TRUE D-L TRUE Die Verwendung des comprod sorgt dafür, dass auf ein FALSE kein TRUE mehr folgen kann (aus theoretischen Gründen. Bemerkung: p.adjust ordnet die pi nicht explizit um. Im Standardpaket stats finden wir andere Varianten von p.adjust, vgl. die Hilfe. Zum einfacheren Verständnis benutzen wir ein künstliches Beispiel: > px <- c(0.007, 0.01, 0.02, 0.022, 0.06) > p.adjust(px, "bonferroni") < p [1] TRUE FALSE FALSE FALSE FALSE > p.adjust(px, "holm") < p [1] TRUE TRUE FALSE FALSE FALSE > p.adjust(px, "hochberg") < p [1] TRUE TRUE TRUE TRUE FALSE > p.adjust(px, "hommel") < p [1] TRUE TRUE TRUE TRUE FALSE Es scheint keinen Grund zu geben, die unmodifizierten Bonferroni-Korrekturen zu verwenden, weil Holms Methode immer bessere Resultate liefert, unter denselben allgemeinen Bedingungen. Die Methoden von Hochberg und Hommel gelten für unabhängige Hypothesen, und dies ist bei uns nicht der Fall. Es ist daher angebracht, in jedem Fall Holms Methode zur Kontrolle der globalen Fehlerrate zu verwenden. 80 7 Korrelation, Regression 7.1 Zweck Oft variieren am selben Objekt gemessene Variablen miteinander im gleichen Sinne, z.B. Körpergrösse und Gewicht, Energiebedarf und Gewicht, Körpergrösse und Schuhgrösse. Das kann bei einer Analyse stören, denn oft möchte man das Verhalten einer Zielgrösse mit möglichst wenigen anderen Einflussgrössen erklären. Die Sparsamkeit beim Einbezug von erklärenden Variablen entspricht "Occam’s Razor", oder wie Einstein es formulierte: "mach es so einfach wie möglich, aber nicht einfacher". 7.2 Methoden Ein Mass für die gegenseitige lineare Abhängigkeit von metrischen (reellen) Grössen ist die Korrellationsmatrix. Sie enthält alle paarweise berechneten Korrelationskoeffizienten PN − x̄)(yi − ȳ) SPxy =p P N SSQx · SSQy 2 2 i=1 (yi − ȳ) i=1 (xi − x̄) · rxy = qP N i=1 (xi Die Grösse r r n−2 1 − r2 ist t-verteilt mit n − 2 Freiheitsgraden. Man sie daher mit einem t-Test auf Verschiedenheit von Null testen. 7.3 Regressionsanalyse Die Regressionsanalyse sucht einen möglichst gut angepassten linearen Zusammenhang zwischen den (i = 1..n) Beobachtungen von P (einer oder mehreren) Einflussgrössen xki , k = 1..P und einer Zielgrösse y mit den gemessenen Werten yi . yi = P X (ak xki ) + i , i aus N (0, σ 2 I). k=1 Die zu bestimmenden Grössen sind die ak , die Grösse σ 2 ist unbekannt und wird mitgeschätzt. Die Schreibweise N (0, σ 2 I) drückt aus, dass die i unabhängig sind und alle aus derselben Normalverteilung N (0, σ 2 ) stammen. Den Fall, dass die i nicht unabhängig voneinander sind und nicht alle aus derselben Normalverteilung stammen, gibt man durch eine kompliziertere Matrix Σ in N (0, Σ) an. Er erfordert eine gesonderte Behandlung, die wir nicht besprechen. Der zu minimierende Ausdruck ist: 81 7 Korrelation, Regression (7.1) n X 2i = i=1 n P X X i=1 !2 (yi − ak xki ) k=1 d.h. wir minimieren die Summe der quadrierten Residuen. Die Lösung kann in geschlossener Form angegeben werden, aber diese ist hier nicht von Interesse. Siehe Faraway [2005], der auch die geometrische Veranschaulichung dieser Minimierung zeigt. 7.3.1 Syntax of linear models in R Die in R gewählte Schreibweise für lineare Modelle kennt folgende Operatoren: • + Einflussgrösse wird ins Modell eingeschlossen, "1" steht für das konstante Glied, es wird immer implizite eingeschlossen, wenn es nicht mit 1äusgeschlossen wird, • * Einflussgrössen und Wechselwirkungen werden eingeschlossen, • - Einflussgrösse wird weggelassen, • : Wechselwirkung, • / Hierarchie (Nesting) von Einflussgrössen, • ^ alle Wechselwirkungen bis zum gegebenen Exponenten werden eingeschlossen, • I() alle Operatoren in der Klammer von I() nehmen wieder ihre übliche arithmetische Bedeutung an. 7.3.2 Beispiel für die einfache Regression und Residuenanalyse Wir behandeln zuerst ein Beispiel der einfachen Regression, d.h. es wird nur ein Regressor einbezogen. > mod0 <- lm(h ~ 1, data = alpBH) > summary(mod0) Call: lm(formula = h ~ 1, data = alpBH) Residuals: Min 1Q Median -15.78 -3.98 1.32 3Q 5.47 Max 10.22 Coefficients: Estimate Std. Error t value Pr(>|t|) (Intercept) 23.48 1.07 22 <2e-16 Residual standard error: 6.66 on 38 degrees of freedom > mod1 <- lm(h ~ bhd, data = alpBH) > summary(mod1) 82 7.3 Regressionsanalyse Call: lm(formula = h ~ bhd, data = alpBH) Residuals: Min 1Q Median -5.36253 -1.50628 -0.00827 3Q 1.51785 Max 7.72828 Coefficients: Estimate Std. Error t value Pr(>|t|) (Intercept) 7.5331 1.2222 6.16 3.8e-07 bhd 0.3783 0.0271 13.95 2.6e-16 Residual standard error: 2.7 on 37 degrees of freedom Multiple R-squared: 0.84, Adjusted R-squared: 0.836 F-statistic: 195 on 1 and 37 DF, p-value: 2.6e-16 > anova(mod0, mod1) Analysis of Variance Table Model 1: h ~ 1 Model 2: h ~ bhd Res.Df RSS Df Sum of Sq F Pr(>F) 1 38 1684.6 2 37 269.2 1 1415.5 194.6 2.6e-16 > mod2 <- lm(h ~ bhd + I(bhd^2), data = alpBH) > summary(mod2) Call: lm(formula = h ~ bhd + I(bhd^2), data = alpBH) Residuals: Min 1Q Median -4.3462 -1.2497 -0.0719 3Q 1.0619 Max 6.4195 Coefficients: Estimate Std. Error t value Pr(>|t|) (Intercept) -1.13875 2.35263 -0.48 0.63129 bhd 0.84936 0.11730 7.24 1.6e-08 I(bhd^2) -0.00551 0.00135 -4.09 0.00023 Residual standard error: 2.26 on 36 degrees of freedom Multiple R-squared: 0.891, Adjusted R-squared: 0.885 F-statistic: 147 on 2 and 36 DF, p-value: <2e-16 > ind <- sort.list(alpBH$bhd) 83 7 Korrelation, Regression xli <- c(0, 80) plot(alpBH, xlim = xli, ylim = c(0, 45), xlab = "bhd in [cm]", ylab = "height in [m]") abline(8, 0.45, lty = 2) abline(8, 0.4, lty = 3) abline(mod1, col = "darkgreen") xx <- eval(parse(text = paste("seq(", paste(unlist(xli), collapse = ","), ",0.5)", sep = ""))) yy <- predict(mod2, newdata = data.frame(bhd = xx)) lines(xx, yy, col = "red") 40 > > + > > > > + > > ● ● ●● ● ● ● ● ● ● ● ●● 10 ● ● ● ●● ● 0 ● ● ● ● ● ● ●● ● ●● ● ●●● ●● ● ● 20 height in [m] 30 ● 0 20 40 60 80 bhd in [cm] Abbildung 7.1: Baumhöhen von Alptal, verschiedene Geraden (siehe abline() ) und die lineare (dunkelgrün) und die quadratische Approximation, angepasst mit dem Modellen mod1 and mod2. 84 7.4 Box-Cox-Exponenten-Transformationen Die drei Modelle mod0, mod1 und mod0 können beurteilt werden anhand ihrer residual standard errors, welche Schätzungen von σ 2 sind: 6.66, 2.70, und 2.26. Die Grössen Multiple R-squared bedeuten die totale Variabilität ërklärt"durch die Modelle mod1 und mod2 im Verhältnis zum "Nullmodell"mod0: X X X SSY := (yi − ŷmod0 )2 = (yi − ȳ)2 , SSEi := (yi − ŷmodi )2 Ri2 = SSY − SSEi , i = 1, 2. SSY 2 2 Hier haben wir Rmod1 = 0.840, dazu das etwas grössere Rmod2 = 0.891. Ideal wäre ein Modell mit R2 = 1, aber dies kann hier nicht erreicht werden wegen der grossen Restvariabilität, wie aus Abb.7.1 ersichtlich ist. 2 , die die Anzahl Regressoren Man benutzt auch eine Variante von R2 , genannt adjustiertes R2 oder Radj 2 2 im Modell berücksichtigt. Anders als R wächst das adjustierte Radj nur dann, wenn der neue Regressor 2 kann negativ werden, und es ist das Modell stärker verbessert als durch Zufall allein zu erwarten wäre. Radj 2 wird so definiert: immer kleiner oder gleich R2 . Radj 1 − (1 − R2 ) N −1 , N −p−1 dabei ist p die totale Anzahl der Regressoren im linearen Modell (aber ohne den konstanten Term mitzuzählen), und N ist die Stichprobengrösse. 7.4 Box-Cox-Exponenten-Transformationen Sind die Punktewolken von Daten nicht "gerade" oder gleicht ihre Form eher einer "Trompete" als einem gleichmässig breiten Band, so verwendet man Transformationen (Wurzel, Logarithmus) der Daten, um diese Unschönheiten zu mildern oder zu beseitigen. Die Box-Cox-Transformationen (7.2) (7.3) yλ − 1 für λ 6= 0 λ = log(y) für λ = 0 y (λ) = > bct <- function() { + par(mfrow = c(1, 1)) + inc <- c(3, 2, 1, 0.5, 0.25) + ind <- c(inc, -rev(inc)) + seo <- seq(along = inc) + 1 + ltyp <- c(seo, rev(seo) + 1) + colr <- c(seo, rev(seo)) + curve(log(x), xlim = c(0, 3), ylim = c(-3, 3), col = 1, + lty = 1) + abline(0, 0, lty = 3) + for (ii in seq(along = ind)) curve((x^ind[ii] - 1)/ind[ii], + add = TRUE, col = colr[ii], lty = ltyp[ii]) + legend(0.2, 3, cex = 0.8, lty = c(1, ltyp), legend = c("ln", 85 7 Korrelation, Regression 3 > bct() 0 −3 −2 −1 log(x) 1 2 ln 3 2 1 0.5 0.25 −0.25 −0.5 −1 −2 −3 0.0 0.5 1.0 1.5 2.0 2.5 3.0 x Abbildung 7.2: Die bei der Box-Cox-Transformation verwendeten Funktionen Werte von k = λ. + + } xλ −1 λ und ln x, die Legende zeigt die as.character(ind)), col = c(1, colr), merge = TRUE) sind eine von λ abhängige Familie, die so skaliert ist, dass die Logarithmus-Transformation mit λ = 0 stetig in die Potenz- und Wurzeltransformationen eingebettet ist (λ > 0 bzw. λ < 0), Abb. 7.2. Diese spezielle Form der Transformation wurde deshalb gewählt, weil hier alle Funktionen mit derselben Steigung 1 durch ein und denselben Punkt (1, 0) gehen. Die Funktion boxcox() in "library(MASS)" berechnet für gegebene Daten eine Gütefunktion, unter deren Maximum das optimale λ liegt. Ziel ist einerseits, Linearität herzustellen, andererseits, für Homogenität der Varianzen zu sorgen. Kann der Box-Cox-Algorithmus nicht helfen, so muss man nach anderen, nichtlinearen Verfahren suchen, die z.B. in "Generalized Linear Models" glm(), "Nonlineare Models" nlm implementiert sind. Faustregel 4. Fällt das optimale λ gemäss Box-Cox deutlich als λ 6= 0 aus, so logarithmiert man Einflussund Zielgrösse. Wenn λ = 0 suggeriert wird, so logarithmiert man nur die Zielgrösse. 86 7.4 Box-Cox-Exponenten-Transformationen Begründung für λ 6= 0: man vernachlässigt die Subtraktion von 1 im Zähler und die Division. Logarithmiert man beide Seiten vonMan erhält mit: (7.4) (7.5) y = axb log y = log a + b log x so wird man auf ein lineares Regressionsproblem in log x und log y geführt. 87 7 Korrelation, Regression 7.5 Reisigdaten zum Pipe-Modell Das Pipe-Modell (Shinozaki, K., et al. 1964) ist eine interessante Hypothese, um die Biomassenverteilung in einem Baum zu beschreiben, insbesondere in der Krone, s Abb. 7.3. Abbildung 7.3: Das Pipe-Modell nimmt an, dass bei gewissen Baumarten die Biomasse oberhalb eines Querschnittes im Stamm oder einem Zweig proportional ist zur Anzahl Leitungsbahnen ("pipes") in diesem Querschnitt ist, gestrichelt = Stammkern. See Hoffmann, Usoltsev, 2000 In der Publikation (Hoffmann, Usoltsev, 2002) werden russische Zweig- und Reisigdaten verwendet . Die erhobenen Variablen sind d: BHD[cm], dc: Durchmesser am Kronenansatz[cm], wf : Trockenmasse der Krone[kg], sp: species, wobei a = "Birch Middle Urals", b = "Birch Turgai",c = "Birch South Urals",d = "Japanese Birch",e="Birch Kazakh Low Hills",f ="Aspen Kazakh Low Hills",I="Spruce Urals",K="Fir Urals",L="Pine Turgai natural stands.",M ="Pine Turgai plantations",N ="Pine Urals", s. Abb. 7.4: > BL <- read.table("./Data/Birch1.dat", header = TRUE, + as.is = 3) > names(BL) [1] "dc" "wf" "sp" > dim(BL) [1] 535 3 > CN <- read.table("./Data/Pine1.dat", header = TRUE, as.is = 4) > names(CN) 88 7.5 Reisigdaten zum Pipe-Modell [1] "d" "dc" "wf" "sp" > dim(CN) [1] 529 plot(0, xlim = range(c(CN$dc, CN$d + 10)), ylim = range(CN$wf), xlab = "dc links, d rechts", ylab = "wf", type = "n") points(CN$dc, CN$wf, pch = 21, col = "blue") points(CN$d + 10, CN$wf, pch = 24, col = "red") points(BL$dc, BL$wf, pch = 1, col = "green") 60 > + > > > 4 ● 50 ● 30 0 10 20 wf 40 ● ● ● ● ● ●● ● ● ● ●● ● ● ● ● ● ● ●● ● ● ●● ● ● ● ● ●●●●● ● ● ●●●● ●●● ● ● ● ●●● ● ●●● ● ● ● ●● ●●● ● ● ● ● ● ●● ●● ● ● ● ●● ●● ● ● ● ● ● ● ● ● ● ● ● ●●● ● ● ● ● ● ● ● ● ● ● ● ● ●● ● ● ●● ● ●● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ●● ● ● ● ● ● ● ● ● ●● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ●● ● ● ● ● ● ● ● ● ● ● ●● ● ● ● ● ● ● ● ● ● ●● ● ● ●● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ●● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ●● ●● ● ● ● ● ● ● ● ● ● ● ● ● ●● ● ● ● ●● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ●● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ●● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ●● ● ● ● ● ● ● ● ● ●● ● ● ● ● ● ● ●● ●● ● ● ● ● ●● ● ● ● 0 10 20 30 ● ● 40 50 60 dc links, d rechts Abbildung 7.4: Reisigdaten; grün: Laubholz, wf vs. dc, ; blau: Nadelholz, wf vs. dc; rot: Nadelholz, wf vs. d. Die roten Datenpunkte sind um 10 Einheiten nach rechts verschoben, um ihre weiter aufgefächerte Trompetenform klarer zu zeigen. Die Prüfung mit Box-Cox liefert für die Laubbaumarten λ = 0.38, und für die Nadelbaumarten λ = 0.29, beide deutlich von Null verschieden. Wir werden also die Einflussgrössen d und dc und die Zielgrösse wf logarithmieren. > > > > > BL$ldc <- log(BL$dc) BL$lwf <- log(BL$wf) CN$ld <- log(CN$d) CN$ldc <- log(CN$dc) CN$lwf <- log(CN$wf) 89 7 Korrelation, Regression −1500 op <- par(mfrow = c(1, 2)) bxd <- boxcox(wf ~ dc, data = BL, lambda = seq(0, 0.7, length = 10)) lambda.opt.d <- bxd$x[which.max(bxd$y)] bxc <- boxcox(wf ~ dc, data = CN, lambda = seq(0, 0.7, length = 10)) lambda.opt.c <- bxc$x[which.max(bxc$y)] par(op) 95% −1600 log−Likelihood −1450 −1900 −1550 −1800 −1500 log−Likelihood −1400 95% −1700 > > + > > + > > 0.0 0.2 0.4 0.6 0.0 0.2 λ 0.4 0.6 λ Abbildung 7.5: Box-Cox zur Bestimmung des Exponenten, Null ist offensichtlich nicht im 95%-Intervall für λ. Dieses Intervall erstreckt sich zu beiden Seiten des Maximalwertes, angegeben durch die gestrichelten Geraden. > lmdc <- lm(lwf ~ ldc, data = CN) > summary(lmdc) Call: lm(formula = lwf ~ ldc, data = CN) Residuals: Min 1Q -1.3864 -0.2242 Median 0.0242 3Q 0.2789 Max 1.0483 Coefficients: Estimate Std. Error t value Pr(>|t|) (Intercept) -4.1301 0.0510 -81.0 <2e-16 ldc 2.2982 0.0249 92.4 <2e-16 Residual standard error: 0.406 on 527 degrees of freedom Multiple R-squared: 0.942, Adjusted R-squared: 0.942 F-statistic: 8.55e+03 on 1 and 527 DF, p-value: <2e-16 > lmd <- lm(lwf ~ ld, data = CN) > summary(lmd) 90 7.5 Reisigdaten zum Pipe-Modell Call: lm(formula = lwf ~ ld, data = CN) Residuals: Min 1Q -2.6023 -0.4673 Median 0.0192 3Q 0.5189 Max 2.4902 Coefficients: Estimate Std. Error t value Pr(>|t|) (Intercept) -3.6284 0.0920 -39.4 <2e-16 ld 1.7750 0.0389 45.6 <2e-16 Residual standard error: 0.758 on 527 degrees of freedom Multiple R-squared: 0.798, Adjusted R-squared: 0.797 F-statistic: 2.08e+03 on 1 and 527 DF, p-value: <2e-16 > cwhl <- function(x) c(73, 0, 3, 81, 2, 6)[which(x == + LETTERS) - 8] > CN$colr <- as.vector(sapply(CN$sp, cwhl)) > unsp <- sort(unique(CN$sp)) Modell lmdc beschreibt das Pipe-Modell sehr gut, seine Residuen, s. Abb. 7.7, sind kleiner als die von Modell lmd, Abb. 7.8, aber die letzteren folgen der Normalverteilung besser. 91 7 Korrelation, Regression plot(0, xlim = range(c(CN$ldc, CN$ld + 2)), ylim = range(CN$lwf), xlab = expression(c(log(d[c]), log(d))), ylab = "Reisigtrockenmasse [kg]", type = "n") points(CN$ldc, CN$lwf, pch = CN$sp, cex = 0.8, col = CN$colr) points(CN$ld + 2, CN$lwf, pch = CN$sp, cex = 0.8, col = CN$colr) abline(lmdc, col = "darkgreen") abline(lmd$coefficients[1] - 2 * lmd$coefficients[2], lmd$coefficient[2], col = "darkgreen") for (ii in unsp) { lines(lowess(cbind(CN$ldc[CN$sp == ii], CN$lwf[CN$sp == ii])), col = cwhl(ii)) } for (ii in unsp) { lines(lowess(cbind(CN$ld[CN$sp == ii] + 2, CN$lwf[CN$sp == ii])), col = cwhl(ii)) } II II I I I IIIIIIII IIII IIIII N MII I NN N M III INN MII INI I NNLNN IN ILIII N NN N IN NIM N N L I L N I I I N NN N N N N IIIIIIN N L N N N N N NN N IIIN IL N N N I I N N N N N N IIIN I N NNN NN N NL N IIMN INN N NN M IN N NL LN N IIIIN IK IIMIM M M M NNNL N N N K IN IIN N LM L N NNNN N N M M IN IN M M N N N N I I I L L N N N N M N I N N I I N N N N I I I N N N N M M LK L M M IN N N N IN I IKN K N NNN N IN IM M M N NN M M N N N N IM N NN IN N N M K KM N N NN N N ILIM IIIN IM IIN M IN LN IM IK IM N N IN N N M M IN N N NLNL NL N N N M M NN N N N N N N M N N L N N M N N I I M M M L L I I M M M M I I N NM L N IN IN K K N IN IM LK M M N N L LMM M N IM ILL N N NN L LIN LM M NN IN IM IN N N M I LN IN IM IM M MK M IL N N NL N IIM N N L M IM M M K M MNNM L L N N N IN M I MNM M N N N N M NLN IN IN L M M N I I L L K K K N K K N N L M M L L M M NM IL IN M NNIM NNLN NN N I L IN N LLN M M IN N N NN M M M M M IM IN M M M IN IN L LM L L M M M M N N N M L LM IM IM N N M L L N N N N NNM N M M K K M N N M M N N N K M M N KK K M I I IM M M MM M MM M N M IM I LNM LM LLM LM LMM NM N N N N N M M L I L M M L I I N N M L L M M M M M N N L L M M M N LIM INM M M NL MLIM MM NMN N LM LLN LL M M M LLL KK LK NN L LIMM NM LK LLL LM M M MM KN K K N M M M N N N M M N N LL M M L LM LN MM L I LM I NLM NN M M M N M MLIIN N LIM L ILN MM LM L LM N N LL LL N NM L L MLM M M M M M M M M L L M L M M I I M M N LNN LN LL M N L N LNMN LM NNM L L ML M MMLLM LLMM LLM M M M LM L M MML M M M LM L LM M L M LLL M M L LL L L M M LL L L LL LL L L L L L N N L L L L L 0 −2 −6 −4 Reisigtrockenmasse [kg] 2 4 > + + > > > > + > + + + > + + + L L 0 1 2 3 4 5 6 c(log(dc), log(d)) Abbildung 7.6: ln(Reisigtrockenmasse) vs. ln(Durchmesser am Kronenansatz) (links) und ln(BHD) (rechts, verschoben) für Nadelholz. Die geglätteten Kurven sind für die einzelnen Standorte (farbig) und für die Gesamtheit der Daten (dunkelgrün) eingetragen. Die Standorte sind im Text angegeben. 92 7.5 Reisigdaten zum Pipe-Modell > plotLmT(lmdc) T3−plot of residuals 30 Residuals vs Fitted 5% 1% −4 −2 0 2 10 −10 −30 ●●● ●● ●●● ●● ● ●● ● ● ● ● ● ●● ● ●● ● ● ●● ● ● ● ●●● ● ●● ● ● ● ● ● ● ●● ● ●● ● ● ● ●●●●● ● ● ● ● ●●● ● ● ● ● ● ●● ●● ● ● ● ● ● ● ● ●● ● ●● ● ● ●●● ●● ● ● ● ● ● ● ● ● ● ● ● ●● ● ● ● ●● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ●● ● ● ●●●● ● ● ● ● ● ● ● ● ● ● ●● ● ● ● ●● ● ●●● ● ● ● ● ● ● ●●● ●● ●● ● ● ● ●● ● ●● ● ● ● ● ● ● ● ● ● ● ●● ● ● ● ● ● ● ● ● ● ● ●● ● ● ●● ● ● ● ● ● ● ●● ● ● ● ● ● ● ● ●● ●● ● ● ● ● ● ●● ● ● ● ● ● ●●● ● ● ● ● ●● ● ● ●● ● ● ●● ● ● ● ● ● ● ● ●● ● ●● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ●● ●● ● ● ● ● ●● ●● ● ●● ● ●● ● ● ●● ●● ● ● ● ● ● ● ●● ● ● ●● ●● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ●●●● ● ● ● ● ● ● ●●● ● ● ●● ● ● ●● ● ● ●● ●● ● ● ●● ● ●●●● ● ● ●●● ●● ●● ● ● ● ● ● ●●● ● ● ● ●● ●● ● ● ● ● ● ● ● ● ● ● ● ● ● ●●● ●● ● ●● ●● ● ● ● ● ● ● ● ● ● ● ● ● 271 ● 96 86 ● T3 0.5 −0.5 −1.5 Residuals ● 4 −1.0 −0.5 Fitted values 0 Fitted values 2 4 0.00 0.02 0.04 0.06 Cook's distance 1.5 1.0 0.5 0.0 Standardized residuals 1.0 Cook's distance 86 ● ● 271 ● 96 ● ● ● ● ● ● ● ● ● ● ● ● ● ●●● ●● ●● ● ● ●● ●●●●● ● ● ●● ● ● ●● ●● ●● ● ● ● ● ●● ● ●● ●● ● ● ●●●● ● ● ●● ● ●● ●● ● ● ●● ● ● ●● ●● ●● ● ● ●● ● ●● ● ● ●● ●●● ●●● ● ● ● ●● ● ●●● ●● ● ●●● ●● ● ● ● ● ● ●● ● ● ● ● ● ●● ● ● ● ● ● ● ● ● ● ●● ● ●●●●● ●● ● ●● ● ● ●●●●● ● ● ● ●● ● ●● ● ● ● ● ● ● ● ● ● ● ● ● ●● ● ● ● ● ● ● ● ● ● ● ●●● ●● ● ● ●●● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ●● ● ● ● ●● ● ● ● ● ● ●● ● ● ●● ●●●●● ● ● ●● ●● ● ●● ● ● ●●●●●● ● ●● ● ●● ● ●● ● ● ● ●● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ●●●●● ● ●●●●●● ●● ● ●● ●●● ● ●● ● ● ● ● ● ● ● ● ● ● ● ● ●●● ● ●●● ● ●●●●● ● ● ●● ● ● ● ● ●●● ● ● ● ● ●●●● ● ● ●● ●●● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ●● ● ●●●●● ● ●● ● ● ● ● ● ● ● ● ● ●● ● ● ● ●● ● ● ● ● ●● ● ●●●● ●●●● ●●●●● ●●● ● ●● ● ● ●● ● ● ● ●● ● ● ● ● ● −2 0.5 t Scale−Location −4 0.0 69 271 25 0 100 300 500 Obs. number Abbildung 7.7: Diagnostics for model "lmdc" 93 7 Korrelation, Regression > plotLmT(lmd) T3−plot of residuals 3 30 Residuals vs Fitted 5% 1% 0 −30 −10 T3 2 −1.0 −0.5 0.0 Scale−Location Cook's distance 72 ● 40 ● ● ● ● ● ● ● ● ● ● ● ●● ● ● ● ● ● ●● ●● ● ●●●● ●● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ●● ● ● ● ● ● ● ● ● ●● ● ● ●● ●● ●● ●● ●● ●● ●● ● ●● ● ●●● ● ● ● ●● ●●● ●●● ●● ● ●● ●● ●● ● ● ● ● ● ● ● ● ●● ● ● ●● ●● ● ● ● ●● ● ●● ● ●●● ● ● ● ● ● ● ● ●● ● ● ● ● ●● ● ● ● ● ● ● ● ● ● ● ● ● ● ●● ●●● ● ● ● ● ● ● ● ● ●● ● ●● ● ● ● ● ●● ●● ●●●●● ● ● ● ● ● ● ●●●● ● ● ●● ● ● ●●● ● ● ● ● ●●● ● ● ● ●● ● ● ●● ● ●● ●● ● ● ●● ● ● ● ●●● ● ● ● ●● ● ● ● ●●● ● ● ●● ● ● ● ●● ● ●●●● ● ● ● ● ●●●● ● ● ● ●● ● ● ● ● ● ● ● ● ●●●● ● ● ● ● ●●● ●● ●● ● ●●● ●● ●● ●● ●●● ● ● ● ●● ●● ● ● ●● ● ● ● ● ● ● ●● ● ● ● ● ● ● ● ● ● ● ●● ● ● ● ● ● ● ● ● ●● ● ●● ● ● ●● ● ● ● ● ● ● ● ●● ● ● ● ● ● ● ● ●●● ●● ●● ●●● ● ●● ● ● ● ● ●● ●● ● ● ● ● ● ● ● ● ● ● ● ●● ● ● ● ● ● ● ●● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ●●● ● ● ●● ● ● ● ● −4 −2 0 Fitted values 2 1.0 214 25 0 159 100 300 Obs. number Abbildung 7.8: Diagnostiken für Modell "lmd" 94 0.5 t 0.00 0.05 0.10 0.15 1.5 1.0 0.5 −2 Fitted values ● 214 0.0 Standardized residuals −4 Cook's distance −1 1 ● ●●●● ●● ●● ●● ● ● ● ●● ● ●● ● ●● ●● ●●●● ● ● ● ● ● ● ● ● ● ● ● ●●●● ● ● ● ●● ●●●●● ● ●● ● ● ●● ●●●● ● ● ● ● ● ● ● ● ● ●● ● ● ● ● ● ● ● ●● ● ● ● ● ● ● ● ● ● ● ● ● ●● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ●● ●● ● ●●● ● ●● ● ● ● ● ● ● ●●● ● ●●● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ●● ●● ● ● ● ●● ● ● ●● ●●● ●● ●● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ●● ● ● ● ● ● ● ● ● ●● ● ● ● ● ●● ● ● ● ● ● ●● ● ● ● ● ● ● ● ● ● ●● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ●●● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ●●● ● ● ● ● ● ● ● ●● ● ● ● ● ●● ● ● ● ● ● ● ● ● ● ●● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ●● ● ● ● ●●● ●●●● ● ●● ●● ● ● ●● ●●●●● ● ●●● ●● ● ● ●●●●● ● ● ●● ●● ● ●●● ● ●● ● ●● ● ● ●●●● ● ● ●● ● ● ● ● ●● ● ● ● ● ● ● ● ● ● 40 ● 72 ● 10 ●● ● ● −3 Residuals 2 ● 214 500 8 Multiple Regression Bei der multiplen Regression haben wir eine kontinuierliche Zielgrösse und zwei oder mehrere kontinuierliche Einflussgrössen. Einige wichtige Punkte sind zu beachten: • Welche Einflussgrössen sollen eingeschlossen werden? • Zeigt sich Krümmung im Zusammenhang der Zielgrösse mit den Einflussgrössen? • Gibt es Wechselwirkungen zwischen den Einflussgrössen, d.h. welche Ausprägungen von Kombinationen von Einflussgrösse A mit Einflussgrösse B stechen heraus? • Wie stark sind Korrelation rAB 6= 0 zwischen den Einflussgrössen? • Besteht die Gefahr der Überparametrisierung, d.h. passt man sich durch den Einbezug von zu vielen Einflussgrössen zu sehr an die zufälligen Fehler der Daten an? Bevor man komplizierte Modelle anschaut, sollte man drei Dinge tun • Die Scatterplotmatrix ansehen, um Muster zu erkennen, • Baummodelle (tree-models im statistischen Sinne) benutzen, um zu sehen, ob komplizierte Wechselwirkumgen vorliegen, • Verallgemeinerte additive Modelle (general addive models, gam) benutzen, um Krümmung zu untersuchen. 8.1 Ein Beispiel, das auch ein Baummodel, ein verallgemeinertes additives Modell ’gam’ und lineare Modelle enthält Wir zitieren ein aktuelles Beispiel aus der Erforschung der Luftverschmutzung aus dem Buch von Crawley [R-Book]. Die Fragestellung lautet: Auf welche Art ist die Ozonkonzentration abhängig von der Windgeschwindigkeit, Lufttemperatur und der Intensität der Sonnenstrahlung? > ozonD <- read.table("./Data/ozone.txt", header = TRUE) > ozonD$temp <- (ozonD$temp - 32) * 5/9 > names(ozonD) [1] "rad" "temp" "wind" "ozone" > dim(ozonD) [1] 111 4 95 8 Multiple Regression odat rad 0.29 temp -0.13 0.35 -0.5 0.7 wind -0.61 ozon 2008-05-18, 21:34:45 Abbildung 8.1: Ozondaten Die Lufttemperatur temp wird in ◦ C angegeben, die Masseinheiten aller anderen Grössen sind unspezifiziert. Aufruf: par(mfrow=c(1,1)); SplomT(ozonD,cex=0.35, diag=0.5). Die Scatterplotmatrix in Abb. 8.1 gibt uns eine erste Übersicht. Die Zielgrösse Ozonkonzentration ozone findet man auf der y-Achse der untersten Reihe: wir sehen eine stark negative Korrelation mit der Windgeschwindigkeit wind, eine stark negative Korrelation mit der Lufttemperatur temp, und eine unklare, vielleicht buckelige Abhängigkeit von der Strahlung rad. Man beginnt mit Vorteil mit einem multiplen Regressionsproblem mit nichtparametrischer Glättung s() in einem verallgemeinerten additiven Modell modelG: > op <- options(warn = -1) > modelG <- gam(ozone ~ s(rad) + s(temp) + s(wind), data = ozonD) > options(op) Die für das Modell modelG in Abb. 8.2 gezeigten Vertrauensintervalle sind genügend eng, um anzudeuten, dass die Krümmung im Zusammenhang von Ozon und Temperatur reell ist, 96 60 40 20 -20 0 s(temp,3.84) 40 20 0 -20 s(rad,2.76) 60 8.1 Einfacheres Baummodell, GAM und lineare Modelle 0 50 100 150 200 250 300 15 25 30 35 temp 40 20 0 -20 s(wind,2.92) 60 rad 20 5 10 15 20 wind Abbildung 8.2: Grundmodell modelG, gam mit Glättung aber die Krümmung des Zusammenhangs mit dem Wind ist fraglich, und ein lineares Modell könnte genügen für die Strahlung. Als nächsten Schritt passen wir ein Baummodell an, um komplizierte Wechselwirkungen zwischen Ziel- und Einflussgrössen aufzuspüren. Aufruf: op <- par(mfrow=c(2,2)); plot(modelG,ask=FALSE); par(op). > library(tree) > modelT0 <- tree(ozone ~ ., data = ozonD) 97 8 Multiple Regression > plot(modelT0) > text(modelT0) temp < 28.0556 | wind < 7.15 61.0 rad < 79.5 temp < 25.2778 12.2 21.0 34.6 wind < 10.6 temp < 31.3889 rad < 205 74.5 83.4 102.0 48.7 Abbildung 8.3: Grundmodell modelT0 zum Aufspüren von Wechselwirkungen 98 8.1 Einfacheres Baummodell, GAM und lineare Modelle op <- par(mfrow = c(2, 2)) plot(residuals(modelT0)) T3plot(residuals(modelT0), lab = "T3-plot der Residuen", legend.pos = "top") T3plot(quantile(residuals(modelT0), c(0.025, 0.975)), lab = "T3-plot der ge trimmten Residuen", legend.pos = "top") par(op) 150 100 ● 0 20 40 60 80 100 Index −50 −150 ● ● ● ● ● ● ●● ● ● ● ● ● ● ●●● ●● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ●● ●● ● ● ● ●●●● ● ● ●●●●●●● ●● ●● ●● ● ●● ●●● ● ●● ● ●● ● ● ●●● ● ● ● ●● ● ● ● ● ●● ● ● ●●● ● ● ● ● ● ●● ● ● ● ● ● ● ● ● ● T3 ● 5% 1% 50 ● 50 0 −50 residuals(modelT0) T3−plot der Residuen −1.0 −0.5 0.0 0.5 1.0 t 30 T3−plot der ge trimmten Residuen 10 5% 1% −30 −10 T3 > > > + > + > −1.0 −0.5 0.0 0.5 1.0 t Abbildung 8.4: Residualsen und getrimmte Residuen (mittlere 95%) des Baummodells modelT0. 99 8 Multiple Regression Das Bild 8.3 von Modell modelT0 zeigt, dass die Temperatur bei Weitem die wichtigste Einflussgrösse ist. Die Windgeschwindigkeit ist sowohl bei hohen wie bei niedrigen Temperaturen, mit ruhiger Luft im Verein mit hoher Ozonkonzentration unterscheidend. Die Zahlen am Ende der Zweige geben die mittlere Ozonkonzentration an. Die Temperatur hat einen kleinen, aber interessanten Effekt. Bei niedrigen Temperaturen hat die Strahlung einen Einfluss bei hohen Windgeschwindigkeiten (>7.15), während bei hohen Temperaturen die relativ niedrigen Windgeschwindigkeiten (<10.6) wichtig sind. In beiden Fällen ist jedoch geht höhere Ozonkonzentration mit mit hoher Strahlung. Das Baummodell zeigt uns, dass die Struktur der Wechselwirkungen nicht besonders komplex ist. Die mittleren 95% der Residuen sind sogar sehr gut normalverteilt, s. Abb. 8.4. Ausgerüstet mit dieser Information (gekrümmter Einfluss von Wind, nicht-komplexer Wechselwirkungsstruktur) beginnen wir mit der linearen Modellierung, und zwar beginnen wir mit dem kompliziertesten Modell: wir schliessen die Wechselwirkungen zwischen allen drei Einflussgrössen und die quadratische Terme (um die Krümmung zu beschreiben) für alle drei Einflussgrössen ein. > model1 <- lm(ozone ~ temp * wind * rad + I(rad^2) + I(temp^2) + + I(wind^2), data = ozonD) > summary(model1) Call: lm(formula = ozone ~ temp * wind * rad + I(rad^2) + I(temp^2) + I(wind^2), data = ozonD) Residuals: Min 1Q Median -38.89 -11.20 -2.74 3Q 8.81 Max 70.55 Coefficients: (Intercept) temp wind rad I(rad^2) I(temp^2) I(wind^2) temp:wind temp:rad wind:rad temp:wind:rad Estimate Std. Error t value Pr(>|t|) 2.84e+02 9.68e+01 2.93 0.0042 -1.26e+01 5.25e+00 -2.41 0.0179 -2.48e+01 7.65e+00 -3.24 0.0016 -4.29e-02 3.26e-01 -0.13 0.8958 -3.62e-04 2.57e-04 -1.41 0.1627 1.89e-01 7.76e-02 2.43 0.0167 6.11e-01 1.47e-01 4.16 6.8e-05 4.28e-01 2.46e-01 1.74 0.0852 1.51e-02 1.35e-02 1.12 0.2660 6.70e-03 2.81e-02 0.24 0.8122 -7.78e-04 1.19e-03 -0.66 0.5136 Residual standard error: 17.8 on 100 degrees of freedom Multiple R-squared: 0.739, Adjusted R-squared: 0.713 F-statistic: 28.4 on 10 and 100 DF, p-value: <2e-16 Die dreifache Wechselwirkung ist klar nicht-signifikant, und so beginnen wir mit der Modellvereinfachung und entfernen wir sie aus dem Modell, das liefert uns model2. > model2 <- update(model1, ~. - temp:wind:rad, data = ozonD) > summary(model2) 100 8.1 Einfacheres Baummodell, GAM und lineare Modelle Call: lm(formula = ozone ~ temp + wind + rad + I(rad^2) + I(temp^2) + I(wind^2) + temp:wind + temp:rad + wind:rad, data = ozonD) Residuals: Min 1Q Median -39.61 -11.45 -2.90 3Q 8.55 Max 70.32 Coefficients: (Intercept) temp wind rad I(rad^2) I(temp^2) I(wind^2) temp:wind temp:rad wind:rad Estimate Std. Error t value Pr(>|t|) 2.59e+02 8.86e+01 2.92 0.0043 -1.15e+01 4.95e+00 -2.33 0.0220 -2.25e+01 6.78e+00 -3.31 0.0013 1.46e-01 1.52e-01 0.96 0.3391 -3.39e-04 2.54e-04 -1.33 0.1855 1.93e-01 7.72e-02 2.50 0.0141 6.17e-01 1.46e-01 4.22 5.2e-05 3.12e-01 1.71e-01 1.83 0.0709 6.75e-03 4.43e-03 1.53 0.1303 -1.13e-02 6.28e-03 -1.80 0.0756 Residual standard error: 17.8 on 101 degrees of freedom Multiple R-squared: 0.738, Adjusted R-squared: 0.715 F-statistic: 31.7 on 9 and 101 DF, p-value: <2e-16 Als Nächstes entfernen wir den am wenigsten signifikanten Zweifach-Wechselwirkungsterm aus model1, hier wind:rad, und erhalten model3. > model3 <- update(model2, ~. - wind:rad, data = ozonD) > summary(model3) Call: lm(formula = ozone ~ temp + wind + rad + I(rad^2) + I(temp^2) + I(wind^2) + temp:wind + temp:rad, data = ozonD) Residuals: Min 1Q Median -43.17 -11.02 -4.08 3Q 7.32 Max 74.79 Coefficients: Estimate Std. Error t value Pr(>|t|) (Intercept) 2.49e+02 8.94e+01 2.78 0.00641 temp -1.00e+01 4.94e+00 -2.03 0.04464 wind -2.11e+01 6.81e+00 -3.10 0.00253 rad -2.36e-02 1.21e-01 -0.20 0.84516 I(rad^2) -3.44e-04 2.57e-04 -1.34 0.18376 I(temp^2) 1.77e-01 7.75e-02 2.28 0.02451 I(wind^2) 5.81e-01 1.46e-01 3.97 0.00013 101 8 Multiple Regression temp:wind temp:rad 2.05e-01 8.86e-03 1.62e-01 4.31e-03 1.26 2.06 0.20899 0.04240 Residual standard error: 18 on 102 degrees of freedom Multiple R-squared: 0.73, Adjusted R-squared: 0.709 F-statistic: 34.5 on 8 and 102 DF, p-value: <2e-16 Dann entfernen wir die Wechselwirkung temp:wind aus model3 und erhalten model4. > model4 <- update(model3, ~. - temp:wind, data = ozonD) > summary(model4) Call: lm(formula = ozone ~ temp + wind + rad + I(rad^2) + I(temp^2) + I(wind^2) + temp:rad, data = ozonD) Residuals: Min 1Q Median -44.26 -11.17 -3.33 3Q 9.56 Max 78.42 Coefficients: (Intercept) temp wind rad I(rad^2) I(temp^2) I(wind^2) temp:rad Estimate Std. Error t value Pr(>|t|) 1.44e+02 3.42e+01 4.22 5.3e-05 -4.96e+00 2.88e+00 -1.72 0.088 -1.30e+01 2.28e+00 -5.70 1.2e-07 -3.48e-02 1.21e-01 -0.29 0.774 -2.99e-04 2.55e-04 -1.17 0.243 1.18e-01 6.23e-02 1.90 0.060 4.45e-01 9.98e-02 4.46 2.1e-05 8.74e-03 4.32e-03 2.02 0.046 Residual standard error: 18 on 103 degrees of freedom Multiple R-squared: 0.726, Adjusted R-squared: 0.707 F-statistic: 38.9 on 7 and 103 DF, p-value: <2e-16 Bis jetzt haben wir alle Wechselwirkungen ausser der knapp signifikanten Wechselwirkung temp:rad hinausgeworfen. Der am wenigsten signifikante quadratische Term in model4 ist I(rad^2), also streichen wir ihn und erhalten model5. > model5 <- update(model4, ~. - I(rad^2), data = ozonD) > summary(model5) Call: lm(formula = ozone ~ temp + wind + rad + I(temp^2) + I(wind^2) + temp:rad, data = ozonD) Residuals: Min 1Q Median -43.76 -11.16 -3.33 102 3Q 8.50 Max 78.85 8.1 Einfacheres Baummodell, GAM und lineare Modelle Coefficients: Estimate Std. Error t value Pr(>|t|) (Intercept) 143.11543 34.28697 4.17 6.2e-05 temp -4.62265 2.86897 -1.61 0.110 wind -13.04856 2.27867 -5.73 1.0e-07 rad -0.11414 0.10005 -1.14 0.257 I(temp^2) 0.11820 0.06236 1.90 0.061 I(wind^2) 0.44667 0.09996 4.47 2.0e-05 temp:rad 0.00782 0.00426 1.84 0.069 Residual standard error: 18 on 104 degrees of freedom Multiple R-squared: 0.722, Adjusted R-squared: 0.706 F-statistic: 45 on 6 and 104 DF, p-value: <2e-16 Diese Streichung hat die fast nicht-signifikante Wechselwirkung wind:rad kaum verändert und den Haupteffekt Temperatur temp bnicht-significant gemacht. Haupteffekte, die empfindlich sind auf Skalenänderungen wie die Temperatur sollten nicht eliminiert werden. Wir entfernen den Term wind:rad und kommen zu model6. > model6 <- update(model5, ~. - wind:rad, data = ozonD) > summary(model6) Call: lm(formula = ozone ~ temp + wind + rad + I(temp^2) + I(wind^2) + temp:rad, data = ozonD) Residuals: Min 1Q Median -43.76 -11.16 -3.33 3Q 8.50 Max 78.85 Coefficients: Estimate Std. Error t value Pr(>|t|) (Intercept) 143.11543 34.28697 4.17 6.2e-05 temp -4.62265 2.86897 -1.61 0.110 wind -13.04856 2.27867 -5.73 1.0e-07 rad -0.11414 0.10005 -1.14 0.257 I(temp^2) 0.11820 0.06236 1.90 0.061 I(wind^2) 0.44667 0.09996 4.47 2.0e-05 temp:rad 0.00782 0.00426 1.84 0.069 Residual standard error: 18 on 104 degrees of freedom Multiple R-squared: 0.722, Adjusted R-squared: 0.706 F-statistic: 45 on 6 and 104 DF, p-value: <2e-16 Das Modell model6 ist schon ein recht gutes und sparsames Modell, aber die Trompetenform der Residuen in Abb. 8.5 legt z.B. eine log-Transformation nahe. 103 8 Multiple Regression > plotLmT(model6) T3−plot of residuals −10 T3 ● −30 ● 120 −1.0 −0.5 0.5 Fitted values t Scale−Location Cook's distance 77 ● ● ● ●● ● ●● ● ● ● ● ● ● ● ●● ● ● ● ● ● ● ● ● ●●● ●● ● ● ● ●● ● ● ● ● ●●●● ● ● ● ● ● ● ● ●●● ● ● ● ● ● ● ●● ● ● ● ●●● ●● ● ● ●●●● ● ● ● ● ● ● ● ●● ●● ● ● ●● ● ● ● ● ● ● ● ● ● ● Fitted values ● 0.4 23 53 ●● ● 1.0 77 0.2 ● ● 20 40 60 80 85 34 120 0 20 40 60 80 100 Obs. number Abbildung 8.5: Diagnostiken für Modell 6 104 0.0 0.0 0.0 0.5 1.0 1.5 2.0 Standardized residuals 10 23 53 ●● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ●● ● ● ●● ● ● ●● ● ● ● ●● ●● ● ●● ● ● ● ● ● ● ● ● ● ● ● ● ●● ● ● ● ●● ● ●● ● ● ●● ● ● ● ●● ●●●● ● ●● ● ● ●● ● ● ● ● ●● ●● ● ●● ● ● ●●● ● ● ● ● ● ● 20 40 60 80 5% 1% 30 77 ● Cook's distance 40 0 −40 Residuals 80 Residuals vs Fitted 8.1 Einfacheres Baummodell, GAM und lineare Modelle Wir formulieren daher model7 direkt mit allen Einflussgrössen von model6. > model7 <- lm(log(ozone) ~ temp + wind + rad + I(temp^2) + + I(wind^2), data = ozonD) > summary(model7) Call: lm(formula = log(ozone) ~ temp + wind + rad + I(temp^2) + I(wind^2), data = ozonD) Residuals: Min 1Q Median -2.0929 -0.2827 -0.0304 3Q 0.3325 Max 1.2301 Coefficients: Estimate Std. Error t value Pr(>|t|) (Intercept) 2.760605 0.939571 2.94 0.0041 temp 0.030715 0.077498 0.40 0.6927 wind -0.208702 0.062278 -3.35 0.0011 rad 0.002562 0.000544 4.71 7.6e-06 I(temp^2) 0.001074 0.001559 0.69 0.4925 I(wind^2) 0.006738 0.002728 2.47 0.0151 Residual standard error: 0.495 on 105 degrees of freedom Multiple R-squared: 0.688, Adjusted R-squared: 0.673 F-statistic: 46.4 on 5 and 105 DF, p-value: <2e-16 Jetzt wird der quadratische Term I(temp^2) irrelevant, wir lassen ihn weg und erhalten model8. > model8 <- update(model7, ~. - I(temp^2), data = ozonD) > summary(model8) Call: lm(formula = log(ozone) ~ temp + wind + rad + I(wind^2), data = ozonD) Residuals: Min 1Q Median -2.024335 -0.274534 -0.000488 3Q 0.313257 Max 1.282441 Coefficients: Estimate Std. Error t value Pr(>|t|) (Intercept) 2.20873 0.48931 4.51 1.7e-05 temp 0.08356 0.01078 7.75 5.9e-12 wind -0.22038 0.05977 -3.69 0.00036 rad 0.00253 0.00054 4.68 8.5e-06 I(wind^2) 0.00722 0.00263 2.75 0.00706 Residual standard error: 0.494 on 106 degrees of freedom 105 8 Multiple Regression > plotLmT(model8) T3−plot of residuals ● 17 2.0 −10 10 5% 1% −30 ● 20 ●● ● ● ● ● ● ● ●● ● ● ● ●● ●● ●● ●●●● ● ● ●● ●● ●● ● ●●●● ● ●● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ●●●● ● ●● ● ●● ●●● ●● ●● ● ● ● ● ● ●● ● ● ● ●●●●● ●● ● ● ● ● ● ● ● ● ● ● ●● ● ● 102 ● T3 0 −1 −2 Residuals 1 Residuals vs Fitted 3.0 4.0 5.0 −1.0 −0.5 Fitted values Fitted values 5.0 0.30 0.10 0.20 17 20 18 0.00 20 ● 11 ●● ● ● ● ● ●● ● ● ● ● ● ● ● ● ● ●● ● ●● ● ●● ● ● ● ●● ● ● ● ● ●● ● ● ●● ● ● ● ● ● ●● ●● ●● ● ● ● ● ● ●● ● ● ●● ● ● ● ●● ● ● ● ●● ●●● ● ● ● ● ● ● ●●● ● ● ● ●●● ● ●● ● ● ●● ● ● ● ● ● ● ● ● ● 4.0 1.0 Cook's distance Cook's distance 0.0 0.5 1.0 1.5 2.0 Standardized residuals Scale−Location 3.0 0.5 t ● 17 2.0 0.0 0 20 40 60 80 100 Obs. number Abbildung 8.6: Diagnostiken für Modell 8 Multiple R-squared: 0.687, Adjusted R-squared: 0.675 F-statistic: 58.1 on 4 and 106 DF, p-value: <2e-16 Die Heteroszedaszität ist verschwunden, aber in Abb.8.6 sticht der Punkt Nr. 17 mit seiner grossen CookDistanz von 0.3 heraus. Wir lassen diesen zu einflussreichen Punkt weg und erhalten in model9 ausgeglichenere und kleinere (< 0.1) Cook-Distanzen. > model9 <- lm(log(ozone) ~ temp + wind + rad + I(wind^2), + data = ozonD[-17, ]) > summary(model9) Call: lm(formula = log(ozone) ~ temp + wind + rad + I(wind^2), data = ozonD[-17, ]) Residuals: 106 8.1 Einfacheres Baummodell, GAM und lineare Modelle Min 1Q Median -0.9768 -0.2734 -0.0144 3Q 0.3628 Max 1.1688 Coefficients: Estimate Std. Error t value Pr(>|t|) (Intercept) 2.534539 0.452849 5.60 1.8e-07 temp 0.075448 0.010014 7.53 1.8e-11 wind -0.220819 0.054659 -4.04 0.00010 rad 0.002210 0.000499 4.43 2.3e-05 I(wind^2) 0.006898 0.002405 2.87 0.00499 Residual standard error: 0.451 on 105 degrees of freedom Multiple R-squared: 0.697, Adjusted R-squared: 0.686 F-statistic: 60.5 on 4 and 105 DF, p-value: <2e-16 > plotLmT(model9) T3−plot of residuals −20 5.0 −1.0 −0.5 t Scale−Location Cook's distance 0.0 ● ● 2.0 1.0 30 102 ● ● 45 ●● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ●● ●● ● ● ●● ● ●●●●● ● ● ● ● ● ● ● ●● ● ●● ● ● ●● ● ● ● ● ● ● ●● ● ● ● ● ● ●● ● ●● ● ● ●● ● ● ● ●● ● ● ● ● ● ● ● ● ● ● ● ●● ● ● ●● ● ● ● ● ● ● 3.0 4.0 Fitted values 5.0 0.08 ● 0.5 19 20 0.04 ● ●● ● 0.0 Fitted values ● 20 ● 0.5 4.0 0.00 1.5 1.0 3.0 0 10 ● ● ● ● ● ● ● ●● ● ● ●●●● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ●● ● ●● ● ●● ● ●● ●● ●●●● ● ● ● ● ● ● ●● ● ● ●● ● ●● ● ●●● ● ● ● ●● ● ● ● ● ● ● ● ●●●●● ●● ● ● ● ● ● ● ● ● ● ●● ● ● 45 102 ● ● ● T3 ●● ● ● 2.0 Standardized residuals 5% 1% ● 20 Cook's distance 0.0 −1.0 Residuals 1.0 Residuals vs Fitted 0 20 40 60 80 100 Obs. number Abbildung 8.7: Diagnostiken für Modell 9 107 8 Multiple Regression Mit Modell plot(model9) geben wir uns zufrieden, denn es zeigt Normalität und konstante Varianz der Residuen. Wir haben ein minimales Modell gefunden mit fünf Parametern, ohne Wechselwirkungen, mit einem quadratischen Term für Windgeschwindigkeit, und reichlichen 105 Freiheitsgraden für den Fehler. 8.2 Alternatives Vorgehen Folgendes Vorgehen sei als Aufgabe gestellt. Man verwende plot(residuals(model1)) und wechsle schon früher zu log(ozone), z.B. mit model2. Man wird nach einer ähnlichen Anzahl von Eliminationsschritten ein minimales Modell erhälten. Ist es identisch mit model9? 8.3 Automatische schrittweise Regression Theoretische Überlegungen deuten darauf hin, dass automatische schrittweise Regression mit dem "vollen" Modell beginnen sollten und nicht-signifikante Regressoren eliminieren sollen ("Rückwärtselimination"). Beginnend mit dem Modell aus dem Mittelwert allein ("Vorwärtsschreiten") hängt die Aufnahme neuer Regressoren sehr delikat davon ab, wie diese miteinander korreliert sind, und man kann eine eher zufällige Auswahl von Regressoren erhalten. Die verschiedenen Kriterien, wie Regressoren ausgewählt werden sollen, z.B. AIC (Akaike Information Criterion), BIC (Bayesian Information Criterion), DIC( Deviance Information Criterion) betonen verschiedene Aspekte der Modellierung, s. http://de.wikipedia.org/wiki/Akaike_Information_Criterion und die Hilfe zu AIC(), step {stats}, stepAIC {MASS}. 108 9 Bootstrap 9.1 Motivation Sich wie Münchhausen an den eigenen Haaren aus dem Sumpf zu ziehen, "Pulling yourself up by your own bootstraps", gab diesem Verfahren den Namen. Man möchte Konfidenzintervalle bestimmen, hat aber nur eine Stichprobe statt der Grundgesamtheit zur Verfügung. Die Idee ist bestechend einfach. Man bildet beliebig viele (Unter-)Stichproben aus dieser Stichprobe, erlaubt aber, dass Werte mehrfach oder gar nicht vorkommen dürfen. Man berechnet z.B. die Stichprobenmittelwerte sehr häufig, einmal für jede Unterstichprobe, und berechnet dann die Extrembereiche dieser Mittelwerte mittels der Funktion quantile. Das 95%-Intervall bekommt man dann mit der Spezifikation von c(0.0275,0.975) für die untere und obere Grenze. 9.2 Beispiel Wir benutzen einen Datensatz mit 30 Werten aus Crawley’s Buch. > skewdt <- read.table("./Data/skewdata.txt", header = TRUE) und zeigen ihr Histogramm in Abb. 9.1. Wir berechnen die Verteilung von 10000 unabhängigen Ziehungen von Stichproben des Umfangs k = 5, 10, . . . , 30 und zeigen die exakten 90%-Vertrauensintervalle und ihre Approximation durch t- und Normalverteilung, siehe Abb. 9.2. > boot1 <- function(n) { + plot(c(0, 30), c(0, 60), type = "n", xlab = "Sample size", + ylab = "Confidence intervals") + for (k in seq(6, 30, 3)) { + a <- numeric(n) + for (ii in 1:n) { + a[ii] <- mean(sample(skewdt$values, k, replace = TRUE)) + } + points(c(k, k), quantile(a, c(0.025, 0.975)), + type = "b") + } + xv <- seq(5, 30, 0.1) + yv <- mean(skewdt$values) + qnorm(0.025) * sqrt(var(skewdt$values)/xv) + lines(xv, yv, col = "red") + yv <- mean(skewdt$values) + qnorm(0.975) * sqrt(var(skewdt$values)/xv) + lines(xv, yv, col = "red") + yv <- mean(skewdt$values) + qt(0.025, xv) * sqrt(var(skewdt$values)/xv) + lines(xv, yv, lty = 2) 109 9 Bootstrap > hist(skewdt$values, xlab = "skewdt", main = "Histogram of skewdt") 6 4 0 2 Frequency 8 10 Histogram of skewdt 0 20 40 60 80 skewdt Abbildung 9.1: Schief verteilte Daten + + + + + } yv <- mean(skewdt$values) + qt(0.975, xv) * sqrt(var(skewdt$values)/xv) lines(xv, yv, lty = 2) abline(mean(skewdt$values), 0, xlim = c(6, 30), lty = 3) return(a) Beim Maximalwert k = 30 (das letzte Ergebnis a der for-Schleife) vergleichen wir die Abstände der Quantile > quantile(a, c(0.025, 0.975)) 2.5% 97.5% 24.8076 37.7739 vom Mittelwert 30.96866: 110 9.2 Beispiel 50 60 > a <- boot1(10000) ● 40 ● ● ● ● ● ● ● ● ● ● 30 ● ● 20 ● ● ● ● 0 10 Confidence intervals ● 0 5 10 15 20 25 30 Sample size Abbildung 9.2: Bootstrap-Vertrauensintervalle (durch die Verbindungslinien zwischen den Kreisen angedeutet) in Abhängigkeit vom Stichprobenumfang. Rot = Normale Approximation, gestrichelt = t-Verteilung als Approximation. Gestrichelte Linie = Mittelwert > mean(skewdt$values) - quantile(a, c(0.025, 0.975)) 2.5% 97.5% 6.16110 -6.80526 Hingegen sind die Quantile der approximierten Normalverteilung > qnorm(0.975) * sqrt(var(skewdt$values)/30) [1] 6.56968 also ähnlich, aber nicht gleich den empirischen Bootstrap-Quantilen (einmal +, einmal −). Man sieht sehr deutlich, dass die Approximationen durch Normal- und t-Verteilung die Schiefe der Daten nicht angemessen wiedergeben können. Die Bootstrap-Konfidenzgrenzen sind bei diesem kleinen Umfang der Originalstichprobe zuverlässiger und dazu nicht schwer zu berechnen. 111 9 Bootstrap Faustregel 5. Der Umfang der Bootstrap-Stichprobe darf nicht grösser sein als die Stichprobe, aus der gezogen wird. Missachtet man diese Regel, so täuscht man eine nicht zu erzeugende Genauigkeit vor! Nun dasselbe Beispiel mit der Funktion boot aus dem Paket boot. boot(data, statistic, R) Die Funktion statistic muss als erstes Argument die Daten, das zweite ein Index haben (der dient zum Übergeben der Zufallsauswahl) : > mymean <- function(x, i) mean(x[i]) > (myboot <- boot(skewdt$values, mymean, R = 10000)) ORDINARY NONPARAMETRIC BOOTSTRAP Call: boot(data = skewdt$values, statistic = mymean, R = 10000) Bootstrap Statistics : original bias t1* 30.9687 0.0645663 std. error 3.29572 Erklärung: original ist der Mittelwert des Datensatzes: > mean(skewdt$values) [1] 30.9687 > sqrt(var(myboot$t)) [,1] [1,] 3.29572 und bias ist die Differenz zwischen dem Mittel und dem Mittel der simulierten Werte, welches in myboot$t zurückgegeben wird, std.error ist deren Standardabweichung. Bootstrap kann sehr vielseitig eingesetzt werden. Es gibt eine Menge von interessanten Grössen, deren exakte Verteilung unbekannt ist, vor allem in Simulationsmodellen. Siehe auch http://en.wikipedia. org/wiki/Bootstrapping_(statistics). 112 10 Anhang 10.1 Literatur Guter einführender Artikel: http://en.wikipedia.org/wiki/Statistics Interaktiver Kurs auf dem Web: http://www.virtualstatistician.com/link-28.html Becker, R.A., Chambers, J.M., Wilks, A.R., 1988. The New S Language: a Programming environment for data analysis and graphics, 702 p., Chapman & Hall, ISBN-10: 0-412-74150-4. "Das"grundlegende "blaue"Buch über S/R. Chambers, J., 1994. Graphical Methods for Data Analysis (Statistics), 336 p. Chapman & Hall/CRC; ISBN13: 978-0412052712 Crawley, M.J., 2005. Statistics: an introduction using R. 327 p., John Wiley Sons, ISBN 0-470-02297-3 (hard), 0-470-02298-1 (paper). Eine handliche und ausgezeichnete Darstellung. Crawley, M.J., 2007. The R book. 942 p., John Wiley Sons, ISBN-13 978-0-470-51024-7 (hard) Eine wahre Fundgrube für R. Faraway, J.J., 2002. Practical Regression and Anova using R: http://cran.r-project.org/doc/ contrib/Faraway-PRA.pdf Faraway, J.J., 2005. Linear Models with R. 229 p., Chapman & Hall, ISBN-10 1-58488-425-8. Ghosh, S., 1996. A new graphical tool to detect non-normality. Journal of the Royal Statistical Society B , 58, 691-702. Hoffmann, C.W., Usoltsev, V.A., 2000. The Estimation of tree foliage biomass from a suitable tree diameter, or Tree foliage and the Pipe Model. Poster presented at the Forum fuer Wissen, 2000-10-25..26, Swiss Federal Research Institute WSL, Birmensdorf, Switzerland. 1 p Hoffmann, C.W., Usoltsev, V.A., 2002. Tree-crown biomass estimation for forest species of the Ural and of Kazakhstan. Forest Ecol. Manag., 158/1-3, 59-69. Ricci, V., Regression: Eine Übersicht von Vito Ricci cran.r-project.org/doc/contrib/ Ricci-refcard-regression.pdf. Dieses Datei befindet sich in ./fig.pdf.ppt Sachs, L., Hedderich, J., 2006. Angewandte Statistik, Methodensammlung mit R. Zwölfte, vollständig neu bearbeitete Auflage. 702 p. Springer, ISBN-13 978-3-540-32160-6, ISBN-10 3-540-32160-8. Eines der vielleicht besten Statistikbücher zur Zeit. Sawitzki, G., 2008. cran.r-project.org/doc/contrib/Sawitzki-Einfuehrung.pdf: Statistical Computing, Einführung in R, Günther , StatLab Heidelberg, 17. März 2008. Shinozaki, K., Yoda, K., Hozumi, K., Kira, T., 1964. A quantitative analysis of plant form . The pipe model theory. Japan. J. Ecol. 14 (3), 97–105, 133–139. 10.2 Dank Ich bin Michael J. Crawley zu Dank verpflichtet für seine ausgezeichneten Statistikbücher, die mich sehr zu diesem Manuskript motivierten und die Erlaubnis, sie ungeniert zu zitieren. Die Arbeit mit den Kursteilnehmern an der WSL war sehr beflügelnd und fruchtbar, besonders in Anbetracht ihres sehr vielfältigen Erfahrungshintergrundes und der Geduld, die sie für meine Bemühungen aufbrachten, diesen Text klar zu 113 10 Anhang formulieren. Vieles aus den lebhaften Diskussionen konnte natürlich nicht in den Text aufgenommen werden. 10.3 Hinweis für das Plotten Bei der Erzeugung von Plots mittels Sweave() kann es vorkommen, dass ein Plot im Text nicht angezeigt wird. Man hilft sich folgendermassen. Man führt die Plotanweisungen op <-; plot(); par(op) direkt in R aus, speichert vom Plotfenster aus den Plot unter geeignetem Namen (hier der des Chunks C8m9b) und verschiebt ihn in einen besonderen Ordner (fig.pdf.ppt), in dem man solche Plots sammelt. In die LaTeX-Anweisung figure kommentiert man den Chunk aus (mittels %) und bindet die Figur mittels includegraphics direkt ein. \begin{figure}[hbt] \centering \he{0.8} % <<C8m9b>>= % op <- par(mfrow=c(2,2)) % plot(model9, which = 1:4) % par(op) % @ \includegraphics{fig.pdf.ppt/C8m9b} \caption{\label{f:C8m9b} Diagnostiken f"ur Modell 9} \end{figure} 114 10.4 Informationsfluss 10.4 Informationsfluss Kurs.Rnw R> Stangle(“+“) R> Sweave(“*“) R Kurs.R \SweaveInput(“ “) R R Kurs.tex Kurs.hdr Kurs.Ch1.Rnw Kurs.Ch2.Rnw Kurs.Ch3.Rnw \fig\Fig-01.pdf \fig\Fig-02.pdf \fig\Fig-03.pdf \fig\Fig-04.pdf > pdflatex Kurs R-Console R> Stangle (“Kurs.Rnw“)+ R> source (“Kurs.R“) R> [Copy Paste] R> [Resultate] R> Sweave (“Kurs.R“)* R> system(“pdflatex Kurs.tex“) L Acrobat Reader Kurs.pdf R Fehler in R chunk Mywork.R L Fehler in Latex C.W.Hoffmann, 2008-11-24 Abbildung 10.1: Dateien und Programme, Informationsfluss im System "R", "LaTeX", "Acrobat". Anstelle von "pdflatex Kurs" gilt für Mac OSX "TexShop, Befehl-T" 10.5 Erzeugung der R-Kodedatei Erzeuge die R Codedatei Crs.R: > Stangle("Kurs.Rnw") Writing to file Kurs.R 10.6 Interne Daten und Funktionen Bisher verborgen gehaltene interne Daten und Funktionen. > > > > > > > > library(cwhmisc) options(width = 70) par(mfrow = c(1, 1)) options(warn = 1) N <- 10000 ceX <- 1.2 ncS <- nclass.Sturges ncC <- nclass.scott 115 10 Anhang > > > + + + + + + + + + + > + + + + > > + + + + + + + + > + + + + + + + > + + + + + + + + + + ncF <- nclass.FD ranC <- c(1, 2, 3, 5, 30, 300) CranC <- function(n, lang = LANG) { if (lang == "Eng") paste("The sums of ", paste(paste(ranC[-length(ranC)], ", ", sep = ""), collapse = ""), "and ", ranC[length(ranC)], " realizations of n=", n, " drawings of the", sep = "") else paste("Die Summe von ", paste(paste(ranC[-length(ranC)], ", ", sep = ""), collapse = ""), "und ", ranC[length(ranC)], " Realisationen von n=", n, " Ziehungen aus der", sep = "") } CranL <- function(lang = LANG) { if (lang == "Eng") paste("Sums of drawings of the", sep = "") else paste("Summen von Ziehungen aus der", sep = "") } scal.mx <- function(x, mx = max(x)) x/mx hist.cum <- function(x, mx = max(x), coL = "red", ...) { h <- hist(x, ...) mh <- max(h$counts) lines(h$breaks, scal.mx(c(0, cumsum(h$counts))) * mh, lty = 4, col = "blue") tb <- table(x) lines(as.numeric(names(tb)), scal.mx(cumsum(tb)) * mh, lty = 1, col = coL) } boxpm <- function(formul, Points = TRUE, Mean = TRUE, ...) { bx <- boxplotM(formul, Mean = Mean, ...) frm <- formula2string(formul) Lhs <- eval(text = frm$left) if (Points) plot(formul) } intpD <- function(x, y, xi) { N <- length(x) stopifnot(N == length(y) | max(abs(diff(x))) > 0) ascending <- identical(x, x[order(x, decreasing = FALSE)]) descending <- identical(x, x[order(x, decreasing = TRUE)]) stopifnot(ascending | descending) if (descending) { x <- rev(x) y <- rev(y) } stopifnot(x[1] <= xi & xi <= x[N]) 116 10.6 Interne Daten und Funktionen + + + + + + + + + + > + > + > + > + > + + + > + + + + + + + + + + + + + + + + + + + + + + + + nu <- max(which(x <= xi)) if (nu == N) { res <- y[N] } else { res <- y[nu] + (xi - x[nu])/(x[nu + 1] - x[nu]) * (y[nu + 1] - y[nu]) } res } d1binom <- function(x, size, prob) stats::dbinom(round(x), size, prob) d1nbinom <- function(x, size, prob, mu) stats::dnbinom(trunc(x), size, prob, mu) d1geom <- function(x, prob, log = FALSE) stats::dgeom(trunc(x), prob, log = log) d1pois <- function(x, lambda, log = FALSE) stats::dpoisn(round(x), lambda, log) d1cauchy <- function(x, location = 0, scale = 1, log = TRUE) { stats::dcauchy(log(x + 0.125), location, scale, log) * 1000 } aver <- function(k, xlab, fct, n, br = ncF, lang = LANG, ...) { s <- rep(0, n) ff <- get(fct) for (ii in 1:k) { s <- s + ff(n, ...) } av <- s/k h <- hist(av, breaks = br, plot = FALSE) mainL <- { if (lang == "Eng") paste(if (k == 1) "Density+Function" else paste(k, "terms"), ", sk =", formatFix(skew(h$counts), 3), sep = "") else paste(if (k == 1) "Dichte+Funktion" else paste(k, "Terme"), ", sk =", formatFix(skew(h$counts), 3), sep = "") } plot(h, main = mainL, xlab = xlab) md <- mean(h$counts) * diff(range(h$breaks)) if (k == 1) { g <- paste("d", substr(fct, 2, 100), sep = "") curve(get(g)(x, ...) * md, add = TRUE, col = "blue") 117 10 Anhang + + + + + + > + + + + > + + + + + + + > + + + + + + + > + + + + + + + + > + + + + + + > > + > } else if (k > 1) curve(dnorm(x, mean(av), sd(av)) * md, add = TRUE, col = "red") invisible(h) } MWstr <- function(n, lang = LANG) { if (lang == "Eng") paste("Averages of ", n, " drawings of") else paste("Mittelwerte von ", n, " Ziehungen von") } pl <- function(tit, xlab, fct, n, br = ncF, cex = ceX, lang = LANG, ...) { pltRCT(3, 2, tit, { for (ii in ranC) aver(k = ii, xlab, fct, n, br = br, lang = lang, ...) }, oma = c(2, 2, 5, 2), cex = cex, mar = c(5, 4, 2, 1)) } plotLmT <- function(model) { op <- par(mfrow = c(2, 2)) plot(model, which = 1) T3plot(residuals(model), lab = "T3-plot of residuals", legend.pos = "top") plot(model, which = 3:4) par(op) } skew <- function(x, na.rm = FALSE) { if (na.rm) x <- x[!is.na(x)] mn <- mean(x) N <- length(x) m3 <- sum((x - mn)^3)/N s3 <- sqrt(var(x))^3 m3/s3 } kurtosis <- function(x, na.rm = FALSE) { if (na.rm) x <- x[!is.na(x)] m4 <- sum((x - mean(x))^4)/length(x) s4 <- var(x)^2 m4/s4 - 3 } timb <- read.table("./Data/timber.txt", header = TRUE) timb1 <- cbind(timb, volComp = pi/4 * timb$girth^2 * timb$height/3) write.table(timb1, file = "timb1.dat", row.names = TRUE) 118 10.6 Interne Daten und Funktionen > > > > > > > > > > + > > > > > > > > > dav <- read.table("./Data/Davos.h", header = TRUE) alp <- read.table("./Data/Alptal.h", header = TRUE) lae <- read.table("./Data/Laegern.h", header = TRUE) alp1 <- cbind(alp, loc = rep("a", nrow(alp))) dav1 <- cbind(dav, loc = rep("d", nrow(dav))) lae1 <- cbind(lae, loc = rep("l", nrow(lae))) dat <- rbind(alp1, dav1, lae1) fact <- read.table("./Data/factorial.txt", header = TRUE) alpBH <- read.table("./Data/AlpBH.txt", header = TRUE) BL <- read.table("./Data/Birch1.dat", header = TRUE, as.is = 3) CN <- read.table("./Data/Pine1.dat", header = TRUE, as.is = 4) BL$ldc <- log(BL$dc) BL$lwf <- log(BL$wf) CN$ld <- log(CN$d) CN$ldc <- log(CN$dc) CN$lwf <- log(CN$wf) ozonD <- read.table("./Data/ozone.txt", header = TRUE) ozonD$temp <- (ozonD$temp - 32) * 5/9 skewdt <- read.table("./Data/skewdata.txt", header = TRUE) 119