У меня есть временные ряды с равномерно распределенными средними данными наблюдений за день.
Как проще всего вычислить сезонные средние значения? Сезоны должны соответствовать метеорологической номенклатуре с DJF (= зима: декабрь, январь, февраль), MAM, JJA и SON.
Это означает, что декабрьские значения относятся к году x-1.
Расчет месячных средних значений красиво представлен здесь: Как рассчитать среднемесячное среднее значение?
Этой идее можно следовать при вычислении среднесезонных значений. Однако несколько предостережений делают его не очень прозрачным, и нужно быть осторожным!
Я также рассмотрел небольшую часть этой проблемы уже в предыдущем потоке: Как переключать строки в R?
Вот теперь полная история:
0: создайте случайный временной ряд.
ts.pdsi <- data.frame(date = seq(
from=as.Date("1901-01-01"),
to=as.Date("2009-12-31"),
by="day"))
ts.pdsi$scPDSI <- rnorm(dim(ts.foo)[1], mean=1, sd=1) # add some data
1-й: используйте пакет sea и добавьте сезоны в свой временной ряд, который должен быть отформатирован как data.frame.
library(seas)
# add moth/seasons
ts.pdsi$month <- mkseas(ts.pdsi,"mon") # add months
ts.pdsi$seas <- mkseas(ts.pdsi,"DJF") # add seasons
ts.pdsi$seasyear <- paste(format(ts.pdsi[,1],"%Y"),
ts.pdsi$seas ,sep="") # add seasyears, e.g. 1950DJF
это дает
> head(ts.pdsi)
date scPDSI month seas seasyear
1 1901-01-01 -0.10881074 Jan DJF 1901DJF
2 1901-02-01 -0.22287750 Feb DJF 1901DJF
3 1901-03-01 -0.12233192 Mär MAM 1901MAM
4 1901-04-01 -0.04440915 Apr MAM 1901MAM
5 1901-05-01 -0.36334082 Mai MAM 1901MAM
6 1901-06-01 -0.52079030 Jun JJA 1901JJA
2-й. Затем вы можете рассчитать средние за сезон, используя вышеупомянутый подход, используя столбец $ seasyear.
> MEAN <- tapply(pdsi$scPDSI, ts.pdsi$seasyear, mean, na.rm = T)
> head(MEAN)
1901DJF 1901JJA 1901MAM 1901SON 1902DJF 1902JJA
-0.45451556 -0.72922229 -0.17669396 -1.12095590 -0.86523850 -0.04031273
ПРИМЕЧАНИЕ: весна (MAM) и лето (JJA) переключаются из-за строгой сортировки по алфавиту.
3-й: верните его
foo <- MEAN
for(i in 1:length(MEAN)) {
if (mod (i,4) == 2) {
foo[i+1] <- foo[i] #switch 2nd 3rd row (JJA <-> MAM)
foo[i] <- MEAN[i+1]
}
}
# and generate new names for the array
d <- data.frame(date=seq(from=as.Date("1901-01-01"), to=as.Date("2009-12-31"), by="+3 month"))
d$seas <- mkseas(d,"DJF")
d$seasyear <- paste(format(d[,1],"%Y"), d$seas ,sep="")
names(foo)<-d$seasyear # add right order colnames
MEAN <-foo
Наконец, это приводит к временному ряду сезонных средних значений. Что ж, я решил, что это слишком сложно, и я думаю, что есть гораздо более простые решения.
Кроме того, это решение также имеет действительно серьезную проблему с зимним сезоном DJF: декабрь пока не выбирается из предыдущего года. Это довольно легко исправить (я думаю), но усложняет данный путь.
Я очень надеюсь, что есть идеи получше!
dd <- c(Sys.Date(), as.Date(c("2013-11-30", "2013-12-01"))); season_year <- as.numeric(format(dd + 31, "%Y"))
. - person Josh O'Brien   schedule 24.09.2013