Выбор характеристик и модель с glmnet по данным метилирования (p >> N)

29

Я хотел бы использовать GLM и Elastic Net, чтобы выбрать эти релевантные функции + построить модель линейной регрессии (т. Е. Как прогнозирование, так и понимание, поэтому было бы лучше оставить с относительно небольшим количеством параметров). Выход непрерывный. Это генов на случаев. Я читал об этом пакете, но я не уверен на 100%, что делать:2000050glmnet

  1. Выполните CV, чтобы выбрать лямбду:
    cv <- cv.glmnet(x,y,alpha=0.5)
    (Q1), учитывая входные данные, вы бы выбрали другое альфа-значение?
    (Q2) мне нужно сделать что-то еще, прежде чем строить модель?

  2. Подходит модель:
    model=glmnet(x,y,type.gaussian="covariance",lambda=cv$lambda.min)
    (Q3) что-нибудь лучше, чем "ковариация"?
    (Q4) Если лямбда была выбрана CV, зачем нужен этот шаг nlambda=?
    (Q5) лучше использовать lambda.minили lambda.1se?

  3. Получите коэффициенты, чтобы увидеть, какие параметры выпали («.»):
    predict(model, type="coefficients")

    На странице справок есть много predictметодов (например, predict.fishnet, predict.glmnet, predict.lognetи т.д.). Но любой «простой» прогноз, как я видел на примере.
    (Q6) я должен использовать predictили predict.glmnetили другое?

Несмотря на то, что я читал о методах регуляризации, я довольно новичок в R и в этих статистических пакетах, поэтому трудно быть уверенным, адаптирую ли я свою проблему к коду. Любые предложения будут приветствоваться.

ОБНОВЛЕНИЕ,
основанное на «Как уже отмечалось, объект класса train содержит элемент с именем finalModel, который представляет собой подобранную модель со значениями параметров настройки, выбранными путем повторной выборки. Этот объект можно использовать традиционным способом для генерации прогнозов для новых выборок, используя функция прогнозирования модели ".

Использование caretдля настройки как альфа, так и лямбда:

  trc = trainControl(method=cv, number=10)  
  fitM = train(x, y, trControl = trC, method="glmnet")  

Есть ли fitMзаменить предыдущий шаг 2? Если да, то как указать параметры glmnet ( type.gaussian="naive",lambda=cv$lambda.min/1se) сейчас?
И следующий predictшаг, я могу заменить modelна fitM?

Если я сделаю

  trc = trainControl(method=cv, number=10)  
  fitM = train(x, y, trControl = trC, method="glmnet")  
  predict(fitM$finalModel, type="coefficients")

это имеет смысл вообще, или я неправильно смешиваю оба словаря пакета?

PGreen
источник

Ответы:

42

Часть 1

В упругой сети используются два типа ограничений на параметры

  1. Ограничения лассо (т.е. на размер абсолютных значений )βj
  2. Ограничения хребта (то есть на размер квадратов значений )βj

α управляет относительным весом двух типов. Ограничения Лассо позволяют выбирать / удалять переменные в модели. Ограничения гребня могут справиться с коллинеарными переменными. То, что вы придаете большее значение, будет зависеть от свойств данных; Многие коррелированные переменные могут нуждаться в обоих ограничениях, некоторые коррелированные переменные могут предложить больший акцент на ограничениях гребня.

Один из способов решить эту проблему - трактовать как параметр настройки вместе с и использовать значения, которые дают наименьшую ошибку CV, так же, как вы настраиваете в данный момент с помощью .λ λαλλcv.glmnet

R пакет каретка может строить модели , используя glmnet пакет и должен быть установлен для настройки над обоими параметрами и .λαλ

Часть 2

Q3

Да, в этом случае, где (количество переменных количество наблюдений), страница справки для предлагает использоватьmn?glmnet

type.gaussian = "naive"

Вместо того, чтобы хранить все внутренние продукты, вычисленные по пути, что может быть неэффективно при большом количестве переменных или когда , опция будет зацикливаться на каждый раз, когда это требуется для внутренних продуктов компьютера.nmn"naive"n

Если бы вы не указали этот аргумент, glmnetв "naive"любом случае выбрали бы , но лучше указать это явно, если значения по умолчанию и параметры изменятся позже в пакете, и вы выполняете код в будущем.m>500

Q4

Короткий ответ: вам пока не нужно указывать высокое значение, nlambdaесли вы выбрали оптимальное значение, обусловленное . Однако, если вы хотите отобразить пути коэффициентов и т. Д., То скромный набор значений течение интервала приведет к гораздо более хорошему набору путей. Вычислительная нагрузка, связанная с выполнением всего пути относительно одной конкретной , не так велика, что является результатом огромных усилий по разработке алгоритмов для правильного выполнения этой работы. Я бы просто оставил значение по умолчанию, если оно не вносит заметной разницы во время вычислений.λ λα=0.5λλnlambda

Q5

Это вопрос о скупости. lambda.minВариант относится к значению по самой низкой ошибке CV. Ошибка при этом значении является средним значением ошибок по сгибам, и, следовательно, эта оценка ошибки является неопределенной. Представляет значение в поиске , что было проще , чем лучшая модель ( ), но имеет погрешность в пределах 1 стандартной ошибки лучшей модели. Другими словами, используя значение как выбранное значение дляλ k λ λ kλλklambda.1seλlambda.minlambda.1seλВ результате получается модель, которая несколько проще, чем лучшая модель, но которую нельзя отличить от лучшей модели с точки зрения ошибки, учитывая неопределенность в кратной CV-оценке ошибки наилучшей модели.k

Выбор за вами:

  1. Лучшая модель, которая может быть слишком сложной или слегка переоснащенной: lambda.min
  2. Простейшая модель, в которой погрешность сопоставима с лучшей моделью с учетом неопределенности: lambda.1se

Часть 3

Это простой способ, с которым вы часто сталкиваетесь в R. Вы используете predict()функцию в 99,9% случаев. R организует использование правильной функции для объекта, предоставленного в качестве первого аргумента.

Более технически, predictэто универсальная функция, которая имеет методы (версии функции) для объектов различных типов (технически известных как классы ). Созданный объект glmnetимеет определенный класс (или классы) в зависимости от того, какой тип модели фактически соответствует. glmnet (пакет) предоставляет методы для predictфункций для этих различных типов объектов. R знает об этих методах и выберет подходящий на основе класса предоставленного объекта.

Восстановить Монику - Дж. Симпсон
источник
2
БОЛЬШОЙ ответ! Я читал сейчас о карете. Не уверен на 100% в отношении отношений между Caret и пакетом glmnet, поэтому я сделал обновление своего вопроса, чтобы прояснить «слияние» этих пакетов с пакетами или переключение с glmnet на Caret.
PGreen
1
@PGreen: caretэто пакет-обертка R, который оборачивает функциональные интерфейсы из более чем 100 ML-пакетов для большей согласованности и добавляет CV, gridsearch, изменяет безумные параметры по умолчанию и т. Д. Он не лишен своих причуд, но довольно хорош и широко используется.
SMCI
Я просто хочу добавить, что для альфа-настройки вы можете использовать cva.glmnet(..)вместо просто cv.glmnet(...)и настраивать альфа и лямбда одновременно. Затем вы можете запустить, minlossplot(cva.fit)чтобы увидеть, какая альфа дает лучший результат. Это обе части glmnetUtils
Эспен Рискедал