【问题标题】:Extracting non-zero coefficients in glmnet in R在 R 中提取 glmnet 中的非零系数
【发布时间】:2019-07-25 20:12:42
【问题描述】:

我正在做一个套索逻辑回归。我已经使用 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  .  

我想提取非零系数的名称和值。我该怎么做?

【问题讨论】:

    标签: r machine-learning glmnet lasso-regression


    【解决方案1】:

    一个非常方便的方法是coefplot 包的extract.coef 函数。

    这是一个简单的可重现示例,改编自 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
    

    【讨论】:

      【解决方案2】:

      您可以使用矩阵表示法。

      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
      

      【讨论】:

        【解决方案3】:

        如果您希望获得不同于零的系数值和系数名称,您可以这样做:

        # 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,]
        

        【讨论】:

          猜你喜欢
          • 2020-01-27
          • 2021-09-26
          • 2018-06-20
          • 2020-06-05
          • 2012-06-23
          • 1970-01-01
          • 2014-10-06
          • 2020-11-15
          • 2015-03-04
          相关资源
          最近更新 更多