come contare quante volte un ordine arima non è vero prima che il primo vero ordine sia ottenuto in r per diverse combo di simulazione arima

Aug 23 2020

La maggior parte delle volte si esegue la arima.sim()funzione per simulare un ordine particolare, arima moselma quando si controllano tali dati di serie temporali simulati tramite la auto.arima()funzione, spesso non sarà il tempo lo stesso ordine di ARIMA desiderato e specificato nel file arima.sim().

Nel mio tentativo di sapere quante volte potrebbe essere necessario eseguire la arima.sim()funzione per una diversa combinazione del suo parametro (dimensione del campione, deviazione standard e coefficiente del modello) prima di ottenere il vero ordine del modello cercato, voglio questo Rscript su countcome molte volte verrà eseguito e arima.sim()prima di ottenere l'exert ARIMA-orderspecificato nella arima.sim()funzione.

**Here is my trial**

library(forecast)
N <- c(10, 20, 30)
SD <- c(1, 2, 3, 4, 5) ^ 2
phi <- c(0.2, 0.4, 0.6)

## generate all combos
all_combos <- expand.grid(N = N, SD = SD, phi = phi)

## create function
set.seed(123)
res2 <- by(all_combos, all_combos["N"], function(DF){
  res <- mapply(function(N, SD, phi){
    cnt <- 0
    repeat {
      x <- arima.sim(n=N, model = list(ar=phi, order = c(1, 0, 0)), sd = SD)
      if(all(arimaorder(auto.arima(x), ic = "aicc"))) != c(1, 0, 0) cnt <- cnt + 1){
      }
        {else(all(arimaorder(auto.arima(x), ic = "aicc"))) == c(1, 0, 0) cnt <- cnt + 1)}
        break
    }
    cnt
  }, DF[["N"]], DF[["SD"]], DF[["phi"]])
  names(res) <- paste("SD", DF[["SD"]], "phi", DF[["phi"]], sep = "-")
  res
})
res2

Mi interessa sapere quante prove di arima.sim()volontà si faranno prima di ottenere il primo ARIMA (1, 0, 0).

Risposte

3 RonakShah Aug 24 2020 at 01:26

Mi sembra strano che tu stia correndo by+ mapply. Penso che mapplysia sufficiente. Inoltre, arimaordernon ha icargomenti, forse intendevi usarlo per la auto.arimafunzione.

Dato che vuoi sapere quante prove sono necessarie per ottenere c(1, 0, 0), aggiungo una colonna aggiuntiva ( index) che è il numero di riga in all_combos. Non appena si ottiene l'output, c(1, 0, 0)il ciclo si interrompe e stampa il file index. Il codice non viene eseguito per il resto delle combinazioni.

library(forecast)
N <- c(10, 20, 30)
SD <- c(1, 2, 3, 4, 5) ^ 2
phi <- c(0.2, 0.4, 0.6)

## generate all combos
all_combos <- expand.grid(N = N, SD = SD, phi = phi)
all_combos$index <- seq_len(nrow(all_combos)) mapply(function(N, phi, SD, index) { x <- with(all_combos, arima.sim(n=N[1], model = list(ar=phi[1], order = c(1, 0, 0)), sd = SD[1])) if(all(arimaorder(auto.arima(x, ic = "aicc")) == c(1, 0, 0))) { print(index) break } }, all_combos$N, all_combos$SD, all_combos$phi, all_combos$index)
1 BenNorris Aug 23 2020 at 22:47

Le tue parentesi graffe sono nei punti sbagliati. Ottengo errori su parentesi graffe impreviste quando eseguo il codice. La Rnotazione per ife elsedovrebbe seguire:

if(condition == TRUE) {
run some code
} else {                    
do some other code       # happens if condition == FALSE
}

Se vuoi controllare una condizione diversa, hai bisogno else if

if(condition == TRUE) {
run some code
} else if(other_condition == TRUE) {                    
do some other code       
} else {
do some third code      # runs if both conditions are FALSE
}

Hai anche le tue parentesi per all()fuori posto. Sulla base di questo, penso che tu voglia che i tuoi condizionali abbiano un aspetto simile a:

if(all(arimaorder(auto.arima(x), ic = "aicc")) != c(1, 0, 0)) {
   cnt <- cnt + 1
   } else if (all(arimaorder(auto.arima(x), ic = "aicc")) == c(1, 0, 0)) {
       cnt <- cnt + 1
       } else { break }
    

Quando li risolvo, il codice viene quasi eseguito, tranne per il fatto che ottengo l'errore

Errore in arimaorder (auto.arima (x), ic = "aicc"): argomento non utilizzato (ic = "aicc")

Quindi, anche le tue parentesi per auto.arima()erano fuori posto. Quanto segue viene eseguito senza errori:

res2 <- by(all_combos, all_combos["N"], function(DF){
   res <- mapply(function(N, SD, phi){
      cnt <- 0
      repeat {
         x <- arima.sim(n=N, model = list(ar=phi, order = c(1, 0, 0)), sd = SD)
         if(all(arimaorder(auto.arima(x, ic = "aicc"))) != c(1, 0, 0)) {
      cnt <- cnt + 1
   } else if (all(arimaorder(auto.arima(x, ic = "aicc"))) == c(1, 0, 0)) {
   cnt <- cnt + 1
} else { break }
      }
      cnt
   }, DF[["N"]], DF[["SD"]], DF[["phi"]])
names(res) <- paste("SD", DF[["SD"]], "phi", DF[["phi"]], sep = "-")
res
})

Tuttavia, penso ancora che ci sia un problema in queste righe e non riesco a capire cosa stavi cercando di ottenere.

      cnt
   }, DF[["N"]], DF[["SD"]], DF[["phi"]])