我正在尝试使用R基于每周数据进行时间序列建模和预测,如下所示:
biz week Amount Count
2006-12-27 973710.7 816570
2007-01-03 4503493.2 3223259
2007-01-10 2593355.9 1659136
2007-01-17 2897670.9 2127792
2007-01-24 3590427.5 2919482
2007-01-31 3761025.7 2981363
2007-02-07 3550213.1 2773988
2007-02-14 3978005.1 3219907
2007-02-21 4020536.0 3027837
2007-02-28 4038007.9 3191570
2007-03-07 3504142.2 2816720
2007-03-14 3427323.1 2703761
...
2014-02-26 99999999.9 1234567
关于我的数据:如上所示,每周都标有一周的第一天(我的周从周三开始,到周二结束)。
当我构建我的ts
对象时,我尝试了
ts <- ts(df, frequency=52, start=c(2007,1))
我遇到的问题是:
1)某些年份可能有53周,因此frequency=52
将无法使用这些年;
2)我的开始周/日期是2006-12-27,我该如何设置启动参数?自2006-12-27周以来,start=c(2006,52)
或start=c(2007,1)
真的越过年界?另外,对于建模,最好是拥有完整的年份数据(比如2007年我的开始年份,如果我只有部分年份的数据),最好不要使用2007,而是从2008年开始?那么2014年:既然还不是完整的一年,我应该使用我的建模吗?无论哪种方式,我仍然有一个问题,是否在2006-12-27这样的年份边界中包括那些周。我应该在2007年或2006年的最后一周将其列为wk 1
吗?
3)当我使用ts <- ts(df, frequency=52, start=c(2007,1))
然后将其打印出来时,我得到了如下所示的结果,因此我得到了2007.01,2007.02,2007.52 ......,它得到了2007.000,2007.019,......来自1/52=0.019
。这在数学上是正确的,但不容易解释。有没有办法将它标记为日期本身就像数据框或至少2007 wk1, 2007 wk2...
======
Time Series:
Start = c(2007, 1)
End = c(2014, 11)
Frequency = 52
Amount Count
2007.000 645575.4 493717
2007.019 2185193.2 1659577
2007.038 1016711.8 860777
2007.058 1894056.4 1450101
2007.077 2317517.6 1757219
2007.096 2522955.8 1794512
2007.115 2266107.3 1723002
4)我的目标是对每周数据进行建模,然后尝试将其分解以查看季节性组件。似乎我必须使用ts()
函数转换为ts
对象sp,我可以使用decompose()
函数。我试过了xts()
,我收到一条错误,指出" time series has no or less than 2 periods"
。我想这是因为xts()
不允许我指定频率,对吗?
xts <- xts(df,order.by=businessWeekDate)
5)我在这个论坛和其他地方寻找答案;大多数例子都是每月一次,虽然每周都有一些时间序列问题,但没有一个答案是直截了当的。希望有人可以在这里帮助回答我的问题。
答案 0 :(得分:19)
使用非整数频率效果很好,并且与大多数模型(auto.arima,ets,...)兼容。对于开始日期,我只使用lubridate中的便利函数。这里的重要性是在处理可能不同的开始和结束日期的多个时间序列时保持一致。
library(lubridate)
ts(df$Amount,
freq=365.25/7,
start=decimal_date(ymd("2006-12-27")))
答案 1 :(得分:2)
首先确保您的数据每年只有52个数据。要做到这一点,用53个数据确定年份,并删除对你的季节性模式不太重要的数据(例如,如果你想检查圣诞节销售季节性,请不要在12月删除一周(!)
Xts是一种很好的格式,因为它更灵活,但是所有的分解和预测工具通常都适用于ts,因为它们每个周期需要固定数量的数据。
关于非完整年份的问题。这应该不是问题。 R不知道什么时候是1月或12月,因此一年可以随时开始和结束。
答案 2 :(得分:0)
关于您的第4个问题,我认为错误是因为您只有一个期间数据(52周),并且您可能需要另外52周的数据来完成2个期间。