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
, 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.