2015-06-01 20 views
11

Sto usando seguente codice con glmnet:Come coefficienti glmnet a 'migliore' lambda

> library(glmnet) 
> fit = glmnet(as.matrix(mtcars[-1]), mtcars[,1]) 
> plot(fit, xvar='lambda') 

enter image description here

Tuttavia, voglio stampare i coefficienti nella migliore delle ipotesi Lambda, come si è fatto in cresta regressione. Vedo la seguente struttura di adattamento:

> str(fit) 
List of 12 
$ a0  : Named num [1:79] 20.1 21.6 23.2 24.7 26 ... 
    ..- attr(*, "names")= chr [1:79] "s0" "s1" "s2" "s3" ... 
$ beta  :Formal class 'dgCMatrix' [package "Matrix"] with 6 slots 
    .. [email protected] i  : int [1:561] 0 4 0 4 0 4 0 4 0 4 ... 
    .. [email protected] p  : int [1:80] 0 0 2 4 6 8 10 12 14 16 ... 
    .. [email protected] Dim  : int [1:2] 10 79 
    .. [email protected] Dimnames:List of 2 
    .. .. ..$ : chr [1:10] "cyl" "disp" "hp" "drat" ... 
    .. .. ..$ : chr [1:79] "s0" "s1" "s2" "s3" ... 
    .. [email protected] x  : num [1:561] -0.0119 -0.4578 -0.1448 -0.7006 -0.2659 ... 
    .. [email protected] factors : list() 
$ df  : int [1:79] 0 2 2 2 2 2 2 2 2 3 ... 
$ dim  : int [1:2] 10 79 
$ lambda : num [1:79] 5.15 4.69 4.27 3.89 3.55 ... 
$ dev.ratio: num [1:79] 0 0.129 0.248 0.347 0.429 ... 
$ nulldev : num 1126 
$ npasses : int 1226 
$ jerr  : int 0 
$ offset : logi FALSE 
$ call  : language glmnet(x = as.matrix(mtcars[-1]), y = mtcars[, 1]) 
$ nobs  : int 32 
- attr(*, "class")= chr [1:2] "elnet" "glmnet" 

Ma non sono in grado di ottenere il migliore Lambda e i coefficienti corrispondenti. Grazie per l'aiuto.

+1

Si sta utilizzando la sequenza lambda predefinita, che viene costruita utilizzando 'nlambda, lambda.min.ratio'. Il consiglio che ho sempre sentito è stato quello di passare la tua sequenza lambda, ad es. 'lambda = 10^seq (10, -15,1/3)' o simile. – smci

+0

@smci, hai un errore di battitura nel tuo esempio. Il segno dovrebbe essere sul parametro from ad es. 'lambda = 10^seq (da = -10, a = 15, di = 1/3)' Il registro – Faris

risposta

12

Prova questo:

fit = glmnet(as.matrix(mtcars[-1]), mtcars[,1], 
    lambda=cv.glmnet(as.matrix(mtcars[-1]), mtcars[,1])$lambda.1se) 
coef(fit) 

Oppure si può specificare un specificare un valore lambda in coef:

fit = glmnet(as.matrix(mtcars[-1]), mtcars[,1]) 
coef(fit, s = cv.glmnet(as.matrix(mtcars[-1]), mtcars[,1])$lambda.1se) 

È necessario scegliere un "migliore" lambda, e lambda.1se è un ragionevole, oppure giustificabile, uno da scegliere. Ma potresti usare cv.glmnet(as.matrix(mtcars[-1]), mtcars[,1])$lambda.min o qualsiasi altro valore di lambda che stabilisci come "migliore" per te.

+0

di lambda.min da cv.glmnet arriva a -0,5. Va bene se contrassegno questo punto sull'asse x della trama (adattato) da glmnet sopra? Il log lambda indicato sull'asse x di quel grafico proviene dallo stesso vettore da cui è arrivato lambda.min? – rnso

+1

Il log lambda sull'asse x proviene dallo stesso vettore di valori lambda da cui proveniva lambda.min. Basta essere consapevoli del fatto che, a causa della natura della convalida incrociata, è possibile ottenere valori diversi per 'lambda.min' se si esegue nuovamente' cv.glmnet'. Quindi, il tuo segno sull'asse x sarebbe il 'lambda.min' da una chiamata particolare di' cv.glmnet'. – Jota

+0

Sarà corretto dire che se (width = lambda.1se - lambda.min), quindi (lambda.min +/- 1.96 * width) saranno gli intervalli di confidenza al 95% per lambda.min o l'area in cui il vero il modello di regressione rischia di mentire? – rnso

0

boxcox(){MASS} fornisce un grafico di probabilità massima mostra quale valore di l fornisce la soluzione migliore in un modello lineare

boxcox(lm.fit) fornisce la trama massima probabilità per una vasta gamma di l's nel modello lineare

lm.fit raccogliere la l con il più alto valore ML

boxcox(lm.fit,lambda=seq(-0.1, 0.1, 0.01)) se, per esempio , il più alto l è circa 0,04, ottenere un ingrandita trama intorno a in quell'area

Nell'esempio, la funzione fornisce un grafico tra l = - 0,1 e 0,1 in incrementi di 0,01.