Создайте несколько прогонов gbm.step () на одном графике - PullRequest
1 голос
/ 06 марта 2020

Я выполнил набор из 100 прогонов gbm.step, чтобы учесть компонент стохастичности анализа, который обеспечивает немного отличающиеся результаты для каждой модели BRT, и, следовательно, оценить диапазон (минимальные и максимальные значения) для подобранных функций , Я хочу нанести эти результаты на график, подобный этому:

plot 100 gbm runs

Воспроизводимый пример:

data(iris)
mod2<-list()
for(i in 1:100){
  mod2[[i]]<-gbm.step(data=iris, gbm.x = 3:4, gbm.y = 1,
                   family = "gaussian", tree.complexity = 4,
                   learning.rate = 0.01, bag.fraction = 0.5, tolerance.method = "fixed")
}
gbm.plot(mod2[[1]],common.scale=F,smooth=T,write.title = FALSE, plot.layout = c(1,2))

Это график одной из 100 моделей. Я хочу такую, как на картинке выше.

Есть ли какая-нибудь функция, которая берет мои 100 моделей и строит их так? Если нет, то какой подход лучше использовать в ggplot?

1 Ответ

1 голос
/ 07 марта 2020

Мы можем попробовать что-то вроде этого:

data(iris)
mod2<-list()
for(i in 1:20){
  mod2[[i]]<-gbm.step(data=iris,
  gbm.x = 3:4, gbm.y = 1,
  family = "gaussian", tree.complexity = 4,
  learning.rate = 0.01, bag.fraction = 0.5, tolerance.method = "fixed")
}

И мы берем некоторые важные части из gbm.plot, чтобы сделать довольно примитивную функцию для 1 предиктора, чтобы получить значения x и y:

getVar = function(gbm.object,predictor_of_interest){
gbm.call <- gbm.object$gbm.call
gbm.x <- gbm.call$gbm.x
pred.names <- gbm.call$predictor.names
response.name <- gbm.call$response.name
data <- gbm.call$dataframe
k <- match(predictor_of_interest, pred.names)
var.name <- gbm.call$predictor.names[k]
pred.data <- data[, gbm.call$gbm.x[k]]
response.matrix <- gbm::plot.gbm(gbm.object, k, return.grid = TRUE)
data.frame(predictors = response.matrix[, 1],
responses = response.matrix[, 2] - mean(response.matrix[,2])
)
}

Затем мы перебираем список моделей, собираем данные:

library(ggplot2)
da = lapply(1:length(mod2),function(i){
data.frame(getVar(mod2[[i]],"Petal.Length"),model=i)})
da = do.call(rbind,da)

Мы можем построить все линии, указав group в aes:

ggplot(da,aes(x=predictors,y=responses,group=model)) + 
geom_line(alpha=0.4) + theme_bw()

enter image description here

Или мин., Макс., Означает, как вы упомянули, используя stat_summary, без группы:

ggplot(da,aes(x=predictors,y=responses)) +
stat_summary(geom="ribbon",fun.ymin="min",fun.ymax="max",alpha=0.3) +
stat_summary(geom="line",fun.y="mean")+theme_bw()

enter image description here

...