Zeitreihe

Methoden der Zeitreihenanalyse

Moderator: schubbiaschwilli

Antworten
HerrTischbein

Zeitreihe

Beitrag von HerrTischbein »

Liebes Forum,
schade um das alte Forum, aber hier sind neue Daten und Probleme :).
Ich habe Pegelmessungen eines Sees über mehrere Jahre und möchte jahreszeitliche Schwankungen des Wasserstandes betrachten.
1. Wie erstelle ich in R eine Zeitreihe mit den festen Zeitpunkten der Messungen (Messungen erfolgten ca. einmal je Woche, aber unregelmäßig und mit Ausfällen)? Ich erhoffe mir über die Zeitreihe vergleichbare (interpolierte Werte?) zu festen Zeitpunkten sowie über den Trend das Fallen und das Steigen des Wasserstandes anzeigen lassen zu können.
2. Wie kann ich mir Min, Max und Mittelwerte für bestimmte Zeitfenster berechnen, z.B. Min, Max, Mean von Jan bis Mrz 2011 bzw. die Werte aller Jahre?
3. Gibt es eine elegantere Lösung für das Filtern nach Jahren/ erstellen eines Vektors je Jahr?
4. Warum erscheint bei mir kein Plot nach dem Befehl lines(pegel....)?
Fragen über Fragen....
Danke schon mal für Eure Hilfe.

Viele Grüße
Pegel.txt
Das ist der Code:

Code: Alles auswählen

pegel.data <- read.table("Pegel.txt", header=TRUE, 
                        sep="\t", na.strings="NA", dec=".", strip.white=TRUE)

pegel.data$Datum <- as.POSIXct(pegel.data$Datum, format = '%d.%m.%Y')
str(pegel.data)

plot(pegel.data$Datum,pegel.data$WSP, type="b")

pegel2008 <- pegel.data[pegel.data$Datum > as.POSIXct("2008-01-01")	
                        & pegel.data$Datum < as.POSIXct("2008-12-31"),]
pegel2009 <- pegel.data[pegel.data$Datum > as.POSIXct("2009-01-01")	
                       & pegel.data$Datum < as.POSIXct("2009-12-31"),]

plot(pegel2008$Datum,pegel2008$WSP, type="l", col="blue",ylim=c(24,26))
lines(pegel2009$Datum,pegel2009$WSP, type="l", col="blue",ylim=c(24,26))
jogo
Beiträge: 2085
Registriert: Fr Okt 07, 2016 8:25 am

Re: Zeitreihe

Beitrag von jogo »

Hallo Herr Tischbein,

hier ein erster Ansatz:

Code: Alles auswählen

pegel.data <- read.table("http://forum.r-statistik.de/download/file.php?id=23", header=TRUE, 
                         sep="\t", na.strings="NA", dec=".", strip.white=TRUE)

# ...

plot(julian(pegel2008$Datum),pegel2008$WSP, type="l", col="blue",ylim=c(24,26))
lines(julian(pegel2009$Datum)-366,pegel2009$WSP, type="l", col="red",ylim=c(24,26))
Bei Deinem ursprünglichen Quelltext wird bei lines(...) nichts angezeigt, weil der Bereich der x-Werte des Diagramms außerhalb des ursprünglichen Plots war (Tage des Jahres 2009 fallen nur ganz selten in das Jahr 2008).

Für die Unterteilung nach Jahren kannst Du auch eine neue Spalte erzeugen:

Code: Alles auswählen

cut(pegel.data$Datum, breaks="year")
Für das Arbeiten mit Datumsangaben gibt es auch zusätzliche Pakete; wahrscheinlich wäre eine Funktion wie "der.wievielte.Tag.im.Jahr(Datum)" für Dich nützlich.

Gruß, Jörg
Benutzeravatar
EDi
Beiträge: 1599
Registriert: Sa Okt 08, 2016 3:39 pm

Re: Zeitreihe

Beitrag von EDi »

