Мы можем попробовать что-то вроде этого:
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()
Или мин., Макс., Означает, как вы упомянули, используя 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()