【问题标题】:Decomposing a zoo object without the periodic error分解没有周期性错误的动物园对象
【发布时间】:2019-10-20 18:46:44
【问题描述】:

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

加载库

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

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

google <- as.numeric(goog)

根据文档,谷歌股票从 2013 年 2 月 25 日到 2017 年 2 月 23 日

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

decompose(googZ) 出错:时间序列的周期数不超过 2 个

decompose(googZ)

decompose(googZ) 出错:时间序列的周期数不超过 2 个

但是这个可以用,我不知道为什么 Google 不能用

autoplot(decompose(AirPassengers))
str(AirPassengers)

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

【问题讨论】:

  • frequency(googZ)frequency(AirPassengers) 之间的差异因此会出现错误。
  • 您的googZ 错误,请改用googZ &lt;- zoo(google, seq(from = as.Date("2013-02-25"), by = "days", length.out = length(google)))
  • @RonakShah Okey 你是对的!我了解 ts 对象(1,4 或 12)的频率参数,但是您如何设法每天在 zoo() 中设置频率?我天真地尝试设置频率 = 365 但没有运气

标签: r time-series xts zoo


【解决方案1】:

decompose 需要

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

Date 类对象表示为纪元(1970 年 1 月 1 日)以来的天数。由于闰年Date 对象每年的点数不同,连续年份之间的差异是 365 或 366,而不是 1,并且点之间相隔 1,而不是相隔 delta。

我们可以强制将其放入ts 对象的方法是在每年的前 365 天(闰年将在 12 月 31 日下降)然后使用它。请注意,year 对象的 year 组件是自 1900 年以来的年数,因此我们必须将 1900 加回去,yday 组件对于 1 月 1 日是 0,对于 1 月 2 日是 1,依此类推,对于非-闰年,闰年为 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))

给予:

【讨论】:

    猜你喜欢
    • 2016-09-19
    • 1970-01-01
    • 2013-02-13
    • 2011-12-14
    • 2011-04-08
    • 1970-01-01
    • 2013-05-15
    • 2021-03-05
    相关资源
    最近更新 更多