Ошибка "drop" (y %*% rep(1, nc))"для cv.glmnet в пакете glmnet R

У меня есть функция для возврата значения auc для модели cv.glmnet, и она часто, хотя и не в большинстве случаев, возвращает следующую ошибку при выполнении функции cv.glmnet:

Ошибка в отбрасывании (y%% rep (1, nc)): ошибка в оценке аргумента "x" при выборе метода для функции "drop": Ошибка в 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.

Кто-нибудь видел это раньше или есть мысли? Спасибо!

2 ответа

Хотите верьте, хотите нет, но сегодня я действительно получил эту же ошибку. Поскольку я не знаю ваш набор данных, я не могу точно сказать, что это такое, но для меня данные, которые я передавал в качестве моей переменной y (ваше depM), были столбцом всех значений True. cv.glmnet вернул бы допустимую модель, только если моя переменная y содержала значения True и False.

Хотелось бы мне объяснить, почему cv.glmnet требовал как True, так и False, но у меня недостаточно понимания самой функции (поскольку я только адаптирую данный мне код). Я просто подумал, что опубликую это на тот случай, если это поможет вам устранить неполадки. Удачи!

У меня такая же проблема при запуске cv.glmnet на наборе данных с 2 положительными случаями и 850 отрицательными случаями. На одной из итераций перекрестной проверки (когда обучающий и тестовый наборы выбираются случайным образом), оба положительных случая отбираются из обучающего набора. Таким образом, glmnet звонки lognetкоторый в свою очередь вызывает drop(y %*% rep(1, nc)) но y является вектором, а не матрицей, по крайней мере, с двумя столбцами.

Самый простой способ, который я могу придумать, это указать foldid параметр для cv.glmnet и убедитесь, что в каждой итерации в данных присутствуют как минимум два класса.

Другие вопросы по тегам