在一个图中绘制 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()
我有 运行 一组 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()