如何在R中使用留一交叉验证获得AUC?

时间:2013-08-17 19:10:33

标签: r cross-validation roc glmnet

我有一个包含100个样本(行)和10000个独立特征(列)的矩阵(x)。观察结果是二元的,样本是好的还是坏的{0,1}(存储在向量y中)。我想执行一次交叉验证并分别确定每个功能的曲线下面积(AUC)(类似于CAtools包中的colAUC)。我试图使用glmnet,但它没有用。正如在手册中所说,我试图将nfold参数设置为等于观察数(100)。

>result=cv.glmnet(x,y,nfolds=100,type.measure="auc",family="binomial")

我收到了这些警告:

>"Warning messages:
1: Too few (< 10) observations per fold for type.measure='auc' in   
cv.lognet; changed to type.measure='deviance'. Alternatively, use smaller  
value for nfolds 
2: Option grouped=FALSE enforced in cv.glmnet, since < 3 observations per  
fold"

任何想法我做错了什么?是否有任何其他方式或R包来获得每个特征的LOO平衡AUC值?

我真的很感激任何帮助。谢谢!

1 个答案:

答案 0 :(得分:2)

当你做一个LOO-CV时,你有一个测试集,其中只有一个样本,你当然不能用它建立一个AUC。但是,您可以在每个步骤循环和存储预测:

k <- dim(x)[1]
predictions <- c()
for (i in 1:k) {
  model <- glmnet(x[-i,], y[-i], family="binomial")
  predictions <- c(predictions, predict(model, newx=x[i,]))
}

这样最终你可以制作一条ROC曲线,例如:

library(pROC)
roc(y, predictions)