我一直在使用预测包中的 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,它将测试样本内拟合。
有没有办法在选择模型后使用完整的数据集自动更新所选模型?