8

毎日の平均観測データを含む等間隔の時系列があります。

季節平均を最も簡単に計算するにはどうすればよいですか? 季節は、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 に関する非常に大きな問題もあります。これはかなり簡単に修正できますが (私は推測します)、与えられた方法をより複雑にします。

周りにもっと良いアイデアがあることを本当に願っています!

4

4 に答える 4

4

私はこれがあなたが欲しいものですか?

# # create some data: daily values for three years
df <- data.frame(date = seq(from = as.Date("2007-01-01"),
                            to = as.Date("2009-12-31"),
                            by = "day"))
df$vals <- rnorm(nrow(df))

# add year
df$year <- format(df$date, "%Y")

# add season
df$seas <- mkseas(x = df, width = "DJF")

# calculate mean per season within each year
df2 <- aggregate(vals ~ seas + year, data = df, mean)

df2
#    seas year         vals
# 1   DJF 2007 -0.048407610
# 2   MAM 2007  0.086996842
# 3   JJA 2007  0.013864555
# 4   SON 2007 -0.081323367
# 5   DJF 2008  0.170887946
# 6   MAM 2008  0.147830260
# 7   JJA 2008  0.003008866
# 8   SON 2008 -0.057974215
# 9   DJF 2009 -0.043437437
# 10  MAM 2009 -0.048345979
# 11  JJA 2009  0.023860506
# 12  SON 2009 -0.060076870

mkseas日付を希望の順序でレベルを持つ季節要因に変換するため、年と季節の集計後も順序は正しくなります。

于 2013-09-24T20:15:28.037 に答える
1

前述のように、非常に単純な解決策が考えられます (こちらにも投稿されています)。動物園のパッケージを組み合わせて季節ごとに集計すると、次のようになります。

library(zoo); library(seas)

seasTS <- aggregate(dataTS, mkseas(x=time(dataTS),width="DJF"), sum)

年ごとにこれを行うには、単に年ごとに mkseas() をループします。シンタックスシュガーを少し入れたコーヒーをお願いします。

乾杯、

アダム

于 2015-09-18T18:44:59.907 に答える