在一个图中绘制 gbm.step() 的多次运行

Plot multiple runs of gbm.step() in one plot

我有 运行 一组 100 运行s of gbm.step 来解释分析的随机性成分,它为每个 BRT 模型提供略有不同的结果,因此估计拟合函数的范围(最小值和最大值)。 我想将这些结果绘制成这样的图:

可重现的例子:

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 的最佳方法是什么?

我们可以这样尝试:

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)

我们可以绘制所有的线,在 aes:

中指定 group
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()