时间序列缺少周末值并在图中保留日期

时间:2018-01-03 15:35:02

标签: r time-series var forecasting arima

我从2012-11-19到2017-10-16每天有1241个数据,但仅限于工作日(自助餐厅的服务数量)。我试图做预测,但我在初始化时间序列时遇到了问题:

timeseries = ts(passage, frequency = 365,
   start = c(2012, as.numeric(format(as.Date("2012-11-19"), "%j"))),
   end = c(2017, as.numeric(format(as.Date("2017-10-16"), "%j"))) )

如果我喜欢这样,因为周末缺席,我的变量将在到达1241之后循环回来,一直到1791(对应于我的2日期之间的天数)以及我是否想要制作火车时间序列,选择参数"结束"将使其与实际日期的数据不对应。

所以我可以克服这个问题吗?我知道我可以直接创建我的时间序列(并且我选择了正确的频率?,如果我将5或7轴放入很远的年份)

timeseries = ts(passage, frequency = 365)

但是我没有选择开始和约会的能力,并且无法在情节中看到该信息

编辑:我希望将其保留为5天的每周数据的原因是,当我绘制预测时,我不会在情节中获得大量的零

plot(forecast(timeseries_00))

喜欢这个plot

1 个答案:

答案 0 :(得分:1)

如果我理解你的问题,那么这个可能是一个解决方案:

步骤1)我创建一个长度为1241的时间序列(段落),与你的一样。

passage<-rep(1:1241)

"passage" time series

步骤2)我在矩阵中转换时间序列,其中每一列都是工作日(因为时间序列在星期一结束时添加4个零),之后我将另外两列添加到矩阵中,值为零(星期六)和星期天),我回到使用函数unmatrix(包gdata)的时间序列,我删除了最后6个零(我自己添加4个,周日和星期六列添加2个)

passage_matrix<-cbind(t(matrix(c(passage,c(0,0,0,0)),nrow = 5)),0,0)
library(gdata)
passage_00<-as.numeric(unmatrix( passage_matrix  ,byrow=T))
passage_00<-passage_00[1:(length(passage_00)-6)]

步骤3)我创建了我的新时间序列

timeseries_00 = ts(passage_00, 
                   frequency = 365,
                   start = c(2012, as.numeric(format(as.Date("2012-11-19"), 
                   "%j"))))

步骤4)现在,我能够使用正确的日期标签绘制时间序列(仅在下面的例子中为工作日)

date<-seq(from=as.Date("2012-11-19"),by=1,length.out=length(timeseries_00))
plot(timeseries_00[timeseries_00>0],axes=F)
axis(1, at=1:length(timeseries_00[timeseries_00>0]), labels=date[timeseries_00>0])

"passage" time series with right date

步骤4)预测时间序列

for_00<-forecast(timeseries_00)

步骤5)我必须修改我的原始时间序列,以便在预测数据和原始数据之间具有相同的长度

length(for_00$mean) #length of the prediction 
passage_00extended<-c(passage_00,rep(0,730)) #Add zeros for future date
timeseries_00extended = ts(passage_00extended, frequency = 365,
                   start = c(2012, as.numeric(format(as.Date("2012-11-19"), "%j"))))
date<-seq(from=as.Date("2012-11-19"),by=1,length.out=length(timeseries_00extended))

步骤6)我必须修改预测数据,以便具有相同长度的timeseries_00extended,所有假数据(0值)都在&#34; NA&#34;

中更改
pred_mean<-c(rep(NA,length(passage_00)),for_00$mean) #Prediction mean
pred_upper<-c(rep(NA,length(passage_00)),for_00$upper[,2]) #Upper 95%
pred_lower<-c(rep(NA,length(passage_00)),for_00$lower[,2]) #Lower 95%
passage_00extended[passage_00extended==0]<-rep(NA,sum(passage_00extended==0))

步骤7)我在相同的图上绘制原始数据(passage_00extended)和预测(平均值[蓝色]和上限和下限[橙色]的不同颜色)

plot(passage_00extended,axes=F,ylim=c(1,max(pred_upper[!is.na(pred_upper)])))
lines(pred_mean,col="Blue")
lines(pred_upper,col="orange")
lines(pred_lower,col="orange")
axis(1, at=1:length(timeseries_00extended), labels=date)

Plot: Forecast