【问题标题】:Regularized regression using glmnet: No difference between groups?使用 glmnet 的正则化回归:组间没有区别?
【发布时间】:2021-03-14 03:36:07
【问题描述】:

我正在使用正则化回归来选择几种最能区分健康状况的蛋白质(二元:有病或无病)。使用它的目的是减少维度(变量选择),以便我们可以拥有一组更小的蛋白质来最好地区分两组。

使用 R 中的 cv.glmnet 函数适当地选择了调整参数(我相信...)。 (具体来说,alpha是根据预测率选的,我用的是lambda.1se。因为选的alpha是0.5,其实我是用elastic net regression。)

因此,16 种蛋白质(在近 500 种蛋白质中)具有非零系数,我假设这些蛋白质最能“区分”两种情况:疾病或无疾病。为了可视化,我使用这些选定的蛋白质制作了箱线图。

但是,我注意到一种蛋白质(TRAP1;图中底部)在两组之间没有显示出任何明显的平均差异或离散度。

我开始想知道为什么正则化回归预测它可能是最能区分这两种健康状况的蛋白质之一?

有人可以帮帮我吗?

非常感谢!!

【问题讨论】:

    标签: r regression glmnet lasso-regression regularized


    【解决方案1】:

    Lasso 不保证您的预测变量在您测试时会显示出统计显着性。大多数情况下,如果有预测能力,您会看到套索选择的变量与您的因变量之间存在相关性。

    当您设置 alpha=0.5 时,它会施加 L1 惩罚(最小化系数的大小)和 L2 惩罚(选择 0/1 的变量),因此查看变量的分布,其中大部分为零,因此将其降低到较低的值应该使其“逃脱” L2 惩罚。

    如果您的套索的目的是选择变量,我会建议两件事 1,删除大部分为零或低方差的特征,如您在上面显示的那个,以及 2. 运行 alpha = 1 的完整套索. 比较预测的准确性。

    我没有你的数据,但我可以用数据集 mtcars 来说明,我在其中引入了一个无意义的预测器并首先计算预测器的 pvalues:

    set.seed(111)
    dat = iris
    dat$Species = ifelse(dat$Species=="versicolor",1,0)
    noise_var = data.frame(matrix(runif(750),nrow=150))
    colnames(noise_var) = paste0("noise",1:ncol(noise_var))
    dat  = cbind(noise_var,dat)
    
    p = sapply(dat[,-ncol(dat)],function(i)cor.test(i,dat$Species)$p.value)
    

    使用完整套索拟合:

    set.seed(222)
    fit_lasso = cv.glmnet(x = as.matrix(dat[,-ncol(dat)]),y=dat[,ncol(dat)],alpha=1)
    cbind(coef(fit_lasso,lambda="1se")[-1],p)
    
                                       p
    noise1        0.0000000 5.089346e-01
    noise2        0.0000000 2.722532e-01
    noise3        0.0000000 9.564023e-02
    noise4        0.0000000 7.743330e-01
    noise5        0.0000000 7.324517e-02
    Sepal.Length  0.0000000 3.341524e-01
    Sepal.Width  -0.3073508 1.595624e-09
    Petal.Length  0.0000000 1.329302e-02
    Petal.Width   0.0000000 1.507473e-01
    

    您可以看到非零系数是显着的,而其他一些显着的系数则不包括在内,这是由于相关性。

    现在拟合弹性网,你可以看到噪声变量包含在低系数中:

    set.seed(222)
    fit_enet = cv.glmnet(x = as.matrix(dat[,-ncol(dat)]),y=dat[,ncol(dat)],alpha=0.5)
    cbind(coef(fit_enet,lambda="1se")[-1],p)
    
                                        p
    noise1        0.00000000 5.089346e-01
    noise2        0.00000000 2.722532e-01
    noise3        0.00000000 9.564023e-02
    noise4        0.00000000 7.743330e-01
    noise5       -0.04636756 7.324517e-02
    Sepal.Length  0.00000000 3.341524e-01
    Sepal.Width  -0.31452496 1.595624e-09
    Petal.Length  0.00000000 1.329302e-02
    Petal.Width   0.00000000 1.507473e-01
    

    还要记住解决方案或选择不稳定,请参阅this post,如果你在不同的种子下运行它,你会得到不同的结果:

    set.seed(333)
    fit_enet = cv.glmnet(x = as.matrix(dat[,-ncol(dat)]),y=dat[,ncol(dat)],alpha=0.5)
    cbind(coef(fit_enet,lambda="1se")[-1],p)
    
                                       p
    noise1        0.0000000 5.089346e-01
    noise2        0.0000000 2.722532e-01
    noise3        0.0000000 9.564023e-02
    noise4        0.0000000 7.743330e-01
    noise5        0.0000000 7.324517e-02
    Sepal.Length  0.0000000 3.341524e-01
    Sepal.Width  -0.2393709 1.595624e-09
    Petal.Length  0.0000000 1.329302e-02
    Petal.Width   0.0000000 1.507473e-01
    

    您当然可以在几个种子上运行它,以查看系数选择的稳定性,但请记住,当相关性很大时,这很复杂

    【讨论】:

    • 很高兴它有用 :) 享受你的蛋白质乐趣
    猜你喜欢
    • 2015-07-16
    • 2015-06-01
    • 2015-02-13
    • 2016-07-03
    • 1970-01-01
    • 2012-07-22
    • 2016-06-28
    • 2018-08-09
    • 1970-01-01
    相关资源
    最近更新 更多