我每天都有关于网站访客数量的时间序列。我的系列从01/06/2014
开始直到今天14/10/2015
,所以我希望预测将来的访客人数。如何用R读取我的系列?我在想:
series <- ts(visitors, frequency=365, start=c(2014, 6))
如果是,并且在运行我的时间序列模型arimadata=auto.arima()
后,我想预测接下来6o天的访问者号码,我该怎么做?
h=..?
forecast(arimadata,h=..),
h
的价值应该是什么?
在此先感谢您的帮助
答案 0 :(得分:20)
ts
规范是错误的;如果您将此设置为每日观察,那么您需要指定2014年的哪一天是6月1日,并在start
中指定:
## Create a daily Date object - helps my work on dates
inds <- seq(as.Date("2014-06-01"), as.Date("2015-10-14"), by = "day")
## Create a time series object
set.seed(25)
myts <- ts(rnorm(length(inds)), # random data
start = c(2014, as.numeric(format(inds[1], "%j"))),
frequency = 365)
请注意,我将start
指定为c(2014, as.numeric(format(inds[1], "%j")))
。所有复杂的一点都在于解决6月1日的哪一天:
> as.numeric(format(inds[1], "%j"))
[1] 152
一旦你有了这个,你就在那里:
## use auto.arima to choose ARIMA terms
fit <- auto.arima(myts)
## forecast for next 60 time points
fore <- forecast(fit, h = 60)
## plot it
plot(fore)
根据我提供的随机数据,这似乎是合适的......
您需要为auto.arima()
选择适合您数据的适当参数。
请注意,x轴标签指的是一年的0.5(一半)。
通过使用 zoo 包创建的zoo
对象可能更容易做到:
## create the zoo object as before
set.seed(25)
myzoo <- zoo(rnorm(length(inds)), inds)
请注意,您现在无需指定任何start
或frequency
信息;只需使用之前inds
个对象中计算的Date
。
像以前一样继续
## use auto.arima to choose ARIMA terms
fit <- auto.arima(myts)
## forecast for next 60 time points
fore <- forecast(fit, h = 60)
该情节会引起问题,因为x轴是自纪元(1970-01-01)以来的天数,因此我们需要抑制此轴的自动绘图然后绘制我们自己的。这很简单,因为我们有inds
## plot it
plot(fore, xaxt = "n") # no x-axis
Axis(inds, side = 1)
这只会产生一些标记的蜱虫;如果你想要更多控制,告诉R你想要的标记和标签:
## plot it
plot(fore, xaxt = "n") # no x-axis
Axis(inds, side = 1,
at = seq(inds[1], tail(inds, 1) + 60, by = "3 months"),
format = "%b %Y")
这里我们每隔3个月进行一次。
答案 1 :(得分:3)
时间序列对象在创建每日时间序列时效果不佳。我建议你使用动物园图书馆。
Library(zoo)
zoo(visitors, seq(from = as.Date("2014-06-01"), to = as.Date("2015-10-14"), by = 1))
答案 2 :(得分:2)
这是一个分步指南,用于预测R中具有多个季节性的每日数据。除非时间序列很长,否则最简单的方法是将频率属性设置为7。
y <- ts(x, frequency=7)
然后,任何通常的时间序列预测方法都应该产生合理的预测。例如
library(forecast)
fit <- ets(y)
fc <- forecast(fit)
plot(fc)
如果时间序列足够长,可以超过一年,那么可能需要考虑年度季节性以及每周季节性。在这种情况下,需要一个多季节模型,如TBATS。
y <- msts(x, seasonal.periods=c(7,365.25))
fit <- tbats(y)
fc <- forecast(fit)
plot(fc)
这应该捕捉每周模式以及更长的年度模式。 365.25期是允许闰年的一年的平均长度。在某些国家/地区,可能需要替代或额外的年份长度。
捕捉与复活节或中国新年等活动相关的季节性变得更加困难。即使有月度数据,这也可能很棘手,因为节日可能会在3月或4月(复活节)或1月或2月(农历新年)下降。通常的季节性模型不允许这样做。处理移动假日效果的最佳方法是使用虚拟变量。但是,ETS和TBATS模型都不允许协变量。可以使用与TBATS相同形式但具有多个误差和协变量源的状态空间模型,但我们没有任何R代码可以做到这一点。
相反,我们可以使用具有ARIMA错误的回归模型,其中回归项包括任何虚拟假日效应以及更长的年度季节性。除非有数十年的数据,否则通常可以合理地假设年度季节性形状每年都保持不变,因此可以使用傅里叶项来模拟年度季节性。假设我们使用K = 5傅立叶项来模拟年度季节性,并且假日虚拟变量在向量假期中,在holidayf中有100个未来值。然后,以下代码将适合适当的模型。
y <- ts(x, frequency=7)
z <- fourier(ts(x, frequency=365.25), K=5)
zf <- fourierf(ts(x, frequency=365.25), K=5, h=100)
fit <- auto.arima(y, xreg=cbind(z,holiday), seasonal=FALSE)
fc <- forecast(fit, xreg=cbind(zf,holidayf), h=100)
可以通过最小化拟合模型的AIC来选择K阶。
答案 3 :(得分:1)
这是当我收到一些日常观察结果而缺少很多观察结果时创建时间序列的方法。 @ gavin-simpson提供了很大的帮助。希望这可以节省一些人的痛苦。
原始数据如下:
library(lubridate)
set.seed(42)
minday = as.Date("2001-01-01")
maxday = as.Date("2005-12-31")
dates <- seq(minday, maxday, "days")
dates <- dates[sample(1:length(dates),length(dates)/4)] # create some holes
df <- data.frame(date=sort(dates), val=sin(seq(from=0, to=2*pi, length=length(dates))))
要使用此数据创建时间序列,我创建了一个“虚拟”数据框,每个日期一行,并将其与现有数据框合并:
df <- merge(df, data.frame(date=seq(minday, maxday, "days")), all=T)
此数据帧可以转换为时间序列。缺少日期是NA
。
nts <- ts(df$val, frequency=365, start=c(year(minday), as.numeric(format(minday, "%j"))))
plot(nts)
答案 4 :(得分:0)
series <- ts(visitors, frequency=365, start=c(2014, 152))
152的编号为01-06-2014,因为频率为365,所以它从152的编号开始 要预测60天,h = 60。
forecast(arimadata , h=60)