缺少周末值的时间序列并在图中保留日期
Time series with missing weekend value and keep date in plot
我从 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))
像这样
如果我正确理解你的问题,这个可能是一个解决方案:
第 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
我从 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))
像这样
如果我正确理解你的问题,这个可能是一个解决方案:
第 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