强制模型系数清理 2 列数据框

Coerce model coefficients to clean, 2-column dataframe

我正在使用交叉验证拟合弹性网,我正在查看每个预测变量的系数有多大:

lambda <- cv.glmnet(x = features_training, y = outcomes_training, alpha = 0)
elnet <- lambda$glmnet.fit
coefs <- coef(elnet, s = lambda$lambda.min, digits = 3)

coefs 变量包含一个 dgCMatrix:

                           1
(Intercept)    -1.386936e-16
ret             4.652863e-02
ind30          -2.419878e-03
spyvol          1.570406e-02

有没有一种快速的方法可以将其转换为具有 2 列的数据框(一列用于预测变量名称,另一列用于系数值)? as.data.frameas.matrix 或链接两者都不起作用。我特别想根据第二列对行进行排序。

另一种方法,没有通过 attributes() 函数进行破解,而是提取行名和矩阵值。 attributes(class(coefs)) 表明 dgCMatrix 是使用 Matrix 包创建的稀疏矩阵。

data.frame( predict_names = rownames(coefs),
            coef_vals = matrix(coefs))

# predict_names    coef_vals
# 1    (Intercept) 21.117339411
# 2    (Intercept)  0.000000000
# 3            cyl -0.371338786
# 4           disp -0.005254534
# 5             hp -0.011613216
# 6           drat  1.054768651
# 7             wt -1.234201216
# 8           qsec  0.162451314
# 9             vs  0.771959823
# 10            am  1.623812912
# 11          gear  0.544171362
# 12          carb -0.547415029

broom::tidy 有一个很好的方法将 dgCMatrix 对象强制转换为长格式数据帧(有点像 as.data.frame.table),在这里效果很好:

mod <- glmnet::cv.glmnet(model.matrix(~ ., mtcars[-1]), mtcars$mpg, alpha = 0)

broom::tidy(coef(mod$glmnet.fit, s = mod$lambda.min, digits = 3))
#>            row column        value
#> 1  (Intercept)      1 21.171285892
#> 2          cyl      1 -0.368057153
#> 3         disp      1 -0.005179902
#> 4           hp      1 -0.011713150
#> 5         drat      1  1.053216800
#> 6           wt      1 -1.264212476
#> 7         qsec      1  0.164975032
#> 8           vs      1  0.756163432
#> 9           am      1  1.655635460
#> 10        gear      1  0.546651086
#> 11        carb      1 -0.559817882