将部分参数列表传递给do.call()

时间:2014-05-14 01:31:55

标签: r

我正在尝试编写一个测试GBM模型的一系列超参数的函数。我只想在GBM调用中改变三个参数。剩下的我想要保持静止。 do.call似乎是答案,因为它需要一个参数列表并将它们传递给一个函数。但是,我无法判断是否有办法修复'一些我永远不想改变的论点。

parms <- list(
'interaction.depth'=1:5,
'n.trees'=c(500,1000,2000),
'shrinkage'=c(0.01, 0.005, 0.001))

res <-expand.grid(parms)

> head(res)
  interaction.depth n.trees shrinkage
1               1    500      0.01
2               2    500      0.01
3               3    500      0.01
4               4    500      0.01
5               5    500      0.01
6               1   1000      0.01

然后我想将扩展网格的每一行作为参数列表传递给GBM函数,同时修复&#39;其他参数到位。类似的东西:

#pseudo-codeish
apply(res, 1, function (row) {do.call("gbm", row)})

2 个答案:

答案 0 :(得分:1)

do.call需要第二个参数的列表。您可以将列表与c组合在一起。 以下表达式使用数据的第一行创建包含元素ab和命名列res的列表:

c(list(a=1, b=2), as.list(res[1,]))

您想要的apply表达式如下所示:

apply(res, 1, function(row) do.call('gbm', c(list(a=1, b=2), as.list(row))))

答案 1 :(得分:1)

您可以使用m*ply包中的plyr个功能。要返回gbm模型列表,请执行以下操作:

gbm.list <- mlply(res, gbm, formula = Y~X1+X2+X3+X4+X5+X6, data = data)

其中formula = Y~X1+X2+X3+X4+X5+X6data = data是固定参数的示例。