我有两个关于使用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]
我的问题是:
为了获得预测,这是否是正确的方法?当我希望预测公式包含截距时?
如果是正确的方法:为什么我必须删除矩阵中的截距?
提前致谢。
答案 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 ~ .)