Combinando auto.arima () e ets () do pacote de previsão

8

Eu tenho usado as funções ets () e auto.arima () do pacote de previsão para prever um grande número de séries temporais univariadas. Eu tenho usado a função a seguir para escolher entre os 2 métodos, mas queria saber se o CrossValidated tinha idéias melhores (ou menos ingênuas) para previsão automática.

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: E sobre esta função?

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
}

O "holdout" é o número de períodos que você deseja usar como um teste fora da amostra. A função calcula uma janela de ajuste e uma janela de teste com base nesse parâmetro. Em seguida, ele executa as funções auto.arima e ets na janela de ajuste e escolhe aquela com o MAE mais baixo na janela de teste. Se o holdout for igual a 0, ele testará o ajuste na amostra.

Existe uma maneira de atualizar automaticamente o modelo escolhido com o conjunto de dados completo, depois de selecionado?

Zach
fonte

Respostas:

15

As probabilidades das duas classes de modelo e, portanto, os valores da AIC, não são comparáveis ​​devido a diferentes suposições de inicialização. Portanto, sua função não é válida. Sugiro que você experimente as duas classes de modelo em sua série e veja quais oferecem as melhores previsões fora da amostra.

Rob Hyndman
fonte
Editei minha pergunta para incluir uma função que escrevi para fazer isso. Minha nova função faz sentido?
Zach
Se holdout = 0, ele está usando ajuste de amostra, o que favorecerá o modelo com mais parâmetros. Mas se o holdout for> 0, faz sentido, embora você precise de uma amostra de holdout bastante grande para o método selecionar o melhor modelo de maneira confiável. Em geral, eu escolheria o modelo a ser usado com base em outras considerações, em vez de considerar apenas o desempenho da previsão fora da amostra em uma amostra resumida de uma série. Por exemplo, você pode considerar o desempenho fora da amostra em todo o conjunto de séries (em vez de uma série por vez) e selecionar a melhor classe de modelo dessa maneira.
precisa saber é o seguinte
obrigado pela sugestão, vou começar a seguir nessa direção. No caso em que meu holdout é igual a zero, e se eu introduzisse algum tipo de penalidade nos parâmetros?
Zach
1
Como continuo dizendo, use desempenho fora da amostra em um grande conjunto de séries. Você não pode comparar facilmente o desempenho dentro da amostra das duas classes de modelo.
Rob Hyndman
Ok, obrigado por todos os conselhos. Usarei o desempenho fora da amostra em todo o conjunto para escolher uma classe de modelo.
Zach