套索回归 glmnet - 关于输入数据的错误

Lasso Regression glmnet - error regarding the input data

我尝试使用 glmnet() 拟合套索回归模型。由于我以前从未使用过 Lasso 回归,所以我尝试与教程相处,但在应用模型时,它总是导致以下错误:

Error in lognet(x, is.sparse, ix, jx, y, weights, offset, alpha, nobs,: 
one multinomial or binomial class has 1 or 0 observations; not allowed

使用这个问题的数据集 (https://stats.stackexchange.com/questions/72251/an-example-lasso-regression-using-glmnet-for-binary-outcome) 似乎因变量 y 必须仅包含 0 和 1。每当我将 y 的观察值之一设置为 2或除 0 或 1 之外的任何其他值,都会导致此错误。

这是我的代码:

lambdas_to_try <- 10^seq(-3, 5, length.out = 100)

x_vars <- as.matrix(data.frame(data$x1, data$x2, data$x3))
lasso_cv <- cv.glmnet(x_vars, y=as.factor(data$y), alpha = 1, lambda = lambdas_to_try, family = "binomial", nfolds = 10)

x_vars_2 <- model.matrix(data$y ~ data$x1 + data$x2 + data$x3)[, -1]
lasso_cv_2 <- cv.glmnet(x_vars, y=as.factor(data$y), alpha = 1, lambda = lambdas_to_try, family = "binomial", nfolds = 10)

这就是我的数据集的样子:

问题是,在我的数据中,y 变量表示犯罪次数,因此它具有 0 到 1000 之间的整数值。我不能将值设置为仅 0 和 1。如何使用这些数据应用套索回归?

正如@Gregor 指出的那样,您拥有的是计数数据,应该是回归而不是分类。使用示例数据集,您可以通过以下方式实现它:

library(MASS)
library(glmnet)
data(Insurance)

您的响应变量应该是数字:

str(Insurance)
'data.frame':   64 obs. of  5 variables:
 $ District: Factor w/ 4 levels "1","2","3","4": 1 1 1 1 1 1 1 1 1 1 ...
 $ Group   : Ord.factor w/ 4 levels "<1l"<"1-1.5l"<..: 1 1 1 1 2 2 2 2 3 3 ...
 $ Age     : Ord.factor w/ 4 levels "<25"<"25-29"<..: 1 2 3 4 1 2 3 4 1 2 ...
 $ Holders : int  197 264 246 1680 284 536 696 3582 133 286 ...
 $ Claims  : int  38 35 20 156 63 84 89 400 19 52 ...

现在我们设置预测变量和响应变量:

y = Insurance$Claims
X = model.matrix(Claims ~ .,data=Insurance)

运行 找到最佳 lambda 的简历(如果您不知道您的 L1 范数):

fit = cv.glmnet(x=X,y=y,family="poisson")
pred = predict(fit,X,s=fit$lambda.1se)

预测是对数刻度,所以要与你的实际比较

plot(log(y),pred,xlab="log (actual)",ylab="log (predicted)")