Я использую, cv.glmnet
чтобы найти предикторов. Я использую следующие настройки:
lassoResults<-cv.glmnet(x=countDiffs,y=responseDiffs,alpha=1,nfolds=cvfold)
bestlambda<-lassoResults$lambda.min
results<-predict(lassoResults,s=bestlambda,type="coefficients")
choicePred<-rownames(results)[which(results !=0)]
Чтобы убедиться, что результаты воспроизводимы, я set.seed(1)
. Результаты сильно различаются. Я запустил точно такой же код 100, чтобы увидеть, насколько переменными были результаты. В 98/100 прогонах всегда был выбран один конкретный предиктор (иногда только сам по себе); другие предикторы были выбраны (коэффициент был ненулевым) обычно 50/100 раз.
Поэтому он говорит мне, что каждый раз, когда выполняется перекрестная проверка, он, вероятно, выберет другую лучшую лямбду, потому что первоначальная рандомизация складок имеет значение. Другие видели эту проблему ( результаты CV.glmnet ), но нет предложенного решения.
Я думаю, что, возможно, тот, который показывает 98/100, вероятно, довольно сильно коррелирует со всеми остальными? Результаты этого стабилизироваться , если я просто запустить LOOCV ( ), но мне интересно , почему они так переменной при nfold < п .
источник
set.seed(1)
один раз бегалcv.glmnet()
100 раз? Это не очень хорошая методология для воспроизводимости; лучшеset.seed()
перед каждым запуском, либо сохраняйте постоянные сгибы между прогонами. Каждый из ваших звонковcv.glmnet()
вызываетsample()
N раз. Так что, если длина ваших данных когда-либо меняется, воспроизводимость меняется.Ответы:
Дело здесь в том, что в
cv.glmnet
K складки («части») выбираются случайным образом.В K-складки перекрестной проверки набора данных разделена на частей, а K - 1 части используются для предсказания K-й части (это делается K раз, используя различные K часть каждый раз). Это сделано для всех лямбд, и это та, которая дает наименьшую ошибку перекрестной проверки.К К- 1 К К
lambda.min
Вот почему, когда вы используете результаты не меняются: каждая группа состоит из одной, поэтому выбор для K групп невелик .н фо л гs = n К
Из
cv.glmnet()
справочного руководства:MSE - это фрейм данных, содержащий все ошибки для всех лямбд (для 100 прогонов),
lambda.min
это ваша лямбда с минимальной средней ошибкой.источник
cv.glmnet(...)$lambda
. Моя альтернатива исправляет это: stats.stackexchange.com/a/173895/19676Тогда для каждого предиктора я получаю:
Таким образом, я получаю довольно твердое описание эффекта предиктора. Когда у вас есть распределения для коэффициентов, вы можете запустить любой статистический материал, который, по вашему мнению, стоит получить CI, значения p и т. Д., Но я еще не исследовал это.
Этот метод может использоваться с более или менее любым методом выбора, который я могу придумать.
источник
Я добавлю другое решение, которое обрабатывает ошибку в @ Alice из-за отсутствия лямбд, но не требует дополнительных пакетов, таких как @Max Ghenis. Спасибо всем остальным ответам - все делают полезные замечания!
источник
Ответ Алисы хорошо работает в большинстве случаев, но иногда выдает ошибки из-за того, что
cv.glmnet$lambda
иногда возвращает результаты различной длины, например:OptimLambda
ниже должно работать в общем случае, а также быстрее, используяmclapply
параллельную обработку и избегая циклов.источник
Вы можете контролировать случайность, если вы явно установили foldid. Вот пример для 5-кратного резюме
Теперь запустите cv.glmnet с этими складками.
Вы будете получать одинаковые результаты каждый раз.
источник