period.apply 具有大端点的函数
Posted
技术标签:
【中文标题】period.apply 具有大端点的函数【英文标题】:period.apply function with large endpoints 【发布时间】:2021-09-20 19:35:58 【问题描述】:我有一个时间序列,想使用 period.apply()
函数 xts
库来估计 377 天的平均值
可重现的例子如下
zoo.data <- zoo(rnorm(5031)+10,as.Date(13514:17744,origin="1970-01-01"))
ep <- endpoints(zoo.data,'days', k =377)
period.apply(zoo.data, INDEX=ep, FUN=function(x) mean(x))
生成的输出是
2007-05-28 2007-12-31 2008-10-05 2008-12-31 2009-02-02 2009-12-31
9.905663 9.800760 10.006344 10.052163 10.152453 10.032073
2010-06-13 2010-12-31 2011-10-22 2011-12-31 2012-02-18 2012-12-31
9.879439 10.038644 9.957582 9.977026 9.959094 10.004348
2013-06-29 2013-12-31 2014-11-07 2014-12-31 2015-03-06 2015-12-31
10.004620 10.086071 9.902875 9.843695 9.851306 10.072610
2016-07-14 2016-12-31 2017-11-23 2017-12-31 2018-03-22 2018-08-01
9.966911 10.199251 10.001628 10.263590 10.181235 10.059080
输出是意外的,因为每个日期的差异不是 377。输出显示它在年底 20xx-12-31 停止,然后移动到下一个端点
【问题讨论】:
【参考方案1】:我不确定你是否可以直接使用endpoints
函数来解决这个问题。
这是使用内置函数解决它的一种方法。这是一个略
一般解决方案。
在下面的代码中,您可以取消注释注释行以打印最后一个区间内的观察次数。
library(xts)
apply.fun <- function(data, variable=1, fun=mean, k=377) # variable: variable name or column index
data <- as.xts(data)
variable <- data[, variable, drop=TRUE]
idx <- index(data)
byindex <- as.integer(idx - first(idx)) %/% k # intervals idendifiers
endates <- idx[!duplicated(byindex, fromLast=TRUE)]
ans <- setNames(tapply(variable, byindex, fun), endates)
#inter.end <- sum(byindex==last(byindex))
#if(inter.end < k) cat(sprintf("Last internal has fewer observations: %d<k=%d\n\n", inter.end, k))
return(as.xts(as.matrix(ans)))
set.seed(147)
zoo.data <- zoo(rnorm(5031)+10,as.Date(13514:17744,origin="1970-01-01"))
apply.fun(zoo.data, 1, mean)
# [,1]
# 2008-01-12 10.043735
# 2009-01-23 10.042741
# 2010-02-04 9.957842
# 2011-02-16 10.016998
# 2012-02-28 9.932871
# 2013-03-11 9.932731
# 2014-03-23 10.045344
# 2015-04-04 10.015821
# 2016-04-15 10.015023
# 2017-04-27 10.038887
# 2018-05-09 9.978744
# 2018-08-01 10.004074
【讨论】:
以上是关于period.apply 具有大端点的函数的主要内容,如果未能解决你的问题,请参考以下文章