在 R 中的动物园时间序列上移动 window

Moving window over zoo time series in R

我 运行 在将移动 window 函数应用于时间序列数据集时遇到了问题。我已将每日流量数据(日期和值)导入到动物园对象中,近似值如下:

library(zoo)
df <-  data.frame(sf = c("2001-04-01", "2001-04-02", "2001-04-03", "2001-04-04", 
                         "2001-04-05", "2001-04-06", "2001-04-07", "2001-06-01", 
                         "2001-06-02", "2001-06-03", "2001-06-04", "2001-06-05", 
                         "2001-06-06"), 
                      cfs = abs(rnorm(13)))
zoodf <- read.zoo(df, format = "%Y-%m-%d")

因为我想计算每个月的 3 天移动最小值,所以我使用 rollapply 定义了一个函数:

f.3daylow <- function(x){rollapply(x, 3, FUN=min, align = "center")}

然后我使用聚合:

aggregate(zoodf, by=as.yearmon, FUN=f.3daylow)

这会及时returns一条错误信息:

Error in zoo(df, ix[!is.na(ix)]) : 
  “x” : attempt to define invalid zoo object

问题似乎是每个月的数据点数量不相等,因为使用相同的数据框和 6 月的附加日期会导致正确的响应。任何有关如何处理此问题的建议都将不胜感激!

好的,那你可能会想到这样的事情。它将每个月的结果粘贴到一个数据点中,以便它可以在聚合函数中返回。否则,您还可以查看 ?aggregate.zoo 以获得更精确的数据操作。

f.3daylow <- function(x){paste(rollapply(x, 3, FUN=min, 
               align = "center"),  collapse=", ")}

data <- aggregate(zoodf, by=as.yearmon, FUN=f.3daylow)

Returns,这是将 3 个复制到 1 个数据点的滚动 window。要分析它,最终还是要分解一遍,所以不推荐。

Apr 2001 
0.124581285281643, 0.124581285281643, 0.124581285281643,
0.342222172241979, 0.518874882033892 
June 2001 
0.454158221843514, 0.454158221843514, 0.656966528249837,
0.513613009234435 

最终您可以通过 strsplit(data[1],", ") 再次将其剪切,但请参阅 Convert comma separated entry to columns 了解更多详情。