predict.gbm$运算符对于原子向量无效

predict.gbm$运算符对于原子向量无效,r,for-loop,R,For Loop,我有一段R代码,是我为正在进行的项目编写的。我想缩短代码以节省项目中的空间。我对R比较陌生,对for语句或函数(如apply)没有太多经验,但我一直在阅读R帮助文件以及本网站和R-bloggers.com上的其他问题,试图对这些函数有一些基本的了解 我使用的函数摘自dismo vignette的第18页 我的目标是 对树的每个级别重复gbm.fixed函数。复杂性从1到5,学习的每个级别。速率从0.001到0.01乘以0.001。 对所有gbm.fixed结果重复predict.gbm函数。 将

我有一段R代码,是我为正在进行的项目编写的。我想缩短代码以节省项目中的空间。我对R比较陌生,对for语句或函数(如apply)没有太多经验,但我一直在阅读R帮助文件以及本网站和R-bloggers.com上的其他问题,试图对这些函数有一些基本的了解

我使用的函数摘自dismo vignette的第18页

我的目标是

对树的每个级别重复gbm.fixed函数。复杂性从1到5,学习的每个级别。速率从0.001到0.01乘以0.001。 对所有gbm.fixed结果重复predict.gbm函数。 将所有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"))
  }}
我做了一些阅读,有相当多的帖子关于$operator对原子向量无效,但我找不到任何与我现在做的应用程序相同的应用程序

我确信这是件简单的事情,但我现在似乎不能把我的头脑集中在它上面。欢迎您的任何意见

作为参考,这里是一个迭代树的例子。复杂度=1,学习率=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)
}

尝试将浏览器置于最后一个for循环中,并尝试手动调试或设置i和j值。您的代码不适用于我,因为我无法访问您的数据。这里有一行代码需要考虑:测试您还可以使用回溯来查看哪一行抛出了错误。但是,正如Roman指出的,依次计算每个对象将向您显示当您需要一个list对象才能使用$operator时,您在哪里创建了原子向量。@RomanLuštrik和Carl Witthoft感谢您的评论!如果我能找到解决方案,我会发布我问题的答案。你找到解决方案了吗?我也有类似的问题
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)
}