“glmnet R包中cv.glmnet的丢弃错误(y%*%rep(1,nc))”错误

时间:2014-07-17 17:54:33

标签: r glmnet

我有一个函数来返回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。

有没有人见过这个或有任何想法?谢谢!

2 个答案:

答案 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}},并确保每次迭代中数据中至少有两个类。