我有一个xts互相排列的对象列表.我想把merge列表变成一个大xts对象.我这样做的尝试是"
merged_reg_1_min_prices <- do.call(cbind, reg_1_min_prices)
Run Code Online (Sandbox Code Playgroud)
然而,这似乎耗尽了记忆. reg_1_min_prices相互排斥的日子是6,000天1分钟的回报,所以它不是很大.有谁知道怎么解决这个问题?
需要明确的是:reg_1_min_prices包含每天1分钟价格的互斥日,列表中的每个条目都是一个xts对象.
我爱do.call.我喜欢能够将函数参数存储在列表中,然后将它们映射到给定的函数.
例如,我经常发现自己使用这种模式来拟合不同预测模型的列表,每个模型都有一些共享和一些独特的参数:
library(caret)
global_args <- list(
x=iris[,1:3],
y=iris[,4],
trControl=trainControl(
method='cv',
number=2,
returnResamp='final',
)
)
global_args$trControl$index <- createFolds(
global_args$y,
global_args$trControl$number
)
model_specific_args <- list(
'lm' = list(method='lm', tuneLength=1),
'nn' = list(method='nnet', tuneLength=3, trace=FALSE),
'gbm' = list(
method='gbm',
verbose=FALSE,
tuneGrid=expand.grid(
n.trees=1:100,
interaction.depth=c(2, 3),
shrinkage=c(.1, .01)
)
)
)
list_of_models <- lapply(model_specific_args, function(args){
return(do.call(train, c(global_args, args), quote=TRUE))
})
resamps <- resamples(list_of_models)
dotplot(resamps, metric='RMSE')
Run Code Online (Sandbox Code Playgroud)
global_args包含对所有模型都相同的参数,并model_specific_args包含特定于模型的参数列表.我循环model_specific_args,连接每个元素global_args,然后用于do.call将最终参数列表传递给模型拟合函数.
虽然这段代码在视觉上很优雅,但它的性能非常糟糕:do.call将整个x数据集按字面序列化为文本,然后将其传递给模型拟合函数.如果x是几GB的数据,则使用疯狂的RAM并且通常会失败.
print(list_of_models[[1]]$call)
Run Code Online (Sandbox Code Playgroud)
有没有办法将参数列表传递给R中的函数,而不使用do.call或call …
我经常指定公式参数来模拟拟合函数,lm或者lme将我需要的部分粘贴在一起,就像@DWin对这个问题的回答一样:理解lm和环境.
在实践中,这看起来像这样:
library(nlme)
set.seed(5)
ns <- 5; ni <- 5; N <- ns*ni
d <- data.frame(y=rnorm(N),
x1=rnorm(N),
x2=factor(rep(1:ni, each=ns)),
id=factor(rep(1:ns, ni)))
getm <- function(xs) {
f <- paste("y ~", paste(xs, collapse="+"))
lme(as.formula(f), random=~1|id, data=d, method="ML")
}
m1 <- getm("x1")
m2 <- getm(c("x1", "x2"))
Run Code Online (Sandbox Code Playgroud)
但是,lme从nlme包中,比较使用方式构造的两个模型anova不起作用,因为anova.lme查看保存的公式参数以确保模型适合相同的响应,并且保存的公式参数很简单as.formula(f).错误是:
> anova(m1, m2)
Error in inherits(object, "formula") : object 'f' not found
Run Code Online (Sandbox Code Playgroud)
这是anova命令应该做的(重新安装模型以使其工作):
> m1 <- lme(y~x1, random=~1|id, …Run Code Online (Sandbox Code Playgroud)