2014-09-14 18 views
5

Quando si cerca di comporre una funzione da quelle più piccole che utilizzano biblioteca previsione di Rob Hyndman, in questo modo:Previsione in R quando si passa in giro argomenti in previsione() e AR()

> library('forecast') 
> arf <- function(data, ...) forecast(ar(data, order.max=1, method="ols"), ...) 

ottengo un errore quando si cerca di collegare alcuni dati:

> arf(ts(1:100, start=c(2000,1), frequency=4)) 
Error in ts(x, frequency = 1, start = 1) : object is not a matrix 

Tuttavia, utilizzando il corpo della ARF lavora direttamente alla perfezione:

> forecast(ar(ts(1:100, start=c(2000,1), frequency=4), order.max=1,method="ols")) 
     Point Forecast Lo 80 Hi 80 Lo 95 Hi 95 
2025 Q1   101 101 101 101 101 
2025 Q2   102 102 102 102 102 
2025 Q3   103 103 103 103 103 
2025 Q4   104 104 104 104 104 
2026 Q1   105 105 105 105 105 
2026 Q2   106 106 106 106 106 
2026 Q3   107 107 107 107 107 
2026 Q4   108 108 108 108 108 
2027 Q1   109 109 109 109 109 
2027 Q2   110 110 110 110 110 

Perché arf non funziona come dovrebbe?

+1

Questo è molto weired effetti. Sembra un bug nel metodo 'forecast.ar' dato che sono riuscito a farlo con il metodo' forecast.Arima' mentre sostituivo 'ar' con' auto.arima'. Aspettiamo @RobHyndman –

risposta

3

Questo è un problema (non proprio un bug) in forecast.ar(). Tutte le funzioni forecast.xxx() tentano di memorizzare i dati utilizzati per stimare il modello di serie temporali come richiesto per i grafici e i calcoli di precisione. Tuttavia, ar() non restituisce i dati, quindi forecast.ar() tenta di trovare i dati nell'ambiente chiamante o nell'ambiente padre. Quando si chiama direttamente forecast(ar(...)), la funzione riesce a trovare i dati, ma arf() pone la chiamata a ar() un livello più in profondità, rendendo così molto più difficile per forecast determinare quali dati sono stati utilizzati.

posso modificare la funzione di far sembrare più difficile per i dati (cioè, guardare nell'ambiente nonno anche), ma la costruzione sarà ancora sicuro perché predict.ar() (parte del pacchetto stats) sarà quindi causare un errore simile. Sarebbe molto meglio se ar() ha restituito i dati, ma ar() fa parte del pacchetto stats e non ho alcun controllo su di esso.

Esistono diverse soluzioni.

  1. È possibile sostituire ar con Arima:

    arf <- function(dat, ...) forecast(Arima(dat, order=c(1,0,0)), ...) 
    

    Questo dovrebbe restituire lo stesso modello se i dati sono stazionari (anche se le stime dei parametri saranno leggermente diversi). Non restituirà la stessa risposta per l'esempio nella tua domanda perché le serie temporali non sono stazionarie.

  2. È possibile utilizzare auto.arima() se si desidera utilizzare modelli ARIMA più generali rispetto ad AR (1).

    arf <- function(dat, ...) forecast(auto.arima(dat, ...) 
    
  3. (Sulla base di un suggerimento da @agstudy). Una soluzione è assicurare i dati vengono memorizzati all'interno dell'oggetto ar:

    arf <- function(dat, ...) 
    { 
        object <- ar(dat, order.max=1, method="ols") 
        object$x <- dat 
        forecast(object,...) 
    } 
    
+0

Purtroppo, sto usando dati non stazionari @RobHyndman. Il tuo terzo suggerimento (la soluzione alternativa) ha funzionato perfettamente per me. – CrystalCuckoo

2

il problema è un errore nel metodo S3 previsto per la classe ar. predict.ar provare a valutare il parametro newdata utilizzando l'oggetto ar. Mostrando le prime righe di getS3method('predict','ar')

function (object, newdata, n.ahead = 1L, se.fit = TRUE, ...) 
{ 
    if (n.ahead < 1L) 
     stop("'n.ahead' must be at least 1") 
    if (missing(newdata)) { 
     newdata <- eval.parent(parse(text = object$series)) 
     if (!is.null(nas <- object$call$na.action)) 
      newdata <- eval.parent(call(nas, newdata)) 
    } 

    ..... 
} 

la riga relativa/spiati è:

newdata <- eval.parent(parse(text = object$series)) 

Ma oggetto $ serie non hanno il diritto di espressione/carattere. poiché è nascosto dal nuovo livello di funzione wrapper arf. Qui una soluzione alternativa è impostare l'espressione corretta per questo termine:

arf <- function(dat, ...) 
    { 
    object <- ar(dat, order.max=1, method="ols") 
    object$series <- as.character(as.expression(as.list(match.call())$dat)) 
    forecast(object,...) 
} 
arf(ts(1:100, start=c(2000,1), frequency=4) 

Nota che; questa soluzione funziona anche con:

aa <- ts(1:100, start=c(2000,1), frequency=4) 
arf(aa) 
+0

11 ore dopo la domanda, abbiamo risposto entro 4 minuti l'uno dall'altro, e non l'ho visto fino a quando ho finito la mia risposta. –

+0

@RobHyndman mee troppo! Non ho visto anche la tua risposta! Sto dicendo che puoi essere in vacanza quindi forse posso aiutarti :) Penso che cancellerò la mia risposta dato che è una soluzione alternativa e non una vera soluzione ... – agstudy

+0

Che ne dici di combinarli, in quanto la tua soluzione è utile se il OP vuole davvero usare 'ar()' con 'method =" ols "'. –

Problemi correlati