首页 > 解决方案 > 在 ARIMA 或 ETS 预测后为最终结果添加季节性和非平稳性

问题描述

TS<-ts(Product_Dist_Training_Trans[,17], frequency = 7)

plot(TS)
library(tseries)
library(forecast)

TSETS<- TS

adf<- adf.test(TS)

Order<- ndiffs(TS)

if (adf$p.value>.05)
{
for(i in  1:Order){
TSDiff<- diff(TS)  
TS<- TSDiff}} else
{
TS
}

decomp<- decompose(TS)

TSadj<- TS-decomp$seasonal

Arima<- auto.arima(TSadj)
AM<- forecast(Arima, h = 29)
AM$mean
plot(AM)

ETS<- ets(TSETS)
fc <- forecast(ETS, h = 29)
fc$mean
plot(fc)

我正在尝试使用 118 天的训练数据预测 29 天的每日销售量,我同时使用 ARIMA 和 ETS 预测。我在 ARIMA 的最终结果中得到了负值(因为我使 ARIMA 的系列是固定的和非季节性的)以及 ETS,我如何在最终结果中获得正确的预测值?另外我应该如何对这两种方法进行比较以获得更准确的结果?

标签: rforecastingarima

解决方案


首先,您定义了频率 = 7 的时间序列对象,这意味着您正在定义数据的每周季节性

要使用 arima 预测时间序列,请使用以下代码:

TS<-ts(Product_Dist_Training_Trans[,17], frequency = 7)
plot(TS)
library(tseries)
library(forecast)

decomp<-stl(TS , s.window = "periodic") 
plot(decomp)
decomp_components<-as.data.frame(decomp$time.series)

seasonal_component<-ts(decomp_components$seasonal, frequency = 7)

relation1<-auto.arima(seasonal_component,seasonal = T ,max.p = 10, max.q = 10, max.d = 5, max.P = 5, max.Q = 5, max.D = 2, max.order = 30, start.p = 1, start.q = 1)
result1<-forecast(relation1, model = "Arima", h = 29)

plot(result1)
deseasonal_cnt<-seasadj(decomp)
relation2 <- auto.arima(deseasonal_cnt,seasonal = F ,max.p = 10, max.q = 10, max.d = 5,max.P = 5, max.Q = 5, max.D = 2, max.order = 30, start.p = 1, start.q = 1)

result2<-forecast(relation2, model = "Arima",h=29)
plot(result2)
result<-result1$mean+result2$mean

如果这仍然为您提供负值,这意味着趋势分量正在减少,因此为避免负值,请改为使用零

result[result<0]<- 0

您的代码的问题是您只预测了季节性部分,您还必须预测非季节性部分,然后结合结果


推荐阅读