R中的时间序列:如何设置两年的每周时间?

时间:2019-05-30 18:05:34

标签: r time-series arima

我有两年的每周时间(7天)的时间序列。我有58个值。开始是:2017-08-05,结束是:2018-09-08。我需要在R中使用此时间序列-使用SARIMA模型等进行预测。但是在R中定义周期/频率时遇到了问题。当我使用分解函数时,出现错误:"time series has no or less than 2 periods"。 Arima功能无法正常工作。详细信息如下。我可以通过什么方式以要求的频率导入数据以供在R中使用?

我的数据(简短示例):

文件:sessions2.csv

date        count
11.11.2017  55053
18.11.2017  45256
25.11.2017  59091
2.12.2017   50030
9.12.2017   41769
16.12.2017  63042
23.12.2017  51838
30.12.2017  47652
6.1.2018    18731
13.1.2018   54470
20.1.2018   22514
27.1.2018   63818
3.2.2018    51605
10.2.2018   26312
17.2.2018   11111

data1.csv仅包含值。例如:

53053
45256
59091
50045
41769
65042
51838

我在R中尝试过

sessions1 <- scan("data1.csv")
sessionsTS <- ts(sessions1, frequency=52, start=decimal_date(ymd("2017-11-11")))

输出sessionTS和错误:

> sessionsTS
Time Series:
Start = 2017.59178082192 
End = 2018.68418328598 
Frequency = 52 

请问哪种时间格式代表这些数字(开始,结束)?以及我可以使用哪种方式转换为十进制日期?

> sessionsComponents <- decompose(sessionsTS)
Error in decompose(sessionsTS) : 
  time series has no or less than 2 periods

> arima(sessionsTS, order = c(0, 1, 0), seasonal = list(order = c(2, 0, 0), period = 52), xreg = NULL, include.mean = TRUE)
Error in optim(init[mask], armaCSS, method = optim.method, hessian = FALSE,  : 
  initial value in 'vmmin' is not finite

> fit <- Arima(sessionsTS, order = c(0, 1, 0), seasonal = list(order = c(2, 0, 0), period = 52))
Error in optim(init[mask], armaCSS, method = optim.method, hessian = FALSE,  : 
  initial value in 'vmmin' is not finite

> sarima(sessionsTS,1,1,0,2,0,0,52)
Error in sarima(sessionsTS, 1, 1, 0, 2, 0, 0, 52) : 
  unused arguments (0, 0, 52)

接下来我尝试了

dataSeries <- read.table("sessions2.csv", header=TRUE, sep = ";", row.names=1)
dataTS <- as.xts(dataSeries , frequency=52, start=decimal_date(ymd("2017-11-11")))

> sessionsComponents2 <- decompose(dataTS)
Error in decompose(dataTS) : time series has no or less than 2 periods 

> model = Arima(dataTS, order=c(0,1,0), seasonal = c(2,0,0))
> model
Series: dataTS 
ARIMA(0,1,0)

在这种情况下,使用Arima时没有季节性...

非常感谢您的帮助。

1 个答案:

答案 0 :(得分:1)

您的数据每周采样一次,因此如果周期也为一周,则需要设置frequency=1,但此时无需进行季节性建模。像设置frequency=52一样,有一个年度周期是很有意义的,但是您没有足够的周期来进行任何估算,因此您至少需要104次观测(至少两个周期,例如错误消息说明)。

简而言之,除非获得更多数据,否则您将无法做想做的事。

部分回答有关ts()和时间格式的问题。如果您这样做:

tt <- read.table(text="
date        count
11.11.2017  55053
18.11.2017  45256
25.11.2017  59091
2.12.2017   50030
9.12.2017   41769
16.12.2017  63042
23.12.2017  51838
30.12.2017  47652
6.1.2018    18731
13.1.2018   54470
20.1.2018   22514
27.1.2018   63818
3.2.2018    51605
10.2.2018   26312
17.2.2018   11111", header=TRUE)

tt$date <- as.Date(tt$date, format="%d.%m.%Y")

ts(tt$count, frequency=52, start=c(2017, 45))
# Time Series:
# Start = c(2017, 45) 
# End = c(2018, 7) 
# Frequency = 52 
#  [1] 55053 45256 59091 50030 41769 63042 51838 47652 18731
#      54470 22514 63818 51605 26312 11111

start在2017年的第45周,而end在2018年的第7周。

您可以使用format(tt$date, "%W")查找星期数。查看?strptime了解更多详细信息,并了解%W的含义。