首页 文章

在R中,从一次收到的一个值中抽样一次,超出样本预测

提问于
浏览
1

我有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 回答

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

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

    在R中轻松完成:

    library(forecast)
    
    data <- read.csv('stackoverflow_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')
    

    enter image description here

    # 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')
    

    enter image description here

相关问题