[R] Finding seasonal peaks in a time series....
Gabor Grothendieck
ggrothendieck at myway.com
Fri Jan 14 03:49:34 CET 2005
Dr Carbon <drcarbon <at> gmail.com> writes:
:
: I have a seasonal time series. I want to calculate the annual mean
: value of the time series at its peak
:
: (say the mean of the three values before the peak, the peak, and the
: three values after the peak).
:
: The peak of the time series might change cycle slightly from year to year.
:
: # E.g.,
: nPts <- 254
: foo <- sin((2 * pi * 1/24) * 1:nPts)
: foo <- foo + rnorm(nPts, 0, 0.05)
: bar <- ts(foo, start = c(1980,3), frequency = 24)
: plot(bar)
: start(bar)
: end(bar)
:
: # I want to find the peak value from each year, and then get the mean
: of the values on either side.
: # So, if the peak value in the year 1981 is
: max.in.1981 <- max(window(bar, start = c(1981,1), end = c(1981,24)))
: # e.g, cycle 7 or 8
: window(bar, start = c(1981,1), end = c(1981,24)) == max.in.1981
: # E.g. if the highest value in 1981 is in cycle 8 I want
: mean.in.1981 <- mean(window(bar, start = c(1981,5), end = c(1981,11)))
: plot(bar)
: points(ts(mean.in.1981, start = c(1981,8), frequency = 24), col =
: "red", pch = "+")
:
: Is there a way to "automate" this for each year.
Calculate the moving average of bar, which we call barma, and define a
function f which takes a two column structure, locates
the largest entry in column 1 and returns the corresponding
entry in column 2. Use 'by' to apply f to the two columns, bar and barma
for each year. Finally convert result back to a ts object.
barma <- filter(bar, rep(1,7)/7)
f <- function(bar) bar[which.max(bar[,1]),2]
barpeakavg <- by(cbind(bar, barma), floor(time(bar)+.0001), f)
barpeakavg.ts <- ts(barpeakavg, start = start(time(aggregate(bar))))
:
: How can I return the cycle of the max value by year?
:
aggregate(bar, FUN = which.max)
More information about the R-help
mailing list