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

时间:2014-12-12 05:28:20

标签: r for-loop

我为我正在处理的项目编写了一段R代码。我想缩短代码以节省项目空间。我对R相对较新,对for语句或函数apply没有太多经验,但我一直在阅读R帮助文件以及本网站上的其他问题,以及r-bloggers.com试图对这些功能有一些基本的了解。

我正在使用的功能来自dismo vignette“Boosted Regression Trees for ecological modelling”的第18页。

我的目标是......

  1. gbm.fixed的每个级别重复tree.complexity函数,从1到5,learning.rate的每个级别从0.001到0.01依次重复0.001。
  2. 重复所有predict.gbm结果的gbm.fixed功能。
  3. 将所有calc.deviance结果返回到矩阵,其中列名称类似于tc1lr001:tc5lr01,因此我可以绘制结果。
  4. 我的方法是使用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)
    }
    

0 个答案:

没有答案