为了检查我的模拟 logistic glm,我想使用 roc (auc) 应用 10 折交叉验证。 也就是说,计算所有折叠的 auc,然后取 aucs 的平均值。但是,当我尝试这样做时,出现了错误。 因为对于某些折叠,测试数据仅包含 1 或仅包含 0.
这是我的代码
set.seed(1234)
library(pROC)
X1=runif(50)
X2=rnorm(50,2)
y=rbinom(50,1,(1.6*X1+2.9*X2)/(1+exp(1.6*X1+2.9*X2))) #response variable#
dta=data.frame(y=y,X1=X1,X2=X2)
#10 fold cross validation#
set.seed(1234)
all.samp <- sample(1:10, length(y), replace = TRUE)
fold <- unique(all.samp)
save.auc=NULL
for(j in fold)
{
trainData = dta[!all.samp==j,]
testData = dta[all.samp==j,]
mod = glm(y~.,family=binomial,data=trainData)
mod.pred = predict(mod, newdata= testData,type="response")
rocauc=auc(roc(testData$y,mod.pred,plot=FALSE))
save.auc = c(save.auc,rocauc) #saving all AUCs#
}
现在,我收到以下错误
Error in roc.default(testData$y, mod.pred, plot = FALSE) : 'response' must have two levels
我该如何解决这个问题?我在 Cross Validated
中发布了这个问题,但是问题被关闭了,有人建议我在这里发布。
我真的需要尽快解决这个问题。因此,我真的很感激建议。
那是因为你的数据集规模小且不平衡。里面很少有阳性案例:
> y
[1] 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 1 0 0 0
[39] 0 0 0 1 0 0 0 0 0 0 0 0
结果,一些交叉验证拆分不包含任何积极的观察:
> testData$y
[1] 0 0 0 0 0 0 0 0
您将需要增加样本量或重新平衡您的数据,以便在每次拆分中始终至少有一个积极的观察。
或者,您应该设置一个分层交叉验证方案,其中正面和负面分开并保留余额。