在没有周期性错误的情况下分解动物园对象

Decomposing a zoo object without the periodic error

我正在尝试将每日时间序列分解为季节性、趋势和剩余部分。我们可以看一个由 fpp2 包提供的 google 个股票的例子:

正在加载库

library(forecast)
library(lubridate) 
library(zoo)
library(fpp2)

将包裹的时间序列转化为数值向量

google <- as.numeric(goog)

根据文档,google 库存从 2013-02-25 到 2017-02-23

googZ <- zoo(google, seq(from = as.Date("2013-02-25"), to = as.Date("2017-02-23"), by = "days"))

分解(googZ)时出错:时间序列没有或少于 2 个周期

decompose(googZ)

Error in decompose(googZ) : time series has no or less than 2 periods

但是这个有效,我不确定为什么 Google 没有

autoplot(decompose(AirPassengers))
str(AirPassengers)

我不明白为什么会发生这种情况,因为我们清楚地知道并正确定义了我们的时间序列。 请注意,我使用了 zoo 包,因为 ts 无法处理每日时间序列。 非常感谢!

decompose 需要

  • 规则间隔的 ts 系列
  • 每个周期的点数相同,例如每年 365 点假设一年是一个时期
  • 周期为 1
  • 一个周期内的点相隔 delatt,其中 delatt = 1/frequency 和 frequency 是每个周期的点数

Date class 对象表示为自纪元(1970 年 1 月 1 日)以来的天数。由于闰年Date天体每年的点数不一样,连续年份相差365或366,不是1,点相差1,不是deltat相隔

我们可以做些什么来强制将其装入 ts 对象是每年的前 365 天(在闰年这将减少 12 月 31 日)然后使用它。请注意,POSIXlt 对象的 year 组件是自 1900 年以来的年数,因此我们必须将 1900 加回去,并且 yday 组件为 0 表示 1 月 1 日,1 表示 1 月 2 日,依此类推non-leap 年为 364,闰年为 365。

library(ggplot2)
library(zoo)

lt <- as.POSIXlt(time(goog2))
tt <- with(lt, ts(coredata(goog2[yday < 365]), 
  start = year[1] + 1900 + yday[1]/365, frequency = 365))
autoplot(decompose(tt))

给予: