我有100个时间序列的训练数据值,我使用auto.arima来查找相同的模型顺序和系数 .
我从传感器接收流值,一次一个 . 在接收到一个值时,我需要从从auto.arima获得的模型对象预测/预测下一个值(仅提前一步/单个值) . 我在某些事件上更新模型系数,但现在没有必要提及它们 . 在传感器工作之前进行一步一步的预测 .
这些是我的示例培训和测试数据:https://drive.google.com/open?id=0B3UpwQBKryLleXdtMkQyOXVDcW8
这是我的代码 . 模型有一些约束,相应地设置 .
data<-read.csv('stackoverflow_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)通过观察情节(我上面有共享图像链接,因为我不能发布由于信誉评分而出现的图像), it seems that the fitted(mdl) forecasts are off by one time unit . 如何纠正?
(2)共享链路中的测试数据是将要进行一步预测的未来数据 . 该数据一次顺序一个值 . 我们如何从那个时间点收到的单个值预测单个下一个值,直到时间算法不断获得值?
1 回答
您将AR(1)系数乘以当前观测值而不是之前的观测值 .
将ARIMA模型重新拟合到测试数据 .
在R中轻松完成: