具有行名称的稀疏矩阵子集

Sparse matrix subsetting with row names

我正在使用 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           .      
...

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

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

我已将相关输出保存为 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