пакет gbm и квантильная регрессия - PullRequest
0 голосов
/ 16 октября 2018

Может ли кто-нибудь указать правильное использование опции распределения квантилей в пакете gbm?Это:

library(datasets)
library(gbm)
library(caret)

set.seed(42)
rm(list = ls())

model <- gbm(Petal.Width ~ Petal.Length

                        , distribution = list(name = "quantile", alpha = 0.4)
                        , data = iris
                        , n.trees = number_of_trees
                        , interaction.depth = 3
                        , shrinkage = 0.01,
                        , n.minobsinnode = 10
    )
model

Не работает.Я получаю:

Error in if (!is.element(distribution$name, getAvailableDistributions())) { : 
  argument is of length zero
Error: object 'model' not found

Спасибо!

1 Ответ

0 голосов
/ 20 октября 2018

Это ошибка в gbm, о которой сообщалось в следующих выпусках GitHub: # 29 , # 27 .Это было исправлено в этом коммите .Пока они не получат новую версию на CRAN, вы можете выполнять квантильную регрессию с версией разработки GitHub:

devtools::install_github("gbm-developers/gbm")
#> Downloading GitHub repo gbm-developers/gbm@master
#> from URL https://api.github.com/repos/gbm-developers/gbm/zipball/master
#> Installing gbm
#> '/usr/lib/R/bin/R' --no-site-file --no-environ --no-save --no-restore  \
#>   --quiet CMD INSTALL  \
#>   '/tmp/Rtmp4acgli/devtools55756447fca5/gbm-developers-gbm-0e07a6b'  \
#>   --library='/home/duckmayr/R/x86_64-pc-linux-gnu-library/3.5' --install-tests
#> 
#> Reloading installed gbm
#> Loaded gbm 2.1.4.9000
library(datasets)
library(gbm)
# library(caret) # this package isn't used

set.seed(42)
rm(list = ls())

model <- gbm(Petal.Width ~ Petal.Length

             , distribution = list(name = "quantile", alpha = 0.4)
             , data = iris
             , n.trees = 3 # number_of_trees -- this variable isn't given by OP
             , interaction.depth = 3
             , shrinkage = 0.01,
             , n.minobsinnode = 10
)
model
#> gbm(formula = Petal.Width ~ Petal.Length, distribution = list(name = "quantile", 
#>     alpha = 0.4), data = iris, n.trees = 3, interaction.depth = 3, 
#>     n.minobsinnode = 10, shrinkage = 0.01)
#> A gradient boosted model with quantile loss function.
#> 3 iterations were performed.
#> There were 1 predictors of which 1 had non-zero influence.

, но не с версией CRAN:

install.packages("gbm")
#> Installing package into '/home/duckmayr/R/x86_64-pc-linux-gnu-library/3.5'
#> (as 'lib' is unspecified)
library(datasets)
library(gbm)
#> Loaded gbm 2.1.4
# library(caret) # this package isn't used

set.seed(42)
rm(list = ls())

model <- gbm(Petal.Width ~ Petal.Length

             , distribution = list(name = "quantile", alpha = 0.4)
             , data = iris
             , n.trees = 3 # number_of_trees -- this variable isn't given by OP
             , interaction.depth = 3
             , shrinkage = 0.01,
             , n.minobsinnode = 10
)
#> Error in if (!is.element(distribution$name, getAvailableDistributions())) {: argument is of length zero
model
#> Error in eval(expr, envir, enclos): object 'model' not found

Проблема была вызвана этойнемного кода:

distribution <- if (missing(distribution)) {
  if (missing(distribution)) {
    y <- data[, all.vars(formula)[1L], drop = TRUE]
    guessDist(y) 
  } else if (is.character(distribution)) { 
    distribution <- list(name = distribution) 
  } 
}

Вы заметите, что в какой-то момент они забыли разобраться со случаем, когда пользователи передают именованный список, как указано в документации.Но теперь этот бит кода исправлен:

if (missing(distribution)) {
  y <- data[, all.vars(formula)[1L], drop = TRUE]
  distribution <- guessDist(y) 
}

if (is.character(distribution)) { 
  distribution <- list(name = distribution) 
}

Таким образом, если distribution уже является списком, он теперь остается без изменений.

...