循环通过一个向量,其元素是 R 中另一个函数的输入

Cycling through a vector whose elements are inputs to another function in R

我需要将矢量元素的所有组合应用于特定函数,并将这些元素也用作此函数的输入。我希望它快一点,但到目前为止,应用及其不同风格的任何组合都没有结果。

总之,我有一个时间序列,需要拟合一个ARIMA模型来描述这个过程。包 stats 中的函数 arima 需要一组输入,因为我不想手动执行此操作,一个可以为我执行此操作的函数似乎是有序的。

到目前为止我试过这个:

 library(stats)
 #need a vector to cycle and use as inputs in the function
 nums <- c(0:3)
 #random time series
 x <- rnorm(1000,mean=1,sd=1)
 #attempt 1
 lapply(nums, arima(x, order=c(nums,nums,nums)))
 #attempt 2
 lapply(nums, arima(x))
 #attempt 3
 #create another vector, as to start cycle with 1 rather than 0
 nums2 <- c(1:3)
 lapply(nums2, arima(randomtimeseries, c(nums, nums, nums)))

必须以这种方式完成,因为这是 运行 作为 cron 作业,因此用户无需添加任何输入以简化上述过程。

您需要学习创建匿名函数。需要明确的是:这些是排列,而不是组合。不过,您可能需要组合,如果需要,请查看 expand.grid。 vector 和 vectorization 标签至少在该概念用于描述 R 实践的方式上具有误导性。解决方案中不会有任何矢量化。

也许,取决于实际目标以及num向量的所有组合是否有意义(我认为这是值得怀疑的):

apply( expand.grid(num,num,num), 1, function(o) arima(x, order=c( x[1],x[2],x[3] ) ) )

这也有点未能仔细考虑模型中的数据,将其转化为详尽的过程。如果预期有任何推论,统计问题可能会很严重。

这看起来像是 reval 包的工作!

首先,生成参数集(参见Generating all distinct permutations of a list in R and data.frame rows to a list):

all <- expand.grid(0:2, 0:2, 0:2, stringsAsFactors = FALSE) 
perms <- all[apply(all, 1, function(x) {length(unique(x)) == 3}),]
orders <- as.list(as.data.frame(t(perms)))
names(orders) = NULL

然后,使用evalmany()应用函数:

library(stats)
x <- rnorm(1000,mean=1,sd=1)

require(reval)    
res = evalmany(arima, order = orders, default.args = list(x = x),
  method="set", collate = FALSE)