ste*_*han 7 r time-series mean
我将时间序列与每日平均观察数据均匀地隔开.
如何计算季节性意味着最简单的方法?季节应遵循DJF(=冬季:12月,1月,2月),MAM,JJA和SON的气象命名.
这意味着12月的价值来自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
Run Code Online (Sandbox Code Playgroud)
1st:使用海洋包装并为您的时间序列添加季节,必须将其格式化为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
Run Code Online (Sandbox Code Playgroud)
这给了
> 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
Run Code Online (Sandbox Code Playgroud)
第二:您可以使用$ 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
Run Code Online (Sandbox Code Playgroud)
注意:由于严格的字母排序,弹簧(MAM)和夏季(JJA)被切换.
第三:切换回来
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
Run Code Online (Sandbox Code Playgroud)
最后,这导致了季节性手段的时间序列.好吧,我把它弄得太复杂了,我想有更简单的解决方案.
此外,这个解决方案也是冬季DJF的一个非常重要的问题:到目前为止,12月是没有选择的.这很容易修复(我猜),但使得给定的方式前夕更复杂.
我真的希望有更好的想法!
我这就是你想要的吗?
# # 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
Run Code Online (Sandbox Code Playgroud)
由于mkseas将日期转换为季节性因素,其级别按所需顺序排列,因此在对年份和季节进行聚合后,顺序也是正确的。
| 归档时间: |
|
| 查看次数: |
2754 次 |
| 最近记录: |