拦截

时间:2016-09-05 02:54:42

标签: r prediction intercept glmnet

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

我做了一个关于列车数据创建,GLMNET估计和列车数据预测的小例子(我稍后会改为测试数据):

# 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矩阵尺寸的错误,除非我删除了矩阵的(截距)列 - 如

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

我的问题是:

  • 为了获得预测,这是否是正确的方法?当我希望预测公式包含截距时?

  • 如果是正确的方法:为什么我必须删除矩阵中的截距?

提前致谢。

2 个答案:

答案 0 :(得分:3)

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

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

答案 1 :(得分:2)

如果要使用截距预测模型,则必须使用截距拟合模型。您的代码使用了无拦截的模型矩阵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 ~ .)