Seite 1 von 1
Points Funktion und auffinden von Extremwerten
Verfasst: So Mär 08, 2020 11:57 am
von Benni1801
Hallo liebe Community,
ich habe folgendes Problem: Ich habe eine Text Datei mit Abfluss Daten, diese stelle ich dann grafisch wie im Code zu sehen mit plot() dar. Dann berechne ich die =.95 Quantile und möchte dann alle Extremwerte sprich peaks mit einem Symbol markieren. Aber immer wenn ich versuche die Punkte mit der points() funktion einfüge, sind diese auf der x-Achse an der falschen Stelle. Meine Frage ist jetzt also erstens wo der Fehler ist bei der Zuordnung von x bzw y Koordinaten, oder ob Klammern falsch gesetzt sind? Und zweitens ob es eine bessere Methode gibt die Peaks zu bestimmen, weil ich mit meiner Variante auch Zwischenwerte bekomme, die nicht zwingend ein Maximalwert sind.
Hier noch mein Ansatz
Code: Alles auswählen
plot(1:366, q[1:366], type="l", xlab="d", ylab="q", main="r")
x=q[q>quantile(q, probs=0.95)][1:366]
points(x,pch=8)
Vielen Dank für eure Hilfe im Voraus.
Re: Points Funktion und auffinden von Extremwerten
Verfasst: So Mär 08, 2020 9:31 pm
von bigben
Hallo Benni,
Du hast der points-Funktion gar keine x-Koordinaten übermittelt, sondern nur y-Werte. Woher soll die arme Funktion denn wissen, wohin die Punkte gemalt werden sollen?
Du benutzt die Begriffe Peak und Maximalwert synonym mit 95%-Quantil. Das ist mathematisch nicht korrekt, deshalb solltest Du besser erklären, was Du machen willst. Wenn Du Code lesen willst, wird Dein reproduzierbares Beispiel sicher eine große Hilfe dabei sein
viewtopic.php?f=20&t=11
LG,
Bernhard
Re: Points Funktion und auffinden von Extremwerten
Verfasst: So Mär 08, 2020 10:55 pm
von Benni1801
Hallo ok ok verstehe, also ich probiere es nochmal.

Ich habe eine Datenreihe von zwei Jahren (732) Werte, hier liegt wenn ich es richtig verstanden habe bereits das erste Problem, weil ich nur eine y Koordinate habe. Also wäre meine erste Frage, wie weise ich direkt beim einlesen der Datei dem jeweiligen Wert 1:732 zu?
Code: Alles auswählen
> str(q1)
num [1:732] 0.12 0.53 0.49 0.4 0.3 0.43 0.46 0.38 0.27 0.23 ...
Nach dem Import habe ich direkt den Plot erstellt und ein paar optische Anpassungen durchgeführt hierbei scheint es aber zu funktionieren, weil mein Plot der Ganglinie richtig aussieht.
Im nächsten Schritt habe ich die 95%quantil berechnet, die in meinem Fall etwa 0.7 beträgt. Dann wollte ich die Werte im Plot markieren die einen Peak darstellen, der größer als die 0.7 ist. Mein erste Idee war über die erste Ableitung, aber hierfür habe ich für meine Zeitreihe keine passende Funktion in R gefunden. Also habe ich mir einfach die Werte die größer als 0.7 sind ausgeben lassen. Hier tritt aber das nächste Problem auf, nämlich ist nicht jeder Wert der größer als 0.7 ist ein Peak. Hier also die nächste Frage gibt es eine Möglichkeit bzw. Eine Funktion mit der ich die erwünschten Hochpunkte (y>0.7) auswählen kann?
Hier der Code soweit ich mir sicher bin, das ich weiß was ich tue
Code: Alles auswählen
q1 <- scan("file1.txt", skip=20)
q1
q1976=q1[1:366]
q1976
q1977=q1[367:732]
q1977
plot(1:366, q1976[1:366], type="l", xlab="Day of the year (1976)", ylab="Discharge (m³/s)", main="Gauge Ibm / Moosache")
quantile(q1976, probs=0.95)
abline(h=0.77)
Die dritte und letzte Frage ist jetztwie ich diese dann am besten markiere mit der Points funktion ist es mir nicht gelungen den y Koordinaten die richtige Koordinaten zuzuordnen. Beziehungsweise habe ich eine Fehlermeldung bekommen, ich hoffe das hilft jetzt beim Verständnis von meinem Problem. Vielen Dank für die Zeit, ich habe jetzt mal meine Daten im Anhang dazugegeben, ich hoffe das hilft!
Liebe Grüße!
e: hab jetzt eine Lösungsmöglichkeit gefunden, um alle Punkte größer 0.7 zu markieren, allerdings mit einer if Schleife also falls jemand noch andere Ideen hat, bitte her damit

