Özellik seçimi ve Metilasyon verilerinde glmnet bulunan model (p >> N)


29

İlgili özellikleri seçmek ve doğrusal bir regresyon modeli oluşturmak için GLM ve Elastic Net'i kullanmak isterim (yani, hem öngörme hem de anlama, bu nedenle göreceli olarak az sayıda parametreyle bırakılmak daha iyi olur). Çıkış süreklidir. Bu var başına genler 50 olguda. Paket hakkında okuyordum , ancak uygulanacak adımlar konusunda% 100 emin değilim:2000050glmnet

  1. Lambda seçmek için CV yapın:
    cv <- cv.glmnet(x,y,alpha=0.5)
    (Q1) giriş verisine bakıldığında farklı bir alfa değeri seçer misiniz?
    (S2) Modeli oluşturmadan önce başka bir şey yapmam gerekir mi?

  2. Modeli
    model=glmnet(x,y,type.gaussian="covariance",lambda=cv$lambda.min)
    takın : (Q3) "kovaryans" tan daha iyi bir şey var mı?
    (S4) Eğer lambda CV tarafından seçildiyse, bu adım neden gerekli nlambda=?
    (Q5) daha iyi kullanmaktır lambda.minya lambda.1se?

  3. Hangi parametrelerin düştüğünü görmek için katsayıları elde edin ("."):
    predict(model, type="coefficients")

    Yardım sayfasında çok var predictyöntemleri (örneğin predict.fishnet, predict.glmnet, predict.lognet, vs). Ancak herhangi bir "düz" örnek gördüğüm gibi tahmin ediyor.
    (S6) Meli kullandığım predictveya predict.glmnetveya başka?

Düzenleme yöntemleri hakkında okuduklarıma rağmen, R ve bu istatistik paketlerinde oldukça yeniyim, bu yüzden sorunumu koda uyarlayıp uyarlamadığımdan emin olmak zor. Herhangi bir öneri kabul edilecektir.

UPDATE
göre "Daha önce de belirtildiği gibi, sınıf trenin bir amacı adı verilen bir eleman içerir finalModelbu kullanarak, bu nesne, yeni numune için tahminler üretmek için geleneksel bir şekilde kullanılabilir. Yeniden örnekleme tarafından seçilen ayar parametre değerleri ile donatılmış model, modelin tahmin fonksiyonu. "

Kullanarak caretayarlamak için alfa ve lambda hem:

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

fitMÖnceki adım 2'nin yerini alıyor mu ? Öyleyse, type.gaussian="naive",lambda=cv$lambda.min/1seşimdi glmnet seçenekleri ( ) nasıl belirtilir ?
Ve aşağıdaki predictadımı, ben yerine modelhiç fitM?

Eğer yaparsam

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

hiç anlamlı değil mi veya yanlış bir şekilde her iki paket bilgisini karıştırıyor muyum?

Yanıtlar:


42

Bölüm 1

Elastik ağda parametreler üzerinde iki tip kısıtlama kullanılmaktadır

  1. Kement kısıtlamaları (yani mutlak değerlerin boyutuna βj)
  2. Sırtı kısıtlamaları (yani, kare değerlerinin βj)

α controls the relative weighting of the two types. The Lasso constraints allow for the selection/removal of variables in the model. The ridge constraints can cope with collinear variables. Which you put more weight upon will depend on the data properties; lots of correlated variables may need both constraints, a few correlated variables might suggest more emphasis on ridge constraints.

One way to solve this is to treat α as a tuning parameter alongside λ and use the values that give the lowest CV error, in the same way that you are tuning over λ at the moment with cv.glmnet.

The R package caret can build models using the glmnet package and should be set up to tune over both parameters α and λ.

Part 2

Q3

Yes, in this case where mn (number of variables number of observations), the help page for ?glmnet suggests to use

type.gaussian = "naive"

Instead of storing all the inner-products computed along the way, which can be inefficient with a large number of variables or when mn, the "naive" option will loop over n each time it is required to computer inner products.

If you had not specified this argument, glmnet would have chosen "naive" anyway as m>500, but it is better to specify this explicitly incase the defaults and options change later in the package and you are running code at a future date.

Q4

Short answer, you don't need to specify a high value for nlambda now that you have chosen an optimal value, conditioned on α=0.5. However, if you want to plot the coefficient paths etc then having a modest set of values of λ over the interval results in a much nicer set of paths. The computational burden of doing the entire path relative to one specific λ is not that great, the result of a lot of effort to develop algorithms to do this job correctly. I would just leave nlambda at the default, unless it makes an appreciable difference in compute time.

Q5

This is a question about parsimony. The lambda.min option refers to value of λ at the lowest CV error. The error at this value of λ is the average of the errors over the k folds and hence this estimate of the error is uncertain. The lambda.1se represents the value of λ in the search that was simpler than the best model (lambda.min), but which has error within 1 standard error of the best model. In other words, using the value of lambda.1se as the selected value for λ results in a model that is slightly simpler than the best model but which cannot be distinguished from the best model in terms of error given the uncertainty in the k-fold CV estimate of the error of the best model.

The choice is yours:

  1. The best model that may be too complex of slightly overfitted: lambda.min
  2. The simplest model that has comparable error to the best model given the uncertainty: lambda.1se

Part 3

This is a simple one and is something you'll come across a lot with R. You use the predict() function 99.9% of the time. R will arrange for the use of the correct function for the object supplied as the first argument.

More technically, predict is a generic function, which has methods (versions of the function) for objects of different types (technically known as classes). The object created by glmnet has a particular class (or classes) depending on what type of model is actually fitted. glmnet (the package) provides methods for the predict function for these different types of objects. R knows about these methods and will choose the appropriate one based on the class of the object supplied.


2
GREAT anwser! I've read now about caret. Not 100% sure about the relationship between caret and glmnet package, so I did an update to my question to clarify the 'merge' of these to packages or either the switch from glmnet to caret.
PGreen

1
@PGreen: caret is an R wrapper package which wraps function interfaces from 100+ ML packages to be more consistent and adds CV, gridsearch, modifies insane parameter defaults etc. It isn't without its quirks but it's pretty good and widely used.
smci

I just want to add that for alpha tuning you can use cva.glmnet(..) instead of just cv.glmnet(...) and tune alpha and lambda at the same time. Then you can run minlossplot(cva.fit) to see which alpha gives the best result. This is both part of glmnetUtils
Espen Riskedal
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.