预测现有的时间序列数据

3

我有一个名为rData的时间序列数据框。该数据分为四个季度,可使用四年的数据。我对数据进行了分析,并将ARIMA模型拟合到系列中,现在我可以计算出接下来几个时期的预测值。但是我希望在我的数据框中创建一个新列,显示与可用时间戳相对应的预测值。然后我想在R中将这两个图表绘制在一起。是否有一种方法可以在R中计算出这些预测值,而无需在可用时间戳之前逐个分析所有数据?另外需要多少周期的数据才能进行预测?

Date <- seq(as.Date("2000-01-01"), as.Date("2003-12-31"), by = "quarter")
Sales <- c(2.8,2.1,4,4.5,3.8,3.2,4.8,5.4,4,3.6,5.5,5.8,4.3,3.9,6,6.4)
rData <- data.frame(Date, Sales)

tsData <- ts(data = rData$Sales, start = c(2000, 1), frequency = 4)

> tsExcelData
     Qtr1 Qtr2 Qtr3 Qtr4
2000  2.8  2.1  4.0  4.5
2001  3.8  3.2  4.8  5.4
2002  4.0  3.6  5.5  5.8
2003  4.3  3.9  6.0  6.4

myModel <- auto.arima(tsData)

myForcast <- forecast(myModel, level = 95, h = 8)

最终结果应该是一个有额外列的数据框和一个包含两个图的图表,一个是实际数据的图,另一个是预测数据的图。就像这样:

实际数据 vs 预测数据:

2个回答

1

你是不是想要过去的数值?如果是,只需将以下代码添加到您的代码中:

extract_fitted_values <- myModel$fitted

plot(tsData, xlab = "Time", ylab = "Sales", type = "b", pch = 19)
lines(extract_fitted_values, col = "red")

正如您所见,您可以从模型拟合中提取拟合值。
关于您的问题:在运行auto.arima模型时,实际上分析了预测时间之前的数据。
这就是Arima模型估计参数的方式(使用过去的数据),然后进行预测。只是使用auto-arima函数时,它会自动选择模型规范。
因此,基本上先前的数据分析是随后预测的先决条件。值得注意的是,您在这里看到的红线代表拟合值,即您的模型使用直到最后时间点的所有数据点来计算并生成这些数字。
如果这一点不太清楚,可以在https://stats.stackexchange.com/questions/260899/what-is-difference-between-in-sample-and-out-of-sample-forecasts这里了解更多。
如果您想对过去的数据(2000-2004)进行“样本外”预测,那么这也是可能的,但您需要在2000-2002上进行拟合,产生1步预测,然后向前滚动1个季度并重复相同的操作。

谢谢,只是为了确保我完全理解。假设我有未来四年的数据,假设数据继续按照目前的趋势和季节性组成部分进行,没有极值,并在添加额外的实际观察之前为每个季度创建一个预测。在可用数据的8年结束时,用于描述该时间点处数据的模型的拟合值应该大致对应于整个额外四年计算的预测值? - Bernard
让我确认一下我理解你的意思: 步骤1)你使用2000-2004年的数据来估计你的模型。 步骤2)然后,你想使用在步骤1中估计的那个模型来预测2005-2008年的数据。对吗?如果是的话,并且如果你实际的未知数据生成过程被步骤1中估计的模型充分描述,则预测值应该大致对应于实际值。请记住,这是一个很大的假设,最好有一些数据可以用来评估它。(例如,在2005-2008年期间计算拟合值和实际值之间的误差) - Jean_N
是的,这是正确的。只有针对2004年第一季度(Q1)计算预测值,而不是整个2004-2007年期间,然后将其与该年度该季度的实际观察结果进行比较。一旦考虑到新的观察结果,就会再次计算预测值,基于新的实际信息,用于该年度的下一个季度(2004年Q2)。因此,我不希望假设该模型正确预测了2004-2007年的预测值。但感谢您回答我的问题,您的意见使我对TS有了更深入的了解。 - Bernard

1
如果您想将它们转换为data.frame并绘制实际值与拟合值+预测值的对比图,可以尝试以下方法:
df <- data.frame( # your data and some NAs, for the forecasting
                  real = c(tsData, rep(NA,length(data.frame(myForcast)$Point.Forecast )))
                  # in a vector the fitted and the predicted
                , pred = c(myModel$fitted, data.frame(myForcast)$Point.Forecast)
                  # the time for the plot
                , time = c(time(tsData), seq(2004,2005.75, by = 0.25)
                            ))

plot(df$real, xlab = "time", ylab = "real black, pred red", type = "b", pch = 19,xaxt="n")
lines(df$pred, col = "red")
axis(1, at=1:24, labels=df$time)

enter image description here

关于理论部分,如前所述,当您运行模型时,会计算出拟合值。运行模型是进行预测的基础,但您也可以只有拟合而没有预测。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接