行名称的稀疏矩阵子集

时间:2018-08-21 08:37:35

标签: r subset sparse-matrix glmnet

我正在使用glmnet进行多项式和交叉验证的特征选择。一切都很好,但是只有不到400个预测变量和4个级别,输出变得有点混乱

X <- matrix(rnorm(350000),nrow=1000,ncol=350)
colnames(X) <- sample(LETTERS,350,TRUE)
Y <- factor(sample(LETTERS[1:5],1000,TRUE),levels =LETTERS[1:5])
out.cvfit <- cv.glmnet(x=X ,y=Y,standardize=TRUE,family="multinomial",parallel = TRUE,type.measure = "class")

所以我得到了这样的输出:

coef.cv.glmnet(out.cvfit,"lambda.1se")
...
$D
351 x 1 sparse Matrix of class "dgCMatrix"
                     1
(Intercept) 0.06770556
F           .         
L           .         
B           .         
W           .         
V           .         
W           .         
G           .         
X           .         
G           .         
A           .         
G           .         
V           .         
Q           .         
T           .      
...

一个有点人为的例子,因为所有都是零,因为没有结构,但是您明白了。

好吧,要在多个级别上查看并汇总提取的预测变量非常麻烦。那么,有没有办法从稀疏矩阵中仅提取非零预测变量?

1 个答案:

答案 0 :(得分:0)

我将相关输出另存为a。然后,您可以使用[]进行子集化。请注意,.中的dgCMatrix被识别为0

a <- coef.cv.glmnet(out.cvfit,"lambda.1se")$D
a[a[,1]!=0,]

使用的数据(示例的较小版本)。

set.seed(2018)
X <- matrix(rnorm(35000),nrow=1000,ncol=35)
colnames(X) <- sample(LETTERS,35,TRUE)
Y <- factor(sample(LETTERS[1:5],1000,TRUE),levels =LETTERS[1:5])
out.cvfit <- cv.glmnet(x=X ,y=Y,standardize=TRUE,family="multinomial",parallel = TRUE,type.measure = "class")

a <- coef.cv.glmnet(out.cvfit,"lambda.1se")$D
a[a[,1]!=0,]

 (Intercept)            R            G            R            T            Q            L            Z 
 0.017394446 -0.055170396 -0.006943011  0.006151795  0.017039835 -0.009432169 -0.047730565  0.065618965