Selezione e modello delle caratteristiche con glmnet sui dati di metilazione (p >> N)


29

Vorrei usare GLM e Elastic Net per selezionare quelle caratteristiche rilevanti + costruire un modello di regressione lineare (cioè sia la previsione che la comprensione, quindi sarebbe meglio rimanere con relativamente pochi parametri). L'output è continuo. Sono geni per casi. Ho letto del pacchetto, ma non sono sicuro al 100% dei passaggi da seguire:2000050glmnet

  1. Esegui CV per scegliere lambda:
    cv <- cv.glmnet(x,y,alpha=0.5)
    (Q1) dati i dati di input, sceglieresti un valore alfa diverso?
    (Q2) devo fare qualcos'altro prima di costruire il modello?

  2. Adatta il modello:
    model=glmnet(x,y,type.gaussian="covariance",lambda=cv$lambda.min)
    (Q3) qualcosa di meglio della "covarianza"?
    (Q4) Se lambda è stato scelto da CV, perché è necessario questo passaggio nlambda=?
    (Q5) è meglio usare lambda.mino lambda.1se?

  3. Ottieni i coefficienti, per vedere quali parametri sono stati esclusi ("."):
    predict(model, type="coefficients")

    Nella pagina di aiuto ci sono molti predictmetodi (ad esempio, predict.fishnet, predict.glmnet, predict.lognet, ecc). Ma qualsiasi previsione "semplice" come ho visto su un esempio.
    (Q6) Dovrei usare predicto predict.glmneto altro?

Nonostante ciò che ho letto sui metodi di regolarizzazione, sono abbastanza nuovo in R e in questi pacchetti statistici, quindi è difficile essere sicuri se sto adattando il mio problema al codice. Eventuali suggerimenti saranno i benvenuti.

AGGIORNAMENTO
Basato su "Come precedentemente notato, un oggetto di un treno di classe contiene un elemento chiamato finalModel, che è il modello adattato con i valori dei parametri di ottimizzazione selezionati mediante ricampionamento. Questo oggetto può essere utilizzato nel modo tradizionale per generare previsioni per nuovi campioni, usando quello funzione di previsione del modello ".

Usando caretper sintonizzare sia alpha che lambda:

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

Non fitMsostituire precedente punto 2? In tal caso, come specificare le opzioni glmnet ( type.gaussian="naive",lambda=cv$lambda.min/1se) ora?
E il predictpassaggio seguente , posso sostituire modela fitM?

Se lo faccio

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

ha senso o sto mescolando erroneamente entrambi i termini del pacchetto?

Risposte:


42

Parte 1

Nella rete elastica vengono impiegati due tipi di vincoli sui parametri

  1. Vincoli del lazo (ovvero sulla dimensione dei valori assoluti di )βj
  2. Vincoli di cresta (cioè sulla dimensione dei valori al quadrato di )βj

α controlla la ponderazione relativa dei due tipi. I vincoli Lazo consentono la selezione / rimozione di variabili nel modello. I vincoli della cresta possono far fronte a variabili collineari. Il tuo peso maggiore dipenderà dalle proprietà dei dati; molte variabili correlate potrebbero aver bisogno di entrambi i vincoli, alcune variabili correlate potrebbero suggerire una maggiore enfasi sui vincoli della cresta.

Un modo per risolvere questo problema è trattare come un parametro di ottimizzazione insieme a e usare i valori che danno l'errore CV più basso, allo stesso modo in cui stai sintonizzando al momento .αλλcv.glmnet

Il cursore del pacchetto R può costruire modelli usando il pacchetto glmnet e dovrebbe essere impostato per sintonizzarsi su entrambi i parametri e .αλ

Parte 2

Q3

Sì, in questo caso in cui (numero di variabili numero di osservazioni), la pagina di aiuto per suggerisce di usaremn?glmnet

type.gaussian = "naive"

Invece di archiviare tutti i prodotti interni calcolati lungo il percorso, il che può essere inefficiente con un gran numero di variabili o quando , l' opzione passerà in rassegna ogni volta che è richiesta per i prodotti interni del computer.mn"naive"n

Se non avessi specificato questo argomento, glmnetavresti scelto "naive"comunque come , ma è meglio specificare questo in modo esplicito se le impostazioni predefinite e le opzioni cambiano più avanti nel pacchetto e stai eseguendo il codice in una data futura.m>500

Q4

Risposta breve, non è necessario specificare un valore elevato per nlambdaora che è stato scelto un valore ottimale, condizionato su . Tuttavia, se si desidera tracciare i percorsi dei coefficienti, ecc., Avere un set modesto di valori di nell'intervallo comporta un set di percorsi molto più bello. L'onere computazionale di fare l'intero percorso rispetto a uno specifico non è così grande, il risultato di un grande sforzo per sviluppare algoritmi per fare correttamente questo lavoro. Vorrei solo lasciare l'impostazione predefinita, a meno che non faccia una differenza apprezzabile nel tempo di calcolo.α=0.5λλnlambda

Q5

Questa è una domanda sulla parsimonia. L' lambda.minopzione si riferisce al valore di con l'errore CV più basso. L'errore con questo valore di è la media degli errori sulle pieghe e quindi questa stima dell'errore è incerta. Il rappresenta il valore di nella ricerca che era più semplice del miglior modello ( ), ma che ha un errore entro 1 errore standard del miglior modello. In altre parole, usando il valore di come valore selezionato perλλklambda.1seλlambda.minlambda.1seλsi traduce in un modello leggermente più semplice del modello migliore ma che non può essere distinto dal modello migliore in termini di errore data l'incertezza nella stima CV dell'errore del modello migliore.k

La scelta è tua:

  1. Il miglior modello che potrebbe essere troppo complesso di leggermente sovradimensionato: lambda.min
  2. Il modello più semplice che presenta un errore comparabile al modello migliore data l'incertezza: lambda.1se

Parte 3

Questo è semplice ed è qualcosa che incontrerai molto con R. Usi la predict()funzione il 99,9% delle volte. R organizzerà l'uso della funzione corretta per l'oggetto fornito come primo argomento.

Più tecnicamente, predictè una funzione generica, che ha metodi (versioni della funzione) per oggetti di diversi tipi (tecnicamente noti come classi ). L'oggetto creato da glmnetha una particolare classe (o classi) a seconda del tipo di modello effettivamente adattato. glmnet (il pacchetto) fornisce metodi per la predictfunzione per questi diversi tipi di oggetti. R conosce questi metodi e sceglierà quello appropriato in base alla classe dell'oggetto fornito.


2
GRANDE risposta! Ho letto ora di Caret. Non sono sicuro al 100% della relazione tra caret e pacchetto glmnet, quindi ho fatto un aggiornamento alla mia domanda per chiarire la "fusione" di questi con i pacchetti o il passaggio da glmnet a caret.
PGreen,

1
@Preen: caretè un pacchetto R wrapper che avvolge le interfacce delle funzioni da pacchetti 100+ ML per essere più coerenti e aggiunge CV, gridsearch, modifica valori di default insane dei parametri ecc. Non è privo di stranezze ma è abbastanza buono e ampiamente usato.
smci,

Voglio solo aggiungere che per la sintonizzazione alfa puoi usare al cva.glmnet(..)posto di solo cv.glmnet(...)e sintonizzare alfa e lambda allo stesso tempo. Quindi puoi correre minlossplot(cva.fit)per vedere quale alfa dà il miglior risultato. Questo fa parte di glmnetUtils
Espen Riskedal,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.