结合预测包中的 auto.arima() 和 ets()

机器算法验证 r 时间序列 预测 指数分布 有马
2022-03-31 14:51:15

我一直在使用预测包中的 ets() 和 auto.arima() 函数来预测大量单变量时间序列。我一直在使用以下函数在这两种方法之间进行选择,但我想知道 CrossValidated 是否有更好(或不那么天真)的自动预测想法。

auto.ts <- function(x,ic="aic") {
    XP=ets(x, ic=ic) 
    AR=auto.arima(x, ic=ic)

    if (get(ic,AR)<get(ic,XP)) {
        model<-AR
    }
    else {
        model<-XP
    }
        model
}

/edit: 这个函数怎么样?

auto.ts <- function(x,ic="aic",holdout=0) {
    S<-start(x)[1]+(start(x)[2]-1)/frequency(x) #Convert YM vector to decimal year
    E<-end(x)[1]+(end(x)[2]-1)/frequency(x)
    holdout<-holdout/frequency(x) #Convert holdout in months to decimal year
    fitperiod<-window(x,S,E-holdout) #Determine fit window

    if (holdout==0) {
        testperiod<-fitperiod
    }
    else {
        testperiod<-window(x,E-holdout+1/frequency(x),E) #Determine test window
    }

    XP=ets(fitperiod, ic=ic)
    AR=auto.arima(fitperiod, ic=ic)

    if (holdout==0) {
        AR_acc<-accuracy(AR)
        XP_acc<-accuracy(XP)
    }
    else {
        AR_acc<-accuracy(forecast(AR,holdout*frequency(x)),testperiod)
        XP_acc<-accuracy(forecast(XP,holdout*frequency(x)),testperiod)
    }

    if (AR_acc[3]<XP_acc[3]) { #Use MAE
        model<-AR
    }
    else {
        model<-XP
    }
    model
}

“holdout”是您希望用作样本外测试的周期数。然后该函数根据此参数计算拟合窗口和测试窗口。然后它在拟合窗口上运行 auto.arima 和 ets 函数,并在测试窗口中选择 MAE 最低的那个。如果holdout 等于0,它将测试样本内拟合。

有没有办法在选择模型后使用完整的数据集自动更新所选模型?

1个回答

由于不同的初始化假设,来自两个模型类的可能性以及因此的 AIC 值不具有可比性。所以你的功能无效。我建议您在您的系列中尝试这两个模型类,看看哪个给出了最好的样本外预测。