Dauerlinien für die Hoch- und Niedrigwasserstatistik
Dies ist die vierte und letzte Übung aus einer Reihe von Übungen zu hydrologisch/metereologischen Datensätzen und deren Auswertung. Sie setzt die Übung zu Empirischen Verteilungsfunktionen fort.
Einleitung
In dieser Übung sollen Dauerlinien (= empirische Verteilungsfunktionen) für die Hochwasserstatistik und die Niedrigewasserstatistik gezeichnet werden. Zusätzlich sollen theoretische Verteilungsfunktionen an die empirischen Verteilungen angepasst werden und über Q-Q-Plots mit diesen verglichen werden.
Anschließend soll mit der Verteilungsfunktion, die die Daten am besten beschreibt ein Wahrscheinlichkeits-Plot und ein Plot für das Wiederkehrintervall erstellt werden (hierfür ist der Code weitestgehend vorgegeben).
Diese Verteilungsfunktionen sollen angepasst werden:
- Normalverteilung
- log-Normalverteilung
- Gumbel-Verteilung
- Weibull-Verteilung
Diese Verteilungsfunktionen sind in R in den Funktionen qnorm()
, qlnorm()
, qgumbel()
und qweibull()
implementiert. Konsultieren Sie die entsprechenden Hilfe-Seiten, um mehr zu diesen Verteilungsfunktionen und die Benutzung der Funktionen zu erfahren.
Um die theoretischen Verteilungsfunktionen an die empirische Verteilung anzupassen verwenden wir die Momentenmethode: Wir berechnen die Werte für das 1. und 2. Moment der Verteilung, also für den Lage- und den Skalierungs-Parameter1 und setzen diese in die Verteilungsfunktion ein. Diese Momente sind wie folgt definiert:
Verteilungsfunktion | 1. Moment (Lage) | 2. Moment (Skalierung) |
---|---|---|
Normalverteilung | mean(x) | sd(x) |
log-Normalverteilung | mean(log(x)) | sd(log(x)) |
Gumbel-Verteilung | mean(x)-0.5772*gscale | gscale = sqrt(6)/pi*sd(x) |
Für die Weibull-Verteilung lassen sich die Momente nicht so einfach berechnen. Hier verwenden wir das sogenannte Maximum-likelihood-Fitting zum Anpassen der Verteilungsfunktion. Diese Methode ist etwas komplizierter, ist jedoch in R schon in der Funktion fitdistr()
implementiert, die wir benutzen werden.
Wir werden also wie folgt vorgehen:
- Daten herunterladen
- Daten zu hydrologischen Jahren aggregieren
- Maximum für Hochwasserstatistik
- Minimum für Niedrigwasserstatistik
- Dauerlinie (= empirische Verteilungsfunktion) zeichnen (Anleitung in letzter Übung)
- Q-Q-Plot erstellen mit
- y-Achse: Quantile der empirischen Verteilung
- x-Achse: Quantile der theoretischen Verteilung
Daten herunterladen
Wir werden die Funktion get_usgs_gage()
aus dem Package EcoHydRology
verwenden, um Abflussdaten vom Server waterdata.usgs.gov des USGS (United States Geological Survey) herunterzuladen. Falls dies noch nicht installiert ist bitte den Befehl install.packages("EcoHydRology")
vorher ausführen.
Die heruntergeladenen Daten haben folgende Struktur:
Die eigentliche Abflussdaten sind in einem data.frame unter Licking_River$flowdata
gespeichert. Schauen wir uns diesen data.frame an:
agency | site_no | date | flow | quality | mdate |
---|---|---|---|---|---|
USGS | 3253500 | 1928-10-01 | 251997.3 | A | 1928-10-01 |
USGS | 3253500 | 1928-10-02 | 256890.4 | A | 1928-10-02 |
USGS | 3253500 | 1928-10-03 | 256890.4 | A | 1928-10-03 |
USGS | 3253500 | 1928-10-04 | 256890.4 | A | 1928-10-04 |
USGS | 3253500 | 1928-10-05 | 244657.6 | A | 1928-10-05 |
USGS | 3253500 | 1928-10-06 | 229978.1 | A | 1928-10-06 |
Es gibt zwei Datums-Spalten. Aus der Struktur erkennen wir, dass die erste Datums-Spalte date
ein Character-Vektor ist. Die zweite Spalte mdate
ist in einem Datums-Format. Also werden wir diese später verwenden. Mit Licking_river$flowdata$flow
können wir die Abflussdaten abrufen.
Plotten wir z.B. eine Zeitreihe der Daten:
Hochwasserstatistik
Für die Hochwasserstatistik brauchen wir das jährliche Abflussmaximum. Um dieses zu berechnen aggregieren wir die täglichen Daten zu jährlichen Daten über die Funktion max
. Für die Aggregierung steht uns die Funktion aggregate
zur Verfügung. Da wir über das hydrologische Jahr aggregieren möchten, müssen wir dieses zuerst noch berechnen. Das Hydrologische Jahr, wie es der USGS definiert beginnt für dieses Gebiet am 1. Oktober und endet am 30. September. Wenn wir also 3 Monate zu mdate
dazu rechnen und dann mit year()
das Datum abfragen, werden die Monate Oktober bis Dezember jeweils dem nächsten Jahr zugeordnet. Wir speichern das Ergebnis dieser Abfrage in einer neuen Spalte namens hydroYear
im flowdata
data.frame. Die Funktionen year()
und months()
entstammen aus dem lubridate
package, das deshalb vorher geladen werden muss.
Zum Aggregieren übergeben wir der Funktion aggregate
unsere Abflussdaten, das by=
Argument, anhand dessen die Daten aggregiert werden sollen (in unserem Falle das hydrologische Jahr) und mit FUN
die Funktion mit der die Daten aggregiert werden sollen.
aggregate
gibt standardmäßig den Aggregationsparameter als zusätzliche Spalte zurück. Daher verwenden wir $x
, um nur die Spalte mit den aggregierten Werten unter annual_max
zu speichern.
Wir sehen, dass die Daten nun deutlich anders verteilt sind:
Dauerlinie
Die Dauerlinie bzw. empirische Verteilungsfunktion zeichnen wir wie in der letzten Übung gezeigt:
Verteilungsfunktion anpassen
Für die Hochwasserstatistik wollen wir die theoretischen Verteilungsfunktionen der Normalverteilung, log-Normalverteilung und Gumbel-Verteilung an unsere Daten anpassen. Wie in der Einleitung beschrieben wollen wir das über die Momentenmethode realisieren. Zur Wiederholung hier die tabelle für die Berechung der Momente:
Verteilungsfunktion | 1. Moment (Lage) | 2. Moment (Skalierung) |
---|---|---|
Normalverteilung | mean(x) | sd(x) |
log-Normalverteilung | mean(log(x)) | sd(log(x)) |
Gumbel-Verteilung | mean(x)-0.5772*gscale | gscale = sqrt(6)/pi*sd(x) |
Es folgt ein Beispiel, wie dies für die Normalverteilung in R umgesetzt werden kann. Bitte schreiben Sie entsprechenden Programmcode für die log-Normalverteilung (qlnorm()
) und die Gumbel-Verteilung (qgumbel()
). Speichern Sie diese unter log_normal
und gumbel
und zeichnen Sie diese mit zusätzlichen Linien in die Grafik ein.
Die Gumbel-Funktion ist nicht im Basispaket von R implementiert. Daher müssen wir noch das Paket evd
hinzuladen. Falls dieses noch nicht installiert ist, kann es mit install.packages("evd")
installiert werden.
Q-Q-Plots zur Bewertung der Anpassung
Zur Überprüfung und Bewertung der Anpassung stellen wir die Quantile der empirischen Verteilung denen der angepassten theoretischen Verteilung gegenüber. Dies nennt sich ein Q-Q-Plot: auf die Y-Achse zeichnen wir die Quantile der empirischen Verteilung (data_sorted
). Auf die X-Achse zeichen wir die Quantile mit gleicher Wahrscheinlichkeit, die wir über die angepasste Verteilungsfunktion berechnet haben (z.B. normal
oder gumbel
). Um die Werte auf den Achsen festzusetzen und für alle Grafiken gleich zu halten berechnen wir mit range(annual_max)
die Spanne unserer Werte.
Anschließend plotten wir noch eine 1:1-Linie in die Grafik mit dem Befehl abline(a=0, b=1)
. Weichen unsere Punte von dieser Linie ab, bedeutet dies eine schlechte Anpassung bzw. geringe Übereinstimmung der theoretischen Verteilung mit der empirischen.
Erstellen Sie zwei weitere Q-Q-Plots for die log-Normalverteilung und die Gumbel-Verteilung. Welche der Verteilungen zeigt die geringsten Abweichungen zur 1:1-Linie?
Wahrscheinlichkeitsplots und Wiederkehrintervall
Im folgenden wird gezeigt, wie man einen Wahrscheinlichkeitsplot und das Wiederkehrintervall darstellt. Hier werden dem Q-Q-Plot lediglich weitere Achsen hinzugefügt, die sich an den theoretischen Wahrscheinlichkeiten bzw. dem Wiederkehrintervall orientieren. Außerdem sind vertikale Lininen eingezeichnet, um das Ablesen von Wahrscheinlichkeiten bzw. Wiederkehrintervallen zu erleichtern. Ein Plot mit einer solchen Achseneinteilung wird auch Wahrscheinlichkeitsnetz genannt und dient Ihnen in ihrem Extremwertbeleg zum manuellen Anpassen einer Verteilungsfunktion und damit zum manuellen Extrapolieren von Wiederkehrintervallen.
Die Position zum Einzeichnen der Wahrscheinlichkeiten \(p_i\) muss über die Gumbel-Funktion berechnet werden. Daher wird hier tick_pos <- qgumbel(tick_lab/100, gloc, gscale)
verwendet, um aus dem Array tick_lab
die Position tick_pos
zum Einzeichnen zu berechnen.
Das Wiederkehrintervall \(T(x)\) berechnet sich aus der Unterschreitungswahrscheinlichkeit \(p_{un}\) mit der Formel:
\[T(x)=\frac{100}{100-p_{un}}\]Und entsprechend aus der Überschreitungwahrscheinlichkeit \(p_{üb}\) mit:
\[T(x) = \frac{100}{p_{üb}}\]Beispiel für ein Extremwertwahrscheinlichkeitsnetz zur manuellen Extrapolation von Extremwertereignissen.
Niedrigewasserstatistik
Um die Niedrigwasserstatistik zu berechnen, ist der erste Schritt wieder die jährliche Aggregierung. Verwenden Sie wie in der Hochwasserstatistik die Funktion aggregate
um diesmal annual_min
zu berechnen (Tipp: übergeben Sie dazu min
als Argument für FUN
).
Für die Niedrigwasserstatistik werden wir eine zusätzliche Verteilungfsunktion anpassen: die Weibull-Verteilung. Diese können wir nicht über die Momentenmethode anpassen, sondern nur über die Maximum-likelihood-Methode. Dies kann in R mit der Funktion fitdistr()
aus dem MASS
-Paket auf die folgende Weise gemacht werden:
Erstellen Sie analog zur Hochwasserstatistik eine Grafik, die die empirische Verteilungsfunktion sowie vier weitere Linien für die vier angepassten Verteilungsfunktionen enthält. Für die Niedrigwasserstatistik empfiehlt es sich in der plot-Funktion das zusätzliche Argument log="x"
zu verwenden, um die x-Achse logarithmisch darzustellen. Auf diese Weise erkennt man im unteren Wertebereich mehr Details.
Daraufhin plotten Sie auch hier für jede angepasste Verteilungsfunktion einen Q-Q-Plot mit den empirischen Daten.
Welche Verteilungsfunktion liefert hier die beste Anpassung?
Wahrscheinlichkeitsplot und Wiederkehrintervall
Auch hier können wir wieder ein Wahrscheinlichkeitsplot mit Wiederkehrintervall zeichnen. Für die Niedrigwasserstatistik macht es mehr Sinn, die Unterschreitungswahrscheinlichkeit darzustellen.
-
Andere Verteilungen haben zusätzlich noch einen 3. Moment, der die Schiefe beschreibt und wiederum andere Verteilungen haben sogar noch weitere Momente. ↩