Re: Points Funktion und auffinden von Extremwerten
Verfasst: Di Mär 10, 2020 12:00 pm
von Hufeisen
So?
Code: Alles auswählen
# Datei einlesen, angucken und Objekte erstellen
q1 <- scan(file = file.choose(), skip=20)
head(q1)
str(q1)
q1976 <- q1[1:366]
q1977 <- q1[367:732]
x_values <- 1:366
quantile_value <- quantile(q1976, probs=0.95)
# Grafik zeichnen
plot(x_values, q1976[1:366], type="l", xlab="Day of the year (1976)", ylab="Discharge (m³/s)", main="Gauge Ibm / Moosache")
points(x_values[q1976 >= quantile_value], q1976[q1976 >= quantile_value])
abline(h = quantile_value)
Re: Points Funktion und auffinden von Extremwerten
Verfasst: Di Mär 10, 2020 12:07 pm
von Benni1801
Ja genau danke! Noch eine Idee wie man nur die höchsten Punkte markiert und die Tageswerte die dazwischen liegen weglässt? LG
Re: Points Funktion und auffinden von Extremwerten
Verfasst: Di Mär 10, 2020 12:12 pm
von Hufeisen
Klar (wenn ich dich richtig verstanden habe):
1. Sortiere die Werte absteigend (optional);
2. Wähle die obersten n Werte aus (eventuell mit Hilfe der Standardabweichung);
3. Zeichne sie mit points wie gesehen.
Viel Spaß beim Basteln! Melde dich, wenn es klemmt.
Re: Points Funktion und auffinden von Extremwerten
Verfasst: Di Mär 10, 2020 12:42 pm
von Benni1801
Das hatte ich auch schon, aber so wäre ja z.B. der Punkt der ca. bei x=150 und y=3 liegt dabei, sollte aber eigentlich nicht sein, mein Gedanke war dann eher so in Richtung erste Ableitung, oder sowas bzw. eine Bedingung, die Punkte zu markieren für die gilt xn-1<xn>xn+1, aber wie dazu die passende Funktion aussehen könnte weiß ich leider nicht.
Re: Points Funktion und auffinden von Extremwerten
Verfasst: Di Mär 10, 2020 12:56 pm
von Hufeisen
Du musst dir überlegen, nach welchem Kriterium Punkte markiert werden sollen. Deine Idee
Punkte zu markieren für die gilt xn-1<xn>xn+1, aber wie dazu die passende Funktion aussehen könnte weiß ich leider nicht.
ist doch gut. Du bist jetzt auf der Lernkurve und dir eine fertige Lösung zu bauen, hilft dir langfristig weniger, als dich auf dem Weg zu begleiten. Also zuerst brauchst du ausgewählte y-Werte und die dazu gehörigen x-Werte. Wenn du die zusammen hast, kannst du prüfen, ob die ausgewählten Werte größere benachbarte Werte haben. Schau mal, wie weit du kommst.
Re: Points Funktion und auffinden von Extremwerten
Verfasst: Di Mär 10, 2020 1:46 pm
von Benni1801
Code: Alles auswählen
plot(1:366, q1976[1:366], type="l", xlab="Day of the year (1976)", ylab="Discharge (m³/s)", main="Gauge Ibm / Moosache")
for (i in 1:366){if ((q1976[i]>=0.77)&(q1976[i]>i+1)&(q1976[i]>i-1)){points(i,q1976[i],pch=8,col="red",cex=2) } }
Code: Alles auswählen
plot(1:366, q1976[1:366], type="l", xlab="Day of the year (1976)", ylab="Discharge (m³/s)", main="Gauge Ibm / Moosache")
for (i in 1:366){if ((q1976[i]>=0.77)&(q1976[i]>q1976[i]+1)&(q1976[i]>q1976[i]-1)){points(i,q1976[i],pch=8,col="red",cex=2) } }
Das waren jetzt meine Versuche, hinhauen tuts damit nicht, entweder ich bin schon ganz blöd im Kopf oder irgendwas passt beim Code nicht

Re: Points Funktion und auffinden von Extremwerten
Verfasst: Mi Mär 11, 2020 11:50 am
von Hufeisen
Geh Schritt für Schritt vor. Arbeite erst einmal nur mit den Daten und versuche dich erst dann an einer Darstellung, wenn dir die Auswahl und Bereinigung der Datenpunkte um kleinere Nachbarn gelungen ist. So kann es los gehen:
Code: Alles auswählen
Teilmenge <- cbind(x_values[q1976 >= quantile_value], q1976[q1976 >= quantile_value])
colnames(Teilmenge) <- c("Reihennummer", "Discharge")
head(Teilmenge)
# Reihennummer Discharge
# [1,] 23 0.87
# [2,] 144 0.98
# [3,] 145 0.95
# [4,] 152 0.93
# [5,] 153 1.50
# [6,] 154 3.31