带截距的 GLMNET 预测

GLMNET prediction with intercept

我有两个关于使用 GLMNET 进行预测的问题 - 特别是关于拦截。

我做了一个train数据创建,GLMNET对train数据的估计和预测的小例子(后面会改成Test data):

# Train data creation
Train <- data.frame('x1'=runif(10), 'x2'=runif(10))
Train$y <- Train$x1-Train$x2+runif(10)
# From Train data frame to x and y matrix
y <- Train$y
x <- as.matrix(Train[,c('x1','x2')])
# Glmnet model
Model_El <- glmnet(x,y)
Cv_El <- cv.glmnet(x,y)
# Prediction
Test_Matrix <- model.matrix(~.-y,data=Train)[,-1]
Test_Matrix_Df <- data.frame(Test_Matrix)
Pred_El <- predict(Model_El,newx=Test_Matrix,s=Cv_El$lambda.min,type='response')

我想在估计公式中截距。此代码给出了有关 Test_Matrix 矩阵维度的错误,除非我删除矩阵的 (Intercept) 列 - 如

Test_Matrix <- model.matrix(~.-y,data=Train)[,-1]

我的问题是:

提前致谢。

如果你想用截距预测模型,你必须用截距来拟合模型。您的代码使用了无截距的模型矩阵 x <- as.matrix(Train[,c('x1','x2')]),因此如果您在使用 predict 时提供截距,则会出现错误。

您可以执行以下操作:

x <- model.matrix(y ~ ., Train)    ## model matrix with intercept
Model_El <- glmnet(x,y)
Cv_El <- cv.glmnet(x,y)
Test_Matrix <- model.matrix(y ~ ., Train)   ## prediction matrix with intercept
Pred_El <- predict(Model_El, newx = Test_Matrix, s = Cv_El$lambda.min, type='response')

请注意,您不必这样做

model.matrix(~ . -y)

model.matrix会忽略公式的LHS,所以使用

是合法的
model.matrix(y ~ .)

您输入 glmnet 函数的矩阵 x 不包含截距列。因此,在构建测试矩阵时应遵循这种格式:即只做 model.matrix(y ~ . - 1, data = Train).

默认情况下,截距适合 glmnet(请参阅 glmnet 函数中的 intercept 参数)。因此,当您调用 glmnet(x, y) 时,您在技术上正在执行 glmnet(x, y, intercept = T)。因此,即使您的 x 矩阵没有截距,一个也适合您。