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
La maggior parte delle volte si esegue la arima.sim()
funzione per simulare un ordine particolare, arima mosel
ma 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 R
script su count
come molte volte verrà eseguito e arima.sim()
prima di ottenere l'exert ARIMA-order
specificato 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
Mi sembra strano che tu stia correndo by
+ mapply
. Penso che mapply
sia sufficiente. Inoltre, arimaorder
non ha ic
argomenti, forse intendevi usarlo per la auto.arima
funzione.
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)
Le tue parentesi graffe sono nei punti sbagliati. Ottengo errori su parentesi graffe impreviste quando eseguo il codice. La R
notazione per if
e else
dovrebbe 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"]])