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 具有大端点的函数的主要内容,如果未能解决你的问题,请参考以下文章

如何在具有大端架构的机器上测试您的代码?

小端大端

大端和小端

大端小端法

大端存储和小端存储

大端存储和小端存储