循环通过一个向量,其元素是 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)
我需要将矢量元素的所有组合应用于特定函数,并将这些元素也用作此函数的输入。我希望它快一点,但到目前为止,应用及其不同风格的任何组合都没有结果。
总之,我有一个时间序列,需要拟合一个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)