使用apply将参数从expand.grid传递给函数

时间:2016-04-27 03:02:28

标签: r

我正在尝试使用expand.grid创建3个订单参数的所有组合,范围如下所示。然后我尝试使用Arima创建参数组合的所有模型并应用。我在下面有伪代码,概述了我正在尝试做的事情以及我在下面做的尝试。该尝试返回错误。如果有人能够看到我做错了什么,请指出如何修复代码,或类似的例子,我们将不胜感激。

伪代码:

library("fpp")

h <- 5
dataTraiz <- window(hsales,end=1989.99)

##Create models for all combinations of p 10 to 0, d 2 to 0, q 5 to 0

Mod1 <- Arima(dataTraiz, order=c(10,2,5)
Mod2 <- Arima(dataTraiz, order=c(9,2,5)
Mod3 <- Arima(dataTraiz, order=c(8,2,5)
.
.
.
Mod5 <- Arima(dataTraiz, order=c(10,2,0)

尝试:

x<-1:10
y<-1:2
z<-1:5

dfG<-expand.grid(x,y,z)


n <-function(a,b,c,dat){
          m=Arima(dataTraiz, order=c(a,b,c))
          return(m)
                        } 


mod<-apply(dfG,1,n)

错误:

Arima中的错误(dataTraiz,order = c(a,b,c)):   参数“c”缺失,没有默认值

1 个答案:

答案 0 :(得分:1)

我建议使用apply对象(例如从data.frames返回的对象)避免使用expand.grid。您可以使用Map为不同的参数值集调用函数< / p>

mod <- with(dfG, Map(function(a,b,c) {
    Arima(dataTraiz, order=c(a,b,c))
}, Var1, Var2, Var3))

使用with(),我们可以在没有dfG的情况下直接访问dfG$Var的Var列。然后我们将值传递给Map,它将它们传递给我们按给定顺序提供的函数中的每个参数。

另一种方法是对函数进行向量化,以便迭代参数元组。例如

n <- function(a,b,c) {Arima(dataTraiz, order=c(a,b,c))}
mod <- do.call(Vectorize(n, SIMPLIFY=FALSE), unname(dfG))