我正在尝试使用 glmnet 来拟合自适应套索以进行多项 Logit 回归。我的问题如下:当我尝试在 cv.glmnet 中使用惩罚矩阵(2x3 矩阵)penalty.factor 时,出现以下错误:
`glmnet 中的错误(x,y,权重 = 权重,偏移量 = 偏移量,lambda = lambda,: penalty.factor 的长度与变量的数量不匹配``
然而,问题在于列(类别)而不是行(变量),因为如果我只使用惩罚矩阵的一列(
penalty[,1]
),它就可以工作。
代表代码在这里:
y <- matrix(round(runif(100,1,3),0))
x <- matrix(rnorm(200),,2)
# Generate Penalties based on ridge regression
set.seed(4342)
ridge.cv <- cv.glmnet(x,y,alpha=0, family= "multinomial", type.measure = "deviance", nfolds = 10)
best_ridge <- do.call(cbind, coef(ridge.cv, s = ridge.cv$lambda.min))
penalty <- 1 / abs(as.matrix(best_ridge)[-1,])
# Cross-validation of Lambda
lasso.cv <- cv.glmnet(x,y,alpha=, family= "multinomial", type.measure = "deviance",
penalty.factor = penalty, nfolds = 10)
我如何使用完整的处罚矩阵?谢谢!
best_ridge
有三列,因此您将给出一个 6 元素矩阵作为惩罚:
> str(penalty)
num [1:2, 1:3] 2.15e+37 1.12e+38 2.03e+38 9.76e+37 2.41e+37 ...
- attr(*, "dimnames")=List of 2
..$ : chr [1:2] "V1" "V2"
..$ : chr [1:3] "1" "1" "1"
错误消息表明惩罚的长度与变量的数量 (2) 不匹配。所以我尝试只提供该矩阵的一列并且......没有错误。
> lasso.cv <- cv.glmnet(x,y,alpha=, family= "multinomial", type.measure = "deviance",
+ penalty.factor = penalty[,1], nfolds = 10)
> lasso.cv
Call: cv.glmnet(x = x, y = y, type.measure = "deviance", nfolds = 10, alpha = , family = "multinomial", penalty.factor = penalty[, 1])
Measure: Multinomial Deviance
Lambda Index Measure SE Nonzero
min 0.1584 1 2.228 0.05557 0
1se 0.1584 1 2.228 0.05557 0