Points Funktion und auffinden von Extremwerten

Wie erstelle ich Grafiken, was ist zu beachten?

Moderatoren: EDi, jogo

Antworten
Benni1801
Beiträge: 5
Registriert: So Mär 08, 2020 11:44 am

Points Funktion und auffinden von Extremwerten

Beitrag 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.
Zuletzt geändert von jogo am So Mär 08, 2020 11:59 am, insgesamt 1-mal geändert.
Grund: Formatierung verbessert, siehe http://forum.r-statistik.de/viewtopic.php?f=20&t=29
bigben
Beiträge: 2771
Registriert: Mi Okt 12, 2016 9:09 am

Re: Points Funktion und auffinden von Extremwerten

Beitrag 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
---
Programmiere stets so, dass die Maxime Deines Programmierstils Grundlage allgemeiner Gesetzgebung sein könnte
Benni1801
Beiträge: 5
Registriert: So Mär 08, 2020 11:44 am

Re: Points Funktion und auffinden von Extremwerten

Beitrag 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 :D

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 ;)
Dateianhänge
file1.txt
(5 KiB) 38-mal heruntergeladen
Zuletzt geändert von student am Mo Mär 09, 2020 8:25 am, insgesamt 1-mal geändert.
Grund: Ein wenig formatiert, um die Lesbarkeit zu erhhöhen!
Hufeisen
Beiträge: 162
Registriert: Fr Aug 31, 2018 6:34 pm

Re: Points Funktion und auffinden von Extremwerten

Beitrag 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)
Dateianhänge
Quantile markieren.png
Benni1801
Beiträge: 5
Registriert: So Mär 08, 2020 11:44 am

Re: Points Funktion und auffinden von Extremwerten

Beitrag 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
Hufeisen
Beiträge: 162
Registriert: Fr Aug 31, 2018 6:34 pm

Re: Points Funktion und auffinden von Extremwerten

Beitrag 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.
Benni1801
Beiträge: 5
Registriert: So Mär 08, 2020 11:44 am

Re: Points Funktion und auffinden von Extremwerten

Beitrag 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.
Hufeisen
Beiträge: 162
Registriert: Fr Aug 31, 2018 6:34 pm

Re: Points Funktion und auffinden von Extremwerten

Beitrag 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.
Benni1801
Beiträge: 5
Registriert: So Mär 08, 2020 11:44 am

Re: Points Funktion und auffinden von Extremwerten

Beitrag 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 :?:
Hufeisen
Beiträge: 162
Registriert: Fr Aug 31, 2018 6:34 pm

Re: Points Funktion und auffinden von Extremwerten

Beitrag 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
Antworten