首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >使用glmnet的正则化回归:组之间没有差异?

使用glmnet的正则化回归:组之间没有差异?
EN

Stack Overflow用户
提问于 2020-12-02 15:09:13
回答 1查看 97关注 0票数 0

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

调优参数选择得当(我相信...)在R中使用cv.glmnet函数(具体地说,根据预测率选择α,我使用λ1se。因为选择的alpha是0.5,所以我实际上使用的是弹性网络回归。)

结果,有16种蛋白质(在近500种蛋白质中)具有非零系数,我假设这些蛋白质是最好地“区分”两种情况的蛋白质:要么有病,要么没有病。为了可视化,我使用这些选定的蛋白质制作了框图。

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

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

有人能帮帮我吗?

非常感谢!

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-12-02 18:36:58

套索不能保证你的预测值在你测试的时候会显示出统计意义。大多数时候,如果有预测能力,你会看到套索选择的变量和你的因变量之间的相关性。

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

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

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

代码语言:javascript
运行
复制
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)

使用全套索拟合:

代码语言:javascript
运行
复制
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

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

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

代码语言:javascript
运行
复制
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,如果您在不同的种子下运行它,则会得到不同的结果:

代码语言:javascript
运行
复制
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

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

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/65103639

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档