试图在R glmnet中使用exact = TRUE功能

时间:2018-04-12 19:50:35

标签: r glmnet

我正在尝试在glmnet中使用exact = TRUE功能。但我收到一条错误消息。

> fit = glmnet(as.matrix(((x_values))), (as.matrix(y_values)),penalty=variable.list$penalty)
> coef.exact = coef(fit, s = 0.03, exact = TRUE)
Error: used coef.glmnet() or predict.glmnet() with `exact=TRUE` so must in addition supply original argument(s)  x and y and penalty.factor  in order to safely rerun glmnet

如何向coef.exact提供penalty.factor?

尝试了选项: -

> coef.exact = coef(as.matrix(((x_values))), (as.matrix(y_values)),penalty=variable.list$penalty, s = 0.03, exact = TRUE)
Error: $ operator is invalid for atomic vectors
> 
> coef.exact = coef((as.matrix(((x_values))), (as.matrix(y_values)),penalty=variable.list$penalty), s = 0.03, exact = TRUE)
Error: unexpected ',' in "coef.exact = coef((as.matrix(((x_values))),"
> 
> coef.exact = coef((as.matrix(((x_values))) (as.matrix(y_values)) penalty=variable.list$penalty), s = 0.03, exact = TRUE)
Error: unexpected symbol in "coef.exact = coef((as.matrix(((x_values))) (as.matrix(y_values)) penalty"
> 
> coef.exact = coef(fit(as.matrix(((x_values))), (as.matrix(y_values)),penalty=variable.list$penalty), s = 0.03, exact = TRUE)
Error in fit(as.matrix(((x_values))), (as.matrix(y_values)), penalty = variable.list$penalty) : 
  could not find function "fit"
> 
> coef.exact = coef(glmnet(as.matrix(((x_values))), (as.matrix(y_values)),penalty=variable.list$penalty), s = 0.03, exact = TRUE)
Error: used coef.glmnet() or predict.glmnet() with `exact=TRUE` so must in addition supply original argument(s)  x and y and penalty.factor  in order to safely rerun glmnet
> 

2 个答案:

答案 0 :(得分:1)

以下是使用mtcars作为示例数据的示例。请注意,在SO上发布时,始终建议提供包含样本数据的minimal & reproducible code example

# Fit mpg ~ wt + disp
x <- as.matrix(mtcars[c("wt", "disp")]);
y <- mtcars[, "mpg"];
fit <- glmnet(x, y, penalty = 0.1); 

# s is our regularisation parameter, and since we want exact results
# for s=0.035, we need to refit the model using the full data (x,y)
coef.exact <- coef(fit, s = 0.035, exact = TRUE, x = x, y = y, penalty.factor = 0.1);
coef.exact;
#3 x 1 sparse Matrix of class "dgCMatrix"
#                      1
#(Intercept) 34.40289989
#wt          -3.00225110
#disp        -0.02016836

您明确需要再次提供xy的原因在?coef.glmnet中提供(另请参阅@FelipeAlvarenga帖子)。

因此,在您的情况下,以下内容应该有效:

fit = glmnet(x = as.matrix(x_values), y = y_values, penalty=variable.list$penalty)
coef.exact = coef(
    fit, 
    s = 0.03, 
    exact = TRUE, 
    x = as.matrix(x_values), 
    y = y_values, 
    penalty.factor = variable.list$penalty)

一些评论

也许混淆源于模型的整体规则参数(s或lambda)与penalty.factor之间的差异,您可以应用于每个系数。后者允许各个参数的差分正则化,而s控制整体L1 / L2正则化的影响。

答案 1 :(得分:0)

coef中,参数s对应于惩罚参数。在帮助文件中:

  

预测所依据的惩罚参数lambda的值   需要。默认值是用于创建模型的整个序列。

[...]

  

如果exact = TRUE,则会合并(并排序)这些不同的s值   使用对象$ lambda,模型在预测之前重新编译   制作。在这种情况下,需要提供原始数据x =和   y =作为predict()或coef()的附加命名参数。主力   predict.glmnet()需要更新模型,因此需要使用的数据   创造它。权重,偏移,惩罚也是如此。   lower.limits,upper.limits如果在原始调用中使用它们。   如果不这样做将导致错误。

因此,要使用exact = T,您必须指定原始惩罚,x,y和您在原始模型中输入的任何其他参数