【问题标题】:Time series with missing weekend value and keep date in plot缺少周末值的时间序列并在图中保留日期
【发布时间】:2018-01-03 15:35:02
【问题描述】:

我有 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 日期之间的天数),如果我想坐火车时间序列,选择带有参数“end”的日期会使其与实际日期的数据不对应。

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

timeseries = ts(passage, frequency = 365)

但我失去了选择开始和结束日期的能力,并且无法在情节中看到该信息

编辑:我想将其保留为 5 天的每周数据的原因是,当我绘制预测时,我不会在图中得到很多零

plot(forecast(timeseries_00))

喜欢这个

【问题讨论】:

    标签: r time-series var forecasting arima


    【解决方案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 值)都在“NA”中更改

    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

    【讨论】:

    • 感谢您的帮助,我正在尝试,到目前为止看起来还不错,但在最后一行,我遇到了错误:Error in date[timeseries_00 &gt; 0] : object of type ‘closure’ is not subsettable 因为它认为我正在调用该函数date(),我想知道你是怎么做到的
    • 经过测试,我遇到了一个最初的问题:预测时,0 值使得plot 难以可视化
    • 我在可视化部分仍然有帮助,所以谢谢你,很抱歉我无法更好地解释自己
    • 好的,祝你有美好的一天。
    猜你喜欢
    • 1970-01-01
    • 2015-01-05
    • 2015-08-08
    • 2020-04-30
    • 2018-06-01
    • 2016-11-21
    • 2020-12-19
    • 2017-01-08
    • 1970-01-01
    相关资源
    最近更新 更多