3

我有一个函数可以返回 cv.glmnet 模型的 auc 值,虽然不是大多数时候,但它经常在执行 cv.glmnet 函数时返回以下错误:

drop(y % % rep(1, nc)) 中的错误:在为函数 'drop' 选择方法时评估参数 'x' 时出错:y % % rep(1, nc) 中的错误:参数不一致

我已经阅读了一些关于该错误的信息,我能找到的唯一建议是使用 data.matrix() 而不是 as.matrix()。我的函数如下(其中“form”是带有我想要的变量的公式,“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。

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

4

2 回答 2

7

信不信由你,我今天实际上遇到了同样的错误。因为我不知道你的数据集,所以我不能确定它是什么,但对我来说,我作为 y 变量(你的 depM)传递的数据是所有 True 值的列。如果我的 y 变量包含 True 和 False 值,cv.glmnet 只会返回有效模型。

我希望我能解释为什么 cv.glmnet 需要 True 和 False,但是我对函数本身缺乏了解(事实上,我只是在调整给我的代码)。我只是想我会发布这个,以防它给你一些故障排除帮助。祝你好运!

于 2014-07-17T22:03:22.810 回答
1

cv.glmnet在包含 2 个正例和 850 个负例的数据集上运行时,我遇到了同样的问题。在一次交叉验证迭代中(训练集和测试集是随机抽样的),两个正例都从训练集中抽样出来。因此,glmnet调用lognet,它又调用drop(y %*% rep(1, nc))buty是一个向量,而不是一个至少有两列的矩阵。

我能想到的最简单的方法是指定foldid参数cv.glmnet并确保每次迭代中数据中至少存在两个类。

于 2015-03-05T12:58:05.580 回答