0

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

使用 R 中的 cv.glmnet 函数适当地选择了调整参数(我相信......)。(具体来说,alpha 是根据预测率选择的,我使用了 lambda.1se。因为选择的 alpha 是 0.5,我实际上是使用弹性网络回归。)

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

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

在此处输入图像描述

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

任何人都可以帮助我吗?

非常感谢!!

4

1 回答 1

2

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

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

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

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

于 2020-12-02T10:36:58.107 回答