168 53 24MB
German Pages 300 [304] Year 2001
Lehr- und Handbücher der Statistik Herausgegeben von Universitätsprofessor Dr. Rainer Schlittgen Bisher erschienene Werke: Böhning, Allgemeine Epidemiologie Caspary • Wichmann, Lineare Modelle Chatterjee • Price (Übers. Lorenzen), Praxis der Regressionsanalyse, 2. Auflage Degen • Lorscheid, Statistik-Lehrbuch Degen • Lorscheid, Statistik-Aufgabensammlung, 3. Auflage Härtung, Modellkatalog Varianzanalyse Harvey (Übers. Untiedt), Ökonometrische Analyse von Zeitreihen, 2. Auflage Harvey (Übers. Untiedt), Zeitreihenmodelle, 2. Auflage Heiler • Michels, Deskriptive und Explorative Datenanalyse Kockelkorn, Lineare statistische Methoden Miller (Übers. Schlittgen), Grundlagen der Angewandten Statistik Naeve, Stochastik für Informatik Oerthel • Tuschl, Statistische Datenanalyse mit dem Programmpaket SAS Pflaumer • Heine • Härtung, Statistik für Wirtschaft- und Sozialwissenschaften: Deskriptive Statistik
Fachgebiet
Pflaumer • Heine • Härtung, Statistik für Wirtschafts- und Sozialwissenschaften: Induktive Statistik Pokropp, Lineare Regression und Varianzanalyse Rasch • Herrendörfer u.a., Verfahrensbibliothek, Band I und Band 2 Riedwyl • Ambühl, Statistische Auswertungen mit Regressionsprogrammen Rinne, Wirtschafts- und Bevölkerungsstatistik, 2. Auflage Rinne, Statistische Analyse multivariater Daten - Einführung Rüger, Induktive Statistik, 3. Auflage Rüger, Test- und Schätztheorie, Band I: Grundlagen Schlittgen, Statistik, 9. Auflage Schlittgen, Statistische Inferenz Schlittgen, GAUSS für statistische Berechnungen Schlittgen • Streitberg, Zeitreihenanalyse, 8. Auflage Schürger, Wahrscheinlichkeitstheorie Tutz, Die Analyse kategorialer Daten
Biometrie
Herausgegeben von Dr. Rolf Lorenz Bisher erschienene Werke: Bock, Bestimmung des Stichprobenumfangs
Brunner • Langer, Nichtparametrisehe Analyse longitudinaler Daten
GAUSS für statistische Berechnungen Buch mit CD-ROM
Von Universitätsprofessor
Dr. Rainer Schlittgen
R. Oldenbourg Verlag München Wien
Die Deutsche Bibliothek - CIP-Einheitsaufnahme Sehlingen, Rainer: GAUSS für statistische Berechnungen / von Rainer Schlittgen. - München ; Wien : Oldenbourg, 2001 (Lehr- und Handbücher der Statistik) ISBN 3-486-25650-5
© 2001 Oldenbourg Wissenschaftsverlag GmbH Rosenheimer Straße 145, D-8I671 München Telefon: (089)45051-0 www.oldenbourg-verlag.de Das Werk einschließlich aller Abbildungen ist urheberrechtlich geschützt. Jede Verwertung außerhalb der Grenzen des Urheberrechtsgesetzes ist ohne Zustimmung des Verlages unzulässig und strafbar. Das gilt insbesondere für Vervielfältigungen, Übersetzungen, Mikroverfilmungen und die Einspeicherung und Bearbeitung in elektronischen Systemen. Gedruckt auf säure- und chlorfreiem Papier Gesamtherstellung: Druckhaus „Thomas Müntzer" GmbH, Bad Langensalza ISBN 3-486-25650-5
Einführung GAUSS verbindet die Flexibilität einer Programmiersprache mit der Komplexität eines statistischen Auswertungsprogrammes. Es verfügt über einen umfangreichen Vorrat an Befehlen aus dem Bereich der Statistik, der numerischen Mathematik und der Grafik. Dass in GAUSS viele statistische Verfahren bereits fertig programmiert sind, erlaubt schnelle statistische Standardauswertungen; andererseits ist GAUSS gerade wegen der Möglichkeit interessant, neuere Verfahren schnell umzusetzen. GAUSS besitzt einige Eigenschaften, die sicherstellen, dass bei der Vorbereitung und bei der Durchführung der praktischen Berechnungen die statistische Fragestellung nicht in den Hintergrund gedrängt wird. Insbesondere erlaubt GAUSS, bei der Programmierung sehr dicht an der Problemformulierung und der standardmäßigen Formulierung statistischer Verfahren zu bleiben. So wird etwa bei der Regressionsrechnung der Kleinste-Quadrate-Schätzer des Koeffizientenvektors bestimmt über ß=
(X'X)-lX'y.
In GAUSS kann das umgesetzt werden mit der Progammzeile INV(x'*x)*x>*y Das Beispiel weist auf den zentralen Punkt hin, dass in GAUSS Vektoren und Matrizen als Entitäten behandelt werden; für diese steht der Matrizenkalkül zur Verfügung. Dies impliziert wesentliche Vereinfachungen beim Umsetzen statistischer Verfahren, von denen ja viele geradezu vom Matrizenkalkül leben. Zusammengenommen kann mit GAUSS leicht drei Problemen statistischer Programmpakete begegnet werden: Kein fertiges Paket kann alle Auswertungsroutinen enthalten, die zur Analyse von Fragestellungen aus unterschiedlichen Bereichen benötigt werden. Größere Progammpakete sind daher auf die am häufigsten eingesetzten Verfahren abgestellt. Speziellere oder neuere Verfahren fehlen in der Regel. Ein zweites Problem bei den statistischen Programmpaketen besteht in der meist nur unzureichend zugänglichen Information darüber, wie die eigentlichen Berechnungen durchgeführt werden und vor allem, welche Varianten der statistischen Verfahren implementiert sind.
VI
Mit einer Black-Box arbeiten zu müssen, ist zumindest unbehaglich. Drittens stellt sich die üblicherweise sehr beschränkte Eingriffsmöglichkeit in den Analyseprozeß als ein Problem dar. Betrachtung von Zwischenergebnissen, Elimination oder Ändern einzelner Daten, Modifizieren von Auswertungsgängen ist i.d.R. recht mühsam oder sogar unmöglich. Es erfordert zwar stets einen gewissen Aufwand, eine Programmiersprache zu erlernen. Dieser ist bei GAUSS aber im Gegensatz zu anderen Programmiersprachen wie C verhältnismäßig gering. Die Einfachheit von GAUSS wird zwar durch Abstriche in den Programmiermöglichkeiten, wie sie z.B. C bietet, erkauft. Das ist jedoch für die meisten Anwender überhaupt nicht relevant, sondern ist nur für die Personen interessant, die professionell programmieren. Außerdem kann man Programme anderer Sprachen in GAUSS integrieren. Die Zielsetzung des vorliegenden Textes ist zweifach. Einmal soll der künftige Nutzer an die Programmierung in GAUSS und die Verwendung von GAUSS zur Auswertung statistischer Daten herangeführt werden. Dazu werden die verschiedenen Aspekte ausführlich dargestellt und mit statistischen Anwendungen aus verschiedenen Teilgebieten unterlegt. Zum anderen soll das Buch auch zum Nachschlagen, gewissermaßen als ständiger GAUSS-Begleiter, geeignet sein. Um diese Zielvorstellung zu erfüllen, sind in den thematisch strukturierten Kapiteln die jeweils passenden GAUSS-Prozeduren tabellarisch zusammengestellt. Wer sucht schon in der von GAUSS mitgelieferten Namenbasierten Hilfe eine Prozedur, von deren Existenz sie/er keine Ahnung hat? Zum Vorteil für beide Zielgruppen ist sicherlich, dass die GAUSS-Mailing Liste der letzten Jahre intensiv ausgewertet wurde; zahlreiche Fragen, die an die GAUSSianer allgemein gestellt wurden, haben zusammen mit den von verschiedenen Anwendern eingebrachten Lösungsvorschlägen ihren Eingang in diesen Text gefunden. Allerdings muss einschränkend konstatiert werden, dass nicht alle Befehle in diesem Buch beschrieben werden. In der Praxis selten vorkommende sind weggelassen worden, um den Umfang des Buches in vertretbarem Rahmen zu halten. Bei der Beschreibung wird die Version GAUSS 3.5 für Windows zu Grunde gelegt; dies ist die erste echte Windows-Version. Dabei ist der Windowsspezifische Anteil des Textes relativ gering. Somit sollte das Buch auch für GAUSS-Anwender nützlich sein, die mit einem anderen Betriebssystem, wie z.B. LINUX, arbeiten. In mehreren Veröffentlichungen wurden verschiedene Programmiersprachen miteinander verglichen. So weit sie GAUSS betreffen, haben die Vergleiche nunmehr eher historischen Wert. Trotzdem seien einige hier kurz erwähnt. Denn bzgl. der Struktur und des Befehlsvorrates hat sich nichts entschieden verschoben. Rust (1993) stellte aufgrund des Befehlsvorrates eine Überlegenheit von GAUSS gegenüber MATLAB in den Bereichen Statistik und Ökonometrie fest. Einen zweiten ausführlichen Vergleich zwischen GAUSS
VII und MATLAB mit ergänzenden Bemerkungen zu MAPLE und MATHEMATICA hat Marc Nerlove (1998) ins Internet gehängt. 1 Sein Fazit nach ca. 90 Seiten besteht darin, dass GAUSS durchaus Schwächen hat, besonders bzgl. des Supportes und der Dokumentation, dass GAUSS jedoch für statistische und ökonometrische Anwendungen, speziell im Zusammenhang mit Maximum-Likelihood-Schätzungen, die anderen so weit übertrifft, dass es in seinem Bereich der Standard bleibt. Die Dokumentation gibt mit der neuen Online-Hilfe der vorliegenden Version (und dem Buch, das Sie nun in den Händen halten,) keinen Anlass mehr, Kritik zu üben. Weiterhin sind über das Internet zahlreiche Ergänzungen und Unterstützungen erhältlich. Die Hauptadresse für GAUSS ist zunächst einmal die Homepage der Firma Aptech Systems, h t t p : //www. aptech. com. Hier findet man wichtige Links, wie z.B. zur GAUSS-mailing Liste (gaussians@eco. u t e x a s . edu) und zu verschiedenen Homepages von GAUSS-Nutzern, die ihre Programme frei zur Verfügung stellen. Das von Alan G. Isaak betreute zentrale GAUSS-Archiv, in dem die Mehrzahl der frei zugänglichen Programme abgelegt sind, ist ebenfalls über diese Aptech-Seite oder direkt über http://gurukul.ucc.american.edu/econ/gaussres/GAUSSIDX.HTM zu erreichen. Zu den im Internet verfügbaren Ressourcen werden im Kapitel 14 detailliertere Ausführungen gemacht. GAUSS-Anwender sollten ab und zu unter www.american.edu/academic.depts/cas/econ/soft.htm und hier unter g a u s s h i n t s nachschauen. Dort werden wertvolle Hinweise auf Möglichkeiten bzw. Bugs abgelegt. In diesem Buch wird bzgl. der Schreibweise eine Trennung zwischen GAUSSBefehlen und -Eingaben, GAUSS-Ausgaben und den üblichen mathematischen Bezeichnungen gemacht. Matrizen und Vektoren werden als mathematische Objekte mit großen bzw. kleinen Buchstaben in fetter Schrift angegeben. Ein Beispiel dafür ist A, b. GAUSS-Befehle und -Eingaben sind in Schreibmaschinenschrift gesetzt. PRINT a ist etwa ein solcher Befehl, bei dem a durchaus eine Matrix sein kann. Ist die Matrix vom Typ (2,2), so wird die zugehörige Ausgabe dann angegeben gemäß 1.0000 4.0000
2.0000 5.0000.
Abgewichen wird von dieser Vereinbarung nur in den Fällen, wo Matrizen Namen gegeben werden, die Assoziationen an die Bedeutung hervorrufen. Dann verwenden wir auch die sonst für GAUSS-Ausdrücke reservierte Schreibmaschinenschrift. In den tabellarischen Zusammenfassungen der Prozeduren werden die zulässigen Dimensionierungen unterhalb der zugehörigen Eingabe bzw. Ausgabe angegeben. Um diese Angaben aber nicht zu überfrachten, wird nur eine 'http://www.aree.umd.edu/mncrlove/mnerlove.htm
Vili von u.U. mehreren Möglichkeiten notiert, und zwar diejenige, welche nach der Erfahrung des Autors am häufigsten verwendet wird. Insgesamt sind die Dimensionsangaben als Hinweis, nicht aber als vollständige Auflistungen zu verstehen. Die Basis für den vorliegenden Text bilden zwei Skripte zu GAUSS unter DOS. Eines ist das von A. Handl, welches von B. Schmidtmann und S. Uhlig in J^T^jX gesetzt wurde. Das andere stammt von T. Thadewald, das mir in einer von H. Knautz und M. Pasche überabeiteten I^IfeX-Fassung zugänglich gemacht wurde. Auch wenn von den ursprünglichen Texten nicht viel übrig geblieben ist, ohne diese Vorgaben hätte ich wohl kaum mit dem Schreiben begonnen. Daher möchte ich allen herzlich danken. Auch Herrn Steinhaus von der Fa. Additive, der deutschen Vertretung von Aptech Systems, möchte ich für seine zahlreichen Hinweise und sein geduldiges Eingehen auf meine zahlreichen Anfragen unterschiedlichster Art ein herzliches Dankeschön sagen. Ganz besonderer Dank geht an Herrn T. Noack, meinem l^T^X-Guru und GAUSS-Mitstreiter, ohne den der Text, den Sie nunmehr in den Händen halten, nicht so aussähe, wie er sich nun darstellt. Berlin und Hamburg
Rainer
Schlittgen
Inhaltsverzeichnis Tabellenverzeichnis Algorithmen und Prozeduren im Text 1
2
3
Die Benutzeroberfläche
XIII XV 1
1.1
Installieren und Konfigurieren
1
1.2
Das Befehlsfenster
4
1.3
Das Ausgabe-Fenster
6
1.4
Das Edit-Fenster
8
Numerische Daten
11
2.1
Erzeugung numerischer Matrizen
11
2.2
Exkurs: Speichern und Einlesen von Matrizen
22
2.3
Fehlende Werte
23
2.4
Komplexe Zahlen
24
2.5
Verwaltung des Hauptspeichers
26
2.6
Ausgabe auf Bildschirm und Drucker
27
2.7
Aufgaben
30
Statistische Funktionen
33
3.1
Deskriptive Statistik
33
3.2
Lineare Regression
40
3.3
Statistische Verteilungen
42
3.4
Zufallszahlen
45
3.5
Aufgaben
47
x 4
5
6
7
8
INHALTSVERZEICHNIS Elementare Verknüpfung von Matrizen
49
4.1
Matrizenrechnung
49
4.2
Elementweise Verknüpfung von Matrizen
51
4.3
Relationale und logische Operatoren
56
4.4
Prioritäten der Operatoren
59
4.5
Aufgaben
60
Weitere Matrizenbearbeitung
63
5.1
Zugriff auf Teile von Matrizen
63
5.2
Umstrukturieren von Matrizen
70
5.3
Kronecker- und horizontales direktes Produkt
74
5.4
Aufgaben
75
Nichtnumerische Daten
79
6.1
Charakter-Matrizen
79
6.2
Strings (Zeichenketten) und String-Arrays
81
6.3
String-Bearbeitung
84
6.4
Aufgaben
89
Programmieren in GAUSS I
91
7.1
Kontrollstrukturen
91
7.2
Stapelprogramme
99
7.3
Funktionen
103
7.4
Prozeduren
104
7.5
Unterprogramme
115
7.6
Keywords
116
7.7
Aufgaben
120
Programmieren in GAUSS II
123
8.1
Fehlersuche
123
8.1.1
Fehlermeldungen
123
8.1.2
Der Debugger
124
8.1.3
Fehlerbehandlung im Programmtext
126
8.2
Libraries
128
INHALTSVERZEICHNIS
9
XI
8.3
Andere Programmiersprachen
133
8.4
Bessere Programme
135
8.5
Aufgaben
139
Datenmanagement
141
9.1
GAUSS-Matrizen- und String-Files
141
9.2
GAUSS-Datensätze
143
9.3
ASCII-Dateien
152
9.4
Andere Datenformate
158
9.5
Aufgaben
164
10 Grafik
167
10.1 Erstellen von Grafiken
168
10.2 Beispiele
175
10.3 Exportieren von Grafiken
181
10.3.1 Konvertieren von Grafik-Dateien
181
10.3.2 Einbinden von Grafiken in Textdokumente
181
10.4 Prozeduren und globale Variablen
183
10.5 Die GraphiX-Library
191
10.6 Aufgaben
193
11 Numerische Methoden I: Lineare Algebra
195
11.1 Inverse Matrizen
196
11.2 Lineare Gleichungssysteme
199
11.3 Matrizenzerlegung und Eigenwerte
201
11.4 Weiteres zur Regression
207
11.4.1 Regression auf der Basis der QR-Zerlegung
208
11.4.2 Kollinearität
209
11.4.3 Robuste Regression
210
11.5 Band-limitierte und dünn besetzte Matrizen
212
11.6 Weitere Matrizenoperatoren
216
XII
INHALTSVERZEICHNIS
12 Numerische Methoden II: Analysis 12.1 Differentation und Integration
217 217
12.1.1 Differentation
217
12.1.2 Integration
220
12.2 Polynome
224
12.3 Glättung und Interpolation
225
12.3.1 Polynominterpolation
225
12.3.2 Splines
226
12.3.3 Nichtlineare Glättung
229
12.4 Fouriertransformation
231
13 Numerische Methoden III: Optimierung
237
13.1 Lineare und quadratische Optimierung
237
13.1.1 Lineare Optimierung
237
13.1.2 Quadratische Optimierung
242
13.2 Nichtlineare Optimierung
243
13.2.1 Nichtlineare Gleichungen
243
13.2.2 Quasi-Newton-Verfahren
244
13.2.3 Maximum-Likelihood Schätzung
245
14 Statistik-Libraries
255
14.1 Kommerzielle Module
255
14.2 Freie Bibliotheken
257
Lösungen zu den Aufgaben
261
Inhalt der CD - Bezug von GAUSS
271
Literatur
275
Gauss-Command-Index
277
Sachindex
283
Tabellenverzeichnis 2.1
Wissenschaftliche Funktionen
17
2.2
Präzisionskontrolle
19
2.3 Erzeugung von Matrizen
20
2.4
Fehlende Werte
23
2.5
Komplexe Zahlen
26
2.6
Verwaltung des Hauptspeichers
26
2.7
Bildschirm- und Druckerausgabe
30
3.1
Deskriptive statistische Funktionen
39
3.2
Parameter der Prozedur OLS
42
3.3
Statistische Verteilungen
43
3.4
Zufallszahlen
47
4.1
Vergleichsoperatoren
57
4.2
Elementweise Vergleichsoperatoren
58
4.3
Prioritäten der Operatoren
60
5.1
Teilmatrizen
68
5.2
Umstrukturierung von Matrizen
73
6.1
Funktionen zur Stringbearbeitung
88
8.1 8.2
Optionen für den Debugger Fehlerbehandlung in Programmen
126 127
8.3
Bibliotheken
133
XIV
TABELLENVERZEICHNIS
9.1 G AUSS-Datensätze
145
9.2
157
ASCII-Dateien
10.1 Grafik-Typen
183
10.2 Globale Variablen für Linien, Farben und Symbole
184
10.3 Färb- und Symbolwerte, Linientypen
185
10.4 Achsen und Skalierung
186
10.5 Titel, Beschriftungen und Schrifttypen
187
10.6 Ausführungskontrolle für Grafiken
187
10.7 Dimensionierung, Perspektive und Unterteilung einer Grafik . 188 10.8 Globale Kontroll-Variablen
188
11.1 Matrixinversion und damit zusammenhängende Prozeduren . 198 11.2 Matrizenzerlegung
205
11.3 Eigenwerte
207
11.4 Funktionen zur Regression
209
11.5 Spezielle Matrizen
213
11.6 Weitere Matrizenoperatoren
216
12.1 Differentation und Integration
222
12.2 Polynom-Operationen
225
12.3 Glättung und Interpolation
230
12.3 Fourier-Transformation
236
Algorithmen und Prozeduren im Text Erstellen einer zweidimensionale Kontingenztafel
69
Bedingter logischer Operator
95
Stapelprogramm für uni- und bivariate Maßzahlen
100
Punktion für exponentialverteilte Zufallszahlen: expozu
103
Prozedur für den Zweistichproben t-Test: t t e s t
108
Prozedur für die Inverse der Cauchy-Verteilung: icauchy
111
Prozedur für die Inverse der Laplace-Verteilung: i l a p l a c e
111
Prozedur für die Inverse der logistischen Verteilung: i l o g i s t i c . . 111 Prozedur für ein QQ-Diagramm (Lage-Skalen-Vert.): qqdiagram Prozedur für ein dreidimensionales Array: array3
. 111 113
Keyword für einen alternativen Editor: edt
117
Keyword für nichtparametrischen Zweistichprobentest: n p a r 2 t e s t
119
Prozedur zur zeilenweisen Sortierung von Matrizen: sortbyrow . . 137 Keyword für das Hinzufügen einer Bibliothek: a d d l i b
156
Keyword für Ausgabe einer Matrix als I^T^X-Datei: w r i l a t e x . . . 161 Streudiagramm mit Bezeichnung der Punkte: gdtext Prozedur für Gesamttitel bei multiplen Grafiken: smwintit
170 ....
173
Beschreibung linearer Abhängigkeiten einer Matrix: l i n e a r d e p . . 209 Robuste lineare Regression (Hubers Algorithmus): regrbm
211
Zeitreihenglättung mit LS-Spline: smoothls
215
Lösung eines Linearen Programms (Simplex-Algorithmus): simplex 239
Kapitel 1
Die Benutzeroberfläche 1.1
Installieren und Konfigurieren
Die Installation von GAUSS unter Windows ist Standard. Vom Start - Button unten links am Bildschirm gelangt man zum Punkt "Ausführen" und verlangt dort "Durchsuchen". Die Auswahl des CD-Laufwerkes bringt einen zum Setup. Dieses wird aufgerufen und den Anleitungen auf dem Bildschirm gefolgt. Allerdings arbeitet GAUSS ab Version 3.5 mit dem FlexLM Lizenzmanager, welcher ein Password benötigt, das an eine HostlD gebunden ist. Die HostlD kann je nach Rechner entweder die Adresse der Netzwerkkarte, die ID des Prozessors oder die Seriennummer des Prozessors sein. Der Einsatz von GAUSS ist also Rechner-gebunden. Während der Installation erscheint die HostlD in einem Fenster. Man kann auch nach der Installation das Programm l m h o s t i d . e x e ausführen, um die HostlD zu erzeugen. Diese ist an die deutsche Vertretung von Aptech, die Firma Additive zu schicken. Die e-mail Adresse lautet i n f o Q a d d i t i v e - n e t . d e . Bei Erstverwendung eines gekauften Programms ist auch die Seriennummer anzugeben; dann erhält man ein permanentes Password. Für eine Demo-Version ist ein temporäres Password zu beantragen; dies ist dann 30 Tage lang gültig. Nach dem Starten von GAUSS landet man automatisch im GAUSS-Befehlsfenster [Command-Window], Insgesamt bietet GAUSS sechs verschiedene Fenster: • Command-Fenster • Output-Fenster • Edit-Fenster
KAPITEL
2
1. DIE
BENUTZEROBERFLÄCHE
• Hilfe-Fenster • Matrix-Editor • Debugger Das Erzeugen einer Grafik öffnet ein weiteres Fenster; siehe dazu das Kapitel 10. Auf den Matrix-Editor wird in Kapitel 2, auf den Debugger in Kapitel 8 eingegangen. Über die Menüleiste, das ist die direkt unter der obersten, der Titelleiste befindliche, können etliche Einstellungen vorgenommen werden. Dazu sind die einzelnen Menüpunkte durch Anklicken zu öffnen; anschließend ist ein Menüpunkt auszuwählen. Das Configure -Menü erlaubt etwa über das
1.1. INSTALLIEREN
UND
KONFIGURIEREN
3
Untermenü 'Preferences' die Auswahl der Schrifttype (Font) mit den möglichen Attributen für die Bildschirmdarstellung. Diese gilt für alle Fenster gleichzeitig. Hier gibt es jeweils eine breite Palette von Möglichkeiten, das Erscheinungsbild und die Druckausgabe zu steuern. Über das | File }M enü kann man u.a. durch Anklicken von 'Print' den Ausdruck des aktuellen Fensters anfordern. Für das weitere Arbeiten ist der Menüpunkt 'Change Working Directory' bedeutsam. Hier kann das Arbeitsverzeichnis eingestellt werden, in dem zunächst Dateien gesucht bzw. abgespeichert werden. Dies gilt dann aber nur für die aktuelle GAUSS-Sitzung. Die einzelnen Punkte aller Menüs sind ausführlich unter dem Help -Menü dokumentiert. Aktiviert man 'Contents', so gelangt man zu dem Fenster, wo u.a. auch die Dokumentation der Menü-Leiste zu finden ist. Für viele Befehle, die über das Anklicken eines Menü-Punktes bzw. eines Icons angefordert werden, gibt es auch Tastenkombinationen. Eine Liste erhält man über den Menüpunkt 'Keyboard' im Hilfe-Menü bzw. über den Menüpunkt 'Contents'; dort wird der Unterpunkte 'Running Commands' geöffnet (anklicken des + -Zeichens) und 'Editing keys' bzw. 'Keyboard Shortcuts' ausgewählt.
Command Keys CTRL+B CTRL+C CTRL+D CTRL+F CTRL+G CTRL+I CTRL+N CTRL+O CTRL+P CTRL+Q CTRL+R CTRL+S CTRL+V CTRL+X CTRL+Z Function Keys Fl
Open bookmark dialog box Copy selected text to the Windows Clipboard Toggle Debug/Output window Fmd/Replace text Go to line number Toggle msert/overstnke mode Open a new, untitled window Open a file and start a new window Print current window, or selected text Quit GAUSS Run file Save window to file Paste text from Windows Clipboard to the active window Cut selected text and place a copy on the Windows Clipboard Undo die last edit Open the GAUSS Help system
Auch die GAUSS-Befehle sind alle in der Hilfe abgelegt, jedoch unter dem Menüpunkt 'GAUSS-Reference'. Hierhin gelangt man auch mittels Anklicken des mit einem Fragezeichen versehenen Icons. In der Referenz hat man die Befehle einmal nach Kategorien und zum anderen alphabetisch sortiert. Wie beim Arbeiten mit Browsern üblich, kann man mittels Anklicken hin- und herspringen. Insgesamt ist die Hilfe für 'alte Gaussianer' eine echte Verbesserung, nutzt sie doch die Möglichkeiten der modernen Browser in durchweg ansprechender Weise.
KAPITEL 1. DIE
4 bdUSS Rufet«.'
1.2
BENUTZEROBERFLÄCHE HFE
Das Befehlsfenster
Im Befehlsfenster kann man GAUSS zunächst im interaktiven Modus als Taschenrechner verwenden. Natürlich gibt es die Addition x+y , Subtraktion x - y , Multiplikation x*y , Division x / y und Exponentation x~y . Aufgerufen werden diese Operationen, indem sie am Bildschirm eingetippt werden und dann die E N T E R -Taste betätigt wird. Dabei muss vor der gewünschten Operation das GAUSS-Prompt " » " stehen. Dieses Zeichen ist die linke Begrenzung für ein auszuführendes Kommando. Zwischen den Zahlen und dem Operator (+,-, *, / , ~) darf kein Leerraum oder Blank stehen; andernfalls erhält man als Fehlermeldung Operand missing. (Siehe jedoch auch Seite 16 und Seite 24.) Sollen mehrere getrennte Ausdrücke berechnet werden, ohne dass jedesmal gleich das Ergebnis gewünscht wird, so lassen sich diese hintereinander eingeben, indem die einzelnen Ausdrücke jeweils mit einem " ; " abgeschlossen werden. Das Semikolon ist in GAUSS generell das Beendigungszeichen für einen (zusammengesetzten) Befehl. Abgeschickt wird ein Befehl, indem ohne ein abschließendes " ; " die [ENTERJ-Taste betätigt bzw. das > > > -Icon angeklickt wird. Die Option bzgl. des " ; " kann vom Anwender geändert werden. Dazu ist das 'Add " ; " to Command' in der 'Options'-Auswahl des Untermenüs 'Preferences' vom Menü Configure anzuklicken. Kommandozeilen lasssen sich auch mehrfach abschicken, indem man mit dem Cursor in die entsprechende Zeile geht und die E N T E R -Taste betätigt bzw.
1.2. DAS
BEFEHLSFENSTER
in der Icon-Leiste das >>> -Icon anklickt. Da die Zeile allerdings nicht mit einem Semikolon abgeschlossen sein darf, muss das automatisch eingefügte " ; " vorher gelöscht werden. Beispiel 1.1 5+6; 8.8*9.9; 3~0.5 11.000000 87.120000 1.7320508
m
GAUSS ist übrigens sehr kulant, was die möglichen Fehler angeht. So erfolgt etwa bei dem Aufruf von - 1 / 0 die Ausgabe von -INF. Werden in einem Ausdruck verschiedene Operationen angegeben, so erfolgt die Bearbeitung von links nach rechts; dabei kommt wie üblich die Punkt- vor der Strichrechnung. Die Exponentation bindet den Exponenten an die Basis, so dass beide zusammen wie eine Größe in die weitere Bearbeitung eingehen. Durch Einklammern mit runden Klammern lässt sich die Reihenfolge der Berechnung durchbrechen. Beispiel 1.2 3*2-2+4; (3*2)-2+4; 3*2*(2+4) 16.00000 40.00000
192.00000
•
Weiter gehört die Modulo-Division, x'/,y , zum Operatorenvorrat. Diese gibt den ganzzahligen Rest einer Division an. Dabei wird der Nenner gerundet: Beispiel 1.3 5'/.2; 7.3X3; 7X3.9; 7X3.3 1 1 3 1
m
Zudem stehen die üblichen wissenschaftlichen Funktionen zur Verfügung. Die folgende Tabelle listet einige wichtige wissenschaftliche Funktionen auf. Für weitere in GAUSS vorhandene Funktionen sei auf die Tabelle 2.1 verwiesen.
KAPITEL
6 SQRT(x) ABS(x) EXP(x) LN(x) LOG(x) x! GAMMA(x)
= =
= = = = =
1. DIE
\/x 1^1 ex log e (x) togioi*) 1•2 • •-x r(x) = /0°° t x - 1 e - t d i
BENUTZEROBERFLÄCHE
CQS(x) SIN(x) TAN(x) COT(x) ARCSIN(x) ARCCOS(x) ATAN(x)
= = =
sin - 1 (x) cos - 1 (x) tan _ 1 (x)
Die Kreiszahl tt ist einfach durch Aufruf des Wortes PI zu bekommen: 3.141592653589793. Die Eulersche Zahl e erhält man auf dem Umweg über die Exponentialfunktion durch Abschicken von EXP(l) zu 2.718281828459045. (Dabei wurden 16 Nachkommastellen angefordert. Siehe dazu Seite 27.) Wie die Tabelle und speziell das Beispiel mit der Exponentialfunktion zeigt, erfolgt der Aufruf einer Funktion in aller Regel, wie in der Mathematik üblich, durch Angabe des Funktionsnamens mit dem in runden Klammern folgendem Argument. Eine Ausnahme bildet die Fakultät " x! ", die ebenfalls der mathematischen Schreibweise angeglichen ist. Die Fakultät hängt mit der Gamma-Funktion r(x) über x! = + 1) für x 6 N zusammen. Die Funktion " ! " rundet allerdings die eingegebene positive Zahl, bevor die Fakultät berechnet wird. Daher erhält man: 3 . 2 ! = 6, 3 . 6 ! = 24 und GAHMA(4.2) = 7.7566895, GAMMA(4.6) = 13.381286. GAUSS unterscheidet nicht zwischen Groß- und Kleinschreibung. Somit erhält man beispielsweise die Zahl 7r = 3.141592653589793... durch Aufruf von p i wie auch durch PI, Pi oder pl. Man kann im Befehlsfenster auch kleine Programme interaktiv erstellen und ausführen. Ein Programm besteht aus einer Folge von Anweisungen, die durch Semikolons voneinander getrennt sind und nacheinander ausgeführt werden. Auf Programme wird später eingegangen.
1.3
Das Ausgabe-Fenster
Die Ausgabe der im Befehlsfenster abgeschickten Kommandos kann auch in ein eigenes Ausgabefenster gelenkt werden. Die Ergebnisse von den Kommandos getrennt zu halten, ist für umfangreichere Arbeiten günstiger. Das Umschalten auf den Modus mit eigenem Ausgabefenster geschieht durch die Betätigung der Taste F6 , durch Anklicken von Cmnd I/O auf der sich am
1.3. DAS
AUSGABE-FENSTER
7
unteren Rand befindlichen Status-Leiste oder durch die entsprechende Anforderung von 'Toggle Cmnd / Split I/O Mode' in der Auswahl von Mode Das Ergebnis erscheint nicht ohne Weiteres im Output-Fenster. Das einfache Anklicken mit der linken Maustaste des Feldes OUTPUT der Status-Leiste reicht nicht. Geht man nämlich auf das Command-Fenster zurück und setzt einen Befehl ab, so erscheint das Ergebnis wieder im Command-Fenster. Die Betätigung des Schalters Cmnd I/O ist wesentlich. Es gibt dann verschiedene Anordnungsmöglichkeiten von Ausgabe- und Kommandofenster. Einmal können beide im Vollbild gehalten werden; dann hat man über den Window -Button die Möglichkeit, von einem in das andere Fenster zu wechseln. Zum anderen lässt sich über Window und 'Dual Vertical' bzw. 'Dual Horizontal' der Bildschirm teilen und beide Fenster parallel halten.
» 33+77; 6A9;
110.00000 10077696.
Bei verschiedenen Aufrufen während einer GAUSS-Sitzung wird die Ausgabe an den vorhandenen Inhalt angehängt. Somit kann bei längerem Arbeiten die Zuordnung eines konkreten Ergebnisses zu dem Kommando, das es hervorgerufen hat, schwierig werden. Daher ist es sinnvoll, das Ausgabefenster bisweilen zu löschen. Das aktive Fenster wird durch Anklicken von 'Clear all' im Menü Edit gelöscht. Das Fenster, in das die Ausgabe gelenkt wird, kann auch mit dem Kommando CLS vom Kommando-Fenster aus gelöscht werden.
8
KAPITEL
1. DIE
BENUTZEROBERFLÄCHE
Das Output-Fenster lässt sich umschalten in den DOS-Modus. Dies geschieht durch Betätigung des Schalters 'DOS-Compatibility Window' im Action Menü. Der DOS-Modus ist von Bedeutung, wenn alte, unter DOS geschrie geschriebene GAUSS- Programme verwendet werden, die eine formatierte Ausgabe produzieren. Unter Windows ist die Formatierung dann höchstens wiederzuerkennen, wenn eine nicht-proportionale Schrift eingestellt ist.
1.4
Das Edit-Fenster
AGGLOM Purpose: agglomérative clustering Format: IHPUT :
(o,lev) - AGGLOM(D, m) D - ; x; PRINT MISS(y,-9) 1.0000 . 3.0000 4.0000 5.0000 1.0000 . 3.0000 4.0000 5.0000
Tabelle 2.4: Fehlende Werte y =ISMISS(x)
ergibt 1 bei fehlendem Wert in X, 0 sonst
y = MISS (x , v)
'missing value code' für Elemente aus v in X
N,P
N,P
N,P
y = MISSRV(x , v) N,p
N,P
y = MISSEX ( x , e ) N,P
N,P
N,P
MSYM(str) y = PACKR(x) M,P
ersetzt 'missing value code' durch Elemente aus V
N,P
'missing value code' für Elemente entsprechend einer logischen Matrix E setzt Symbol, als fehlender Wert interpretiert löscht Zeilen mit fehlenden Werten
N.P
y = SCALMISS(x) N.P
1, wenn X skalarer 'missing value code', 0 sonst
Bzgl. der Dimensionierung der Argumente v und e gibt es eine Erweiterung, die auf der E x E-Verknüpfbarkeit basiert. Darauf wird im folgenden Kapitel eingegangen.
24
KAPITEL
2.4
2. NUMERISCHE
DATEN
Komplexe Zahlen
GAUSS kennt komplexe Zahlen. Sie können über die algebraische Schreibweise mit LET bzw. mit der Verwendung der geschweiften Klammern generiert werden: LET zl=l+li; z2={0-li}; z3={2+3}; PRINT zl z2 z3 1.0000000 + l.OOOOOOOi 0.0000000 - l.OOOOOOOi 2.0000000 + S.OOOOOOOi Bei der Verwendung der geschweiften Klammern ist das Symbol " i " also optional; ohne sie würde aber die Variable z3 einfach den Wert 5 zugeordnet bekommen. Der Befehl z=COMPLEX(a,b) verbindet die beiden reellen Zahlen a und b so, dass z=a+bi eine komplexe Zahl ist. Die Verbindung zweier reeller zu einer komplexen Zahl kann auch einfach mit z=(a,b) erreicht werden. Natürlich soll ein Paar reeller Zahlen nicht als komplexe Zahl fehlinterpretiert werden. Daher sind die folgenden Regeln etabliert worden: • Wird vom Zwischenraum, Blank, zweier Zahlen klar, dass es sich um zwei reelle Zahlen handelt,so werden sie auch als solche behandelt. Dies gilt etwa für 1 U +2 U und 1 U 2 U . • Ist der Zwischenraum unüblich für reelle Zahlen, so wird das Paar als eine komplexe Zahl behandelt: l u +u2 und l+ u 2. • Die letzte Regel gilt auch für einzelne Zahlen. Somit ist +2 eine reelle Zahl, + 2 jedoch eine imaginäre. • Bei der Verwendung der runden Klammern ist der Zwischenraum innerhalb der Klammern ohne Bedeutung, let z= (1,2) gibt also das gleiche wie (1, 2),( 1, 2 ) , ( 1 , 2) oder ( 1 , 2 ) . Den Realteil a und den Imaginärteil b einer komplexen Zahl z = a + ib erhält man getrennt wieder zurück mit a=REAL(z); b=IMAG(z) Dass man komplexe Zahlen zur Verfügung hat, ergibt an manchen Stellen eine deutliche Erleichterung; zum Beispiel, wenn man die Beziehung von Sinus-
2.4. KOMPLEXE
ZAHLEN
25
und Kosinusfunktion mit der e-Funktion ausnutzen kann. Ist z = a + bi und sind r = \/a2 + b2, = arctan(o/6) so gilt: z — a + bi — r(cos() + sin( ; PRINT 1; PRINT a ; ; PRINT 4; PRINT 1 2 3 4 1.000000 2.000000 3.000000 4-000000 1.000000 2.000000 3.000000 4-000000 Der Befehl LPRINT hat dieselbe Bedeutung wie PRINT, leitet jedoch alle Ausgaben nicht an den Bildschirm, sondern an den Drucker. Sollen die Spalten einer Matrix in verschiedenen Formaten ausgegeben werden, so ist der Befehl PRINTFM zu verwenden. Die Syntax dieses Befehls ist
2.6. AUSGABE
AUF BILDSCHIRM
UND
DRUCKER
29
dem GAUSS-Handbuch bzw. der Online-Hilfe zu entnehmen. Die Festlegung von Feldlänge und Genauigkeit des Outputs einer PRINT Anweisung erfolgt mit dem Befehl FORMAT. Dieser Befehl erlaubt eine globale Festlegung all jener Formatierungsmerkmale, die auch mit der PRINT Anweisung gesteuert werden können. Er hat den folgenden Aufbau FORMAT /mf /jnt a,b; Die Optionen mf und jnt stimmen mit den Optionen des PRINT-Befehls überein. Der Parameter a legt die minimale Feldlänge jedes Zeichens fest, während der Parameter b bei dezimaler Notation die Anzahl der Nachkommastellen und bei wissenschaftlicher Notation die Anzahl der ausgegebenen Stellen angibt. Im Gegensatz zum PRINT-Befehl behalten die Parameter der FORMAT-Anweisung solange Gültigkeit, bis sie überschrieben werden. Voreingestellt ist FORMAT /Ml /ROS 16,8 . Mit dem FORMAT-Befehl lässt sich naturgemäß steuern, wieviele Spalten am Bildschirm ohne seitliche Verschiebung zu sehen sind. Je geringer die angeforderte Feldbreite, desto mehr Spalten sind gleichzeitig sichtbar. Beispiel 2.15 a={5.34 13}; a 5.3400000 13.000000 FORMAT 1,0; a l.E+001 5. FORMAT /RZ 1,0; a 5 1E+001 FORMAT /RD 1,0; a 5 13 FORMAT /R0 16,8; a 5.3400000 13.000000 FORMAT 5,1; a 5. l.E+001 FORMAT 5,2; a 5.3 13. FORMAT 1,4; a 5.340 13.00
30
KAPITEL 2. NUMERISCHE
DATEN
Tabelle 2.7: Bildschirm- und Druckerausgabe CLS
löscht den Bildschirm
Spaltenposition des Cursors im Output-Fenster y = CSRCOL y = CSRLIN Zeilenposition des Cursors im Output-Fenster FORMAT [ [ / m l ] ] [ [ / j n t ] ] [[f , p ] ] Format von Matrizen und Zahlen bei Ausgabe mit PRINT oder LPRINT LOCATE z , s Positionierung des Cursors in der Zeile z und Spalte s LPRINT (0N/0FF) automatische Druckerausgabe LPRINT[[/mf]] [ [ / j n t ] ] [ [ a l a2 . . . ] ] [ [ ; ] ] Ausgabekontrolle auf Standarddrucker LPWIDTH n Breite der Druckausgabe LSHOW Ausgabe der globalen Symbole am Drucker OUTWIDTH n legt Breite der Ausgabe fest PRINT [ [ / m f ] ] [ [ / j n t ] ] a l a2 . . . [ [ ; ] ] Bildschirmausgabe PRINTFM( x ,mask,fmt) Matrixausgabe mit unterschiedlichen Formaten N,P M,Q p,3 j e c j e Spalte SCREEN (0N/0FF/0UT)
kontrolliert die Ausgabe auf dem Bildschirm
SHOW
Ausgabe der globalen Symbole am Bildschirm
2.7
Aufgaben
A u f g a b e 2.1 1. Erzeugen Sie einen Skalar mit dem Wert 3.912. 2. Definieren Sie jeweils einen Zeilen- und einen Spaltenvektor, der die Werte 3 bis 9 enthält. Aufgabe 2.2 Geben Sie die beiden folgenden Matrizen ein: LET a={l 5 , 4 3>; LET b={-l 4 , 1 - 9 } Prognostizieren Sie die Ergebnisse für folgende Eingaben und überprüfen Sie Ihre Antwort am Rechner: a!
a~2
SQRT(b)
a'/,2
b'/.3;
2.7.
AUFGABEN
31
Aufgabe 2.3 Erzeugen Sie durch Verwendung von GAUSS-Prozeduren folgende Vektoren: (i) (ii)
1989 1990 1991 1992 1993 1994 1 2 3 4 5 6
(iii)
1 3 6 10 15 21
(iv)
4 11 36 147
Aufgabe 2.4 Wie lautet der Aufruf von RECSERCP, um eine in Binärdarstellung gegebene Zahl als Dezimalzahl auszugeben? Wie lautet der Aufruf von RECSERRC, um eine in Dezimaldarstellung gegebene Zahl in ihre Binärform zu verwandeln? Aufgabe 2.5 Definieren Sie eine (2,3)-Matrix t e s t . 1. Drucken Sie die Matrix aus. 2. Rufen Sie CLEAR t e s t auf und drucken Sie t e s t erneut aus. 3. Erzeugen Sie die ursprüngliche Matrix t e s t erneut. Rufen Sie NEW auf und drucken Sie t e s t erneut aus. 4. Erklären Sie die Ergebnisse mittels Aufruf von SHOW. Aufgabe 2.6 1. Definieren Sie einen Skalar mit dem Wert der e-Funktion an der Stelle 2. Geben Sie den Skalar mit 0, 5 und 14 Dezimalstellen aus. 2. Rufen Sie FORMAT 10,3 auf. Weisen Sie einer Variablen y den Wert SIN(2) zu und drucken Sie die Variable aus. Ändern Sie nun das Format auf 8 Nachkommastellen. Was ergibt die Ausgabe von y nun? 3. Definieren Sie einen Spaltenvektor y mit den Werten des natürlichen Logarithmus für 1, 10, 100000. Geben Sie den Inhalt von y rechtsbündig aus. 4. Stellen Sie den voreingestellten Zustand für die Ausgabe durch den Befehl FORMAT /MB1 /R0S 16,8 wieder her. Bei welchem Wert von x springt die Ausgabe von EXP(x) in die wissenschaftliche Notation um?
Kapitel 3
Statistische Funktionen 3.1
Deskriptive Statistik
Wie im letzten Kapitel wird davon ausgegangen, dass ein Datensatz i.d.R. als numerische Matrix gegeben ist. Dabei stehen in den Spalten die jeweils zur gleichen Variablen (im statistischen Sinne) gehörigen Beobachtungen. Dafür sind verschiedene deskriptive Maßzahlen und Funktionen von Interesse. Die Prozedur DSTAT liefert eine globale Übersicht über die wichtigsten univariaten Maßzahlen. Will man das Ergebnis der Prozedur DSTAT einfach am Bildschirm anschauen, so ruft man sie auf mit CALL D S T A T ( 0 , x )
kann die berechneten Maßzahlen auch als Ergebnis in Variablen ausgeben, vgl. Tabelle 3.1. Dies wird durch die Verwendung von CALL unterdrückt. Diese Form des Aufrufs ist generell bei Prozeduren nützlich, die sowohl eine Ausgabe in Tabellenform produzieren als auch globale Variablen zurückgeben. DSTAT
Hier hängt das Erscheinungsbild der Ausgabe von der gewählten Schrift ab. Da viele GAUSS-Prozeduren ursprünglich als DOS-Anwendungen geschrieben wurden, sind proportionale Schriften nicht unterstützt. Die Schreibmaschinenschrift Courier ist allgemein verfügbar; mit ihr wird die ursprünglich vorgesehene Formatierung tatsächlich angezeigt. Eine für diese Prozedur wichtige globale Variable ist miss (zwei Underscores), die festlegt, wie fehlende Werte behandelt werden. Der vorangestellte Wert (Default) ist 0; damit werden alle Beobachtungen als gültig angesehen. Das führt dazu, dass etwa die arithmetischen Mittel und Standardabweichungen für die Spalten nicht berechnet werden, in denen fehlende Werte auftauchen. Andererseits
34
KAPITEL
3. STATISTISCHE
FUNKTIONEN
wird angegeben, dass kein Wert als fehlend deklariert ist. Wird er auf 1 gesetzt, miss=l, so werden Beobachtungen, d.h. Zeilen der Datenmatrix, mit fehlenden Werten ganz aus dem Datensatz gestrichen. Dies wird als listwise deletion (zeilenweises Entfernen) bezeichnet. Ändern der Voreinstellung auf den Wert 2 bewirkt ein so genanntes spaltenweises Entfernen aus dem Datensatz. Das ist nur sinnvoll, wenn wie bei DSTAT die Maßzahlen für jede Variable bzw. Spalte getrennt betrachtet werden. Beispiel 3.1 Für die BMW-Daten aus dem Beispiel 2.1 ergibt CALL DSTAT(0,bmw): Variable XI X2 X3
Mean
Std Dev
Variance
91.4500 1.5720 2.4711 90.3050 37.9054 1436.8205 21712.5000 4887.8979 23891546.0526
Minimum
Maximum
87.0000 94.0000 11.0000 185.0000 6950.000 26900.0000
Valid Missing 20 20 20
0 0 0
Neben den auf einzelne Variablen bezogenen summarischen Übersichten sind oft Kovarianz- und Korrelationsmatrizen und andere Maßzahlen von Interesse. In der Tabelle 3.1 sind einige relevante Prozeduren aufgelistet, mit denen verschiedene statistische Maßzahlen berechnet werden können. Beispiel 3.2 In einem Experiment wurde der Einfuß des Stimulans Coffein auf die einfache physische Aufgabe des 'Finger Tabbing' untersucht. 30 Studenten wurden zunächst darin trainiert. Dann wurden sie zufällig auf drei Gruppen ä 10 aufgeteilt. Jedes Mitglied einer Gruppe bekam die gleiche Dosis an Coffein (0, 100 und 200 mg). Zwei Stunden später mussten alle 'Finger Tabbing' durchführen und die Anzahl der Tabs pro Minute wurde festgehalten. Die Ergebnisse sind in der (10,3)-Datenmatrix t a b s abgespeichert. Die Spalten korrespondieren mit den Coffein-Leveln. PRINT tabs 242 248 245 246 244 245 248 247 247 248 248 250 242 247 244 246 246 243 242 244
246 248 250 252 248 250 246 248 245 250
3.1. DESKRIPTIVE
STATISTIK
35
Beim Aufrufen der in der Kopfzeile der folgenden Tabelle angegebenen Kommandos erhält man jeweils die zugehörigen Spaltenvektoren. MEANC(x)
STDC(x)
MEDIAN(x)
244.80000 246.40000 248.30000
2.3944380 2.0655911 2.2135944
244-50000 246.50000 248.00000
Für die Bestimmung der 1/4- und 1/3-Quantile wird zuerst der Spaltenvektor e={0.25,0.33333} erzeugt. Dann ergibt das Kommando QUANTILE(x,e) 242.00000 244-50000 242.66660 245.33330
246.00000 246.66660
Hier sind also die zu einer Spalte gehörigen Quantile wieder in der zugehörigen Spalte zu finden. Die unterschiedliche Form, spaltenweise oder zeilenweise Zugehörigkeit des Ergebnisses zu einer Ausgangsspalte der Datenmatrix, muss man also jeweils bedenken. Zudem ist zu sehen, dass mit dieser Funktion die Quantile über eine lineare Interpolation berechnet werden. • An dieser Stelle ist es angebracht, ein warnendes Wort vor der verbreiteten Computergläubigkeit auszusprechen. Computer rechnen stets nur mit einer gewissen -bisweilen erstaunlich niedrigen- Rechengenauigkeit. H.D. Vinod hat dazu unter www.fordham.edu/economics/vinod das folgende Beispiel angegeben. Beispiel 3.3 Es sei ein (1001, l)-Vektor x gegeben. Es sei x\ = 10000000.2, x 2 bis x 5 0 i seien 10000000.1; die restlichen Komponenten seien gleich 10000000.3. Dann sind die exakten Werte von x und sx gleich 10000000.2 bzw. 0.1. Mit GAUSS erhält man, FORMAT 24,16; MEANC(x); STDC(x) 10000000.19999998 0.1000000005588024 Der Mittelwert ist also nur bis zur siebten Nachkommastelle korrekt, die Standardabweichung bis zur neunten. Für den Mittelwert hilft die vorhergehende Zentrierung: m=MEANC(x); MEANC(x-m)+m 10000000.200000000
m
Die nichtparametrische Statistik basiert auf Rängen. Die beobachteten Daten x i , x 2 , . . . ,xn werden dabei durch ihre Rangwerte oder Platznummern
36
KAPITEL
3. STATISTISCHE
FUNKTIONEN
ersetzt. Der kleinste Wert bekommt den Rangwert 1, der zweitkleinste den Wert 2 usw. Dies wird in GAUSS umgesetzt mit der Prozedur r = RANKINDX(x.l) Die Eins in der Prozedur steht für numerische Werte; die Anwendung auf nichtnumerische Daten, bei denen dann an dieser Stelle eine 0 stehen muß, wird im Kapitel 6 angesprochen. Hier gilt dann die Korrspondenz r; = #{j\xj < £;} für i = 1 , . . . ,n, wenn x ein Vektor der Länge n ist. GAUSS ordnet den n Werten von x die Zahlen 1 bis n zu. Auch gleiche Werte in den Daten, so genannte Bindungen, bekommen folglich unterschiedliche Rangwerte zugeordnet. Oft ist es aber gewünscht, bei Bindungen mittlere Ränge zu vergeben. Dann zählt man zunächst die Ränge weiter und ordnet dann allen gleichen Werten den zugehörigen mittleren Rangwert zu. (Vergleiche Aufgabe 4.8 im Kapitel 4.) Antiränge bilden eine weitere wichtige Funktion der nichtparametrischen Statistik. Der Vektor der Antiränge ist der Vektor der Indizes der geordneten Werte. Diesen Vektor erhält man mit der folgenden Prozedur: y=SORTIND(x) Beispiel 3.4 Seien die beobachteten Daten xi = 4.2, x^ = 6.3, £3 = 3.5, x\ = 6.0. Dann sind die zugehörigen Rangwerte r\ = 2,r2 = 4,r3 = l,r4 = 3. Für die Antiränge erhält man 3,1,4,2; der kleinste Rangwert steht an dritter Stelle, der zweitkleinste an erster usw. In GAUSS stellt sich das folgendermaßen dar: LET x= 4.2 6.3 3.5 6.0; r=RANKINDX(x,1); r 2.0000000 4.0000000
1.0000000 3.0000000 SORTIND(r) 3.0000000 1.0000000 4.0000000 2.0000000
•
Für Anwendungen in der Zeitreihenanalyse ist die Faltung, die mit der Prozedur CONV berechnet wird, eine wesentliche Operation. Dazu ist die zweifache Differenzenbildung yt = Xt — 2xt-\ + Xt-2 genauso zu zählen wie die Ermittlung eines gleitenden Durchschnittes yt = (xt~q + • • • + xt + • • • + Xt+q) /(2q + 1) • Dabei muss man sich aber die Zuordnung der ausgegebenen
3.1. DESKRIPTIVE
STATISTIK
37
Werte zu den entsprechenden Zeitpunkten genau überlegen. GAUSS kann nicht zwischen den beiden Situationen, die durch die Differenzenbildung und den gleitenden Durchschnitt gegeben sind, unterscheiden. Sinnvoller Weise würde man / = 3 bzw. / = 2q + 1 wählen, aber das Ergebnis im zweiten Fall zeitlich 'zurückschieben', um die Zuordnung des Output zum mittleren Zeitpunkt zu erreichen. Bei der Anwendung auf komplexwertige Matrizen sind die Ergebnisse der Funktionen MINC und MAXC die Minima bzw. Maxima der Beträge der einzelnen Spalten. Es wird für jede Zahl a + bi also zuerst \Ja2 + b2 berechnet und pro Spalte das Extremum dieser Zahlen ausgegeben. Beispiel 3.5 NEW; x={-2,l>; y=x+0*sqrt(-l); MINC(x) -2.00000 MINC(y) 1.00000
m
Natürlich bietet GAUSS Möglichkeiten für grafische Darstellungen. So erstellt die Prozedur HIST ein grobes (theoretisch nicht korrektes) Histogramm für die Daten des Spaltenvektors x. BOX zeichnet für die Spalten der Datenmatrix X jeweils Box-Plots; XY(x,y) erstellt ein Streudiagramm der y-Werte in Abhängigkeit von den x-Werten. Während nahe liegender Weise x als Vektor der Abszissenwerte vom Typ (n, 1) sein muss, darf das gleichlange y mehrere Spalten enthalten. Dann erhält man eine Überlagerung der Grafiken, die zu den einzelnen Spalten gehören. Um die Grafiken zu erhalten, muss vorab die Grafik-Bibliothek geöffnet sein (vgl. Kapitel 10). Dies geschieht mit dem Befehl LIBRARY PGRAPH Auf Grafiken wird ausführlicher in Kapitel 10 eingegangen. Beispiel 3.6 Für die Coffein-Level Daten erhält man die folgenden, in einer Abbildung zusammengefaßten Box-Plots. Dabei sind die Parameter so gewählt, dass die extremsten 10% der Beobachtungen jeweils als einzelne Punkte dargestellt werden. •
KAPITEL
38
3. STATISTISCHE
FUNKTIONEN
Abbildung 3.1: Finger-Tabbing bei unterschiedlichem Coffein
JL
I
X
I
Beispiel 3.7 Für den Kilometerstand und die Preise der 5er BMWs des Beispiels 2.1 soll ein Streudiagramm erstellt werden. Damit die Punkte einzeln dargestellt und nicht linear verbunden sind, ist vorab die globale Einstellung für die XY-Grafik zu ändern durch die Zuweisung _plctrl=-l. Sind die Angaben zum Baujahr in der Variablen b a u j und die zum Preis in preis abgespeichert, ist die Grafik insgesamt zu erstellen mit der Befehlssequenz: LIBRARY PGRAPH;_plctrl=-l;XY(bauj.preis)
•
Abbildung 3.2: gefahrene Km und Preise für 5er BMW
0
20
40
60
80
too
120
140
160
)30
200
3.1. DESKRIPTIVE
39
STATISTIK
Tabelle 3.1: Deskriptive statistische Funktionen p = COLS(x)
Anzahl der Spalten von X
N,P
y = CONV(x, b ,f ,m) -/+1,1 N.l M,1
ptp
c = CORRVC(v)
P.P
P, P
c =C0RRX(x) P,P
Die Skalare / , m bestimmen den ersten und den letzten Index der Ausgabe. Die Vektoren werden ggfls. durch Oen verlängert. Der erste Wert, der ohne vorangestellte Nullen berechnet wird, ist also der für t = M, falls M < N
N,P
c = C0UNTS(x,v)
P, 1
+ bMXt+i-M
Korrelationsmatrix aus M=X'X, wobei die Datenmatrix X in der ersten Spalte eine Konstante haben muss Korrelationsmatrix aus Kovarianzmatrix V Korrelationsmatrix aus Datenmatrix X
c = CORRM(m)
P,P
yt = bixt + b2xt-i H
N,1
Cj = #{i\V(j) < der x 2 -Verteilung mit m FG. 2 y = CDFCHINC(x,v,d); CDF der nichtzentralen x -Verteilung mit v FG. und Nichtzentralitätsparameter d yij = 1 — F ( x i j \ m l i j , m 2 j j ) ; Komplement der y = CDFFC (x , ml ,m2) N,P N.P N,p N p CDF der F-Verteilung mit m l , m 2 FG. y = CDFFNC(x,ml,m2,d) yi — F(x{ m l , rri2, d); Komplement der CDF der nichtzentralen F-Verteilung mit ml,m2 Freiheitsgraden und Nichtzentralitätsparameter d. y = CDFBETA (x , a , b )
IV, P
N.p N,p
N
p
N
y = CDFGAM (g , x) Np
N.P
N.P
'
p
yij = F(xij\gi t j); CDF der Gammaverteilung mit Parameter g.
' D a m i t ist auch die von Vinod (2000) formulierte Kritik zumindest zum Teil nicht mehr aktuell.
44
KAPITEL
3.
STATISTISCHE
FUNKTIONEN
y : • CDFMVN(x , r )
y j = F(a;.j|R); C D F der multivariaten Standard-Normalverteilung mit Korrelationsmatrix R .
y : • CDFN(x)
Uij
K,P K.K
N.P
IV,P
y : • CDFNC(x) IV,
p
^{z-ij)
=
Vij = 1 -
N,P
y : • CDFNI(p)
Vij
y : • CDFN2 ( x , dx )
Vij = ${xij
y =• CDFTC (x ,m) N,P N,P y: • CDFTNC ( x , v , d)
Vij = 1 — F(xij\mij); Komplement der C D F der t-Verteilung mit m FG. yi = F(xi\v,d); C D F der nichtzentralen tVerteilung mit v FG und Nichtzentralitätsparameter d.
N,P
N,P
N,P N,P
N.P
N, 1
N, l
= -
+ dxij)
$(xij)
y = CDFTVN(xl,x2,x3,rl2,r23,r31) 7V,1
IV,1
IV,1
IV,1
IV, 1
y =; ERF(x)
N.P
N,P
ERFC(x)
y
N.P
N.P
IV,1
JV,1
Vi = F((xu, X2i, X3,)'|rl2j, r23i, r31j); C D F der trivariaten Standard-Normalverteilung mit angegebenen Korrelationen Gaußsche Fehlerfunktion: 2 fXi' Vij = -7= / exp[-i 2 ] dt, xitj > 0 V71" Jo Vij = 1 - ERF(xjj)
y = LNCDFBVNCxl, x2 , r )
N.P
N.P
N,P p.p
= \nF((xlij,x2ij)l\rijy, nat. Logarithmus der C D F Standard-Normalverteilung
yij
der
bivariaten
y = LNCDFBVN2(h,dh, k , d k , r )
N, 1
IV,1
iv,1
N, 1
IV,1
N.l
yi = \nP(hi1
bn
\ ai op bn
Op op bn
(ai . . . Op) .op Kurz gefasst gilt für die vertauschten Operanden: (bi) .op(dj) =
(bjopoj).
(Letzteres ist das standardmäßige Matrizenprodukt einer (n, 1)-Matrix mit einer (l,p)-Matrix.)
54
KAPITEL
4. ELEMENTARE
VERKNÜPFUNG
VON
MATRIZEN
Beispiel 4.4 LET x [2,3]=4 1 2 3 1 1; LET y[2,3]=2 2 2 3 3 3; PRINT x.*y PRINT x.~y 8 2 4 16 1 4 27 1 1 9 3 3 LET y={4 2 1,5 2 4>; PRINT l./y 0.25 0.50 1.00 0.20 0.50 0.25
PRINT y./2 2.0
1.0
0.5
2.5
1.0
2.0
PRINT y.+3 7 5 4 8 5 7
x={l 2 4,2 3 6>; y={l,5>; w={2 2 -1>; PRINT x.-y PRINT x.*w PRINT y.-x 0 1 3 2 4-4 0 -1 -3 -3-2 1 4 6-6 3 2 -1 x={l,2,3}; y={3 2 1>; PRINT x.+y PRINT 4 3 2 3 6 5 4 3 9 6 5 4
PRINT 3 6 9
x.*y 2 1 4 2 6 3
y.*x 2 1 4 2 6 3
PRINT y*x 10
Beispiel 4.5 Bei 5 verschiedenen PKWs wurde für zwei verschiedene Reifensätze A und B die Anzahl der km, die bei einer Tankfüllung von 11 1 gefahren wurden, notiert. Der Datensatz ist: PKW 1 2 3 4 5
Reifen A B 89 110 105 101 90
95 109 111 110 91
Der Inhalt der Tabelle sei in der Matrix km abgespeichert, km={89 95, 110 109, 105 111, 101 110, 90 91}. Es sollen nun verschiedene Größen berechnet werden: 1. Benzinverbrauch pro 100 km je PKW und Reifen, d.h. Verbrauch pro 100 km = (1 /gefahrene km) ( l l 1) (100 km)): benzver=(l./km)*ll*100; benzver' 12.36 10.00 10.48 10.89 12.20 11.58 10.09 9.91 10.00 12.09 2. die insgesamt zurückgelegte Strecke (in km) je PKW:
4.2. ELEMENTWEISE
VERKNÜPFUNG
VON
MATRIZEN
55
strecke=SUMC(km'); s t r e c k e ' 184 219 216 211 181 3. die zurückgelegte Strecke pro Liter je PKW und Reifen: strpkm=km/11; strpkm' 8.09 10.0 9.55 9.18 8.18 8.64 9.91 10.09 10.0 8.27 (Hier reicht es, " / I I " anzugeben; dies wird als Produkt "*(1/11)" interpretiert.) 4. die Differenz der gefahrenen Kilometer zwischen B und A je PKW: d = { - l , l > ; dif=km*d; d i f ' 6.00 -1.00 6.00 9.00
1.00
5. die relative Differenz der gefahrenen Kilometer zwischen B und A je PKW (B-A)/A d = { - l , l > ; e={l,0>; rdif=(km*d)./(km#e); r d i f ' 0.67 -0.09 0.057 0.089 0.011
u
Beispiel 4.6 Für die folgende zweidimensionale Häufigkeitstabelle
Status Schüler Lehrling
Sport im Freien
Sportart Sport nicht im Freien
14 8
6 9
erzeugt mit LET h[2,2]=14 6 8 9 s o l l e n verschiedene abgeleitete Tabellen erstellt werden: • Eine Tabelle mit relativen Häufigkeiten: rel=ges./SUMC(SUMC(h));rel 0.378 0.162 0.216 0.243 • Eine Tabelle mit bedingten relativen Häufigkeiten bezogen auf den Status der Befragten: bed=h./SUMC(h');bed 0.700 0.300 0.471 0.529 • Eine Tabelle mit unter Unabhängigkeit geschätzten erwarteten Häufigkeiten:
56
KAPITEL 4. ELEMENTARE VERKNÜPFUNG VON MATRIZEN erw=(SUMC(h)',*SUMC(h'))./SUMC(SUMC(h));erw 11.89 8.11 10.11 6.89
Die Modulo-Division '/, ist immer ein elementweiser Operator. Er verallgemeinert in natürlicher Weise die Modulo-Division zweier Skalare. Ebenfalls ist das Potenzieren " immer ein elementweiser Operator. Beispiel 4.7 z [2,3] =7 6 5 4 3 2; PRINT z'/.z [., 3] ;
2 0
1 0 1 0
LET ml[2,3]=1 2 3 4 5 6; LET m2[2,3]=l 3 5 2 4 6; LET vl=l 2; LET v2[l,3]=l 2 3; PRINT ml~m2; PRINT ml~v2; PRINT ml~vl;
1 16
8 625
243 46656
1 4
4 25
27 216
1 16
2 25
3 36
PRINT vl~v2;
4.3
1
1
1
2
4
8
m
Relationale und logische Operatoren
Zunächst sind zwei Matrizen genau dann gleich, wenn alle Komponenten gleich sind: A = B O aij = bij für alle i,j. Mit den relationalen Operatoren kann man die Gleichheit und weitere Relationen zwischen zwei Matrizen untersuchen. Sind x und y zunächst Skalare (oder (1,1)-Matrizen) und relop ein relationaler Operator wie < oder >=, so ist das Ergebnis von x relop y eine 1, falls die entsprechende Bedingung erfüllt ist, ansonsten eine 0. Die Anwendung auf Matrizen setzt voraus, dass die beiden Operanden die gleiche Dimensionierung haben. Falls die Bedingung dann für alle entsprechenden Elemente der beiden Matrizen erfüllt ist, so ist das Ergebnis von x relop y eine 1, ansonsten eine 0. Jeder der relationalen Operatoren hat zwei äquivalente Darstellungen, eine mit formalen mathematischen Symbolen, die andere als Buchstabenkombination. (Diese sind am Englischen angelehnt; beispielsweise steht LT für 'less than', kleiner als.) Beide Darstellungen sind vollkommen äquivalent.
4.3. RELATIONALE
UND LOGISCHE
OPERATOREN
57
Tabelle 4.1: Vergleichsoperatoren == >=
EQ
gleich
LE
kleiner gleich
GE
größer gleich
FEQ FLE FGE
Fuzzy - Fuzzy < = Fuzzy > =
/= < >
NE LT GT FNE FLT FGT
ungleich kleiner als größer als Fuzzy / = Fuzzy < Fuzzy >
Für den Aufruf der Buchstabenvarianten gibt es zwei Formen z = 0 P E R A T 0 R ( x , y ) ; z = ( x OPERATOR y )
LE(2,0.5) steht also für 2 =
./= .< .>
.NE . LE . GT DOTFNE DOTFLT DOTFGT
ungleich kleiner als größer als Fuzzy ./ = Fuzzy . < Fuzzy . >
Beispiel 4.8 LET ml[2,3]=1 2 3 4 5 6; LET m2[2,3]=l 3 5 2 4 6; PRINT ml>=m2 PRINT ml==m2 0.0000 0.0000 FEQ(3,EXP(LN(3))) 1.0000 _fcmptol = 0.00001; x=1.000009~0.1; PRINT (x==l) FEQ(x,1) 0.0000 1.0000 Das Vorzeichen einer reellen Zahl x erhält man mit (x>0)-(x 0; -1, falls x < 0 und den Wert 0, wenn a; = 0. Auch zu den relationalen Operatoren gibt es korrespondierende elementweise relationalen Operatoren, die nach den im Abschnitt 4.3 angegebenen Regeln arbeiten: Allerdings müssen hier die Buchstabenvarianten der strikten Vergleichsoperatoren in der eingeklammerten Form aufgerufen werden (sofern das jeweilige Ergebnis nicht einer Variablen zugeordnet wird): (x .REL0P y) Bei den Fuzzy-Vergleichen geschieht der Aufruf in der klassischen Weise einer Prozedur mit zwei Argumenten: DOTFOP(x.y) Beispiel 4.9 Mit den elementweisen Vergleichsoperatoren können auf bequeme Weise speziell strukturierte Matrizen erzeugt werden: x=SEQA(l,1,4);
4.4. PRIORITÄTEN PRINT 1 0 0 0
x. 1 1 1 1 0 1 0 0
DER
OPERATOREN PRINT 1 1 1 1
1 1 1 1
x'. ; b=a*x Aufgabe 4 . 5 Bei der Transponierung einer Matrix von komplexen Zahlen ändern sich die Vorzeichen der Imaginärteile: x={3+5*i 3-4*i>; x x' 3.0 - 5.0i 3.0 + 5.0i 3.0 - 4.0i 3.0 + 4.0i Welcher mathematische Vorgang steckt dahinter? Aufgabe 4.6 Sei v ein (n, l)-Vektor und x ein Skalar. Es soll ein Vektor z erzeugt werden, für den gilt: Ist das Element Vi größer als x, so ist das Element Zj der absolute Wert von Vj, ist es kleiner, so sei Zi — x und gilt = x, so sei z; = —x. Aufgabe 4 . 7 Betrachten Sie das Kilometerbeispiel und bestimmen Sie die Anzahl (a) der PKW's mit gleicher Kilometerzahl bei A und B; (b) der PKW's, bei denen mit Reifen B mehr Kilometer gefahren wurden als mit A. (c) der PKW's, die mit A (bzw. B) zwischen 90 (ausschließlich) und 110 (einschließlich) km zurückgelegt haben. Aufgabe 4 . 8 Gegeben sei ein relativ kurzer (n, l)-Datenvektor, bei dem an verschiedenen Stellen gleiche Werte stehen dürfen. Bestimmen Sie mittels eines geschlossenen Ausdruckes die mittleren Ränge. Diese sind definiert wie die Rangzahlen,
62
KAPITEL 4. ELEMENTARE
VERKNÜPFUNG
VON
MATRIZEN
jedoch wird über die Ränge, die zu gleichen Werten gehören, das arithmetische Mittel gebildet. So gehört etwa zu x = (1,2,2,2,3,4,4,5,6,6)' der Rangvektor r = (1,3,3,3,5,6.5,6.5,8,9.5,9.5)'.
Kapitel 5
Weitere Matrizenbearbeitung Wie schon erwähnt, beruht ein Großteil des Nutzens von GAUSS für statistische Berechnungen darauf, dass auf einfache Weise mit Matrizen operiert werden kann. Matrizen sind speziell für die Regressionsrechnung und die multivariate Statistik so grundlegend, dass kein Lehrbuch zu diesen statistischen Gebieten ohne Matrizenrechnung auskommt. Aber auch Operationen wie die Auswahl eines Teildatensatzes oder das Hinzufügen von Daten zu einem existierenden Datensatz lassen sich in GAUSS mit Hilfe von Matrixoperationen leicht realisieren.
5.1
Zugriff auf Teile von Matrizen
Oft ist es von Interesse, einzelne Elemente, Spalten oder Zeilen einer Matrix (Variablen bzw. Beobachtungen eines Datensatzes) separiert anzusehen bzw. zu verändern. Dazu dienen die eckigen Klammern " [ ]". Bisher wurden sie benutzt, um die Dimension der Matrizen festzulegen, denen mit dem LETBefehl Werte zugewiesen wurde. In allen anderen Anweisungen gibt der Inhalt der eckigen Klammern im Ausdruck " x [ . , . ] " die Positionen (Zeilen, Spalten) der Elemente der Matrix X an, die man extrahieren oder verändern möchte.
64
KAPITEL 5. WEITERE
MATRIZENBEARBEITUNG
Um die Diskussion konkret zu führen, sei die Matrix f 1 4 X = 7 10 K 13
2 3 5 6 8 9 11 12 14 15
)
betrachtet. Nun gilt: x [2,3] x [ l 3 5 , 1 3]
gibt das Element X23 der Matrix X an, also hier X23 = 5. gibt die Elemente an, die auf den Schnittpunkten der Zeilen 1,3,5 mit den Spalten 1 und 3 liegen. Hier ergibt also diese Anweisung die Matrix
(\ 13i 15i)/ x [ . , 2]
gibt die zweite Spalte von X an: 2
x[4,.] x [2:5,1] x[l 3:5,.]
5 8 11 14 gibt die vierte Zeile von X an: (10 11 12) ist die abgekürzte Schreibweise für x [2 3 4 5,1] ist die abgekürzte Schreibweise für x [ l 3 4 5 , . ] .
Bei Spalten- und Zeilenvektoren reicht ein Index. Sei v der Zeilenvektor v = ( 1 2 3 4 5 4 3 2
l).
Dann bezeichnet v[3] ebenso wie v [ l , 3 ] das 3.Element von v. v[4:8] ist das gleiche wie v [ l , 4 : 8 ] . z=v[4:8] ergibt z = (4 5 4 3 2). Es können auch Vektoren und Matrizen (bzw. Ausdrücke, die diese zum Ergebnis haben), als Argumente benutzt werden. Der Befehl hat also die Gestalt: z=x [ r , c] Die Elemente von R geben dann die Zeilenindizes und die Elemente von C die Spaltenindizes an. Matrizen werden zeilenweise eingelesen. Ist R bzw. C die Zahl Null, so werden alle Zeilen bzw. Spalten von X ausgewählt. Die skalare Null entspricht also dem Punkt in z [ . , columns] bzw. z [rows,. ]. Innerhalb der eckigen Klammern werden übrigens Leerzeichen als Trennzeichen interpretiert. Daher dürfen keine zusätzlichen Leerzeichen eingefügt werden, auch nicht hinter " [", vor und hinter dem Komma und vor "]".
5.1. ZUGRIFF AUF TEILE VON MATRIZEN
65
In z = x [ r l . . . r t , c l . . .es] brauchen die Zahlen r l , . . . r t bzw. cl,. . . ,cs nicht in der ursprünglichen Reihenfolge zu stehen. Das Ergebnis ist dann eine entsprechend umgeordnete Matrix. Auch gleiche Zahlen sind zugelassen, nichtganze Zahlen, die größer als Null sind, werden auf die nächst kleinere ganze Zahl abgerundet. Negative Werte führen zu einer Fehlermeldung. Völlig identisch mit dem Befehl z=x [r, c] ist der Befehl z=SUBMAT(x,r,c) In den obigen Beispielen wurde jeweils eine neue Matrix Z aus Elementen der Matrix X gebildet. Man kann aber auch indizierten Elementen von X neue Werte zuweisen, die zuvor in eine Matrix Z geschrieben wurden. Die Dimension von Z muss mit den Anzahlen der indizierten Zeilen und Spalten von x korrespondieren. Den einfachsten Fall stellt natürlich die Veränderung eines einzelnen Wertes einer Matrix dar. So wird mit x [ 2 , 3 ] = 0 der Wert £2,3 der Matrix X auf Null gesetzt. Beispiel 5.1 Im folgenden sei X die Matrix
t
2 3 \ 7 5 7 4 9 5 I 8/
1 3 X = 3 8 V6
und v wieder der Vektor v = ( l
2
3
4
5
4
3
2
1 )
Dann erhalten wir: PRINT 1 3 3 8
x[l 2:4,1 3] 3 5 4 5
PRINT xCl 3 1 1 2,3 2] 3 2 4 7 3 2 3 2 5 7
PRINT 1 3 3 6
x[l:3 5,.] 2 3 7 5 7 4 1 8
PRINT v[2:4 6:9] 2 3 4 4 3
Mit a={l 2,4 5>; b={2 3>; und c=a' ergibt sich weiter:
2
1
KAPITEL 5. WEITERE
66 z=x[a,b];z
2 7 9 1
z=x[c,b];z
3 5 5 8
2 9 7 1
MATRIZENBEARBEITUNG
z=x[0,b];z
2
3 5 5 8
3 5
4
5 8
z=v[b~2] ;z 4 i
z=v[SUMC(a)];z
5
3
Die zuletzt angegebene Möglichkeit, ausgewählte Teile einer Matrix zu modifizieren, illustriert die nachstehende Anweisungsfolge: d=0NES(6,6); d [ l 4 5 6 , 3 5 ] = x [ c , b ] ; PRINT d 2
1 1 9 7 1 In vielen Fällen interessiert man sich nur für die Hauptdiagonale der Matrix X. Das ist z.B. der Fall, wenn X eine Kovarianzmatrix ist und man sich nur die Varianzen anschauen will. Ist allgemein X nicht quadratisch, sondern vom Typ (n,m), so besteht die Hauptdiagonale aus den Elemente • • • , %kk mit k = min(m, n). Zwei Prozeduren greifen auf diese Diagonalen zu. Die Prozedur DIAG macht aus den Diagonalelementen der Matrix X den Spaltenvektor y; DIAGRV ersetzt die Diagonalelemente in X durch die Elemente in einem anzugebendem Vektor v. Der Aufruf erfolgt gemäß y=DIAG(x)
und
z=DIAGRV(x,v)
Beispiel 5.2 LET x [ 3 , 2 ] = l 2 2 3 3 4 ; y=DIAG(x); PRINT x y
1 2
2 3
3
4
1 3 LET v=10 10;z=DIAGRV(x,v); PRINT z 10 2 2 10 3 4
5.1. ZUGRIFF
AUF TEILE VON
MATRIZEN
67
Das Auswählen oder Entfernen von denjenigen Elementen aus einem Datensatz, die eine bestimmte Bedingung erfüllen, geschieht mit y=SELIF(x,e)
bzw.
z=DELIF(x,e)
Dabei ist X eine (n,p)-Matrix und e ein Spaltenvektor. Das Ergebnis von y=SELIF(x,e) ist eine (fc,p)-Matrix Y, die diejenigen Zeilen von X enthält, für die die entsprechende Komponente im Vektor e von Null verschieden ist. Jede Komponente e* / 0 von e wird als 'wahr' interpretiert, k ist also die Anzahl der Nicht-Null-Werte in e. Bei den beiden in der Box angegebenen Befehlen besteht das Ergebnis von z=DELIF(x,e) gerade aus den Zeilen von X, die nicht zu Y gehören. Beispiel 5.3 (a) LET m [ 2 , 2 ] = l , 2 , 3 , 4 ; LET e = l , 0 ; SELIF(m,e); 1
2
(b) Sei ein Datensatz von monatlichen Mietzahlungen gegeben mit miete={700,300,420,600,530}. Aus dem Vektor miete sollen diejenigen Wohnungen ausgewählt werden, deren Miete die Bedingung 'Miete; yc=VEC(x); yr=VECR(x); PRINT x; PRINT yc; PRINT y r ; 1 2 1 1 2 3 3 4 3 2
4
Das Hinzufügen von k Zeilen entspricht der Erhöhung des Umfanges eines Datensatzes um k Beobachtungen. Sind X und Y zwei Matrizen mit der gleichen Anzahl von Spalten, so ist Z die zusammengefügte Matrix, bei der der obere Teil durch X und der untere durch Y gegeben ist: z=x|y. Das Hinzufügen von q Spalten entspricht andererseits der Erweiterung des Datensatzes um neue Variablen. Dies kommt häufig vor, wenn man aus den vorhandenen neue Variablen durch Transformationen etc. generiert. Diese Art des Zusammenfügens von Matrizen setzt nun voraus, dass beide Matrizen die gleiche Anzahl von Zeilen haben. Dann ist z=x~y die Matrix, deren erste Spalten durch X und deren letzte Spalten durch Y gegeben sind. Beispiel 5.9 LET x—1 2 , 3 4; LET y=l 2; PRINT x l y ; PRINT x ~ y ' ; 1 2 1 2 1 3 4 3 4 2 1 2
5.2. UMSTRUKTURIEREN
VON MATRIZEN
Tabelle 5.2: Umstrukturierung von Matrizen y = x' P.N N-p z = x | y N + M.P N.P M p z = x y N.P + Q N.P NQ y = LAGl(x)
y = LAGN(x , t) N p N.P y = RESHAPE (x,m,q) M.Q N.P y = REV(x) N.P N.P y = ROTATER (x , r ) Vp N.P N,1
Transponierte der Matrix x Spaltenweises Anhängen der Matrix Y an die Matrix X Zeilenweises Anhängen der Matrix Y an die Matrix X Verschieben aller Zeilen um eine Zeile nach unten; die erste Zeile erhält 'missings', die letzte geht verloren. Verschieben aller Zeilen um t Zeilen nach unten; die ersten t Zeilen erhalten 'missings', die letzten t Zeilen gehen verloren. Umformen von X in (m,q)-Matrix. Die Elemente werden dabei zeilenweise aus X entnommen Umkehrung der Reihenfolge der Zeilen
Rotieren der ¿-ten Zeile von X um r* (t-tes Element von r) Stellen nach rechts (bzw. nach links bei negativen Zahlen in r) y = SHIFTR(x, r ,f ) Verschieben der Zeilen von X jeweils um r,; N,P N,P N,1 N,1 die freiwerdenden Plätze in der i-ten Zeile werden mit dem Wert f l aufgefüllt Sortieren der Zeilen einer Matrix nach der y = S0RTC(x,s) N.P N.P s-ten Spalte (aufsteigende Reihenfolge) Sortieren der Zeilen einer Matrix nach den y = SORTMC ( x , s1) N,P Li in s angegebenen Spalten, st € N, (aufsteigende Reihenfolge); dabei wird zuerst nach der Spalte Si dann nach si usw. sortiert. Umwandlung von X in einen Spaltenvektor y = VEC(x) N.P.l n.P (spaltenweise) y =VECH(x)
y = VECR(x) P.N.l N.P y = XPND(x) M.M
(zeilenweise) Umwandlung der quadratischen Matrix in einen Spaltenvektor unter Weglassung der oberhalb der Diagonalen liegenden Elemente Umwandlung der Matrix X in einen Spaltenvektor (zeilenweise) Umkehrfunktion von VECH. Die Länge N muss N = (M 2 + M)/2 erfüllen.
73
74
KAPITEL
5.3
5. WEITERE
MATRIZENBEARBEITUNG
Kronecker- und horizontales direktes Produkt
Erweiterungen der elementweisen Operationen mit Matrizen stellen das Kronecker-Produkt und das horizontale direkte Produkt dar. Das Kronecker-Produkt " x . * . y " ergibt eine Matrix Z, deren Elemente durch Multiplikation eines jeden Elementes in X mit der Matrix Y entstanden sind. Beispiel 5 . 1 0 LET x [ 2 , 2 ] = l 2 3 4 ; z = x . * . y ; PRINT z 8 5 6 4 7 8 9 H 12 15 18 16 1 24 27 28
LET y [ 2 , 3 ] = 4 5 6 7 8 9 ; 10 16 20 32
12 18 24 36
Das horizontale direkte Produkt "z=x*~y" zweier Matrizen X und Y mit gleicher Anzahl von Zeilen ist wie folgt definiert. (Dabei bezeichnet Xj die j-te Spalte der Matrix X ) : (
Xll
Zl2
X21
X22
Xln \ X2n
*
~
\ «Eml J'iii'l
= (xi.*Y)~(xa.*Y)~
I 2/ii
3/12
VU \
y 2i
2/22
1)21
\ y ml
•••
Vm2
Vml /
~(xn.*Y).
Beispiel 5 . 1 1 x = i l 2 , 3 4 } ; y={5 6 , 7 8>; z=x#~y; z 5 6 10 12 21 24 28 32
Mit dem horizontalen direkten Produkt kann man bisweilen mehrstufige Bearbeitungsvorgänge kompakt zusammenfassen. (Für spätere Anwendungen heißt dies, dass man Schleifen vermeiden kann; siehe dazu das Kapitel 7.) Beispiel 5 . 1 2 Es sollen zwei (p,p)-Momentmatrizen aus zwei (l,p)-Datensätzen nacheinander berechnet und in einer gemeinsamen Matrix abgespeichert werden. Für
5.4.
AUFGABEN
75
jeden Datensatz ist also die Matrix (
\
X\X\
X\X2
•••
X\Xp
X1X1 X\X2
• • • XiXp
XpXi
•••
XpX2
XpXp
\
J
zu bestimmen. Die Speicherung soll dabei sparsam erfolgen. / 1 2 3 \ Konkret ergibt sich für die (2,3)-Matrix X = [ ^ ^ 1, wenn die beiden Momentmatrizen verkettet werden: x={l 2 3, 4 5 6}; M0MENT(x[l,.],1)"MOMENT(x[2,.],1) 1 2 3 16 20 24 2 4 6 20 25 30 3 6 9 24 30 36 Zum anderen ergibt das horizontale direkte Produkt: x*~x 1 2 3 2 4 6 3 6 9 16 20 24 20 25 30 24 30 36 Werden also bei x*"x die 4te, 7te und 8te Spalte entfernt, so erhält man in den beiden Zeilen gerade die verschiedenen Elemente der beiden Momentmatrizen. Der allgemeine Befehl lautet dann: c = VECH(RESHAPE(SEQA(l,l,p~2),p,p)); / * S p a l t e n , d i e verwendet werden s o l l e n */ ym = SUBMAT(x*~x,0,c); •
5.4
Aufgaben
Aufgabe 5.1 Definieren Sie eine (5,5)-Matrix mit den Zahlen 1 bis 25. (a) Experimentieren Sie mit ungeradzahligen Indizes, um ein Element aus der Matrix auszugeben. (b) Extrahieren Sie eine (3,2)-Teilmatrix. (c) Extrahieren Sie die dritte Zeile. (d) Extrahieren Sie die erste Spalte. (e) Definieren Sie zwei Vektoren, um damit einen Block aus der Matrix zu extrahieren.
76
KAPITEL 5. WEITERE
MATRIZENBEARBEITUNG
Aufgabe 5.2 Schreiben Sie einen kurzen Ausdruck, um die k kleinsten Elemente einer (n,p)-Matrix X zu finden. Wie kann man zugleich noch die Positionen der k kleinsten Elemente in der Matrix bestimmen? Aufgabe 5.3 Beantworten Sie die folgende Anfrage an die GAUSS-Mailing Liste: Liebe Gauss-Anwender, ich möchte eine Matrizenmultiplikation implemen-
soll das Ergebnis ein (2 • n, l)-Vektor folgender Gestalt sein: Aufgabe 5.4 Gegeben sei eine (n, fc)-Matrix A und ein (n, l)-Vektor v mit 1 < Vi < k. Gesucht ist eine Anweisung, die einen Vektor z berechnet, so dass das i-te Element von z UitVi enthält. Aufgabe 5.5 Stellen Sie sich vor, Sie seien Mitarbeiter einer Bank, bei der die Salden der Kundenkonten durch folgenden Vektor gegeben seien: (Wählen Sie format / r d 10,2 und rndseed 100.) stand = FL00R(5000#RNDU(FL00R(RNDU(1,1)*10.00),1))-1000; Kontonummer ist dabei gleich der Zeilennummer im Vektor. Sie sollen dem Vorstand folgende Daten mitteilen: (1) Anzahl der Kundenkonten; (2) Anzahl der Konten mit negativem Saldo; (3) Kontonummer und -stand des Kontos mit dem höchsten bzw. niedrigsten Saldo; (4) Anzahl der Konten mit Saldo x in den Bereichen x < 0, 0 < x < 100, 100 < x < 500, 500 < x < 1000, 1000 < x < 10000. Aufgabe 5.6 Gegeben sei ein Vektor von Korrelationen, r = (.12 .13 .14 .23 .24 .34). Daraus soll eine Korrelationsmatrix der Form 1.00 .12 .13 .14 .12 1.00 .23 .24 .13 .23 1.00 .34 .14 .24 .34 1.00
5.4. AUFGABEN
77
gebildet werden. Setzen Sie möglichst clever die verschiedenen Funktionen zum Umstrukturieren von Matrizen ein. Aufgabe 5.7 Schreiben Sie eine kompakte Anweisungsfolge, mit der die Spalten einer Matrix randomisiert werden. werden. Aufgabe 5.8 Schreiben Sie je einen Ausdruck, wie aus einer (10,10) Matrix X zufällig 20 Elemente ohne bzw. mit Zurücklegen gezogen werden. Diese können dann in einem Spaltenvektor r stehen. Aufgabe 5 . 9 Gegeben sei eine (n, 2)-Matrix. In der ersten Spalte stehen die Werte i , einer Variablen X , etwa das Haushaltseinkommen; in der zweiten stehen positive ganze Zahlen rii, die etwa die Anzahl der Haushaltsmitglieder des iten Haushalts angeben. Daraus soll ein Vektor erzeugt werden, bei dem jeder Wert Xi so oft vorkommt, wie der Wert n* angibt. Aus der Matrix 950 490 780
2 \ 3 soll etwa der Vektor (950,950,490,490,490,780)' entstehen. 1 J
Kapitel 6
Nichtnumerische Daten 6.1
Charakter-Matrizen
Wie bereits erwähnt wurde, kann eine Matrix nicht nur Zahlen sondern auch Buchstaben oder andere Zeichen enthalten. Dies wird im statistischen Rahmen vor allem benötigt, um nicht-numerisch kodierte Werte von Variablen sowie Labels, d.h. Kurzbezeichnungen von Variablen oder ihren Werten, abzuspeichern. Kurzbezeichnungen, weil bei Charakter-Matrizen die Elemente maximal 8 Zeichen haben dürfen. Für längere Zeichenketten stehen die nachfolgend beschriebenen Strings und String-Arrays zur Verfügung. Bei Charakter-Matrizen können Zahlen und Zeichen auch gemischt auftreten; das ist bei String-Arrays nicht möglich. Besteht eine Matrix nur aus Zahlen, so reicht es aus, nur ihren Namen einzugeben, um ihren Inhalt am Bildschirm auszugeben. Bei einer CharakterMatrix muss man dagegen vor den Namen ein $ setzten: Beispiel 6.1 LET namen[2,2]=Hans Franz Sepp OTTO; PRINT namen; 6.9052465E-315 1.9162828E-312 6.6572278E-315 6.5756515E-315 PRINT $namen; HANS FRANZ SEPP OTTO
»
Die Ausführungen zur Ausgabe im Kapitel 2, d.h. zu den Befehlen PRINT und FORMAT, bleiben im wesentlichen gültig. PRINT $mat
80
KAPITEL
6. NICHTNUMERISCHE
DATEN
gibt die Matrix mat aus, wobei deren Elemente als Zeichenketten aufgefasst werden. Dabei ist zu beachten, dass die in FORMAT angegebene Feldlänge mindestens den Wert 8 besitzt. Beispiel 6.2 LET name[4,1]=HANS FRANZ SEPP OTTO; FORMAT 16,8; $name HANS FRANZ SEPP OTTO FORMAT 8 , 1 ; $name HANS FRANZ SEPP OTTO FORMAT 1,8; $name HANS FRANZ SEPP OTTO FORMAT 1,2; $name; HA FR SE OT
m
Die Buchstaben werden als Großbuchstaben gespeichert (und ausgegeben), wenn die Zeichen wie üblich eingegeben worden sind. Um sie als kleine Buchstaben zu erhalten, müssen die Elemente der Charakter-Matrix in Anführungszeichen eingeschlossen werden. Beispiel 6.3 namen={"Hans" "Franz","Sepp" " O t t o " } PRINT $namen; Hans FYanz Sepp Otto
%
Bei der Eingabe von Sonderzeichen innerhalb von Anführungszeichen ist zu beachten, dass der Backslash \ eine besondere Funktion haben kann; eine ganze Reihe von Sonder- und Steuerzeichen in Zeichenketten beginnen mit dem Backslash. Zum Beispiel liefert \ b einen Piep-Ton. Um ihn daher (etwa
6.2. STRINGS
(ZEICHENKETTEN)
UND
STRING-ARRAYS
81
bei Pfadangaben) zu erzeugen, muss er doppelt aufgeführt werden. Das Sonderzeichen \ wird in GAUSS (innerhalb von " ") also dargestellt durch \ \ . Beispiel 6.4 p f a d = { " c : \ \ d " } ; PRINT $pfad c:\d
m
Bei vielen GAUSS-Programmen können sowohl numerische Matrizen wie auch Charakter-Matrizen als Argumente eingegeben werden. Dann ist meist ein flag zu setzen, das mitteilt, um welche Art der Matrix es sich handelt. Meist ist flag = 1 bei numerischen Daten und = 0 sonst. In einigen Fällen gibt es jedoch getrennte Prozeduren. So ist etwa zum Sortieren einer Charakter-Matrix die Prozedur SORTCC(x.c)
vorgesehen. Hier ist der Skalar c wie bei der Prozedur SORTC die Spaltennummer, nach der die Matrix X sortiert werden soll. Matrizen, bei denen Zahlen und Zeichenelemente gemischt auftreten, treten z.B. bei statistischen Erhebungen auf, wenn nominal skalierte Variablen nicht von vornherein numerisch kodiert werden. Das ist etwa der Fall bei der Erhebung der Variablen Geschlecht, deren Werte man gerne mit w und m angibt. Solche gemischten (n, fc)-Matrizen X können mit Hilfe der Funktion y=PRINTFMT(x,mask)
ausgegeben werden. Hier ist mask ein (1, fc)-Vektor bestehend aus Einsen und Nullen. Die jeweilige Spalte wird dann als numerisch bzw. nichtnumerisch interpretiert. Abkürzend kann mask auch ein Skalar sein, wenn alle Elemente von X vom gleichen Typ sind, y ist 1, wenn die Ausführung der Anweisung erfolgreich war, sonst wird eine 0 ausgegeben. Soll die Ausgabe noch detaillierter formatiert werden, so kann dies mit PRINTFM geschehen. Zu dieser Funktion sei auf das GAUSS-Manual bzw. auf die Online-Hilfe verwiesen. Mit den einfachen Funktionen PRINT x und PRINT $x ist es bei gemischten Matrizen nicht getan, wie der folgende Bildschirm zeigt.
6.2
Strings (Zeichenketten) und String-Arrays
Ein String oder String-Array ist ein spezifischer in GAUSS. String-Arrays dürfen nicht mit Charakter-Matrizen verwechselt werden. Während die Elemente von Charakter-Matrizen maximal 8 Zeichen haben dürfen, bestehen
82
» »
KAPITEL
LET x [ 2 , 2 Ì = 1 x;
alpha
2
DATEN
beta;
1.0000000 » $x;
6. NICHTNUMERISCHE
+DEH +DEN
2.0000000
ALPHA BETA »
PRIHTFMT ( x , 1 ~ 0 ) / 1 2
ALPHA BETA
1.0000000
Strings aus Folgen von Zeichen beliebiger Länge. Jedes Zeichen ist in einem String erlaubt. Strings werden mit dem STRING Befehl erzeugt. Auch die einfache Zuordnung einer in Anführungszeichen eingeschlossen Zeichenkette erzeugt einen (1,1) (skalaren) String-Array. Ist die Zeichenkette in Anführungszeichen eingeschlossen, so wird die Groß- und Kleinschreibung beachtet; ohne Anführungszeichen wird die Zeichenkette wieder in Großbuchstaben abgespeichert. Es sei daran erinnert, dass eine Charakter-Matrix resultiert, wenn die in Hochkommata eingeschlossene Zeichenkette (von maximal 8 Zeichen) zudem mit den gescheiften Klammern umgeben ist. Bei einigen Zeichen sind spezielle Konventionen zu beachten. So gelten die oben zu dem Sonderzeichen \ gemachten Bemerkungen auch für Strings. Gerade bei Pfadangaben ist das wichtig, da Strings nicht der Längenbeschränkung von acht Zeichen unterliegen. Beispiel 6.5 pfad = " c : \ \ d \ \ m y d a t a " ; PRINT pfad c:\d\mydata
m
Die Angabe der Anzahl von Zeilen und Spalten bei dem zu erzeugenden String bewirkt, dass ein String-Array generiert wird. Dann sind durch Leerzeichen getrennte Zeichenketten anzugeben. Anders als bei numerischen Matrizen wird ein String-Array nicht einfach aufgefüllt, wenn zu wenige Items vorhanden sind. (Lediglich bei nur einer einzelnen Zeichenkette bekommen alle Plätze diese zugeordnet.) STRING x [ r , c] = Folge 1 Folge2
..
Dabei ist x der Name des Strings und F o l g e l , F o l g e 2 , . . . sind die Zeichenfolgen, die x zugewiesen werden sollen, r , c müssen wieder konkrete Zahlen-
6.2. STRINGS
(ZEICHENKETTEN)
UND STRING-ARRAYS
83
angaben sein; Variablennamen sind unzulässig. Der Inhalt einer String-Variablen mit dem Namen x wird am Bildschirm ausgegeben durch PRINT x Das PRINT ist wieder fakultativ. Es sei aber noch extra darauf hingewiesen, dass hier einfach PRINT x aufgerufen wird und nicht etwa PRINT $x ! Beispiel 6.6 x="Mittelwert"; PRINT x Mittelwert x Mittelwert LET STRING s[2,2] = abed efgh ij k; PRINT s ABGD EFGH IJ K
m
Da der PRINT Befehl die Ergebnisse einer Folge von Anweisungen am Bildschirm ausgibt, kann man Zeichenketten und Matrizen für die Ausgabe mischen. Ohne Semikolon gibt es bei der Ausgabe keinen Zeilenvorschub. mean=3.5; PRINT "Mittelwert" mean Mittelwert 3.5000000 Die dynamische Neubelegung von Variablen funktioniert nur beschränkt zwischen den beiden wesentlichen Datentypen. Charakter-Matrizen können nicht als Strings neu belegt werden; auch der umgekehrte Vorgang ist nicht erlaubt. Dagegen funktioniert die Neubelegung von Strings durch numerischen Matrizen und umgekehrt. Beispiel 6.7 STRING x=kein; PRINT x kein x=l; PRINT x 1.0000000 y={"kein">; PRINT $y kein STRING y=kein (0) : Redefinition of 'y' (matrix)y being declared external string Den jeweiligen Datentyp kann man mit
•
84
KAPITEL
6. NICHTNUMERISCHE
DATEN
y = TYPE(x) erfragen, y ist ein Skalar; er hat den Wert 6 wenn das Argument eine Matrix ist, 13 bei einem String und 15, wenn es ein String-Array ist. Beispiel 6.8 STRING t e x t l = " M i t t e l w e r t " ; TYPE(text1); 13
t e x t 2 = " M i t t e l w e r t " ; TYPE(text2); 13
text2={"Mittelwert">; TYPE(text2); 6
6.3
String-Bearbeitung
Die meisten der Operatoren, die für numerische Daten existieren, haben ihr Gegenstück zum Bearbeiten von Matrizen von Zeichenketten und Strings. Das wesentliche Kennzeichen ist das vorangestellte Dollar-Zeichen: $+ $| Auch das Transponieren von Matrizen steht zur Verfügung. Außerdem gibt es zahlreiche Prozeduren, die sowohl für numerische Daten wie auch für nichtnumerische anwendbar sind. Diese sind i.d.R. bei den numerischen Prozeduren beschrieben und daran zu erkennen, dass sie ein extra Argument haben, für das bei numerischen Daten eine 1, für nichtnumerische eine 0 einzugeben ist. Wie diese Operatoren wirken, sei nur anhand des Verkettungsoperators $+ verdeutlicht. Sind s l und s2 zwei Strings, dann ist s=sl$+s2 der String, der dadurch gewonnen wird, dass man den String s2 hinten an den String s l anfügt. Sind s l und s2 String-Arrays, so werden sie mit $+ entsprechend den Regeln der elementweisen Verknüpfung addiert. Charakter-Matrizen werden entsprechend behandelt. Allerdings gilt die Einschänkung, dass die Zeichenketten höchstens 8 Zeichen haben dürfen. Somit gehen hierbei u.U. Zeichen verloren. Bei der Zusammenfügung eines String und einer Charakter-Matrix resultiert der Typ, der links vom $+ steht. Eine Charakter-Matrix kann also dadurch in einen String-Array verwandelt werden, dass von links ein 'inhaltsleerer' String b heran-addiert wird, STRING b="". Umgekehrt wird aus einem StringArray a durch 0$+b eine Charakter-Matrix. Dabei werden gegebenenfalls die einzelnen Zeichenketten auf 8 Zeichen gekürzt,
6.3.
STRING-BEARBEITUNG
85
Beispiel 6.9 sl="WASSER"; s2="SCHILD"; s3="KR0ETE"; s=sl$+s2$+s3; s WASSERSCHILDKROETE sl="WASSER"; s2={"EIMER">; TYPE(sl$+s2); TYPE(s2$+sl) 13.000000 6.0000000
•
Beispiel 6.10 LET x [2,2] = abc dei, d f; LET y [2,1] =m n; PRINT $(x $+y); PRINT $x'; ABCM DEFM ABC D DN FN DEF F Das Gleiche erhalten wir, wenn x und y mit LET STRING definiert werden. (Die PRINT-Befehle ändern sich natürlich. Der erste lautet dann PRINT x $+ y;). • Für String-Arrays sind die einfachen und die elementweisen relationalen Operatoren $, . $ < , .$=, . $ > analog zu den numerischen Vergleichsoperatoren definiert. Sie vergleichen die ersten Elemente der Strings entsprechend dem Alphabet. Beispiel 6.11 STRING a="a"; STRING b="b"; STRING c="abc"; PRINT a$>c PRINT b$>a PRINT a$
Anweisung 2
-»
...
Anweisung n
92
KAPITEL
7. PROGRAMMIEREN
IN GAUSS I
Die Anweisungen werden sequenziell, d.h. eine nach der anderen, abgearbeitet. In GAUSS müssen die einzelnen Anweisungen einer Sequenz durch Semikolon getrennt sein. Beispiel 7.1 LET v l = l 2; LET v 2 [ l , 3 ] = 3 4 5; PRINT v l . * v 2 34 5 6 8 10
m
Oft soll eine bestimmte Anweisungsfolge wiederholt abgearbeitet werden, und zwar solange, wie eine bestimmte Bedingung erfüllt ist. Das zugehörige Flussdiagramm sieht dann wie in Abbildung 7.1 aus. Abbildung 7.1:
A Dabei ist A eine Sequenz von Anweisungen und B eine Bedingung. Ist die Bedingung B erfüllt, wird die Sequenz A ausgeführt. Im gesamten Kapitel wird für B jeder Ausdruck zugelassen, der als Ergebnis einen Skalar ausgibt. Der Ausdruck wird genau dann als falsch interpretiert, wenn der Skalar Null ist. In allen anderen Fällen wird die Bedingung als erfüllt angesehen. Die zu dem Flussdiagramm gehörige G AUSS-Syntax ist: DO WHILE B; A; ENDO; Eine solche Kontrollstruktur bezeichnet man als Wiederholungsanweisung. Wenn die Bedingung B einfach darin besteht, dass ein Zähler i beginnend bei s mit der Schrittweite w bis zu einer festgelegten Zahl e hochgezählt werden soll, kann die Wiederholungsanweisung auch folgendermaßen realisiert werden: FOR i ( s , e , w ) ; A; ENDFOR; Hier ist zu beachten, dass i nach dem Wiedereintritt in eine Wiederholung erhöht wird. Daher ist u.U. der letzte Wert von i größer als e.
7.1.
KONTROLLSTRUKTUREN
93
Beispiel 7.2 FOR i ( 1 , 1 0 , 2 ) ; ? i ; ENDFOR; 1.0000000 3.0000000 5.0000000 7.0000000 9.0000000 11.000000
m
Eine andere Art der Wiederholungsanweisung besteht darin, eine Anweisungsfolge solange abzuarbeiten, solange eine Bedingung nicht erfüllt ist. Die entsprechende Syntax in GAUSS hat die Form: DO UNTIL B; A; ENDO; Die Abb. 7.2 zeigt das zugehörige Flussdiagramm. Abbildung 7.2:
Nein
A Beispiel 7.3 An einem einfachen Beispiel soll die Verwendung der Wiederholungsanweisung illustriert werden. Gegeben sei ein Vektor mit Komponenten X\,... , xn. Es soll das arithmetische Mittel von Xi,... , xn bestimmt werden. Das Ergebnis soll in der Variablen m stehen. (Für den Moment sei vergessen, dass schon eine GAUSS-Funktion bekannt ist, die dies leistet). Das Flussdiagramm 7.3 zeigt die Vorgehens weise. Die zugehörige Anweisungsfolge ist, wenn x die konkreten Zahlen 1,2,3,4 zugewiesen werden: LET x=l 2 3 4; i=l; s=0; n=R0WS(x); DO WHILE i 0.5 oder < 0.5 sind. Auch dann ist w ein Skalar und kein (10, l)-Vektor. Mit Wahrscheilichkeit 0.998 wird aber w ein leerer Vektor bleiben. • Eine unbedingte Sprunganweisung wird mit GOTO angefordert. Steht in einem Programm GOTO l a b e l ; label:
98
KAPITEL
7. PROGRAMMIEREN
IN GAUSS I
so wird von der Zeile, in der das GOTO steht, in die Zeile gesprungen, in der die Marke l a b e l : (mit einem Doppelpunkt!) angebracht ist. Häufig wird diese Sprunganweisung im Zusammenhang mit der IF-Abfrage benutzt. Beispiel 7.9 Ein Algorithmus zur Erzeugung von Beta(p, ^-verteilten Zufallszahlen (p,q> 0) ist in Johnson, Kotz und Balakrishnan (1995) angegeben: (a) Initialisierung: Setze a — p + q. Wenn min(p, q) < 1, setze b = max(p _ 1 , g - 1 ) ; andernfalls setze b = y/(a — 2)/(2pq - a). Setze g = p+ (b) Erzeuge über dem Intervall (0,1) gleichverteilte Zufallszahlen Ui,U2 und setze V = b * ln[C/i/(l - U2)}, W = p * exp(V). (c) Wenn a * \n[a/(q + W)]+g*V (b).
- 1.3862944 < ln[([/2) * U2], gehe nach
(d) Gib X = W/(q + W) aus. Die Anweisungsfolge hierzu lautet, wenn p und q willkürlich initialisiert werden: p = 2; q = 6; a = p+q; IF minc(p|q)1 0 1
IN GAUSS I
m
Ist die Funktion im Befehlsmodus definiert worden, so kann sie wie oben sofort benutzt werden, nachdem sie definiert und die Zeile ausgeführt wurde. Sie ist während der gesainten Sitzung im Hauptspeicher vorhanden. Nach Beendigung der Sitzung geht sie aber verloren. Will man Funktionen längerfristig speichern, so müssen sie in eine Datei gespeichert werden. Üblicherweise wird dazu im Edit-Fenster ein neues Arbeitsblatt eröffnet, und die Funktion darin erstellt oder kopiert. Daraufhin wird die Datei, welche die Definition der Funktion enthält, gespeichert. Anklicken des Disketten-Icons oder von 'Save' im | File [M enü öffnet ein Fenster, über das der Name und das Verzeichnis gewählt werden können. Dann kann die Funktion kompiliert werden, indem die Datei ausgeführt wird, etwa indem der | Run [-Button angeklickt wird. Die Funktion ist jetzt im Hauptspeicher und kann benutzt werden.
7.4
Prozeduren
Funktionen sind beschränkt auf eine Anweisung und die Ausgabe einer Größe. Will man mehrere Anweisungen unter einem Namen zusammenfassen, und ggf. mehrere Größen berechnen, die dann als globale Variablen zur Verfügung stehen sollen, so muss man eine Prozedur definieren. Eine Prozedur ist eine Folge von Anweisungen, die lokale und globale Variablen enthalten oder erzeugen kann. Die Struktur einer Prozedur hat die Gestalt PROC ( r ) = p n a m e ( a r g l , a r g 2 , . . . , a r g n ) ; LOCAL l v a r l , l v a r 2 , . . . , l v a r m ; Anweisung 1; Anweisung 2; Anweisung p; RETP(ausdruckl,ausdruck2,....ausdruckr); ENDP; Die Anweisungen PROC und ENDP sind obligatorisch, die Anweisungen LOCAL und RETP hingegen fakultativ. Es können mehrere LOCAL und RETP Anweisungen in einer Prozedur vorkommen.
7.4.
PROZEDUREN
105
Für die einzelnen Teile einer Prozedur gilt Folgendes: Deklaration der Prozedur Eine Prozedur wird durch die Anweisung PROC deklariert. Diese hat folgenden Aufbau: PROC (r) = pname(argl,arg2 argn); Dabei sind: r : Anzahl der Objekte, die von der Prozedur zurückgegeben werden; r ist eine ganze Zahl zwischen 0 und 31. Diese Werte können, wie auch bei Funktionen, Argumente von anderen Funktionen oder Prozeduren sein oder in Ausdrücken verwendet werden. Im Fall r = l kann auf die Klammern verzichtet werden. Weitergehend kann in diesem Fall die Angabe ganz unterbleiben. PROC pname(argl,arg2,. . . ,argn) ist also erlaubt, wenn nur eine Variable ausgegeben wird. pname: Name der Prozedur, dessen erstes alphanumerisches Zeichen ein Buchstabe sein muß. a r g l , a r g 2 , . . . ,argn: Eine Liste von Variablennamen, für die das gleiche gilt wie bei der Deklaration einer Funktion. Deklaration der lokalen Variablen Mit Hilfe der Anweisung LOCAL können Variablen lokal gehalten werden. Sie hat die Gestalt LOCAL l v a r l , l v a r 2
lvarm;
Dabei sind v 1, v2 vn Variablennamen. Durch die Anweisung LOCAL werden die Variablen nicht initialisiert. Falls auf sie innerhalb der Prozedur zugegriffen wird, muss ihnen vorher in der Prozedur ein Wert zugewiesen werden. Lokale Variablen existieren nur während der Ausführung der Prozedur. Prozedur-Körper Der Prozedur-Körper enthält die Anweisungen. Jede andere Prozedur (auch benutzerdefinierte) sowie globale Matrizen oder Zeichenketten können im Prozedurkörper auftauchen. GAUSS-Prozeduren dürfen rekursiv sein. Das heißt, sie kann sich selbst aufrufen. Hierbei muss natürlich gewährleistet sein, dass dieser Prozess ein Ende findet. Ausgaben der Prozedur Mit Hilfe der Anweisung RETP können im Prozedurkörper berechnete lokale Variablen oder auch erst an dieser Stelle berechnete Größen als globale Variablen der "Umwelt" übergeben werden. Für r>0 hat die RETP-Anweisung hat folgenden Aufbau RETP(ausdruckt,....ausdruckr);
106
KAPITEL
7. PROGRAMMIEREN
IN GAUSS I
(Wie die "Umwelt" eineie Ausgabe entgegennimmt, wird gleich besprochen.) Die Anzahl r der Objekte, die durch RETP zurückgegeben werden, muss mit der entsprechenden Zahl im Deklarationsteil übereinstimmen. Der Ausdruck kann jeder legale GAUSS-Ausdruck sein, der als Ergebnis eine Matrix oder eine Zeichenkette liefert. Wenn die Prozedur so definiert ist, dass kein Objekt zurückgegeben wird (r=0), entfällt die RETP-Anweisung. Ende der Prozedur-Definition Die ENDP-Anweisung ENDP; markiert das Ende der Prozedur-Definition. Es gibt verschiedene Möglichkeiten, Prozeduren aufzurufen. Der übliche Fall ist dabei, dass die Prozedur ein oder mehrere Ergebnisse zurückgeben soll. Sei pname der Name der Prozedur und a r g l , . . . ,argn die Argumentenliste. Dann erfolgt durch • C x l , . . . , x r } = pname(argl
argn)
eine Zuweisung an die Variablen x l , . . . ,xr. Sofern die Prozedur nur ein Ergebnis zurückgibt, kann die geschweifte Klammer entfallen. Soll das Ergebnis lediglich am Bildschirm ausgedruckt werden, so reicht pname(argl,...,argn) Die Ergebnisse können direkt einer weiteren Prozedur pname 1 übergeben werden, wenn die Anzahl der übergebenen Parameter mit der Anzahl r der Ergebnisse übereinstimmt. Natürlich ist auch darauf zu achten, dass die Anordnung der übergebenen Parameter die gewünschte ist: pname1(pname(argl,...,argn)) Eine Prozedur, die kein Ergebnis zurückgibt, oder bei der man die Ausgabe des Ergebnisses unterdrücken will, ruft man auf mit CALL p n a m e ( a r g l , . . . , a r g n ) Dies ist beispielhaft schon im Kapitel 3 mit den GAUSS-Prozeduren DSTAT und OLS vorgeführt worden. Beispiel 7.12 Mit einer Prozedur soll eine zweiseitiger t-Test für das Zweistichprobenproblem unabhängiger Stichproben durchführt werden; als Ergebnis soll sie den p-Wert liefern.
7.4.
PROZEDUREN
107
Ausgangspunkt der statistischen Fragestellung sind unabhängige Zufallsvariablen Xu...
,Xm,Ylt...
,Yn
Xi~N(nx,02),
mit
Yj ~
N{ßY,02).
Das Testproblem lautet H0 : fix = Mr
:
ßx i t*Y •
Unter HQ ist die Teststatistik
mit X = £ TZ i Xu?=i
EU
Y
J> Sx = ^
Eti
~ X)2
S^ =
Ej=i (Yj ~ i-verteilt mit m + n — 2 Freiheitsgraden. Wird der Test zum Niveau a durchgeführt, so wird die Nullhypothese verworfen, wenn für den Wert t der Teststatistik T > tm+n-2;l-a/2 gilt; sonst wird Ho beibehalten Zur Testentscheidung kann auch der p-Wert benutzt werden. Dieser ist hier 2 • P(T > |t|) = p. Da p < a äquivalent mit |í| > i m + n - 2 ; i - a / 2 ist) wird in diesem Fall Ho abgelehnt, ansonsten nicht. Der Vorteil der p-Werte liegt darin, dass jeder Anwender den Vergleich mit "seinem" Testniveau selbst vornehmen kann. Daher ist es sinnvoll die Prozedur so zu schreiben, dass sie als Ergebnis die Überschreitungswahrscheinlichkeit, also den p-Wert, abliefert. Die Deklaration der Prozedur enthält als Argumente die beiden Datenvektoren x und y und gibt als einziges explizites Ergebnis den p-Wert aus. Sie wird t t e s t genannt: PROC (1) = t t e s t ( x , y ) ; Die lokalen Variablen werden bestimmt, nachdem der Prozedurkörper geschrieben ist, da spätestens dann klar ist, welche lokalen Variablen benötigt werden. Im Prozedurkörper, der die Anweisungen enthält, wird der Wert der Teststatistik und der p-Wert berechnet. m n t t t
= = = = =
ROWS(x); ROWS(y); MEANC(x)-MEANC(y); t/SQRT((m-1)*STDC(x)"2+(n-1)*STDC(y)~2); t*SQRT((m+n-2)*m*n)/(m+n));
KAPITEL 7. PROGRAMMIEREN
108
IN GAUSS I
Zur Berechnung des p- Wertes wird das Komplement der Verteilungsfunktion CDFTC(t ,m+n-2) der i-Verteilung mit m + n - 2 Freiheitsgraden, vgl. Tabelle 3.3 benötiget. Als p-Wert ergibt sich unter Berücksichtigung der Tatsache, dass das Komplement der Verteilungsfunktion an der Stelle der Absolutwerte zu berechnen ist: p = 2*CDFTC(ABS(t),m+n-2); Wie die Durchmusterung des Prozedurkörpers zeigt, sind m , n , t , p als lokale Variablen zu deklarieren: LOCAL m , n , t , p ; Abschließend ist noch der p-Wert als Resultat der Prozedur mit RETP(p); auszugeben und das Ende der Prozedur zu definieren mit ENDP; Zusammengefasst ergibt sich also folgende Prozedur: / * PROZEDUR FUER ZWEISTICHPROBEN T-TEST Input: x = (m,l)-Vektor, e r s t e Stichprobe y = ( n , l ) - V e k t o r , zweite Stichprobe Output: p = Skalar, p-Wert f ü r z w e i s e i t i g e A l t e r n a t i v e */
PROC (1) = t t e s t ( x , y ) ; LOCAL m, n, t , p; m = ROWS(x); n = ROWS(y); t = MEANC(x)-MEANC(y); t = t/SQRT((m-1)*STDC(x)"2+(n-1)*STDC(y)"2); t = t*SQRT((m+n-2)*m*n)/(m+n)); p = 2*CDFTC(ABS(t),m+n-2); RETP(p); ENDP; Die Prozedur t t e s t wird auf den folgenden Datensatz angewendet: 1. Stichprobe: 11.8, 8.2, 7.1, 13, 10.8, 10.1, 14.6, 14 2. Stichprobe: 12.1, 8.3, 3.8, 7.2, 12, 11.1, 10.1, 13.7 LET x=11.8 8.2 7 . 1 13 10.8 10.1 14.6 14; LET y=12.1 8.3 3.8 7.2 12 11.1 10.1 13.7; ttest(x,y); 0.35539676 p=ttest(x,y); p 0.35539676
7.4.
PROZEDUREN
109
Es ist entscheidend, dass die lokalen Variablen tatsächlich lokaler Natur sind. D.h.: • Gab es vor Ausführung der Prozedur keine Variablen im Hauptspeicher mit Namen wie in der Variablenliste, so gibt es sie auch nach Ausführung der Prozedur nicht. • Gab es vor Ausführung der Prozedur Variablen im Hauptspeicher mit Namen wie in der Variablenliste, so haben diese Variablen den gleichen Wert wie vor Ausführung der Prozedur. • Globale Variablen im Hauptspeicher werden durch die Ausführung der Prozedur modifiziert, wenn sie nicht als Dummy-Argument verwendet und nicht in der Variablenliste aufgeführt, aber innerhalb der Prozedur angesprochen werden. Insbesondere gibt es beim Kompilieren keine Fehlermeldung. Diese kommt wahrscheinlich später, wenn die Prozedur erneut verwendet wird, ohne das die globale Variable noch existiert. Dies ist eine häufige und schwer zu entdeckende Fehlerquelle. Beispiel 7.13 Ein Beispiel zur Verdeutlichung der Eigenschaften lokaler Variablen ist ein Programmcode mit der folgenden Struktur. Dabei geht es um eine BootstrapSimulation. Das bedeutet, dass man aus einem vorhandenen Datensatz immer wieder Stichproben mit Zurücklegen zieht ('resample'), um die interessierende statistische Maßzahl zu berechnen. Die Streuung der Bootstrap-Werte gibt dann z.B. eine Schätzung des Standardfehlers der Maßzahl. Als Maßzahl wird der Median genommen, für den bei kleineren Datensätzen kein Standardfehler angegeben werden kann. Zunächst wird die Prozedur definiert. Die Bootstrap-Stichprobe erhält ebenfalls den Namen x; jedoch ist das Ergebnis ohne abschließende Zuordnung verloren, da das Symbol x innerhalb der Prozedur als lokale Variable geheilten wird (weil es als Dummy Argument in der Prozedurdefinition auftaucht). Das globale x dagegen bleibt unverändert. Die beiden PRINT-Aufrufe geben das gleiche Ergebnis. PRQC (1) = resample; Q Definieren der Prozedur 0 LOCAL n; n = ROWS(x); x = x [RNDU (n, 1) *n+1] ; RETP(x); ENDP; x = RNDN(10,1); ® Erzeugen des Datensatzes 0 PRINT MEDIAN(x); resample; y) =x + y h (x,y) =x2
-y2
h{x,y)
*x-y/y
=2
Das Programm soll eine Prozedur enthalten, der eine (n, 2)-Matrix mit (x, y)Werten und die Nummer i der zu berechnenden Punktion (nicht der Vektor der Funktionen) übergeben wird. Der Output sollte ein (n, l)-Vektor der Werte der j-ten Punktion sein. Aufgabe 7.7 Die Stringvariable t e x t enthalte einen deutschen Text (ohne Umlaute). Schreiben sie ein GAUSS-Programm, das ermittelt, wie oft ein einzugebendes Wort in t e x t enthalten ist (unabhängig von Groß- oder Kleinschreibung).
Kapitel 8
Programmieren in GAUSS: Weiterführendes 8.1
Fehlersuche
8.1.1
Fehlermeldungen
Nachdem man ein Programm geschrieben hat, wird man es ausführen wollen. Der GAUSS-Befehl COMPILE kompiliert ein Programm und speichert den Code als Datei. Unterschieden davon ist der Befehl Compile Main F i l e um die als Haupt-Datei spezifizierte Datei zu kompilieren. Diese wird in dem Fensterchen in der Icon-Leiste angezeigt. Unter Umständen ist die gewünschte Datei über das Menü Action mit 'Set Main File' als solche zu deklarieren. Während dieser Form der Kompilierung werden alle Fehler unterhalb des aktuellen Blocks des GAUSS-Codes angezeigt, sofern der Ausgabemodus auf 'Cmnd I/O', oder im Output- Fenster, wenn der Ausgabemodus auf 'Split I/O' gesetzt ist. In der Standardeinstellung bestehen die Fehlermeldungen aus • • • •
Datei, in der der Fehler auftrat, Zeilennummer, in der der Fehler auftrat, GAUSS-Fehlernummer, kurzer Fehlerbeschreibung
In der Datei g a u s s . e r r im Unterverzeichnis wksp des Wurzelverzeichnisses von GAUSS werden die GAUSS-Fehlermeldungen protokolliert. Eine Liste aller GAUSS-Fehlermeldungen und ihrer Fehlernummern ist im GAUSS Users Guide zu finden.
124
KAPITEL
8. PROGRAMMIEREN
IN GAUSS II
Ist das Programm fehlerfrei übersetzt worden, kann es dennoch zu Fehlern kommen, etwa wenn eine Division durch Null oder die Determinante einer nicht- quadratischen Matrix berechnet werden soll. Auch hier wird eine Fehlermeldung ausgegeben. Sie hängt in Art und Umfang von den eingestellten Optionen ab.
8.1.2
Der Debugger
GAUSS verfügt über einen eingebauten leistungsfähigen Debugger. Damit kann die Ausführung eines Programms direkt verfolgt werden. Das bedeutet, dass entweder ein Stapelprogramm analysiert werden soll oder zumindest ein Prozeduraufruf erfolgen muss, damit es etwas zu verfolgen gibt. Dieser Prozeduraufruf ist in einer eigenen Datei anzulegen, da der Debugger auf die Ausführung von Files angelegt ist. Der Einsatz des Debuggers empfiehlt sich vor allem bei komplizierteren, nicht auf den ersten Blick durchschaubaren Fehlermeldungen.
Hier ist ein Algorithmus fuer Beta-verteilte Zufallszahlen, wenn beide Parameter groesser als 1 sind ($X \sim B(p_0,q_0), •in(p_0,q_0)>1$) betal (5,2,3); PROC = TOKEN(c); d = d$+a; ENDO; j=0; DO WHILE j < STRLEN(d); 0 Überprüfen, ob n i c h t n u m e r i s c h e 0 j=j+l; 0 Zeichen i n x [ i ] vorhanden s i n d 0 x l = xlISTRINDX(w,STRSECT(d,j,1),1); ENDO; IF x l > 0; nums = numsISTOF(x)'; ELSE; str = str$lx;
156
KAPITEL 9. DATENMANAGEMENT ENDIF; ENDO;
• Beispiel 9.8 Wie im letzten Kapitel angemerkt wurde, werden beim Neu-Laden einer GAUSS-Bibliothek alle bis auf die beiden Bibliotheken GAUSS und U S E R geschlossen. Es ist daher eine Prozedur wünschenswert, die das zusätzliche Aktivieren einer Bibliothek erlaubt. Hierzu wurde das folgende Keyword geschrieben. DECLARE STRING _neu_=" " ; KEYWORD a d d l i b ( n e u ) ; _neu_= neu; RUN e : \ d \ m y g a u s s \ u t i l \ a d d l i b _ 0 . s r c ; ENDP; Daraus ist erst einmal nicht viel zu erkennen. Es wird eine globale Variable _neu_ vorbereitet, der der Name der hinzuzufügenden Bibliothek zugewiesen wird. Dann folgt die Ausführung einer vorbereiteten Datei. Diese Struktur ist notwendig, weil der Aufruf von RUN innerhalb einer Prozedur oder eines Keywords zum Verlassen der aufrufenden Prozedur führt. Die auszuführende Datei hat die folgenden Einträge: LIBRARY - 1 ; DOS move c : \ g a u s s 3 5 \ l i b \ l i b l s t * c : \ g a u s s 3 5 \ l i b \ l i b l s t ; fO=FOPEN("c:\\gauss35\\lib\\liblst","r"); STRING y = " " ; DO UNTIL S T R I N D X ( y , " F i l e s " , 1 ) > 0 ; y = y$+FGETSA(f0,1); ENDO; CLOSE(fO); STRING l i b l i s t = " l i b r a r y "; DOS e r a s e c : \ g a u s s 3 5 \ l i b \ l i b l s t ; DO WHILE (STRLEN(y)>0); { x , y > = TOKEN(y); IF STRINDX(x,"leg",1)>0; h = STRSECT(x,STRRINDX(x,"\\",-l)+l,STRLEN(x)); l i b l i s t = l i b l i s t $ + " "$+STRSECT(h,1,STRINDX(h,".leg",1)-1); ENDIF; ENDO; l i b l i s t = l i b l i s t $ + " "$+_neu_$+";dos e r a s e o u t ; " ; SCREEN OFF;
9.3.
ASCII-DATEIEN
157 Tabelle 9.2: ASCII-Dateien
e r r = FCHECKERR(f) e r r = FCLEARERR(f) s t r = FGETS(f.maxsize) sa = FGETSA(f,numi) s t r = FGETST(f.maxsize) sa = FGETSAT(f,numl)
N,1
f =FOPEN(fname,m)
numi = FPUTS(f,sa) numi = FPUTST(f,sa) r e t = FSEEK(f,offs,base)
s = FSTRERROR
Fehlerstatus der Datei f (Schreib/Lese-Fehler 1, sonst 0) beseitigt Fehlerstatus der Datei f liest eine Zeile aus der Datei f (maxsize: max. Größe von str) schreibt numl Zeilen der Datei f in sa wie FGETS, aber Leerzeilen bleiben nicht erhalten wie FGETSA, aber Leerzeilen bleiben nicht erhalten Öffnen einer Datei m: Modus, in dem Datei geöffnet wird, f: skalarer Dateiname schreibt Strings aus sa in Datei f (numl: Zahl der geschriebenen Zeilen) wie FPUTS unter zusätzlichem Anhängen einer Leerzeile pro String setzt Zeiger in der Datei f o f f s : Umfang in Bytes, base: Zeigerausgangsposition, r e t : 0, falls FSEEK erfolgreich, 1 sonst Erläuterungen der letzten I/O-Fehler werden in s geschrieben
f : jeweils mit FOPEN geöffnet
OUTPUT f i l e = out ; OUTPUT 0N; PRINT l i b l i s t ; OUTPUT OFF; RUN out ; SCREEN 0N; LIBRARY; Der Aufruf von LIBRARY - 1 schreibt die Namen aller geöffneten Bibliotheken zusammen mit den Prozeduren in eine Datei in das Verzeichnis, das in l i b _ p a t h festgelegt ist. Da unter Windows95/NT die Dateien eindeutig spezifiziert werden, wird der Bezeichnung l i b l s t eine Zeichenkette angehängt, die auf der DOS-Ebene beseitigt wird. Dann wird aus der möglicher Weise sehr großen Datei mit FGETSA der relevante Teil herausgeschnitten; mit den Befehlen TOKEN, STRINDX usw. werden die relevanten Teile der Einträge in einen String geschrieben. Dieser wird um die neu zu aktivierenden Biblio-
158
KAPITEL
9.
DATENMANAGEMENT
theken verlängert und dann wiederum in eine Datei geschrieben. In ihr steht nun der Befehl LIBRARY gefolgt von der Liste der bereits aktiven sowie der neu zu aktivierenden Bibliotheken. Die Ausführung der Datei ergibt dann das gewünschte Resultat. Zwischenzeitlich werden die Hilfsdateien wieder gelöscht.
9.4
•
Andere Datenformate
Die Unterstützung des Exports und Imports anderer Datenformate ist unter GAUSS für Windows ab der Version 3.2 recht komfortabel. Die folgende Tabelle listet die direkt unterstützten Spreadsheed- und Datenbankformate mit ihren üblichen Dateierweiterungen auf. Daten-Typ
Dateierweiterung
Lotus vl-v5 Excell v2.1-v7.0 Quatro vl-v6 Symphony vl.0-1.1 dBase II dBase III/IV Paradox, FoxPro, Clipper ASCII - character delimited ASCII - formatiert GAUSS-Datensatz
.wks .wkl - ,wk5 . xls .wql ,wq2 .wbl .wrk . db2 .dbf .db . CSV . t x t .asc .prn .dat
Die fett gedruckten Erweiterungen stehen für exportierbare und importierbare Formate; die in schräger Schrift eingegebenen für importierbare. Vier Prozeduren stehen dafür zur Verfügung, je zwei für den Import und zwei für den Export: export exportf import importf
Exportiert Exportiert Importiert Importiert
eine GAUSS-Matrix in ein spezielles Format, einen GAUSS-Datensatz in ein spezielles Format, einen File in eine GAUSS-Matrix. einen File in einen GAUSS-Datensatz.
Der Aufruf der beiden Exportprozeduren geschieht gemäß r e t = EXPORT(x,fn,na); Dabei sind:
bzw.
r e t = EXPORTF(ds,fn,na)
9.4. ANDERE DATENFORMATE x ds fn
: : :
na
:
ret
:
159
der Name einer Datenmatrix, der Name eines Datensatzes. ein String, der den Namen der Datei (gegebenenfalls mit Pfadangabe) angibt, in die die Matrix x bzw. der Datensatz ds exportiert werden soll. ein Charakter-Vektor mit den Variablennamen für die Spalten; alternativ kann der Skalar 0 angegeben werden. Dann werden die Namen Varl bis Vark erzeugt, ist 1, wenn der Export erfolgreich war; sonst 0.
Beispiel 9.9 Das folgende Beispiel exportiert die Matrix bmw in eine Exel-Datei: fname = " c : W t e m p W a u t o . x l s " ; LET names = j ä h r km p r e i s ; CALL EXP0RT(bmw,fname,names); Die auch als GAUSS-Datensatz vorliegenden BMW-Daten werden folgendermaßen in eine dBase Datei exportiert: fname = "c:\\temp\\auto.dbf"; dname = "c:\\d\\gauss\\bmw.dat"; CALL EXPORTF(dname,fname,0);
• Die Importfunktionen werden aufgerufen gemäß {x,nam} = IMPORT(fn,ra,sh);
bzw.
y = IMPORTF(fn,ds,ra,sh)
Hier sind: fn
:
ds
:
ra
:
sh x nam y
: : : :
ein String, der den Filenamen (mit Pfadangabe) der zu importierenden Datei angibt, ein String, der den Namen (mit Pfadangabe) des GAIJSSDatensatzes angibt, in den die Daten importiert werden sollen, ein String, der den Bereich der Zellen angibt, die importiert werden sollen, bzw. ein Deskriptor bei gepackten ASCII-Dateien, oder der Skalar 0. Die letzte Option ist die Voreinstellung, Skalar, der die Seite oder Sheet-Nummer angibt, Datenmatrix Charakter-Vektor der Spaltennamen Skalar, 1 wenn der Import erfolgreich war, sonst 0.
160
KAPITEL
9.
DATENMANAGEMENT
Für die Import- und Export-Kommandos gibt es zudem gut ein Dutzend Einstellungsmöglichkeien, die Punkte regeln wie die Handhabung von fehlenden Werten, Überschriften usw.. Beispiel 9.10 Die ASCII-Datei bmw.asc wird in eine Datenmatrix importiert durch Aufruf von: {b,nam}=import("c:\\d\\gauss\\bmw.asc",0,0)
$ $ sfc $ $
GA USS Data Import Facility
$ $ $ $ $ £ £ $ $ * $ $ $ $ %$ • • * * * * * * * * * • • * • • • * * * * • • • * • • * * * * * ^
Begin Import... Import completed (gauss) b 87.00000000 89.00000000 91.00000000 90.00000000 91.00000000 91.00000000 92.00000000 90.00000000 91.00000000 92.00000000 92.00000000 92.00000000 93.00000000 92.00000000 92.00000000 93.00000000 93.00000000 92.00000000 94.00000000 92.00000000 $nam Coli Col2 Col3
121.00000000 145.00000000 120.00000000 112.00000000 185.00000000 88.00000000 11.00000000 100.00000000 85.00000000 65.00000000 60.00000000 70.00000000 93.00000000 80.00000000 69.00000000 75.00000000 84.90000000 86.00000000 120.00000000 36.20000000
6950.00000000 14300.00000000 17500.00000000 17900.00000000 18000.00000000 18900.00000000 21900.00000000 21900.00000000 22900.00000000 23500.00000000 23900.00000000 23900.00000000 23900.00000000 23900.00000000 24900.00000000 25400.00000000 25900.00000000 25900.00000000 25900.00000000 26900.00000000
"
Eine allgemeine Datenbankschnittstelle für GAUSS ist das von S. Steinhaus entwickelte 'Database Connection Kit', kurz DCK. Es basiert auf der Open DataBase Connectivity, ODBC-Schnittstelle. Diese wurde ursprünglich von
9.4. ANDERE DATENFORMATE
161
Microsoft für Windows Betriebssysteme entwickelt; in der Zwischenzeit haben verschiedene Software-Hersteller das Interface auf die meisten UNIX, Macintosh and O S / 2 Plattformen portiert. Über diese Schnittstelle kann auf andere Datenformate direkt zugegriffen werden; eine Konvertierung ist nicht mehr nötig. Voraussetzung ist, dass ein entsprechender ODBC-Treiber existiert. Die Installation kopiert die relevanten Dateien in das Wurzelverzeichnis von GAUSS. Wenn die Installation erfolgreich abgeschlossen ist, muss der Computer aufgrund der Installation unter Umständen neu gebootet werden, Dann kann man GAUSS starten und die folgenden Anweisungen abschicken, um die Kommandos nutzen zu können: dlibrary -a odbc; library odbc; Eine Erklärung ist nun unter der erweiterten GAUSS-Hife zu finden. Diese ist recht ausführlich; dem braucht nichts mehr hinzugefügt zu werden. S. Steinhaus hat auch einige Beispielprogramme beigefügt, so dass der Einstieg in das System nicht schwer fallen dürfte. Das DCK-Modul ist inzwischen intensiv im Einsatz und in vielen Finanzunternehmungen von großer Wichtigkeit. Es ist nicht Bestandteil von GAUSS 3.5; wahrscheinlich wird es ab GAUSS 4.0 integriert sein. Bis zu diesem Zeitpunkt ist es ein frei verfügbares Modul und liegt zum Herunterladen auf der Homepage von Aptech Systems bereit. Das D C K ist recht umfangreich und gut dokumentiert. Will man SAS- oder SPSS-Datensätze in GAUSS-Datensätze umwandeln, so ist auf kommerzielle Programme zurückzugreifen, wie etwa D B M S / C O P Y von Conceptual Software, Inc. oder StatTransfer von der Fa. Circle Systems. Letztere kann man über die Links auf der Homepage der Firma Aptech erreichen. Im Prinzip sollte es auch möglich sein, mittels des DCK-Moduls von GAUSS aus direkt auf SAS- und SPSS-Datensätze zuzugreifen. Bei SAS benötigt man dafür aber eine lauffähige Version auf dem Rechner. Zudem ist es ohne weitere Kenntnis der SQ-Language offensichtlich nicht leicht. Zum Abschluss soll noch ein Keyword zur direkten Ausgabe einer Datenmatrix als MfeX-Datei angegeben werden. Diese Möglichkeit ist sicherlich für viele Anwender aus dem wissenschaftlichen Bereich von Nutzen. /* ** *• •• ** ** ** **
vrilatex is a keyword «ritten by Alan G. Isaac for public non-commercial use. Some of the code derives from Meinert Hellows' vriasc keyword. There are no Performance guarantees for this code. Alan G. Isaac Last update: 05/20/1995 Mail: Department of Economics, The American University, Washington, DC 20016, USA Internet: aisaacQamerican.edu
162
KAPITEL 9.
DATENMANAGEMENT
Keyword: wrilatex Purpose: Writes a GAUSS matrix or string array to a LaTeX table. Format: wrilatex x c:\example.tex [dcolumn] Input: x, (n,m)-matrix, the matrix to be written to an ASCII file, example.tex, name of the LaTex file to which x will be written. dcolumn, optional parameter specifying the availability of the dcolumn package for decimal point centered columns ** ** ** ** »• */
Remarks: If example.tex exists already, it will be overwritten. It is up to the user to edit the resulting file for conformity to LaTeX. Do not double any backslashes in the file name. To print a character matrix, called say charmat, first convert it to the string array ""$+charmat.
keyword wrilatex(str); LOCAL mat,f.answer,opt,errmsg,oldwidth,typ,myct,oldstate, oldout, nevmat,amper,bckslsh2,mask,oldcvfmt, oldnvfmt, success,oldscr,r,c; {mat,f} = TOKEN(str); {f.opt} = TOKEN(f); typ = TYPECV(mat); if typ /= 6 and typ /= 15; GOTO errout("There is no GAUSS matrix or string array called "$+mat$+"."); endif; mat = VARGET(mat); r=R0WS(mat); c = COLS(mat);
answer="Y"; IF COLS(files(f,0))==2; answer=""; DO UNTIL answer$=="Y" or answer$=="N"; PRINTDOS "File '"$+f$+"» already exists; overwrite? (y/n)"; answer=UPPER (c ons); II H ».
endo; endif; if answer$=="Y"; { oldstate,oldout } = SYSSTATE(18,1); OUTPUT file = ~f reset; ELSE; GOTO errout("User abort; do not overwrite existing file.");
9.4. ANDERE
DATENFORMATE
163
endif; oldvidth = SYSSTATE(11,256); oldscr = SYSSTATE(15,0); PRINT "'/, CAREFUL! This i s a self-contained LaTeX document."; PRINT "'/, EDIT appropriately if inserting in another document."; IF UPPER(opt) $== "DCOLUMN"; PRINT "\\documentclass{article>"; PRINT "\\usepackage{dcolumn>"; /+ can change number of decimal places here PRINT "Wnewcolumntypei. MD{. H . H5}>";
*/
PRINT "\\begin{document>"; PRINT "\\begin{tabular>I"$+chrs(ones(1,c)»46)$+"I"; ELSE; PRINT "\\documentclass{article>"; PRINT "\\begin{do cument}"; PRINT "\\begin{tabular}I"$+chrs(ones(1,c)*99)$+"I"; ENDIF; print "Whline";; nevmat = mat[.,1] ; amper = 0NES(r,l)*CHRS(38); bckslsh2 = 0NES(r,1)*"\\\\"; myct = 1; DO WHILE myct < c; IF typ == 15; nevmat = newmat $~(""$+amper) $~mat[.,myct+l]; ELSE; newmat = nevmat "amper "mat[.,myct+l]; ENDIF; myct = myct+1; ENDO; IF typ == 15; nevmat = nevmat $~(""$+bckslsh2); fORMAT /sa /rds 1,-1; PRINT /sa nevmat; ELSE; PRINT; nevmat = nevmat ~bckslsh2; mask = VECR(ONES(c,l)"ZEROS(c,l))'; oldcvfmt = F0RMATCV("«.,*s""l~2); oldnvfmt = F0RMATNV("*.*lf""8~4); IF NOT PRINTFMT(nevmat,mask);
164
KAPITEL 9.
DATENMANAGEMENT
oldcvfmt = FORMATCV(oldcvfmt); oldnvfmt = FORMATNV(oldnvfmt); GOSUB oldsys; GOTO errout("Print fails; may be out of disk space."); ENDIF; oldcvfmt = FORMATCV(oldcvfmt); oldnvfmt = FORMATNV(oldnvfmt); ENDIF; PRINT "Whline"" ; PRINT "Wendtabular"" ; PRINT " Wenddocument " ; GOSUB oldsys; RETP; oldsys: OUTWIDTH OLDWIDTH; OUTPUT file = "oldout; if oldstate; OUTPUT ON; ELSE; OUTPUT OFF; ENDIF; if oldscr; SCREEN ON; ENDIF; RETURN; errout: POP errmsg; PRINT "\g"; ERRORLOG "Error: M"$+errmsg; ENDP;
9.5
Aufgaben
Aufgabe 9.1 Schreiben Sie eine Prozedur oder ein Key word, das durch interaktive Abfrage von Dateinamen GAUSS-Datasets anlegt, öffnet, bzw. schließt. Aufgabe 9.2 Beantworten Sie die folgende Anfrage aus der GAUSS-mailing-Liste: Ich habe ein Programm geschrieben, dessen Ausführung viel Zeit benötigt. Es soll nun mehrmals mit verschiedenen Datensätzen durchlaufen. Dies soll in Form eines Stapelprogramms geschehen. Die Daten werden eingelesen mittels LOAD d a t a [ ] = c : \ d a t a l 9 9 6 . a s c ; Wie kann man organisieren, dass die Jahreszahl als eine Art Parameter eingegeben wird, so dass die verschiedenen Durchläufe im Rahmen einer Schleife angefordert werden?
9.5.
AUFGABEN
165
Aufgabe 9.3 Erzeugen Sie eine (10,5)-Datenmatrix von Zufallszahlen und exportieren Sie die Matrix nach EXEL. Dabei sollen die Spalten die Bezeichnungen Varl bis Var5 bekommen.
Kapitel 10
Grafik Abbildung 10.1: Grafik aus den GAUSS-Beispielen Publication Quality Graphics E x a m p l e XY g r a p h
X Axis
Title
GAUSS verfügt über eine beachtliche Kapazität zur Erstellung von Grafiken. Als es auf den Markt kam, war GAUSS damit sogar Vorreiter. Heutzutage erscheint die Erstellung einer publikationsreifen Grafik mit der Bibliothek PGRAPH, Publicaton Quality Graphics, eher etwas aufwendig. Neben den mit einigem Aufwand zu produzierenden anspruchsvollen Grafiken lassen sich
168
KAPITEL 10.
GRAFIK
aber schnell für statistische Zwecke ausreichend gute Grafiken erzeugen. Als so genanntes 'third party' Produkt gibt es für GAUSS unter Windows nun ein zweites Grafik-Paket mit dem Namen Interactive GraphiX (IGX). Dieses verfügt über so viele gute Möglichkeiten, dass es hier zusätzlich vorgestellt werden soll.
10.1
Erstellen von Grafiken
Wie bereits in Kapitel 3 angemerkt wurde, muss die Grafik-Bibliothek mit dem Befehl LIBRARY PGRAPH geöffnet werden, um in GAUSS Grafik-Befehle benutzen zu können. GAUSS-Grafiken werden insgesamt in vier Schritten erstellt: (a) Aktivieren der Library PGRAPH. (b) Bereitstellen der Daten. (c) Einstellen der gewünschten Grafik-Optionen durch Zuordnen der entsprechenden Werte zu den globalen Variablen. (d) Aufruf der gewünschten Grafik-Routine. Unter UNIX ist ein fünfter Schritt nötig. Zwischen Windows (und DOS) auf der einen Seite und UNIX auf der anderen Seite gibt es nämlich einen signifikanten Unterschied bei der Erstellung von Grafiken. Anders als bei Windows müssen bei UNIX die Grafikausgabefenster vor der Ausgabe explizit definiert und erstellt werden. Bei jedem der Grafikbeispielprogramme, welche plattformübergreifend sind, findet sich daher folgende Metaabfrage: #IFUNIX let v = 100 100 640 480 40 80 1 6 15 0 0 2 2; pbw = WinOpenPQGC v, "Bar Chart", "Bar" ); call WinSetActive( pbw ); #ENDIF Diese sorgt für die Definition des Fenster, sobald das Programm in GAUSS für UNIX ausgeführt wird. Die folgende Tabelle gibt eine Kurzübersicht über die verschiedenen GrafikTypen. Ihre Namen deuten schon darauf hin, welche Art von Grafik die Prozeduren jeweils erzeugen. Zum Teil sind sie schon in vorangehenden Kapiteln angesprochen worden. Ausführlichere Informationen sind im Abschnitt 10.4, speziell in der Tabelle 10.1, zu finden.
10.1. ERSTELLEN BAR(v,h) HISTF(x,f) LOGY(x.y)
VON
GRAFIKEN
BOX(g,h) HISTP(x.gr) SURFACE(x,y,z)
169 CONTOUR(x,y,z) LOGLOG(x.y) XY(x,y)
HIST(x,gr) L0GX(x,y) XYZ(x,y,z)
Der Aufruf einer Grafik-Prozedur erzeugt ein Extra-Fenster mit der Grafik. Zunächst füllt dies den gesamten Bildschirm aus. Mit der Maus kann es verkleinert werden. (Wie unter Windows üblich, geht man dazu auf den Rand, bis der Cursor sich in einen Doppelpfeil verwandelt; drücken der linken Maustaste und ziehen bei gedrückter Taste verändert die Fenstergröße.) GAUSS erstellt die PGRAPH-Grafiken grundsätzlich in der zuletzt angegebenen Fenstergröße. Dies gilt auch für einen Neustart des Programms. Wie man an der Kopfzeile des Grafik-Fensters erkennt, ist für die Darstellung und Weiterbearbeitung von Grafiken das Programm Playw verantwortlich. Das Ausdrucken einer Grafik geschieht einfach durch Anklicken von 'Print' im Menü File bzw. duch die Tastenkombination Strg + Beim Drucken sind in der verschiedenlich Probleme beobachtet worden. Daher sei auf den anderen tkf-Betrachter vwr.exe von Aptech hingewiesen. Diese Anwendung unterscheidet sich von Playw dadurch, dass der Code Windows-basiert ist und sie aus einer einzelnen ausführbaren Datei besteht. Sie hängt speziell nicht von irgendwelchen DLLs ab. vwr wurde zum Betrachten und Drucken von tkf-Grafiken entwickelt und ist robuster und schneller als Playw, da vwr ausschließlich Windows Drucker-Treiber verwendet, vwr.exe wird standardmäßig mitgeliefert und befindet sich im Wurzel Verzeichnis. Eine Dokumentationsdatei, v w r . t x t , ist ebenfalls dort zu finden, vwr.exe wird der voreingestellte Grafik-Betrachter der kommenden Versionen sein. Die jeweils letzte Grafik kann mit dem Befehl RERUN wieder erzeugt werden, wenn sie durch Anklicken des Kreuz-Symbols oben rechts weggedrückt worden ist. Das zeigt, dass das Wegdrücken den File nicht löscht. Im aktuellen Verzeichnis bleibt die zugehörige g r a f i c . t k f - D a t e i erhalten. Es gibt einige Prozeduren, mit denen die Gestalt von Grafik beeinflusst werden können. Ein Beispiel hierfür ist die Prozedur TITLE. Mit TITLE="DAS IST MEINE GRAFIK" wird als Titel DAS IST MEINE GRAFIK über die Grafik gesetzt. Zu weiteren Prozeduren sei auf den Abschnitt 10.4 und den User's Guide verwiesen. Die Gestalt der Grafiken wird zu einem bedeutenden Teil durch globale Variablen der PGRAPH-Bibliothek bestimmt. Diese Variablen sind mit gewissen Default-Werten vorbelegt. Möchte man andere Optionen haben, so müssen sie gesetzt werden, bevor eine Grafik mit einem der Kommandos in der obigen Tabelle gezeichnet wird. Dies geschieht entweder durch die direkte Zuordnung oder durch Aufruf einer Prozedur. Ein Beispiel für die direkte Zuordnung ist die globale Variable _ p l c t r l . Mit ihr werden die Verbindungslinien zwischen
KAPITEL 10.
170
GRAFIK
den Punkten der Streudiagramme beeinflusst; wird vor dem Aufruf einer XYGrafik _plctrl=-l gesetzt, so werden die Punkte ohne Verbindungslinien gezeichnet. Es resultiert ein 'klassisches' Streudiagramm. Ohne diese Änderung bleibt die Voreinstellung, _plctrl=0, wirksam. Das ist z.B. bei der Darstellung von Zeitreihen wünschenswert. Ein Wert _plctrl>0 führt zur Darstellung von verbundenen Punkten, bei denen zusätzlich im angegebenem Abstand die Punkte durch ein Symbol hervorgehoben werden. Eine größere Anzahl von globalen Variablen erlauben es, für zu erstellende Grafiken Linienzüge, Pfeile, Kreise etc. zu zeichnen. Auch Bezeichnungen können zusätzlich in der Grafik eingebaut werden. Dazu sei auf den Abschnitt 10.4 verwiesen. Globale Variablen können auch verwendet werden, um in einem Streudiagramm die einzelnen Punkte mit Labein zu versehen. Dazu hat G. Draisma das folgende Programm geschrieben: /* ** ** ** ** ** ** ** ** ** ** ** ** ** */
Zweck: Hinzufügen von "text" zu dem darauf folgenden Plot Format : gdtext(x,y,s,fhbw) Input : x (n,1)-Vektor, x-Koordinaten für den Text y (n,1)-Vektor, y-Koordinaten für den Text s (n,1)-Charakter-Vektor mit dem Text fhbw (1,4)-Vektor mit Angaben zu Farbe, Höhe, Breite und Winkel der Labels Output : keiner Bemerkungen: gdtext(0,0,0) setzt die globalen Variablen _pmsgstr und _pmsgctl auf 0 Datum: 21-12-98 Author: G. Draisma, Econometric Institute, Erasmus Universiteit Rotterdam
PR0C (0) = gdtext(x,y,s,fhbw) ; local i, n, tp ; tp = fhbw[2 4]~l~fhbw[l 3] ; x = VECR(x) ; y = VECR(y) ; n = MAXC(R0WS(x)IR0WS(y)) ; x = RESHAPE(x,n,1) ; y = RESHAPE(y,n,1) ; s = RESHAPE(0 + s,n,1) ; if s == 0; _pmsgctl = 0 ; _pmsgstr = "" ; RETP ;
10.1. ERSTELLEN
VON GRAFIKEN
171
ENDIF ; if COLS(_pmsgctl) < 2 ; _pmsgctl = x~y~RESHAPE(tp,n,5) ; _pmsgstr = "" ; i = 0 ; DO WHILE i < n ; i = i + 1; _pmsgstr = _pmsgstr $+ s [ i ] $+ "\000" ; ENDO ; ELSE ; _pmsgctl = _pmsgctl|(x~y~RESHAPE(tp,n,5)) ; i = 0 ; DO WHILE i < n ; i = i + 1; _pmsgstr = _pmsgstr $+ s [ i ] $+ "\000" ; ENDO ; ENDIF ; RETP ; ENDP ; Beispiel 10.1 _pdate=""; n = 37 ; _plctrl = -1 ; _pstype = 4 ; fhbw = {15 0.20 0 0 } ; gdtext(0,0,0,fhbw) ; X = RNDN(n,2) ; s = FTOCV(SEQA(l,l,n),0,0); gdtext(x[.,1],x[.,2],s,fhbw) ; XY(x[.,1],x[.,2]) ;
•
Will man mehrere Grafiken in einer Sitzung nacheinander erzeugen, so bekommt der Befehl GRAPHSET seine Bedeutung. Diese Prozedur hat keinen Parameter; durch ihren Aufruf werden die globalen Grafikvariablen auf die voreingestellten Werte zurückgesetzt. Bisweilen möchte man eine Serie von Grafiken erzeugen, die später ausgedruckt werden sollen. Dies kann erreicht werden, indem jeweils die Grafik umbenannt wird. Dazu ist vor der Anforderung der Grafik der globalen Variablen _ptek jeweils ein neuer Namen zuzuordnen. Die Grafiken werden dann unter diesen Namen im Arbeitsverzeichnis gespeichert. Will man sie bei der Erzeugung nicht am Bildschirm erscheinen lassen, so ruft man zusätzlich _pscreen=0 auf. Das Ganze kann z.B. in einer Schleife geschehen:
172
KAPITEL
10.
GRAFIK
Abbildung 10.2: Streudiagramm mit Bezeichnungen für die Punkte
¿9
£
2+1
•ß
+16
+52^ +1 3 .14 +35 +TU +3 -|9 +12^-15^5 +1i +1 1
+34
+19
¿0
i = 0; DO WHILE i < anzahl; i=i+l; _ptek = " f i g " $+ FT0CV(i,1,0)$+".tkf"; / * Hier d i e G r a f i k Nr. i */ ENDO; Sollen die x-Werte lediglich eine fortlaufende Nummer sein, dann kann in den meisten Grafiken der Vektor der x-Werte durch eine 0 (bei einigen auch durch eine andere Konstante) ersetzt werden; es ist also nicht nötig, mit SEQA eine Folge zu produzieren. Mit GAUSS ist es möglich, den vorhandenen Platz des Bildschirms bzw. der auszudruckenden Seite in Fenster zu unterteilen und für jedes Fenster eine eigene Grafik zu plotten. Hierzu dienen verschiedene Befehle. Der einfachste ist WINDOW(r,c,t) Der Skalar r gibt die Anzahl der Fenster pro Zeile und c die der pro Spalte an. t bezieht sich auf den Typ des Fensters, ob transparent (t-=l) oder nicht (t—0). Das ist bei überlappenden Fenstern relevant. Solche können mit MAKEWIN erzeugt werden.
10.1. ERSTELLEN
VON
GRAFIKEN
173
Nach Aufruf von WIND0W(r,c,t) wird das erste Fenster mit SETWIND angesprochen und kann belegt werden; mit NEXTWIND wird dann das jeweils nächste Fenster aktiviert. Die Reihenfolge geht dabei von oben links nach rechts; dann wird die zweite obere Zeile von links nach rechts aufgebaut etc. Am Ende wird die Grafik mit ENDWIND abgeschlossen. Die Struktur der Erzeugung einer mehrere, gleich große Teilgrafiken umfassenden Grafik ist also: WINDOW(r,c,t); /* Unterteilung des Bildschirms */ SETWIND(l); /* Setzt die Nummer auf das erste Fenster */ Erzeugen der ersten Grafik NEXTWIND; Erzeugen der zweiten Grafik NEXTWIND; usw. ENDWIND; Es gibt weitere Möglichkeiten, die spezifischere Gestaltungsmöglichkeiten erlauben. Dazu sei auf das Handbuch bzw. die vorgegebenen Beispiele im Unterverzeichnis examples des Wurzelverzeichnisses verwiesen. Es ist nicht ganz offensichtlich, wie ein Gesamttitel über eine Anzahl von Teilgrafiken angebracht werden kann. Hier hat ein GAUSS-Nutzer dankenswerter Weise eine Lösung an die GAUSS-mailing-Liste geschickt. 1 Sie besteht aus folgender Prozedur, bei der r, c und typ wie bei WINDOW die Anzahlen von Zeilen und Spalten sowie den Typ des Fensters bedeuten: titwin = smwintit( r, c, title, typ ) title ist nahe liegender Weise der Titel, der über der Gesamtgrafik anzubringen ist. SMWINTIT ruft eine weitere Prozedur auf. Das Progamm-Listing lautet folgendermaßen: /*****•»******************•**«**********»******»********•******•»****** titwin = smvintit( ROWS, COLS, TITLE, TYPE ) ROVS, COLS and TYPE wie in WINDOW Durch TITLE wird die y-Dimension reduziert und TITLE oben ausgegeben, titwin = 1 wenn der Titel gedruckt wird, sonst =0. smwintit( rows, cols, "", type ) = WINDOW( rows, cols, type ) ***********************************************************************/ PROC smwintit( nrows, ncols, tit, wtype ); LOCAL axold.skip; IF TYPE(tit)==13 and tit$/=""; axold = _PAXES; 'Leider habe ich die mail gelöscht, so dass ich den Absender nicht mehr identifizieren kann.
174
KAPITEL 10. GRAFIK
.PAXES = 0; MAKEWIND(9,6.855,0,0,0); SETWIND(I); YLABELC") XLABELC") TITLE(tit); DRAU; TITLE( "" ); .PAXES = aiold; IF (_ptitlht==0); skip = 0.5; ELSE; skip = .ptitlht; ENDIF; IF (_pdate $/=""); skip = skip+0.2; ENDIF; smakewin(nrows,ncols,skip,wtype); RETP(l); ELSE; smakewin(nrows,ncols,0,wtype); RETP(O); ENDIF; ENDP; / » • » * * » * » • * • * » * * • • » » • • • * * » » • » * * * • * • » • * • * * • * * * * * * » * * » « * * * * * * • * * * * * • • * * • *
special version of WINDDW SMAKEWIN( ROWS, COLS, SHIFT, TYPE ) ROWS, COLS and TYPE as in WINDOW SHIFT reduziert die y-Dimension und lässt einen geeigneten Platz an oberen Rand frei. smakewin( rows, cols, 0, type ) = WINDOW( rows, cols, type ) PROC (0) = smakewin(numrows.numcols,shift,wintype); LOCAL xsize, ysize, i, j; IF numrows < 1; PRINT "SMAKEWIN: rows must be positive"; RETP; ENDIF; IF numcols < 1; PRINT "SMAKEWIN: columns must be positive"; RETP; ENDIF; IF shift < 0; PRINT "SMAKEWIN: shift can not be negative"; RETP; ENDIF; xsize = 9/numcols; ysize = (6.855-shift)/numrows; i = 1;
10.2.
BEISPIELE
175
DO WHILE i 0 Linie und Symbol beim jeweils angegebenen Element, < 0 nur Symbol beim jeweils angegebenen Element Skalar oder ( K , l)-Vektor, Linientyp: 1 gestrichelt 2 gepunktet
10.4. PROZEDUREN
UND GLOBALE
VARIABLEN
185
3 kuze Striche 4 eng gepunktet 5 Punkte und Striche 6 durchgezogen Skalar oder (K, l)-Vektor, Linienbreite (9,1)-Vektor, Farben für Plots [1] Achsen [2] Achsen-Nummern [3] Bezeichnung der x-Ache [4] Bezeichnung der y-Ache [5] Bezeichnung der z-Ache [6] Titel [7] Box [8] Datum [9] Hintergrund Skalar oder (K, l)-Vektor, Festlegung der Symbole Skalar oder (K, l)-Vektor, Symbolgröße
_plwidth _pmcolor
_pstype _psymsiz
Tabelle 10.3: Färb- und Symbolwerte, Linientypen Farben: 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
Schwarz Blau Grün Türkis Rot Lila Braun Grau Dunkelgrau Hellblau Hellgrün Helltürkis Hellrot Violett Gelb Weiß
Symbole : 1 2 3 4 5 6 7 8 9 10 11 12 13 14
Kreis Quadrat Dreieck Pluszeichen Diamant Umgek. Dreieck Stern gefüllter Kreis gef. Quadrat gef. Dreieck gef. Pluszeichen gef. Diamant gef. umgek. Dreieck gef. Stern
Linien: 1 2 3 4 5 6
Striche Punkte Kurze Striche Feine Punkte Punkte und Striche Durchgezogene Linie
186
KAPITEL 10.
GRAFIK
Tabelle 10.4: Achsen und Skalierung .paxes
_pcross
_pframe
-Pgrid
_pticout SCALE(xs,ys) SCALE3D(xs,ys,zs) 2.1 2,1 2,1 XTICS(mi,ma,s,t)
YTICS(mi,ma,s,t) ZTICS(mi,ma,s,t)
Skalar, (2,1)- oder (3,l)-Vektor. Zeichnen der Achsen (1) oder keine Achsen (0). Falls Skalar, bezieht sich der Wert auf alle Achsen. Sonst auf x,y bzw. x,y,z. Skalar, Position der Koordinatenachsen am Rand des Koordinatensystems (0) oder durch den Nullpunkt (1) (2,l)-Vektor. Zeichnen eines Rahmens um das Koordinatensystem: [1] 0=kein, l=mit Rahmen [2] 0=keine, l=mit Achsenstrich(en) (2,l)-Vektor. Zeichnen von Gitterlinien: [1] 0=keine, l=gepunktete, 2=fein gepunktete, 3=durchgezogene Gitterlinien [2] 0=keine Unterteilung, l=gepunktete Linien für weitere Unterteilung, 2=Linien nur bei weiterer Unterteilung Skalar, =0: Ticks nach innen, =1: Ticks nach außen Skalierung einer 2D-Grafik xs und ys enthalten jeweils das Minimum und das Maximum legt Skalierung für 3D-Graph fest, Syntax wie SCALE Skalierung der x-Achse mi = Minimum für die x-Achse, ma = Maximum für die x-Achse, s = Abstand zwischen den Achsenstrichen, t = Zahl der kleinen Zwischenstriche Skalierung der y-Achse; analog zur x-Achse Skalierung der z-Achse; analog zur x-Achse
10.4. PROZEDUREN UND GLOBALE VARIABLEN
187
Tabelle 10.5: Titel, Beschriftungen und Schrifttypen
_pdate _plegctl
_plegstr _pnum
_pnumht ASCLABEL(xl.yl) FONTS(str) TITLE(str)
XLABEL(str) YLABEL(str) ZLABEL(str)
String, der vor das Datum gesetzt wird. (_pdate="" unterdrückt die Datumsausgabe) Skalar oder (l,4)-Vektor, der die Position der Legende bestimmt: 0 keine Legende [1] Position der Legende 1: in Koordinaten, 2: in Inch, 3: in Pixel [2] Größe des Legendentextes von 1 bis 9 [3] x-Koordinate der linken unteren Ecke [4] y-Koordinate der linken unteren Ecke String mit dem Text der Legenden; bei mehreren Kurven werden diese im Text durch den Nullbyte (\000) abgegrenzt. Skalar, (2,1) oder (3,l)-Vektor für die Achsennumerierung 0=ohne, l = m i t (vertikal auf der y-Achse), 2=mit (horizontal auf der y-Achse) Größe der Achsennummern (in inches) Beschriftung der x/y-Achsenunterteilung lädt Zeichensätze (str:Namen) Titel der Grafik mit str als Stringvariable. Mehrere Zeilen werden mit "\L" getrennt. Hochstellungen werden mit " [ ] T i e f s t e l l u n g e n mit " ] [ " erzeugt. Höhe des Titels wird mit _ p t i t l h t kontrolliert (in inches). Beschriftung der x-Achse, Syntax wie TITLE Beschriftung der y-Achse, Syntax wie TITLE Beschriftung der z-Achse, Syntax wie TITLE
Tabelle 10.6: Ausführungskontrolle für Grafiken GRAPHPRT(str) GRAPHSET RERUN
steuert Druckerausgabe Setzt zurück auf die Default-Werte Lesen und Ausgabe der zuletzt erstellten Grafikdatei
KAPITEL
188
10.
GRAFIK
Tabelle 10.7: Dimensionierung, Perspektive und Unterteilung einer Grafik AXMARGIN(l,r,t,b) BEGWIND
Begrenzung der Achsen (in inches) globale Fenstervariablen, beginnen einer Teilgrafik ENDWIND Ende der Fensterbearbeitung bzw. der Teilgrafik e r r = LOADWIND(filename) lädt Fensterkonfiguration aus der im String filename angegebenen Datei MAKEWIND(xs,ys,xh,yh,typ) erzeugt ein Fenster von der Breite xs der Höhe ys, dem horizontalen Abstand xh und vertikalen yh von der linken Ecke des Bildschirmes; typ=l erzeugt ein transparentes Fenster (Maße in inch); typ=0 ein nicht-transparentes MARGIN(l,r,t,b) Grenzen für aktuelles Fenster NEXTWIND nächstes Fenster e r r = SAVEWIND(filename) speichert aktuelle Fensterkonfiguration in die im String filename angegebene Datei SETWIND (n) gibt aktuellem Fenster eine Nummer. VIEW (x, y, z) Position des Betrachters einer 3D-Grafik. x,y,z sind Skalare in Einheiten der Arbeitsbox. VIEWXYZ(x,y,z) analog zu VIEW (in Koordinateneinheiten) V0LUME(x,y,z) Länge,Breite,Höhe einer 3D-Arbeitsbox WINDOW(row,col,typ) teilt Bildschirm in Fenster gleicher Größe
Tabelle 10.8: Globale Kontroll-Variablen _pageshf _pagesiz _parrow _parrow3 _paxht _pbox _perrbar _pline
(2,l)-Vektor, Verschiebung der Grafik (x:rechts, y:oben) (2,l)-Vektor, Größe auf Drucker (inches) (M, ll)-Matrix, M Pfeile (M, 12)-Matrix, M 3D Pfeile Skalar, Höhe der Achsenlabels in inch Skalar, Box um Grafik (> 0: Farbwert) (M, 12)-Matrix, M Fehlerbereiche (M, 9)-Matrix, M Linien, Kreise,...
10.4. PROZEDUREN
,pline3d
UND GLOBALE
VARIABLEN
[M,l] Item Typ und Koordinatensystem: 1 Linie in Plot-Koordinaten 2 Linie in Inch-Koordinaten 3 Linie in Pixel-Koordinaten 4 Kreis in Plot-Koordinaten 5 Kreis in Inch-Koordinaten 6 Radius in Plot-Koordinaten 7 Radius in Inch-Koordinaten [M,2] Linientyp: 1 gestrichelt 2 gepunktet 3 kurze Striche 4 dichte Punkte 5 Punkte und Striche 6 durchgezogen \M,3-7] Koordinaten und Dimensionen (1) Linien in Plot-Koordinaten: [M,3] x-Startpunkt [M,4] y-Startpunkt [M,5] x-Endpunkt [M,6] y-Endpunkt [M,7] 0 bei Fortsetzung, 1 bei neuer Linie (2) Kreise in Plot-Koordinaten: [M,3] x-Koordinate des Zentrums [M,4] y-Koordinate des Zentrums [M,5] Radius in Einheiten der x-Koordinate [M,6] Startpunkt des Kreisbogens in Bogenmaß [M ,7] Endpunkt des Kreisbogens in Bogenmaß (3) Radius in Plot-Koordinaten: [M,3] x-Koordinate des Kreiszentrums [M,4] xy-Koordinate des Kreiszentrums [M,5] Startpunkt des Radius in Einheiten Koordinate; 0 ist das Kreiszentrum [M,6] Endpunkt des Radius [M,7] Winkel in Bogenmaß [M,8] Farbe [M,9] Linienstärke (> 0) Extralinien zu XYZ oder SURFACE [M, 1] x-Startpunkt [M,2] y-Startpunkt [M,3] z-Startpunkt [M,4] x-Endpunkt [M,5] y-Endpunkt [M,6] z-Endpunkt
189
der x-
190
.plotshf .plotsiz .pmsgctl
_pmsgstr
_pnotify _protate _pscreen _psilent _psym
_psym3d _ptek .pversno .pxpmax _pxsci _pypmax _pysci _pzoom _pzpmax
KAPITEL
10.
GRAFIK
\M,7] Farbe [M,8] Linientyp (wie bei _pline) [M,9] Linienstärke ( > 0) (2,l)-Vektor, Distanz des Plots zur linken, unteren Ecke (x,y-Koord. in inches) (2,l)-Vektor, Achsengröße (in inches) (M, 7)-Matrix zur Positionierung der Texte aus _pmsgstr [M, 1] x-Wert für die linke untere Ecke [M,2] y-Wert für die linke untere Ecke [M,3] Höhe der Symbole in inch [M,4] Winkel in Grad (-180 bis 180) [A/,5] Lokalisation in Plot-Koordinaten ( = 1 ) oder in inch (=2) [M,6] Farbe [M,7] Stärke der Schrift String mit Extra-Text, der in der Grafik positioniert werden kann. Textteile werden durch \000 getrennt. Bildschirmausgabe während Zeichnens Skalar, 0 = keine Drehung; 1 = 90 ° -Drehung Skalar, Bildschirmausgabe 1—an, 0=aus Skalar, 0=Beep an, l = B e e p aus (M, 7)-Matrix, zeichnet M extra Symbole [M, 1] x-Koordinate [M,2] y-Koordinate [M,3] Symboltyp [M,4] Symbolhöhe [M,5] Farbe [Ai,6] Typ der Koordinaten Plot-Koordinaten ( = 1 ) oder inch ( = 2 ) [M,7] Stärke der Linien (M, 7)-Matrix, zeichnet M extra Symbole in einer 3DGrafik (proc SURFACE oder XYZ) Name der nächsten Grafik-Datei(en) (mit Dateierweiterung .tkf Grafik Version Nummer max. Anzahl von Nachkommastellen der x-Achse Skalar, Schwellenwert, ab wann bei der x-Achse in andere Zahlendarstellung gewechselt wird max. Anzahl von Nachkommastellen der y-Achse Skalar, Schwellenwert, ab wann bei der y-Achse in andere Zahlendarstellung gewechselt wird Vergrößerungskontrolle max. Anzahl von Nachkommastellen der z-Achse
10.5. DIE _pzsci
10.5
GRAPHIX-LIBRARY
191
Skalar, Schwellenwert, ab wann bei der z-Achse in andere Zahlendarstellung gewechselt wird
Die GraphiX-Library
Die Bibliothek I n t e r a c t i v e GraphiX, IGX, wurde von der Firma Econotron Software entwickelt und gehört nicht zum Lieferumfang von GAUSS, sondern muss zusätzlich bezogen werden. Die Installation unter Windows ist Standard. Es ist einfach s e t u p . exe im IGX-Verzeichnis auf der CD auszuführen und den Anweisungen am Bildschirm zu folgen. Abbildung 10.9: Grafik aus den GraphiX-Beispielen
GAUS: 0, läßt sich die Inverse bestimmen durch c = INVPD(a)
11.1. INVERSE
MATRIZEN
197
Regularität liegt genau dann vor, wenn die Spalten a . i , . . . , a. n der Matrix A linear unabhängige Vektoren bilden, d.h. wenn aus Aia.i + h A„a. n = 0 folgt: Ai = ••• = An — 0. Die größte Anzahl der linear unabhängigen Spaltenvektoren heißt der Rang der Matrix . Eine Matrix A heißt orthogonal, wenn A - 1 = A'. Orthogonale Matrizen sind regulär; ihre Spaltenvektoren erfüllen auch a^a.* = 1 für j = k und =0 für Den Rang bekommt man mit der Prozedur c = RANK(a) Ist die Matrix A regulär, so ist ihre Determinante von Null verschieden. Andernfalls ist die Determinante Null. Die numerische Bestimmung einer Determinante ist eine diffizile Aufgabe; in GAUSS wird sie eingefordert mit c = DET(a) Ist die Matrix A nicht regulär, so kann die Lösung eines linearen Gleichungssystems A x = b nicht so ohne weiteres angegeben werden. Es ist dann oft nicht einmal sicher, dass das System konsistent ist, dass es also überhaupt eine Lösung gibt. Hier kommen generalisierte Inverse ins Spiel. Generalisierte Inverse einer (n,p)-Matrix A ist jede Matrix A~, für die gilt: AAA=A Man kann zeigen, dass ein lineares System A x = b genau dann konsistent ist, wenn für eine generalisierte Inverse A~ von A gilt: A A ~ b = b. Auch in der Statistik spielen generalisierte Inverse eine relevante Rolle, da viele Resultate nicht auf der Existenz der tatsächlichen Inversen, sondern nur auf den Eigenschaften der generalisierten Inversen basieren. In GAUSS erhält man generalisierte Inverse von quadratischen Matrizen A mit dem Befehl c = INVSWP(a) Eine spezielle generalisierte Inverse ist die so genannte Moore-Penrose-Inverse A + . Die Ausgangsmatrix A braucht auch hier nicht unbedingt quadratisch zu sein; A + ist durch die folgenden vier Eigenschaften festgelegt: 1. 2. 3. 4.
AA+A = A A+AA+ = A + A A + ist symmetrisch A + A ist symmetrisch
Der GAUSS-Befehl c = PINV(a)
198 KAPITEL
11. NUMERISCHE METHODEN I: LINEARE
ALGEBRA
Tabelle 11.1: Matrixinversion und damit zusammenhängende Prozeduren y = DET(x)
Determinante von X
y =INV(x)
Y = X-1
N,N
N,N
N,N
Y = X - 1 (X symmetrisch und positiv definit)
y =INVP(x) N.N
N,N
y =INVSWP(x) N,N
generalisierte (sog. sweep-) Inverse
1,N
y = PINV(x) K,N
Moore-Penrose Pseudo-Inverse
N,K
y = RANK(x)
Rang der Matrix X
ergibt eine solche Moore-Penrose Inverse A + für eine allgemeine (n, m)- Matrix A. Sofern A regulär ist, stimmt die Moore-Penrose Inverse mit der üblichen Inversen überein, dann ist also A + = A _ 1 . Beispiel 11.1 LET a={l 2 3 4 , 4 6 9 5 , 2 4 6 8 , 8 5 1 3}; PRINT a; PRINT RANK(a) 1.000 2.000 3.000 4.000 4.000 6.000 9.000 5.000 2.000
8.000 3.0000000
4.000
6.000
8.000
5.000
1.000
3.000
c=INVSWP(a;); PRINT c 0.111 -0.222 0.000 0.460 0.000 -0.444 0.000 0.000 0.000 0.000 -0.175 0.444 d=PINV(a); -0.019 -0.014 -0.028 0.083
PRINT d 0.003 -0.037 0.050 -0.029 0.156 -0.057 -O.I42 0.166
0.222 -0.175 0.000 0.032 0.109 0.031 -0.078 0.015
PRINT a*c 1.000 0.000 2.000 0.000
0.000 1.000 0.000 0.000
0.000 0.000 0.000 0.000
0.000 0.000 0.000 1.000
PRINT a*d 0.200 0.000 0.400 0.000
0.000 1.000 0.000 0.000
0.400 0.000 0.800 0.000
0.000 0.000 0.000 1.000
Die Ergebnisse sind hier gerundet; anstelle der Nullen stehen im Originalausdruck zum Teil Zahlen der Größenordnung 10~ 16 . Man sieht, dass bei der allgemeinen generalisierten Inversen die Moore-Penrose-Bedingungen nicht erfüllt zu sein brauchen. •
11.2. LINEARE
11.2
199
GLEICHUNGSSYSTEME
Lineare Gleichungssysteme
Die (n,m)-Matrix A in dem linearen Gleichungssystem (11.5), Ax = b , heißt Koeffizientenmatrix des Systems. Für eine quadratische, reguläre (n,n)-Matrix A liefert GAUSS die Lösung des Gleichungssystems A x = b auch durch die "Matrixdivision" x=b/A. Diese spezielle Lösungsmethode ist oft für eine schnelle Berechnung ausreichend. Beispiel 11.2 LET a[2,2]=3 2 2 2; LET b=3 2; x=b/a; PRINT x 1 0
Allgemeine Systeme lassen sich besonders einfach lösen, wenn die Koeffizientenmatrix Staffel- oder Echelonform aufweist. Eine typische KoeffizientenMatrix in Staffelform hat die folgende Form:
0
/
A =
\
0
0
0
0
0
0
0
0
0
0 0
0
0
0
0
0
0 0
0
0
0
0
0 0 0
0
Dabei sind * beliebige Zahlen und [*] Zahlen ungleich Null. Zunächst kommen also Zeilen, die nicht durchgängig Null sind (sofern vorhanden): Die Pivots [T] sind die Nichtnull-Elemente in diesen Zeilen. Unter jedem Pivot enthält die Spalte nur noch Nullen. Jeder Pivot liegt rechts von dem Pivot in der Zeile darüber; dies produziert die Treppenform. Die Auflösung eines Systems Ax = b in Staffelform erfolgt rekursiv, beginnend mit xn. Befindet sich in Spalte j kein Pivot, so ist xj beliebig wählbar; andernfalls ist Xj durch Xj+i,... ,xn und bj bestimmt. Diese Methode wird als Rücksubstitution bezeichnet.
200 KAPITEL
11. NUMERISCHE METHODEN I: LINEARE
ALGEBRA
Beispiel 11.3 Die Matrix
/ [T]
A =
0 0
\
0 2 |T] 5 0 0
3 N 0 ® /
hat Staffelform mit den Pivots 1, 4, 6. Das lineare Gleichungssystem
/IT] 1 1 0
0 0
2 5
V
3 \ ( ö
Xl 3:2
\ =
/ 7 \ 8
0
[9)
wird nun folgendermaßen gelöst: Aus Zeile 3 ergibt sich 6x4 — 9,
d.h.
x 4 = 3/2-
X3 ist offenbar beliebig wählbar. Aus Zeile 2 erhält man 4x 2 + 5 a ; 3 = 8 ,
d.h.
x 2 =0.25(8 - 5x 3 ) - 2 - 1.25x3.
Aus Zeile 1 ergibt sich schließlich 11 + 2x3 + 3x4 = 7, d.h.
i i = 2.5 - 213.
Die Lösungen des Systems bilden die Vektoren der Form Xi X2 X3
I4
\
J
( 5/2 \
2 0 3 V /2
/ -2 \ + 13
/
-74 1 \ 0 /
In GAUSS lässt sich die reduzierte Zeilen-Echelonform einer Matrix X mit der Prozedur y = RREF(x) gewinnen. Dabei ist X eine (n, m)-Matrix; die (n, m)-Matrix Y enthält dann die reduzierte Echelonform. Reduziert bedeutet, dass die Pivot-Elemente schon auf Eins gesetzt sind und linear abhängige Zeilen nur Nullen als Eintrag haben. Elemente der Matrix werden dabei Null gesetzt, wenn sie kleiner sind als eine geeignete kleine Zahl. Übrigens lässt sich der Rang einer Matrix X unter Verwendung von RREF gewinnen. Der Rang entspricht der Anzahl der Zeilen, die von Null verschiedene
11.3. MATRIZENZERLEGUNG
UND
EIGENWERTE
201
Einträge haben. Um diese Anzahl zu ermitteln, wird zunächst die Echelonform von X bestimmt. Um numerischen Problemen zu begegnen, werden dann die mittleren Zeilensummen der Absolutwerte berechnet. Genau so viele dieser mittleren Zeilensummen sind von Null verschieden, wie Nicht-NullSpalten in der transponierten Matrix RREF(x)' vorhanden sind. Ist _rref t o i eine selbst gewählte numerische Toleranz, so lautet der Befehl: r = SUMC(MEANC(ABS(RREF(x)')).>_rreftol) Die auf der Rücksubstitution basierende Lösung des Systems U x = b, bei dem U eine quadratische und reguläre obere Dreieckmatrix ist, berechnet die GAUSS-Prozedur x = UTRIS0L(b,u) Wird für b eine Matrix B eingesetzt, so werden die resultierenden Systeme separat gelöst; UTRISOL löst jede Gleichung Ux.j = b j einzeln; dabei sind b . j , x j die jten Spaltenvektoren der Matrizen B, X. Da lineare Gleichungssysteme in Staffelform besonders leicht zu lösen sind, geht man bei allgemeinen Systemen so vor, dass sie in äquivalente Gleichungssysteme überführt werden, d.h. System mit identischer Lösungsmenge, bei denen die Koeffizientenmatrix Staffel- oder Dreiecksform hat. Das ist die Essenz des bekannten Gaußschen Eliminationsverfahrens. Daneben gibt es in GAUSS verschiedene Prozeduren zur Lösung linearer Gleichungen. Diese nutzen zum Teil spezifische Strukturen der Koeffizientenmatrix. Hier sei nur die Prozedur x = SOLPD(b.a) erwähnt, bei der A eine symmetrische positiv definite (n, n)-Matrix sein muss. Ist b eine (n, fc)-Matrix, so werden mit einem Schlag k lineare Gleichungssysteme (mit der gleichen Koeffizientenmatrix) bearbeitet. Das Ergebnis ist dementsprechend ebenfalls eine (n, fc)-Matrix. Weitere Prozeduren zur Lösung linearer Gleichungen mit speziellen Bedingungen an die Koeffizientenmatrix sind CH0LS0L, QRSOL und QRTSOL, vgl. den folgenden Abschnitt. Zudem gibt es Lösungsroutinen für Band-limitierte und dünn besetzte Matrizen, siehe den Abschnitt 11.5.
11.3
Matrizenzerlegung und Eigenwerte
Die Matrizentheorie lehrt, dass jede reelle (n,p)-Matrix A in der Form A = USV'
(11.6)
202 KAPITEL
11. NUMERISCHE METHODEN I: LINEARE
ALGEBRA
geschrieben werden kann; dabei ist U eine orthogonale (n,n)-Matrix, V ist eine orthogonale (p,p)-Matrix und S ist vom Typ (n,p), wobei nur die Elemente auf der Hauptdiagonalen ggf. größer als Null sind, Sij — 0 für i ^ j. In Kurzschreibweise wird dies formuliert als S = diag(«i,S2,... , s m ) mit m = min{n,p} und s; > 0. Die Si heißen Singulärwerte von A und (11.6) heißt Singulärwertzerlegung von A. Zur Vereinfachung wird si > > • • • > sm unterstellt. Hat A den Rang r, so sind genau r Singulärwerte strikt positiv. Über die Singulärwerte lässt sich die Stabilität von Lösungen linearer Gleichungen erfassen. Bei einem linearen Gleichungssystem A x = b ist die Koeffizientenmatrix A schlecht konditioniert, wenn geringe Änderungen in den Koeffizienten von A oder b zu starken Änderungen bei der Lösung führen. Gemessen wird die Konditionierung mit der Konditionszahl, dem Quotienten von größtem durch kleinsten Singulärwert. d = COND(x) Schon bei Werten zwischen 30 und 100 spricht man von schlechter Konditionierung. Entsprechend nennt man einen Datensatz schlecht "konditioniert", wenn geringe Änderungen in den Daten zu sehr unterschiedlichen Ergebnissen bei der statistischen Auswertung führen können. Beispiel 11.4 Die Lösung des Gleichungssystems f 1.000 0.500 \ f xi \ / 1.5 \ V 0.667 0.333 ) ^ x2 ) ~ ^ 1.0 ) ' ist einfach Xi = 1, x-i = 1. Wird nun die zweite Komponente des rechts stehenden Vektors b geändert in b2 - 0.999, so ergibt sich die Lösung x\ — 0, x-i — 3. Die alternative Änderung des Elementes 022 der Koeffizientenmatrix A in a 2 2 = 0.334 ergibt andererseits die Lösung X\ = 2, x 2 = - 1 . Die zugehörige Konditionszahl der Koeffizientenmatrix A ist COND(A) = — =3611.5557. «2 Der Wert ist sehr groß, A extrem schlecht konditioniert.
•
Die Singulärwertzerlegung A = USV' führt über die Multiplikation von S mit V' zu einer Zerlegung von A in eine orthogonale Matrix und eine, die im unteren Block nur Nullen hat. Weitergehend gibt es die QR-Zerlegung einer (n,p)-Matrix A. Sie ist ist gegeben durch A = QR, wobei Q orthogonal und R eine obere (p, p)-Dreiecksmatrix ist. Vielfach ist die Orthogonalmatrix Q
11.3. MATRIZENZERLEGUNG
UND
EIGENWERTE
203
nicht von Interesse, sondern nur R. So gilt z.B. für die KQ-Schätzung des Regressionsmodells y = Xß + e, wenn X = Q R ist: X'Xß
= X'y
R'Q'QR/3 = X'y i,... , uj/v) gesetzt wird: X'WXß
= X'W y.
(11.11)
Das sind gerade die Normalgleichungen einer gewichteten Kleinste-QuadrateRegression. Dabei sind hier die Gewichte abhängig von den Residuen. Somit kann ß iterativ mittels der Durchführung von gewichteten Regressionen berechnet werden, wobei in jedem Schritt die Residuen des letzten Schrittes zur Bestimmung der Gewichte verwendet werden. Huber (1980) hat alternativ vorgeschlagen, zur iterativen Berechnung von der Darstellung des ML-Schätzers bei Normalverteilung auszugehen: ß = (X'X^X'y ß = ß + ( X ' X ) _ 1 X ' ( y — y) Dies kann dazu benutzt werden, eine geeignete Startschätzung ß ( m e i s t die KQ-Schätzung) rekursiv zu verbessern: ß(k+l)
/* *+
= ß(k)
+ (X'Xr'XV ( ^ f ^ )
(11.12)
REGRBM
** **
Piirpose
** ** ** **
Format Input
** **
Output
M estimation of linear regression via Hubers algorithm. LS start estimate b = REGRBM(y,x) y = (n,l) vector, dependent variable z = (n,p) matrix, independent variables beta = (p,l) vector, the regression coefficients
PROC (1) = REGRBM(y,x,6psi); LOCAL beta,betal,e,it,n,s,zziz; n = ROWS(y); beta = y/x; e = y-x»beta; s = 1.4»MEDIAN(ABS(e-MEDIAN(e))); zziz = INV(x'*x)*x'; betal = 0; it=l; fl improving start estimate a DO WHILE ABS(beta-betal)>(0.0001*(ABS(BETA)+0.001)) AND it ) ' ) ; e = y-x*beta; s = 1.4*MEDIAN(ABS(e-MEDIAN(e))); it=it+l; ENDO; betal=0; it=l; 9 f i n a l loop uith inserted 9 9 p s i - f . and fixed scale 9 DO WHILE abs(beta-betal)>(0.0001*(abs(beta)+0.001)) and i t M. Für ein XQ G [o, b) und ein kleines Ax > 0 kann der Wert f(xo)-Ax als Näherung für den Flächeninhalt unter dem durch f(x) bestimmten Linienzug (Graphen) im Intervall [xo, + Ax] angesehen werden. Für eine Zerlegung a = xo < xi < • • • < xn+i = b mit Xi — Xi-1 = Ax ist dann flxi)' näherungsweise gleich der Gesamtfläche unter dem Graphen von f(x) im Intervall [a, 6]. Offensichtlich wird diese Näherung immer besser, je feiner die Zerlegung des Intervalls [o, 6] gewählt wird. Das bestimmte Integral von f(x) im Intervall [a,6], ist daher
12.1. DIFFERENTATION
UND
definiert als Grenzwert rb " / fix) dx = lim V fixi) Ja i=0
INTEGRATION
221
• Ax .
(12.1)
Für die numerische Berechnung mit dem Computer wird der Grenzwert durch eine approximierende Summe mit einem kleinen Ax ersetzt. Bestimmte mehrdimensionale Integrale sind in nahe liegender Weise als Grenzwerte entsprechender Summen definiert und werden numerisch wieder über approximierende Summen bestimmt. Bei den Approximationen gibt es allerdings so genannte Quadraturformeln, die eine verbesserte Approximation erlauben. INTQUAD1, INTQUAD2 und INTQUAD3 basieren auf der Gauß-LegendreQuadratur. INTSIMP verwendet die Simpson-Methode mit Randkorrektur. Diese Prozeduren verlangen die Angaben numerischer Grenzen. Funktionsabhängige Grenzen bei der Integration erlauben die beiden Prozeduren INTGRAT2 und INTGRAT3. Bisweilen möchte man eine gutartige Funktion f(x) von —oo bis oo numerisch integrieren. Dann ist es nicht sinnvoll, für die Grenzen einfach (absolut gesehen) große Zahlen wie ±10 1 0 einzusetzen. Sinnvoller ist es sicherlich, die reelle Achse in Segmente einzuteilen und das Integral segmentweise zu bestimmen. Wenn dann die entfernter liegenden Segmente keine wesentliche Veränderung der Summe der einzelnen Integrale mehr bringen, kann man abbrechen. Ein anderer Weg führt über die Hermitesche Quadratur. Diese gilt für Funktionen des Typs h(x) — exp(—x 2 )/(x). Das folgende Programm dazu ist auch im GAUSS-Archiv abgelegt. /*
GAUSS-HERMITE-QUADRATUR
Paul L. Fackler
(1995)
**
Die Prozedur gibt die Abszissenwerte
(x) und die Gewichte
»•
(v) für die Gauss-Hermitesche Quadrature der Ordnung n aus.
*+
Das wird dann verwendet um Integrale der Form
**
über die gesamte reelle Achse zu berechnen. Die Approxima-
•*
tion wird berechnet als w'f(x).
** **
für alle Polynome der Ordnung kleiner als 2n.
•*
int(exp(-x~2)f (x)) Die Integration ist exakt
**
Beispiel:
••
Um das Integral der Funktion exp(-x~2)(x~4+10) zu bestimmen,
**
werden folgende Aufrufe benötigt: {x,w}=hermite(3);
*•
int=w'(x~4+10);
**
Um diese Abszissenwerte und Gewichte so zu transformieren,
**
dass
**
Verteilung zu berechnen, sind die Abszissenwerte mit SQRT(2)
sie geeignet sind, um die Momente der Standardnormal-
222
KAPITEL
12. NUMERISCHE METHODEN II:
ANALYSIS
Tabelle 12.1: Differentation und Integration g= GRADPUf ,x)
9i,j =
h=HESSP(fef ,x)
K
w = INTGRAT2 (&f, x, g)
Wi
dfi(x) d'Xj
d2f(x) | dxidxj
=
= J
j
f(x,y)dydx
x
2.i g¡2(1) g ist ein (2, l)-Vektor von Pointern auf Funktionen, welche die Grenzen von y berechnen. (Erste Zeile ist obere, zweite ist untere Grenze.) xi.i Sii(x) hn(x,y) w= INTGRAT3(&f , x , g , h )
Wi
~ J
J
J
f(x,y,z)
dz dy dx
X2,i ji2(x) hfs(x,y) g, h sind (2, l)-Vektoren von Pointern auf Funktionen, welche die Grenzen von y und z berechnen. (Erste Zeile ist obere, zweite ist untere Grenze.) w= INTQUADK&f ,x)
u>i= J f{x) dx X2,i Vl,i
w= INTQUAD2(&f,x,y)
Wi = J x
2,i
J
f{x,y)dydx
V2,i
Xl.i Vl.i 21,i
w = INTQUAD3 (&f, x, y, z)
Wi = J
J
J f(x,y,z)
dz dy dx
X2,i V2,i Z2,i XI,1 y = INTSIMP(&f,x,t)
m
dx w- / X2.1 t ist die Toleranz, die zur Überprüfung der Konvergenz verwendet wird.
12.1. DIFFERENTATION
UND
INTEGRATION
223
*• **
zu multiplizieren dividieren.
und die Gewichte durch SQRT(pi) zu
*» *•
INPUT: N - Anzahl der Quadraturpunkte
*• **
OUTPUTS: X - Abszissenwerte (evaluation points) W - Quadraturgewichte
** *•
Der ( f r e i e ) Code basiert auf einem Algorithmus, der in Press et a l . (1986) wiedergegeben i s t .
PROC (2)=hermite(n); LOCAL x , w , p i m 4 , m a x i t , i , i t s , j , m , p l , p 2 , p 3 > p p , z , z l ; maxit=100; pim4=l/pi~0.25; m=TRUNC((n+l)/2); x=ZER0S(n,l); w=ZER0S(n,l); i=0; DO WHILE i 0 ist eine Normierungskonstante, und a ist ein Parameter, der die Ausbreitung der Verteilung steuert. Für a = 2 liegt eine Normalverteilung vor, für a = 1 eine Cauchy-Verteilung. Während die erstgenannte das statistische Schmuckstück ist, dient die Cauchy-Verteilung i.d.R. als Beispiel für eine Verteilung, die häufig extreme Beobachtungen hervorbringt. Von ihr existiert nicht einmal der Erwartungswert.
12.4.
FOURIERTRANSFORMATION
233
Auch die symmetrischen stabilen Verteilungen mit 1 < a < 2 sind für die Analyse von statistischen Daten mit mehr extremen Werten als bei der Normalverteilung von Interesse. Solche treten z.B. bei finanzwirtschaftlichen Zeitreihen auf. Dort werden für die Innovationen stabile Verteilungen unterstellt; diese sind dann über einen Maximum Likelihood Ansatz zu schätzen. Nur für zwei symmetrische stabile Verteilungen führt die inverse Fouriertransformation zu geschlossenen Ausdrücken für die Dichten; dies sind die beiden Sonderfälle a = 1,2. Für die anderen wurden daraus aber Reihenentwicklungen hergeleitet. Eine darauf aufbauende GAUSS-Prozedur für die Berechnung der Dichten in Abhängigkeit vom Parameter hat McCulloch (1994) geschrieben. Der Programmcode wurde von ihm zur freien, nichtkommerziellen Nutzung an das GAUSS-Archiv übermittelt, natürlich ohne irgendeine Gewährleistung. Sie sind in die Library DISTRIB aufgenommen worden. (Siehe Kapitel 14.) Die Zeitreihenanalyse ist - wie erwähnt - der zweite Bereich der Statistik, in dem die Fouriertransformation eine wichtige Rolle spielt. Die Fouriertransformierte hat dann die Interpretation, dass eine Zeitfunktion durch Überlagerungen von harmonischen Wellen, d.h. durch Addition verschiedener Sinusund Kosinusfunktionen, dargestellt wird. Sofern die Zeitfunktion zu diskreten, gleichabständigen Zeitpunkten t = 0 , 1 , 2 , . . . ,N — 1 beobachtet wird, liegt eine Zeitreihe (xt) vor. Dann wird man zur diskreten Fouriertransformation (DFT) geführt:
/ (jf) = E
ü = - f , . . • , 0 , .. , y ) •
(12.6)
Tatsächlich wird hierdurch eine Funktion definiert, die nur noch approximativ mit der (stetigen) Fouriertransformation übereinstimmt. Die diskrete inverse Fouriertransformation gibt (xt) zurück:
j=0
x
'
Große Bedeutung erlangt die Fouriertransformation für die Zeitreihenanalyse Mitte der 60er Jahre, als einerseits eine größere Verbreitung elektronischer Rechner einsetzte und andererseits die auf C.F.Gauß zurückgehende schnelle (engl, fast) Fouriertransformation von Cooley und Tuckey wiederentdeckt wurde. Die FFT basiert darauf, dass die Ausgangsfolge in zwei Teilfolgen aufgespalten werden kann und die getrennte Berechnung der DFT und die anschießende Zusammenführung der Ergebnisse weniger Rechenoperationen benötigt als die direkte Berechnung. Dies kann zu einer Rekursion ausgebaut werden; sie ist am effizientesten, wenn am Ende jeweils nur noch zwei einzelne Folgenglieder stehen, die Reihenlänge somit eine Potenz von Zwei ist. Da das
234
KAPITEL
12. NUMERISCHE METHODEN II:
ANALYSIS
Anfügen von Nullen an eine diskrete Folge die Werte der DFT nicht ändert (wohl aber die Frequenzen k/N\), ist es effizienter, eine Folge mit Nullen aufzufüllen, bis die Bedingung N' = 2 m erfüllt ist, und darauf die FFT anzuwenden. Wird die zentrierte Reihe (xt—x) einer Fouriertransformation unterworfen, so geben die quadrierten Beträge der Fouriertransformierten für die Frequenzen j/N (nach geeigneter Glättung) an, mit welchem Varianzanteil die zugehörige harmonische Welle in der Reihe vertreten ist. Das ist bis auf eine Normierung das Periodogramm; es ist als Ausgangspunkt für die Spektralschätzung von höchstem Interesse. Ist G(j) — f ( j j ) = Xiilo' jf(xt ~ exp(i2-Ktj/N) die diskrete Fouriertransformation von (Xt — x) /N, so ist das Periodogramm definiert durch (0 )"2; / * D a r s t e l l e n des Periodogramms */ XY(seqa(0,l,n)/(2*n),per); Das Periodogramm ist in der Abbildung 12.3 wiedergegeben.
236
KAPITEL 12. NUMERISCHE METHODEN II: ANALYSIS Tabelle 12.3: Fourier-Transformation
y = FFT(x) IV, K L, M
komplexe 1- oder 2-dim. FFT; dabei sind L und M die kleinsten Potenzen von 2, die größer sind als N und K. xr , x i ) inverse komplexe 1- oder 2-dim. FT; zu L,M siehe y : • FFTI (N.K N, 1 L,M FFT. = : multidimensionale FFT; die Daten sind zeilenweiy FFTM(x,dim) se im Vektor x abgespeichert, : y FFTMI(x,dim) inverse multidimensionale FFT; die Daten sind N,1 K. X y = zeilenweise im Vektor x abgespeichert, verbesserte Version von FFT; L und M sind die FFTN(x) N.K L.M kleinsten Zahlen größer als N und K, die sich als Primfaktorprodukte darstellen lassen, bestimmt die kleinste zulässige Zahl n > nO, für n = NEXTN(nO) die eine FFT bzw. RFFT berechnet werden kann, ° NEXTNEVN(nO) wie NEXTN bestimmt die optimale Dimension einer Matrix •OPTN(nO) n > nO, für die Berechnung einer FFT bzw. RFFT wie OPTN n = OPTNEVN(nO) : • RFFT(x) reelle 1- oder 2-dim. FFT y N.K y = • RFFTI(x) inverse reelle FFT; zu L, M siehe FFTN
L.M
N.K
y : • RFFTIP(x) N,K
L.M
y : 'RFFTN(x) N,K
L.M
inverse reelle FFT mit gepacktem Input; zu L, M siehe FFTN verbesserte Version von RFFT; zu L, M siehe FFTN
y = RFFTNP(x) N.K
neue Version von RFFTP; zu L, M siehe FFTN
y : •RFFTP(x) N.K
reelle 1- oder 2-dim. FFT mit Output in gepacktem Format; zu L, M siehe FFT
L.M L.M
Die folgende Tabelle gibt eine Übersicht, welche der in der Tabelle 12.3 angeführten Funktionen zur Bestimmung der Reihenlänge mit welchen FFTTransformationen harmonieren. Vektor Matrix Matrix FFT-Funktion -Länge -Zeilen -Spalten NEXTN, NEXTN, NEXTN, FFTN OPTN OPTN OPTN RFFTN, RFFTNP NEXTNEVN, NEXTN, NEXTNEVN, OPTNEVN OPTN OPTNEVN
Kapitel 13
Numerische Methoden III: Optimierung 13.1
Lineare und quadratische Optimierung
13.1.1
Lineare Optimierung
Die Bestimmung des Maximums einer linearen Zielfunktion Z{x) = c'x — ciXi H
1- cnxn = max
(13.1)
unter den Nebenbedingungen aii^i + ••• + o,i n x n < 6i d2\X\ + • • • + a2nxn < + ' ' ' + OmnXn < bm und xi > 0 , . . . , xn > 0, kurz A x < b, x > 0
(13.2)
heißt lineares Programm (LP) oder lineares Optimierungsproblem. Die Koeffizienten c, heißen Ziel- oder Zielfunktionskoeffizienten; Ein konkreter Vektor x° ist eine Lösung von A x < b, falls er diese Ungleichungen erfüllt. x° heißt zulässige Lösung, falls er Lösung ist und für ihn zudem x° > 0 gilt.
KAPITEL
238
13. NUMERISCHE METHODEN III:
OPTIMIERUNG
Die Aufgabe eines LP besteht darin, unter den zulässigen Lösungen eine zu bestimmen, bei der die Zielfunktion maximal ist. Sind die Koeffizienten des Vektors b in einem LP alle nicht negativ, so heißt das LP normal. Man sagt auch, dass das LP in Standardform vorliegt. Die Formulierung der Aufgabenstellung ist nicht so restriktiv, wie es erst einmal den Anschein haben könnte: (1) Die Minimierung einer linearen Funktion Z(x) — c'x unter Nebenbedingungen ist äquivalent zur Maximierung von Z'(x) = —c'x und folglich ebenfalls ein LP. (2) Nebenbedingungen der Form a ^ i + • • • + alnxn > b, lassen sich durch Multiplikation mit -1 in die Form a'uxi + • • • + a'inxn < b[ bringen. Zentral sind nun so genannte Basislösungen. Zu deren Bestimmung wird das Problem nun etwas umformuliert. Die Nebenbedingungen werden durch nichtnegative Schlupfvariablen zu Gleichungen gemacht: anZi + • • • + ainxn + U\ a-ziXi + • • • + Ü2nXn +U2 a
mlxl
— b\ = i>2
+ ••• +
^ 0, - - -, xn > 0,
U\ > 0 , . . . , um> o
Die Zielfunktion wird geändert in Z(x, u) = c'x + O'u = ciXi +
1- cnxn + 0«i H
h 0 u m = max
Tatsächlich entsprechen sich die Lösungen des linearen Gleichungssystems [A|E] ^ * ^ = b, für die ^
^ > 0 gilt, und die zulässigen Lösungen
x° > 0 des linearen Ungleichungssystems Ax < b einander eindeutig. Damit ist das LP in ein Gleichungssystem umgewandelt. Für LP's in Normalform ist zur Lösung der Simplex-Algorithmus geeignet. Dieser ist ein modifizierter Gauß-Algorithmus und besteht aus folgenden Schritten: 1.
Man geht von dem System [A|E]
das Ausgangstableau:
aus und bildet
13.1. LINEARE
Oll 021
UND QUADRATISCHE
• ' '
T =
OPTIMIERUNG
239
Oln O 2„
1 0
0 1
0 0
bi b2
0 0
1 0
bm 0
02 ,n+m
bi b2
Oml a
'
omn cn
0 0
Oll «21
• •
«In 0-2n
Ol,n+l 02,n+l
Oml Cl
'
dmn Cn
Om,n-f 1 Cn+1
.... ••.•
bm d
An die oben angegebene kanonische Form wird also noch eine Zeile angehängt, in der zu Beginn die Koeffizienten der Zielfunktion sowie der Wert der Zielfunktion für die spezielle vollständige Basislösung x = 0, u = b stehen. Für diese ist j a Z(x, u) = 0. 2. Man überprüft die Zielfunktionszeile ( c i , . . . , cn, c n + i , . . . , cn+m). Ist j < 0 (j = 1 , . . . ,n + m), so ist die gefundene Basislösung optimal. Andernfalls gibt es (mindestens) ein j mit Cj > 0.
c
3.
Man wählt Spalte j als Pivotspalte, falls Cj = m a x { c i , . . . , c n + m } .
4. Hat man in der Pivotspalte nur Komponenten < 0, also a ^ < 0 (« = 1 , . . . ,m) so existiert keine Lösung. Der zulässige Bereich ist unbeschränkt. Andernfalls gibt es (mindestens) ein i mit o^- > 0. 5.
Man wählt Zeile i mit (tfj = m i Q>rj n { ^ la r , > 0 } als Pivotzeile.
6. Man erhält das Pivotelement a,j > 0, tauscht die Basisvariable der Zeile i gegen die Nichtbasisvariable der Spalte j und erhält eine neue Basislösung ( S )
des Systems [A|E] ( * ) = * » .
( * ) > 0 .
Dieser Schritt ergibt ein neues Tableau T. Dieses wird als neues Starttableau angesehen und das Verfahren mit Schritt 2 fortgesetzt. Ist der Simplex-Algorithmus beendet, so kann man aus dem Tableau den optimalen Wert der Zielfunktion und die zugehörigen Werte für x\,... ,xn ablesen. Der optimale Wert der Zielfunktion ist das Negative von d im Endtableau. Der Simplex-Algorithmus führt auf die folgende GAUSS-Prozedur:
240
KAPITEL 13. NUMERISCHE METHODEN III: OPTIMIERUNG
PROC (1)= s i m p l e x ( a , b , c ) ; LOCAL m , j , i , a l , b a s ; m = ROWS(a); a = (a~EYE(ROWS(b))~b)|(c'~ZER0S(l,R0WS(b)+l)); c = C0LS(a)-l; loop: PRINT a ; / * Zwischentableaus nur zur I l l u s t r a t i o n */ IF a [ m + l , . ] l e 0; GOTO END; ENDIF; j = MAXINDC(a[m+l,l:c]'); IF a [ l : m , j ] < = 0 ; PRINT "No S o l u t i o n " ; GOTO END; ENDIF; al=SELIF(SEQA(l,1,m)~a[l:m,j c+1] , a [ l : m , j ] . > 0 ) ; i = a l [MININDC(A1 [. ,3] . / a l [ . , 2 ] ) , 1] ; bas=a[i,.]/a[i,j]; a[i,.]=bas; a = a-a[i,.].*a[.,j]; a [i,.]=bas; GOTO l o o p ; END: RETP(a); ENDP; Beispiel 13.1 Gegeben sei das Problem xi + 3^2 < 15 2x\ + X2 < 12 ii + x2 < 7
t
4xi + 5x2 = niax
mit
und
xi, x? > 0 .
Die Eingaben für die Prozedur sind dann: LET a={l 3, 2 1, 1 1>; LET b={15, 12, 7>; LET c={4, 5} Der Aufruf des Algorithmus geschieht gemäß d = s i m p l e x ( a , b , c ) . Bei der Ausführung geschieht nun Folgendes: Die Prozedur baut zuerst das Ausgangstableau für den Simplex-Algorithmus auf: 1 2 1 4
3 1 1 5
1 0 0 0
0 1 0 0
0 0 1 0
15 12 7 0
Es ist die zweiten Spalte zu wählen. Dann ist die erste Zeile die Pivotzeile. Nun ist die die zweite Spalte so umzuformen, dass sie Basisvariable der ersten
13.1. LINEARE
UND QUADRATISCHE
OPTIMIERUNG
241
Zeile wird (bisher 3te Spalte). Dies ergibt das Tableau: 1 0 0 0
1/3 5/3 2/3 7/3
1/3 -1/3 -1/3 -5/3
0 1 0 0
0 0 1 0
5 7 2 -25
Für den zweiten Durchgang ist die erste Spalte zu wählen. Dann ist die dritte Zeile die Pivotzeile. Die Basisvariable der dritten Zeile (=5te Spalte) ist also gegen die erste Spalte auszutauschen. Dies ergibt das Tableau: 0 0 1 0
1 0 0 0
1/2 -1/2 -1/2 -1/2
-1/2 -5/2 3/2 -7/2
0 1 0 0
4 2 3 -32
Offensichtlich ist die gefundene Basislösung optimal. Für Xi = 3, £2 = 4 ergibt die Zielfunktion den maximalen Wert 32. • Eine statistische Anwendung der linearen Programmierung ergibt sich bei der LAD- (Least Absolute Deviations-) Regression. Mit den Zeilenvektoren Xj und dem (Spalten-) Koeffizientenvektor ß lautet das Zielkriterium n
¿=i
1Vi - *ißI =
min
(13.3)
Dieses Problem führt über das Konzept der dualen Programme zu einem LP in Standardform. Zunächst werden für die Residuen a — yi — Xiß die positiven und negativen Teile eingeführt: f ei \ 0
falls falls
ti > 0 a< 0 '
_ _ J —ei ~ \ 0
6i
falls falls
ei 0
Dann ist e^ = e t — e~ und |ej| = e t + e ^ , und (13.3) kann geschrieben werden als: +e
¡=i
i)=
min
mit den Nebenbedingungen ef - er =yi~
x.iß
(i = 1,..., n)
Die Koeffizienten ß j werden in der gleichen Weise wie die Residuen in Positivund Negativteile aufgespalten. Dann ergibt sich die Aufgabe / et e. [ 1 1 . . . 10 0 . . . 0] ßt \ ß7
\
/
KAPITEL
242
13. NUMERISCHE METHODEN III:
OPTIMIERUNG
mit den Nebenbedingungen
f et \ [I|-I|X|-X]
®
V ßT )
e+ \
/ o \
e
i
ßt \ ßT /
Wie die Theorie lehrt, ist die Lösung dieses Problems die gleiche wie die Lösung des dualen Programms , i. y z = max, Nun sind nur noch wenige Zwischenschritte nötig, um die LAD-Regression mit dem Simplexverfahren zu bestimmen. Dazu und zu Hinweisen bzgl. effizienterer Implementationen, welche die spezielle Struktur des Problems ausnützen, sei auf Späth (1987) verwiesen.
13.1.2
Quadratische Optimierung
Ein Typ von Nebenbedingungen, die häufig in Regressionsproblemen vorkommen, legt fest, dass einige oder alle Parameterkomponenten nicht-negativ sein sollen. Dieses lineare Kleinste-Quadrate-Problem mit derartigen Nebenbedingungen gibt einen guten Einstieg in den Bereich der quadratischen Programmierung. Eine empfehlenswerte Textstelle ist Fletcher (1981). Sei also das Regressionsmodell y = Xß + e gegeben. Aus einem Datensatz soll nun ß bestimmt werden, so dass Cß > 0. Der KQ-Ansatz (y — Xß)'(y — Xß) = min führt mit dieser Nebenbedingung auf y'y + ß'X'Xß
- 2/3'X'y i min
Cß > 0 Der Term y ' y kann vernachlässigt werden, da er (bei beobachteten y) konstant ist. Dies hat aber schon die Struktur eines quadratischen Programms. Die standardmäßige Formulierung des Problems der quadratischen Programmierung lautet i x ' Q x — x ' R = min
(13.4)
unter den Nebenbedingungen Ax = B Cx > D
(13.5) (13.6)
13.2. NICHTLINEARE
OPTIMIERUNG
243
und den Schranken Xu ^ ^ ^ Xo
(13.7)
Dafür gibt es die GAUSS-Prozedur i x . u l , u 2 , u 3 , u 4 , r e t } = QPR0G( s t a r t , q , r , a , b , c , d , b i i d s ) Für Weiteres sei auf die GAUSS-Language Reference verwiesen.
13.2 13.2.1
Nichtlineare Optimierung Nichtlineare Gleichungen
Nichtlineare Optimierungsprobleme stellen eine zentrale Aufgabe in der angewandten Statistik dar. Das gilt beispielsweise für die ML-Schätzung, aber ebenso für nichtlineare Regressionsprobleme. Der Ansatz zur Lösung solcher Fragestellungen beruht darauf, dass sich bei Funktionen mehrerer Variablen lokale Extrema dadurch auszeichnen, dass keine Richtung einen positiven oder negativen Anstieg haben darf. Damit muss der Gradient Null sein. Das Verschwinden der partiellen Ableitungen ist nur eine notwendige Bedingung. Es gibt i.d.R. Punkte, für die dies erfüllt ist, an denen aber kein lokales Extremum vorliegt. Man spricht dann von stationären Punkten der Funktion Stationäre Punkte können theoretisch über die Bestimmung der Nullstelle des Gradienten ermittelt werden. Jedoch ist die Aufgabe der Bestimmung eines Minimums oder Maximums im Mehrdimensionalen nicht gleich zu setzen mit der Bestimmung der Nullstelle einer nichtlinearen Funktion. Denn die Forderung, dass der Gradient Null wird, impliziert weitgehende Abhängigkeiten zwischen den verschiedenen Dimensionen. Daher ist die Suche nach einem lokalen Extremum ein eher 'eindimensionales' Problem, während das andere ein echt mehrdimensionales ist. Siehe dazu die Ausführungen in Press et. al. (1986, S. 272). Bzgl. nichtlinearer Gleichungen sei hier nur auf die Prozedur { x . r e t c o d e } = EQS0LVE(&f,x0) hingewiesen, die ein System von nichtlinearen Gleichungen / ( x ) = 0 löst. xO ist dabei ein (k, l)-Vektor von Startwerten; &f ist ein Pointer auf die relevante Prozedur, r e t c o d e ist ein Skalar, der Auskunft über den Erfolg der Prozedurausführung gibt. Vgl. die Language Reference zu den möglichen Werten 1 bis 6.
244
KAPITEL
13.2.2
13. NUMERISCHE METHODEN III:
OPTIMIERUNG
Quasi-Newton-Verfahren
Eine effektive iterative Methode zur Bestimmung eines Minimums basiert auf der Approximation der interessierenden Funktion / ( x ) durch eine mathematisch einfacher zu handhabende, von der man weiß, dass sie ein Minimum besitzt. Für univariate Funktionen sind Parabeln eine Klasse derartiger Funktionen. Eine geeignete approximierende Parabel erhält man über eine Taylor-Reihenentwicklung, die nach dem dritten Glied abgebrochen wird: /(*) « f(xi) + / ' ( * ! ) ( * - an) +
!)(* -
Xl)
2
(13.8)
Das Minimum wird von der approximierenden Parabel an der Stelle x — xi — f'(xi)/f"(Xl) angenommen. Die Idee der Iteration besteht nun darin, von einer Näherungslösung x\ auszugehen und die Minimalstelle der approximierenden Parabel als Verbesserung von Xi bei der Annäherung an die Minimalstelle von / anzusehen. Das ergibt dann die Iteration Xk+1 =xk-
[/"(*