我正在尝试使用glmnet包进行功能选择。我一直在运行glmnet。但是,我很难理解输出。我的目标是获取基因列表及其各自的系数,以便根据它们在分离我的两组标签方面的相关程度对基因列表进行排名。
x = manual_normalized_melt[,colnames(manual_normalized_melt) %in%
sig_0_01_ROTS$Gene]
y = cellID_reference$conditions
glmnet_l0 <- glmnet(x = as.matrix(x), y = y, family = "binomial",alpha = 1)
关于我如何离开这里的任何提示/说明?我知道我想要的数据在glmnet_l0中,但我对如何提取它有点不确定。
此外,任何人都知道是否有办法在R?
中使用L0范数进行特征选择非常感谢你!
答案 0 :(得分:1)
以下是glmnet
中的一些方法:
首先是一些数据,因为你没有发布任何数据(物种中有两个级别的虹膜数据):
data(iris)
x <- iris[,1:4]
y <- iris[,5]
y[y == "setosa"] <- "virginica"
y <- factor(y)
首先运行交叉验证模型,看看什么是最好的lambda:
library(glmnet)
model_cv <- cv.glmnet(x = as.matrix(x),
y = y,
family = "binomial",
alpha = 1,
nfolds = 5,
intercept = FALSE)
在这里,我选择进行5倍交叉验证,以确定最佳lambda。
最好看lambda的系数:
coef(model_cv, s = "lambda.min")
#output
#5 x 1 sparse Matrix of class "dgCMatrix"
1
(Intercept) .
Sepal.Length -0.7966676
Sepal.Width 1.9291364
Petal.Length -0.9502821
Petal.Width 2.7113327
在这里你可以看到没有丢弃变量(或者它们会有。而不是系数)。如果所有功能都在相同的范围内(如基因表达数据),您可以考虑将standardize = FALSE
作为参数添加到glmnet调用,因为它默认设置为TRUE
。至少我在建模表达时会这样做。
要看到最好的lambda:
model_cv$lambda[which.min(model_cv$cvm)]
现在您可以制作包含所有数据的模型:
glmnet_l0 <- glmnet(x = as.matrix(x),
y = y,
family = "binomial",
alpha = 1,
intercept = FALSE)
您可以在lambda刻度上绘制它并添加描绘最佳lambda的垂直线:
plot(glmnet_l0, xvar = "lambda")
abline(v = log(model_cv$lambda[which.min(model_cv$cvm)]))
在这里,人们可以看到系数在最好的lambda下几乎没有缩小。
使用更高维数据,您会看到许多系数跟踪在最佳lambda开始之前趋向于0并且很多。在coef矩阵中。
使用predict.glmnet
设置s = model_cv$lambda[which.min(model_cv$cvm)]
时,它会为所有测试的lambda生成预测。
同时检查此post它包含一些其他相关信息。
答案 1 :(得分:0)
前段时间我将 glmnet 包装在一个包中进行功能选择,您可以查看at the code(从第89行开始),也可以使用devtools :: install_github下载包( &#39; mlampros / FeatureSelection&#39)。我还解释了它在blog post中的工作原理。