我有一个函数来返回cv.glmnet模型的auc值,虽然不是大部分时间,但它在执行cv.glmnet函数时会返回以下错误:
掉线错误(y%%rep(1,nc)): 评估论证的错误' x'选择功能方法' drop&#39 ;: y%%rep(1,nc)中的错误:不一致的参数
我已经阅读了一些关于错误的内容,我发现的唯一建议是使用data.matrix()而不是as.matrix()。我的功能如下(其中"表格"是一个带有我所需变量的公式," dt"是数据框):
auc_cvnet <- function(form, dt, standard = F){
vars = all.vars(form)
depM = dt[[vars[1]]]
indM = data.matrix(dt[vars[-1]])
model = cv.glmnet(indM, depM, family = "binomial", nfolds=3, type.measure="auc", standardize = standard)
pred = predict(model, indM, type = "response")
tmp = prediction(pred, depM)
auc.tmp = performance(tmp, "auc")
return(as.numeric(auc.tmp@y.values))
}
我在另一个函数中实现了这个函数,它迭代了几个变量的组合,看看哪些变量组合运行良好(它是一个非常强力的方法)。无论如何,我在抛出错误时打印出迭代的公式,并且仅使用该公式调用函数并且它工作正常。所以不幸的是,我无法确定哪些调用会产生错误,否则我会尝试提供更多信息。数据框大约有30行,当我在110行的较大数据集上运行代码时没有错误。两个数据集中都没有NA。
有没有人见过这个或有任何想法?谢谢!
答案 0 :(得分:6)
信不信由你,我今天也遇到了同样的错误。由于我不知道你的数据集,我不能确定它是什么,但对我来说,我传递的数据是我的y变量(你的depM)是所有True值的列。如果我的y变量包含True和False值,cv.glmnet只会返回一个有效的模型。
我希望我能解释为什么cv.glmnet需要True和False,但我对函数本身缺乏了解(因为它是,我只调整给我的代码)。我只是觉得我会发布这个,以防它给你一些帮助排除故障。祝你好运!
答案 1 :(得分:1)
在数据集上运行cv.glmnet
时遇到同样的问题,其中包含2个正例和850个负数。在一个交叉验证迭代中(其中训练和测试集被随机采样),两个正例都从训练集中取样。因此,glmnet
调用lognet
,而drop(y %*% rep(1, nc))
调用y
,但foldid
是一个向量,而不是一个至少有两列的矩阵。
我能想到的最简单的方法是将cv.glmnet
参数指定为{{1}},并确保每次迭代中数据中至少有两个类。