2015-06-01 13 views
11

Tôi đang sử dụng đoạn mã sau với glmnet:Bắt hệ số glmnet tại 'tốt nhất' lambda

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

enter image description here

Tuy nhiên, tôi muốn in ra các hệ số lúc tốt nhất Lambda, giống như nó được thực hiện ở sườn núi hồi quy. Tôi thấy cấu trúc phù hợp sau đây:

> 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" 

Nhưng tôi không thể có được Lambda tốt nhất và các hệ số tương ứng. Cảm ơn bạn đã giúp đỡ.

+1

Bạn đang sử dụng trình tự lambda mặc định, được tạo bằng cách sử dụng 'nlambda, lambda.min.ratio'. Lời khuyên mà tôi luôn nghe là vượt qua chuỗi lambda của riêng bạn, ví dụ: 'lambda = 10^seq (10, -15,1/3)' hoặc tương tự. – smci

+0

@smci, bạn có lỗi đánh máy trong ví dụ của mình. Dấu hiệu phải có trên tham số từ ví dụ: 'lambda = 10^seq (từ = -10, đến = 15, bởi = 1/3)' – Faris

Trả lời

12

Hãy thử điều này:

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

Hoặc bạn có thể chỉ định một định một giá trị lambda trong coef:

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

Bạn cần phải chọn một lambda "tốt nhất", và lambda.1se là hợp lý, hoặc chính đáng, một để chọn. Nhưng bạn có thể sử dụng cv.glmnet(as.matrix(mtcars[-1]), mtcars[,1])$lambda.min hoặc bất kỳ giá trị nào khác của lambda mà bạn giải quyết khi là "tốt nhất" cho bạn.

+0

nhật ký lambda.min từ cv.glmnet đến -0,5. Có phải tất cả các quyền nếu tôi đánh dấu điểm này trên trục x của cốt truyện (phù hợp) từ glmnet ở trên? Các lambda đăng nhập chỉ ra trên trục x của cốt truyện đó là từ cùng một vector từ nơi lambda.min đã đến? – rnso

+1

Hàm lambda trên trục x là từ cùng một vectơ của các giá trị lambda mà lambda.min xuất phát. Chỉ cần lưu ý rằng do bản chất của xác thực chéo, bạn có thể nhận được các giá trị khác nhau cho 'lambda.min' nếu bạn chạy' cv.glmnet' một lần nữa. Vì vậy, dấu của bạn trên trục x sẽ là 'lambda.min' từ một cuộc gọi cụ thể của' cv.glmnet'. – Jota

+0

Sẽ đúng khi nói rằng nếu (width = lambda.1se - lambda.min), thì (lambda.min +/- 1.96 * width) sẽ là khoảng tin cậy 95% cho lambda.min hoặc khu vực nơi đúng mô hình hồi quy có khả năng nói dối? – rnso

0

boxcox(){MASS} cung cấp một âm mưu maximum-likelihood cho thấy mà giá trị của l cung cấp phù hợp nhất trong một mô hình tuyến tính

boxcox(lm.fit) cung cấp cốt truyện maximum-likelihood cho một loạt của l's trong mô hình tuyến tính

lm.fit chọn l với giá trị cao nhất ML

boxcox(lm.fit,lambda=seq(-0.1, 0.1, 0.01)) nếu, ví dụ, l cao nhất là khoảng 0,04, có được một đã thu nhỏ trong ô khoảng khu vực đó

Trong ví dụ, hàm cung cấp một âm mưu giữa l = - 0,1 và 0,1 gia tăng 0,01.

Các vấn đề liên quan