Подмножество разреженной матрицы с именами строк

Я использую 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           .      
...

Немного надуманный пример, так как все равно нулю, так как структуры нет, но суть вы поняли.

Хорошо, это становится очень громоздким для просмотра на нескольких уровнях и составления сводок извлеченных предикторов. Итак, есть ли способ извлечь из разреженной матрицы только ненулевые предикторы?


person Fredrik Karlsson    schedule 21.08.2018    source источник
comment
Знаете ли вы, что разреженная матрица на самом деле хранит только ненулевые элементы?   -  person Roland    schedule 21.08.2018


Ответы (1)


Я сохранил соответствующий вывод как 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 
person milan    schedule 21.08.2018
comment
Фантастический. Именно то, что мне нужно. Я конвертирую вывод, используя as.data.frame() для удобочитаемости моего набора данных из 400 функций, но ваше решение было именно тем решением, которое мне нужно было найти. Спасибо! - person Fredrik Karlsson; 21.08.2018