向前一步,在 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中的测试数据是未来要做一步预测的数据。此数据一次按顺序出现一个值。我们如何根据在该时间点收到的单个值预测单个下一个值,直到时间算法不断获取值?
您将 AR(1) 系数乘以当前观察值而不是之前的观察值。
将 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')
我有 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中的测试数据是未来要做一步预测的数据。此数据一次按顺序出现一个值。我们如何根据在该时间点收到的单个值预测单个下一个值,直到时间算法不断获取值?
您将 AR(1) 系数乘以当前观察值而不是之前的观察值。
将 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')