r - 基于 glmnet 包最能区分组的变量
问题描述
我最终想找到一组使用弹性网回归方法最能区分三组(低、中、高)的蛋白质。
有可重现的示例代码:
tempcv <- cv.glmnet(x=as.matrix(iris[,-5]), y=iris[,5], family="multinomial",
nfolds=20, alpha=0.5)
coefsMin <- coef(tempcv, s="lambda.min")
然后我得到的是以下内容:
$setosa
5 x 1 sparse Matrix of class "dgCMatrix"
1
(Intercept) 15.119192
Sepal.Length -1.897589
Sepal.Width 5.455627
Petal.Length -2.807969
Petal.Width -5.942061
$versicolor
5 x 1 sparse Matrix of class "dgCMatrix"
1
(Intercept) 4.795799
Sepal.Length 1.726752
Sepal.Width .
Petal.Length -1.160588
Petal.Width -1.978123
$virginica
5 x 1 sparse Matrix of class "dgCMatrix"
1
(Intercept) -19.914991
Sepal.Length .
Sepal.Width -3.925362
Petal.Length 4.536932
Petal.Width 9.236506
在这种情况下,使用每个系数的绝对值,我可以将这个结果解释如下吗?
最能区分“setosa”与其他两组(“versicolor”和“virginica”)的两个变量是 Sepal.Width (5.46) 和 Petal.Width (-5.94)。
如果这是错误的,那么我该如何选择一些最能区分群体的变量/特征?
非常感谢!!!
解决方案
对于 glmnet,您获得的系数与您的输入具有相同的比例,来自小插图:
请注意,对于 family = "gaussian",glmnet 在计算其 lambda 序列之前标准化为具有单位方差(然后对结果系数进行非标准化)。
在您的示例中,自变量未按比例缩放。因此,系数的大小将取决于自变量的规模。例如, Sepal.Width
每个单位的均值系数Sepal.Width
会使对数几率增加 5.46。但是你可以看到它们的取值范围非常不同:
apply(iris[,1:4],2,range)
Sepal.Length Sepal.Width Petal.Length Petal.Width
[1,] 4.3 2.0 1.0 0.1
[2,] 7.9 4.4 6.9 2.5
只有在应用套索之前缩放自变量时,您的假设才成立。
推荐阅读
- linux - 为什么 MongoDb 会因“得到信号:7(总线错误)”而崩溃
- c++11 - 使用 ostream 和打印功能进行打印,具有内部功能
- java - iText PDF:如何在 PDF 中创建指向其他部分的内部链接
- git - 将提交从一个分支移动到另一个分支
- javascript - 在数组中分组、过滤和计数
- pipenv - 使用 pipenv 安装 pyside
- r - R 中的 %||% 运算符有什么作用?管道百分比 管道百分比
- angular - Angular NgForm 有两个组件
- python-3.x - Python时间给出了错误的值
- sdk - Microsoft.AspNetCore.App 2.1.1 升级“被项目阻止”