Извлечение ненулевых коэффициентов в glmnet в R
Я делаю лассо логистическую регрессию. Я использовал cv.glmnet, чтобы получить ненулевые коэффициенты. И это похоже на работу, т. Е. Я получаю некоторые ненулевые коэффициенты, а остальные идут в ноль. Тем не менее, когда я использую функцию coef для печати всех коэффициентов, она дает мне список всех коэффициентов. Есть ли способ извлечь коэффициенты и их имена, которые не равны нулю. Код того, что я сделал:
cv.lasso = cv.glmnet(x_train,y_train, alpha = 0.6, family = "binomial")
coef(cv.lasso, s=cv.lasso$lambda.1se)
Когда я использую Coef, я получаю следующий вывод:
4797 x 1 sparse Matrix of class "dgCMatrix"
1
(Intercept) -1.845702
sampleid.10 .
sampleid.1008 .
Я хочу извлечь имя и значение ненулевых коэффициентов. Как я могу это сделать?
3 ответа
Очень удобный способ сделать это extract.coef
функция coefplot
пакет.
Вот простой воспроизводимый пример, адаптированный из cv.glmnet
документы:
library(glmnet)
library(coefplot)
set.seed(1010)
n=1000;p=100
nzc=trunc(p/10)
x=matrix(rnorm(n*p),n,p)
beta=rnorm(nzc)
fx= x[,seq(nzc)] %*% beta
eps=rnorm(n)*5
y=drop(fx+eps)
px=exp(fx)
px=px/(1+px)
ly=rbinom(n=length(px),prob=px,size=1)
set.seed(1011)
# model:
cvob1=cv.glmnet(x,y)
Вот x
имеет 100 переменных, от V1 до V100; какие из них имеют ненулевые коэффициенты?
extract.coef(cvob1)
# result:
Value SE Coefficient
(Intercept) -0.11291017 NA (Intercept)
V1 -0.41095526 NA V1
V2 0.50127803 NA V2
V4 -0.40319404 NA V4
V5 -0.42518885 NA V5
V6 0.42609526 NA V6
V7 0.41845873 NA V7
V8 -1.54881117 NA V8
V9 1.23284876 NA V9
V10 0.31187777 NA V10
V14 -0.03085618 NA V14
V18 -0.15211282 NA V18
V26 0.19704039 NA V26
V30 -0.11568702 NA V30
V31 -0.07108829 NA V31
V36 0.15282509 NA V36
V39 0.10250912 NA V39
V47 -0.02602025 NA V47
V60 0.04502238 NA V60
V63 -0.07051392 NA V63
V68 0.06431373 NA V68
V75 -0.35798561 NA V75
Вы можете использовать матричные обозначения.
library(MASS)
library(glmnet)
set.seed(8675309)
### simulate covariates from inepedent normals
xx <- mvrnorm(100, rep(0, 100), diag(1, 100))
### simulate coefficients first 50 from beta second 50 0 => spurious features
my_beta <- c(runif(50, -2, 2), rep(0, 50))
## simulate responses
yy <- rbinom(100, 1, plogis(xx %*% my_beta))
## do your glmnet
reg <- cv.glmnet(x = xx, y = yy, alpha = 0.5, family = 'binomial')
rownames(coef(reg, s = 'lambda.min'))[coef(reg, s = 'lambda.min')[,1]!= 0] ### returns nonzero coefs
Если вы хотите получить значения коэффициентов, отличные от нуля, И имена коэффициентов, вы можете сделать так:
# I start with your command, and assign to a variable just to make the code more readable
outcome <- coef(cv.lasso, s=cv.lasso$lambda.1se)
outcome[outcome[,1]!=0,]