Р: Как рассчитать кривую AUC и ROC для объекта / модели «bgeva»?

Поскольку у меня есть данные с двоичным ответом, но редкие события, я хотел бы улучшить их прогноз, установив модель bgeva вместо модели gam. Чтобы доказать и сравнить точность прогноза и сравнить ее с другими моделями, которые я пробовал, мне нужно рассчитать AUC и построить кривую ROC.

Проблема в том, что мой код, который работает с glm и gam, не работает с объектом bgeva. Точнее, использование функции predict() выводит ошибку: no applicable method for 'predict' applied to an object of class "bgeva", и мой друг Google не нашел для меня никакого решения.

Вот один простой пример из пакета bgeva() и код, который я использовал для вычисления AUC и построения кривой ROC для объектов glm и gam:

library(bgeva)

set.seed(0)
n <- 1500
x1 <- round(runif(n))
x2 <- runif(n)
x3 <- runif(n)
f1 <- function(x) (cos(pi*2*x)) + sin(pi*x)
f2 <- function(x) (x+exp(-30*(x-0.5)^2))
y <- as.integer(rlogis(n, location = -6 + 2*x1 + f1(x2) + f2(x3), scale  = 1) > 0)
dataSim <- data.frame(y,x1,x2,x3)

################
# bgeva model: #
################
out <- bgeva(y ~ x1 + s(x2) + s(x3))

# AUC for bgeva (does not work)##################################
library(ROCR)
pred <-as.numeric(predict(out, type="response", newdata=dataSim))
rp <- prediction(pred, dataSim$y) 
auc <- performance( rp, "auc")@y.values[[1]]
auc

################
# gam model:   #
################
library(mgcv)

out_gam <- gam(y ~ x1 + s(x2) + s(x3), family=binomial(link=logit))

# AUC and ROC for gam (the same code, works with gam) ############
 pred_gam <-as.numeric(predict(out_gam, type="response"))
 rp_gam <- prediction(pred_gam, dataSim$y)

 auc_gam <- performance( rp_gam, "auc")@y.values[[1]]
 auc_gam

 roc_gam <- performance( rp_gam, "tpr", "fpr")
 plot(roc_gam)

person Peky84    schedule 30.08.2015    source источник
comment
С str(out) я понял, что нет подходящих значений для модели в объекте bgeva. Может кто знает, как их рассчитать вручную? Тогда мне больше не нужна функция predict() для работы.   -  person Peky84    schedule 31.08.2015


Ответы (1)


# Можно посчитать

pred <-as.numeric(predict(out$gam.fit, type="response", newdata=dataSim))

# ваш пример

> auc
[1] 0.7840645
person Felipe Barletta    schedule 18.12.2020