Ich habe Pegelmessungen eines Sees über mehrere Jahre und möchte jahreszeitliche Schwankungen des Wasserstandes betrachten.
Endlich mal ein Thema wo ich auch was von verstehe :) [Ich untersuche u.a. auch zeitliche Dynamiken, aber in Fließgewässern].
1. Wie erstelle ich in R eine Zeitreihe mit den festen Zeitpunkten der Messungen (Messungen erfolgten ca. einmal je Woche, aber unregelmäßig und mit Ausfällen)? Ich erhoffe mir über die Zeitreihe vergleichbare (interpolierte Werte?) zu festen Zeitpunkten sowie über den Trend das Fallen und das Steigen des Wasserstandes anzeigen lassen zu können.
Würde das mit ggplot machen. Hab unten mal ein Beispiel-Skript angehängt.
Interpolation, sowie Trends und Saisonalität hab ich (für Temperatur zumindest) gut mit einem GAM hinbekommen. Dazu braucht man einpaar weitere Variablen (auch zum plotten), wie z.b. das Jahr, dein Tag im jahr und den Tag seit Beginn der Messung...
2. Wie kann ich mir Min, Max und Mittelwerte für bestimmte Zeitfenster berechnen, z.B. Min, Max, Mean von Jan bis Mrz 2011 bzw. die Werte aller Jahre?
Geht wunderbar mit data.table. Hab dir ein Beispiel angehängt. Siehe auch diesen Post von mir.
3. Gibt es eine elegantere Lösung für das Filtern nach Jahren/ erstellen eines Vektors je Jahr?
Ja, siehe mein Skript. Am einfachsten ist es eine Variable "Jahr" zu erstellen. Verschiedene Vektoren würde ich nicht erstellen, das müllt nur einen Workspace zu und lässt sich schwer zuordnen. Lieber die Daten beisammen halten.
4. Warum erscheint bei mir kein Plot nach dem Befehl lines(pegel....)?
Weil die x-Werte nicht zusammenpassen. Einmal 2008 und einmal 2009. Eine variable "day-of-year" kann hier helfen (auch das steht in meinem Skript).


HTH,

Edi

Code: Alles auswählen

pegel.data <- read.table("http://forum.r-statistik.de/download/file.php?id=23", header=TRUE, 
                         sep="\t", na.strings="NA", dec=".", strip.white=TRUE,
                         stringsAsFactors = FALSE)
# only measurements
pegel.data <- pegel.data[!is.na(pegel.data$WSP), ]

pegel.data$Datum <- as.Date(pegel.data$Datum, format = '%d.%m.%Y')


require(ggplot2)
ggplot(pegel.data, aes(x = Datum, y = WSP)) +
  geom_point() +
  geom_line()



# day of year (for season)
pegel.data$doy <- as.numeric(strftime(pegel.data$Datum, format = "%j"))
# days since start (for trends)
pegel.data$dss <- as.numeric(pegel.data$Datum - min(pegel.data$Datum))
# year
pegel.data$year <- as.numeric(strftime(pegel.data$Datum, format = "%Y"))


# same plot, as above, but splitted by year
ggplot(pegel.data, aes(x = doy, y = WSP)) +
  geom_point() +
  geom_line() +
  facet_grid(~year)

# same plot, as above, but splitted by year
ggplot(pegel.data, aes(x = doy, y = WSP, col = factor(year))) +
  geom_point() +
  geom_line()


# plot only 2011
ggplot(pegel.data[pegel.data$year == 2011, ], aes(x = Datum, y = WSP)) +
  geom_point() +
  geom_line()



# min/mean/max per year
# I like data.table

library(data.table)
setDT(pegel.data)

# mean/min/max per year
pegel.data[ ,list(min = min(WSP),
                  mean = mean(WSP),
                  max = max(WSP)) , by = year]

# mean/min/max for 1. janu 2008 - 30.march 2008
# pegel.data[Datum > "2008-01-01" &
# # subset only
pegel.data[Datum > "2008-01-01" &
             Datum <= "2008-03-30", ]
# aggregate
pegel.data[Datum > "2008-01-01" &
             Datum <= "2008-03-30", list(min = min(WSP),
                  mean = mean(WSP),
                  max = max(WSP))]

# monthly mean over all year
pegel.data[ ,list(min = min(WSP),
                  mean = mean(WSP),
                  max = max(WSP)) , by = month(Datum)]
# monthly mean separate per year
pegel.data[ ,list(min = min(WSP),
                  mean = mean(WSP),
                  max = max(WSP)) , by = list(year, month(Datum))]

Edit:
jogo war schneller :o , aber ich hab mehr schrieben ;)
jogos erwähnte "der.wievielte.Tag.im.Jahr(Datum)" Funktion hab ich auch drin.
Ich verwenden data.table nur am Ende, aber eigentlich sollte man das direkt von Anfang machen, das macht die zuweisen von dss und doy lesbarer.
Bitte immer ein reproduzierbares Minimalbeispiel angeben. Meinungen gehören mir und geben nicht die meines Brötchengebers wieder.

Dieser Beitrag ist lizensiert unter einer CC BY 4.0 Lizenz
Bild.
HerrTischbein

Re: Zeitreihe

Beitrag von HerrTischbein »

Ihr seid super - habt vielen Dank. Beim ersten Lesen habe ich das Nichtplotten von lines verstanden..... für den Rest brauche ich etwas länger.
Vielen dank und Grüße
P.S. EDI: Wir wollen vielleicht auch mal auf ein Fließgewässer mit dem Versuch :).
Antworten