我为我正在处理的项目编写了一段R代码。我想缩短代码以节省项目空间。我对R相对较新,对for
语句或函数apply
没有太多经验,但我一直在阅读R帮助文件以及本网站上的其他问题,以及r-bloggers.com试图对这些功能有一些基本的了解。
我正在使用的功能来自dismo vignette“Boosted Regression Trees for ecological modelling”的第18页。
我的目标是......
gbm.fixed
的每个级别重复tree.complexity
函数,从1到5,learning.rate
的每个级别从0.001到0.01依次重复0.001。predict.gbm
结果的gbm.fixed
功能。calc.deviance
结果返回到矩阵,其中列名称类似于tc1lr001:tc5lr01
,因此我可以绘制结果。 我的方法是使用for
循环。我可以使用以下代码运行所有gbm.fixed
函数...
for (i in 1:5){
for (j in seq(0.001,0.01,0.001)){
#Call the gbm.fixed model
assign(paste0("test.tc",i,"lr.",substr(j,3,7)),
gbm.fixed(data=data.train,
gbm.x = 3:10,
gbm.y = 2,
learning.rate = j,
tree.complexity = i,
n.trees = 10000))
}}
但是,当我尝试使用以下代码运行predict.gbm
函数时......
for (i in 1:5){
for (j in seq(0.001,0.01,0.001)){
tree.list<-seq(100,10000,100)
assign(paste("pred.tc",i,"lr.",substr(j,3,7),sep=""),
predict.gbm(paste0("test.tc",i,"lr.",substr(j,3,7)),
data.test,
n.trees=tree.list,
"response"))
}}
...我收到以下错误......
Error in object$Terms : $ operator is invalid for atomic vectors
我做了一些阅读,并且有很多关于$ operator is invalid for atomic vectors
的帖子,但我找不到任何与我正在做的事情相同的应用程序。
我确信这很简单,但我现在似乎无法绕过它。任何意见都表示赞赏。
作为参考,这里是我试图循环的工作代码的一次迭代(tree.complexity = 1和learning.rate = 0.001)的示例。
samp <- sample(nrow(data), round(samp.size * nrow(data)))
data.train <- data[samp,]
data.test <- data[-samp,]
tree.list<seq(100,20000,100)
test.tc1.lr001<- gbm.fixed(data=data.train,
gbm.x=2:10, #predictor variables
gbm.y=1, #response variable
learning.rate=0.001,
tree.complexity=1,
n.trees=20000)
pred.tc1.lr001 <- predict.gbm(test.tc1.lr001,
data.test,
n.trees=tree.list,
"response")
#Calculate the deviance for all the results
pred.dev.tc1.lr001 <- rep(0,200)
for (i in 1:200) {
pred.dev.tc1.lr001[i] <- calc.deviance(data.test[,1],
pred.tc1.lr001[,i],
calc.mean=TRUE)
}