毎日の平均観測データを含む等間隔の時系列があります。
季節平均を最も簡単に計算するにはどうすればよいですか? 季節は、DJF (=冬: 12 月、1 月、2 月)、MAM、JJA、および SON による気象学の命名法に従う必要があります。
つまり、12 月の値は x-1 年から取得されます。
月次平均の計算は、ここにうまく表示されています: 月次平均を計算する方法は?
季節平均を計算するとき、この考え方に従うことができます。ただし、いくつかの警告により、透明性が低下するため、注意が必要です。
また、以前のスレッドで既にこの問題の小さな部分を扱っていました: How to switch rows in 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 つ目: seas パッケージを使用して、時系列に季節を追加します。これは、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 に関する非常に大きな問題もあります。これはかなり簡単に修正できますが (私は推測します)、与えられた方法をより複雑にします。
周りにもっと良いアイデアがあることを本当に願っています!