I am trying to write a function with arima.sim()
function in R
such that I only need to input the variables of any of the ARMA
families to get the seeds
that will produce my type of ARMA
simulation.
Two out of my three (2/3) cases are true when I use the following
arma_sim_search <- function(a, z, n, ar11, ma11, ar22, ma22, ar33, ma33, p, d, q, sd = 1, j1, k1, j2, k2, j3, k3, arr1, maa1, arr2, maa2, arr3, maa3){
output <- if (p == 1) {
ar1_sim_search <- function(a, z, n, ar11, p, d, q, sd = 1, j1, arr1){
future::plan(future::multisession)
n_cores <- parallel::detectCores()
cl <- parallel::makeCluster(n_cores)
doParallel::registerDoParallel(cores = n_cores)
message('processing...')
`%dopar%` <- foreach::`%dopar%`
i <- a:z
res <- foreach::foreach(i = a:z, .packages = c('foreach', 'forecast')) %dopar% {
set.seed(i)
mod <- stats::arima.sim(n = n, model = list(ar = c(ar11), order = c(p, d, q)), sd = sd)
best.mod <- forecast::auto.arima(mod, ic = "aicc")
(cf <- best.mod$coef)
if (length(cf) == 0) {
rep(NA, 2)
} else if (all(grepl(c("ar1|intercept"), names(cf))) &
substr(cf["ar1"], 1, j1) %in% arr1) {
c(cf, seed = I)
} else {
rep(NA, 2)
}
}
message(' done!\n')
res1 = res[!sapply(res, anyNA)]
parallel::stopCluster(cl)
options(max.print = .Machine$integer.max)
res2 <- tibble::tibble(Reduce(function(...) merge(..., all = T), lapply(res1, function(x) as.data.frame(t(x)))))
res2[order(res2$seed), ]
res2 <- Reduce(function(...) merge(..., all = T), lapply(res1, function(x) as.data.frame(t(x))))
res2[order(res2$seed), ]
}
ar1_sim_search(a = a, z = z, n = n, p = 1, d = d, q = q, ar11 = ar11, sd = sd, j1 = j1, arr1 = arr1)
#######################################################################
} else if (p == 1 && q == 1) {
arma1_sim_search <- function(a, z, n, ar11, ma11, p, d, q, sd = 1, j1, k1, arr1, maa1){
future::plan(future::multisession)
n_cores <- parallel::detectCores()
cl <- parallel::makeCluster(n_cores)
doParallel::registerDoParallel(cores = n_cores)
message('processing...')
`%dopar%` <- foreach::`%dopar%`
i <- a:z
res <- foreach::foreach(i = a:z, .packages = c('foreach', 'forecast')) %dopar% {
set.seed(i)
mod <- stats::arima.sim(n = n, model = list(ar = ar11, ma = ma11, order = c(p, d, q)), sd = sd)
best.mod <- forecast::auto.arima(mod, ic = "aicc")
(cf <- best.mod$coef)
if (length(cf) == 0) {
rep(NA, 2)
} else if (all(grepl(c("ar1|ma1|intercept"), names(cf))) &
substr(cf["ar1"], 1, j1) %in% arr1 & substr(cf["ma1"], 1, k1) %in% maa1) {
c(cf, seed = I)
} else {
rep(NA, 2)
}
}
message(' done!\n')
res1 = res[!sapply(res, anyNA)]
parallel::stopCluster(cl)
options(max.print = .Machine$integer.max)
res2 <- tibble::tibble(Reduce(function(...) merge(..., all = T), lapply(res1, function(x) as.data.frame(t(x)))))
res2[order(res2$seed), ]
res2 <- Reduce(function(...) merge(..., all = T), lapply(res1, function(x) as.data.frame(t(x))))
res2[order(res2$seed), ]
}
arma1_sim_search(a = a, z = z, n = n, p = 1, d = d, q = 1, ar11 = ar11, ma11 = ma11, sd = sd, j1 = j1, k1 = k1, arr1 = arr1, maa1 = maa1)
##############################################################
} else {
ma1_sim_search <- function(a, z, n, ma11, p, d, q, sd = 1, k1, maa1){
future::plan(future::multisession)
n_cores <- parallel::detectCores()
cl <- parallel::makeCluster(n_cores)
doParallel::registerDoParallel(cores = n_cores)
message('processing...')
`%dopar%` <- foreach::`%dopar%`
i <- a:z
res <- foreach::foreach(i = a:z, .packages = c('foreach', 'forecast')) %dopar% {
set.seed(i)
mod <- stats::arima.sim(n = n, model = list(ma = c(ma11), order = c(p, d, q)), sd = sd)
best.mod <- forecast::auto.arima(mod, ic = "aicc")
(cf <- best.mod$coef)
if (length(cf) == 0) {
rep(NA, 2)
} else if (all(grepl(c("ma1|intercept"), names(cf))) &
substr(cf["ma1"], 1, k1) %in% maa1) {
c(cf, seed = I)
} else {
rep(NA, 2)
}
}
message(' done!\n')
res1 = res[!sapply(res, anyNA)]
parallel::stopCluster(cl)
options(max.print = .Machine$integer.max)
res2 <- tibble::tibble(Reduce(function(...) merge(..., all = T), lapply(res1, function(x) as.data.frame(t(x)))))
res2[order(res2$seed), ]
res2 <- Reduce(function(...) merge(..., all = T), lapply(res1, function(x) as.data.frame(t(x))))
res2[order(res2$seed), ]
}
ma1_sim_search(a = a, z = z, n = n, p = p, d = d, q = 1, ma11 = ma11, sd = sd, k1 = k1, maa1 = maa1)
}
##############################################################################
return(output)
}
The first case works well with this output.
arma_sim_search(a = 1, z = 1000, n = 25, p = 1, d = 0, q = 0, ar11 = 0.8, sd = 1, j1 = 3, arr1 = "0.8")
#processing...
#done!
# ar1 seed
#64 0.8835177 16
#2 0.8026257 30
#9 0.8115264 42
#19 0.8246183 43
#67 0.8971222 49
The second
case is giving me error.
arma_sim_search(a = 1, z = 1000, n = 25, p = 1, d = 0, q = 1, ar11 = 0.4, ma11 = 0.5, sd = 1, j1 = 3, k1 = 3, arr1 = "0.4", maa1 = "0.5")
I got this error
message: Error in { : task 1 failed - "inconsistent specification of 'ma' order"
The third case works well like the first.
arma_sim_search(a = 1, z = 1000, n = 25, p = 0, d = 0, q = 1, ma11 = 0.8, sd = 1, k1 = 3, maa1 = "0.8")
#processing...
#done!
# ma1 seed intercept
#81 0.8551335 24 NA
#14 0.8090642 28 NA
#12 0.8080051 29 NA
#43 0.8314141 33 NA
This is the skeletal image of my function: the first case is when the expression is an AR1
with p == 1
the second is when the expression is an ARMA11
with p ==1 && q ==1
and the last is a case when the expression is an MA1
case when q == 1
.
arma_sim_search <- function(a, z, n, ar11, ma11, ar22, ma22, ar33, ma33, p, d, q, sd = 1, j1, k1, j2, k2, j3, k3, arr1, maa1, arr2, maa2, arr3, maa3){
output <- if (p == 1) {
ar1_sim_search <- function(a, z, n, ar11, p, d, q, sd = 1, j1, arr1){
AR1 EXPRESION
}
ar1_sim_search(a = a, z = z, n = n, p = 1, d = d, q = q, ar11 = ar11, sd = sd, j1 = j1, arr1 = arr1)
########################################################
} else if (p == 1 && q == 1) {
arma1_sim_search <- function(a, z, n, ar11, ma11, p, d, q, sd = 1, j1, k1, arr1, maa1){
ARMA11 EXPRESION
}
arma1_sim_search(a = a, z = z, n = n, p = 1, d = d, q = 1, ar11 = ar11, ma11 = ma11, sd = sd, j1 = j1, k1 = k1, arr1 = arr1, maa1 = maa1)
##################################################
} else {
ma1_sim_search <- function(a, z, n, ma11, p, d, q, sd = 1, k1, maa1){
MA1 EXPRESION
}
ma1_sim_search(a = a, z = z, n = n, p = p, d = d, q = 1, ma11 = ma11, sd = sd, k1 = k1, maa1 = maa1)
}
##############################################################################
return(output)
}
arma_sim_search(a = 1, z = 1000, n = 25, p = 1, d = 0, q = 1, ar11 = 0.4, ma11 = 0.5, sd = 1, j1 = 3, k1 = 3, arr1 = "0.4", maa1 = "0.5")
Meanwhile, when I ran the function of case two
alone it ran well.
arma1_sim_search <- function(a, z, n, ar11, ma11, p, d, q, sd = 1, j1, k1, arr1, maa1){
future::plan(future::multisession)
n_cores <- parallel::detectCores()
cl <- parallel::makeCluster(n_cores)
doParallel::registerDoParallel(cores = n_cores)
message('processing...')
`%dopar%` <- foreach::`%dopar%`
i <- a:z
res <- foreach::foreach(i = a:z, .packages = c('foreach', 'forecast')) %dopar% {
set.seed(i)
mod <- stats::arima.sim(n = n, model = list(ar = ar11, ma = ma11, order = c(p, d, q)), sd = sd)
best.mod <- forecast::auto.arima(mod, ic = "aicc")
(cf <- best.mod$coef)
if (length(cf) == 0) {
rep(NA, 2)
} else if (all(grepl(c("ar1|ma1|intercept"), names(cf))) &
substr(cf["ar1"], 1, j1) %in% arr1 & substr(cf["ma1"], 1, k1) %in% maa1) {
c(cf, seed = I)
} else {
rep(NA, 2)
}
}
message(' done!\n')
res1 = res[!sapply(res, anyNA)]
parallel::stopCluster(cl)
options(max.print = .Machine$integer.max)
res2 <- tibble::tibble(Reduce(function(...) merge(..., all = T), lapply(res1, function(x) as.data.frame(t(x)))))
res2[order(res2$seed), ]
res2 <- Reduce(function(...) merge(..., all = T), lapply(res1, function(x) as.data.frame(t(x))))
res2[order(res2$seed), ]
}
arma1_sim_search(a = 1, z = 1000, n = 50, p = 1, d = 0, q = 1, ar11 = 0.2, ma11 = 0.7, sd = 1, j1 = 3, k1 = 3, arr1 = 0.2, maa1 = 0.7)
#processing...
# done!
# ar1 ma1 seed
#5 0.2887975 0.7388537 212
#4 0.2871108 0.7819748 229
#3 0.2858437 0.7425638 249
#2 0.2728310 0.7659739 310
#1 0.2574142 0.7674407 935