向前一步,在 R 中一次只接收一个值的样本预测

one-step ahead, out of sample forecast from only one value received at a time, in R

我有 100 个时间序列训练数据值,我使用 auto.arima 从中查找模型顺序和系数。

我从传感器接收流值,一次一个。收到一个值后,我需要从 auto.arima 获得的模型对象 forecast/predict 下一个值(仅一步 ahead/single 值)。我根据某些事件更新模型系数,但现在没有必要提及它们。在传感器工作之前进行前进预测。

这些是我的样本训练和测试数据: https://drive.google.com/open?id=0B3UpwQBKryLleXdtMkQyOXVDcW8

这是我的代码。模型有一定的约束条件,相应设置。

data<-read.csv('Whosebug_data.csv',header=TRUE, sep=",");
data1<-data[[1]];  # first 100 points of data - training data
mdl<-auto.arima(data1,max.p=3, max.q=3,max.d=1, stepwise=FALSE, approximation = FALSE,allowdrift=TRUE, allowmean=TRUE);
summary(mdl);

Series: data1 
ARIMA(1,0,1) with non-zero mean 

Coefficients:
         ar1     ma1  intercept
      0.7456  0.2775   767.7463
s.e.  0.0804  0.1197     0.1072

sigma^2 estimated as 0.04944:  log likelihood=9.34
AIC=-10.69   AICc=-10.27   BIC=-0.27

Training set error measures:
                       ME      RMSE       MAE           MPE       MAPE
Training set -0.004354719 0.2189945 0.1706344 -0.0005753987 0.02222701
                  MASE        ACF1
Training set 0.9063639 -0.01022176

对于样本内数据,在(红色图)中手动生成一步预测,并在(绿色图)中使用拟合(mdl)。下面显示的是它们与原始训练数据(黑色图)的组合图。

这是手动提前一步预测的代码。

res_1 = 0;
res_2 = 0;
constant_1 = mdl$coef [["intercept"]] * (1 - mdl$coef [["ar1"]]);
fc = 0;
for (i in 1:length(data1)){
  fc[i] <-constant_1 +(mdl$coef [["ar1"]]*(data1[i] )) + (mdl$coef [["ma1"]]*(res_1)); # one-step ahead forecast for in-sample data
res_2[i] = data1[i] - fc[i];
res_1 = data1[i] - fc[i];
}

one step ahead forecast : in-sample data plot

这些是我的问题:

(1) 通过观察剧情(我已经在上面分享了图片link,因为信誉分数我不能post图片),似乎拟合(mdl)预测偏离了一个时间单位。如何纠正?

(2) 共享link中的测试数据是未来要做一步预测的数据。此数据一次按顺序出现一个值。我们如何根据在该时间点收到的单个值预测单个下一个值,直到时间算法不断获取值?

  1. 您将 AR(1) 系数乘以当前观察值而不是之前的观察值。

  2. 将 ARIMA 模型重新拟合到测试数据。

在 R 中轻松完成:

library(forecast)

data <- read.csv('Whosebug_data.csv', header=TRUE, sep=",")
data1 <- ts(data[[1]][1:100])  # first 100 points of data - training data
mdl <- auto.arima(data1, max.p=3, max.q=3, max.d=1, 
         stepwise=FALSE, approximation=FALSE, allowdrift=TRUE, allowmean=TRUE)

# One-step forecasts on training data
plot(data1)
lines(fitted(mdl), col='red')

# One-step forecasts on test data
data2 <- ts(data[[2]], start=length(data1)+1)
data12 <- ts(c(data1,data2))
mdl2 <- Arima(data12, model=mdl)
plot(data2)
lines(window(fitted(mdl2), start=101), col='red')