代码之家  ›  专栏  ›  技术社区  ›  Serk

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

  •  2
  • Serk  · 技术社区  · 6 年前

    我有从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))
    

    这样地 plot

    1 回复  |  直到 6 年前
        1
  •  1
  •   Terru_theTerror    6 年前

    如果我正确理解了您的问题,这可能是一个解决方案:

    步骤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\u 00,所有假数据(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)我在同一个图上绘制原始数据(段落\u 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