Постройте несколько прогонов gbm.step() на одном графике

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

запланировать 100 гигабайт пробега

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

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?


person JMarcelino    schedule 06.03.2020    source источник
comment
Можете ли вы предоставить репрекс вашей проблемы?   -  person agila    schedule 06.03.2020
comment
Вот пример. Я могу построить одну модель, но я понятия не имею, как построить значения среднего, минимального и максимального значений кривой.   -  person JMarcelino    schedule 06.03.2020


Ответы (1)


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

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()

введите здесь описание изображения

Или min,max,mean, как вы упомянули, используя 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()

введите здесь описание изображения

person StupidWolf    schedule 07.03.2020
comment
Спасибо @StupidWolf, вы сэкономили мне много работы! Знаете ли вы, как я могу построить ответ в исходной шкале, а не в оценках? - person JMarcelino; 07.03.2020
comment
Привет @JMarcelino, мне нужно быть в порядке, в приведенной выше функции последняя строка responses = response.matrix[, 2] - mean(response.matrix[,2]); вы делаете responses = response.matrix[, 2] , и это должно сработать.. может быть, вы попробуете, и если это не сработает, я могу изучить это :) - person StupidWolf; 07.03.2020
comment
Круто, вы очень помогли в эти дни! Благодарю вас! - person JMarcelino; 07.03.2020
comment
Теперь я увидел, что ваша функция использует plot.gbm(). Я думал, что он отображает предельные эффекты, когда остальные переменные удерживаются в их среднем значении, а не интегрируют другие переменные. Есть ли обходной путь, чтобы другие переменные удерживались в их среднем значении? Спасибо - person JMarcelino; 06.04.2020
comment
Хм, я не совсем понимаю ваш вопрос, как бы вы удерживали другие переменные в их среднем значении? Вы в основном делаете правильный прогноз и имеете другие переменные в постоянном среднем значении? насколько он будет отличаться от этого маргинального сюжета? - person StupidWolf; 06.04.2020
comment
Я предполагаю, что моя проблема: я не понимаю, почему gbm.plot(), gbm.plot.fits() и plot.gbm() дают разные результаты. Я должен задать новый вопрос об этом. - person JMarcelino; 06.04.2020