我有两个关于使用GLMNET进行预测的问题--特别是关于拦截。
我给出了一个关于列车数据创建、GLMNET估计和火车数据预测的小例子(稍后我将更改为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]我的问题是:
提前谢谢。
发布于 2016-09-05 03:40:49
如果你想用截距来预测一个模型,你必须用截距来拟合一个模型。您的代码使用模型矩阵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 ~ .)发布于 2016-09-05 03:53:56
输入到x函数中的矩阵glmnet不包含截取列。因此,在构造测试矩阵时,您应该尊重这种格式:即只需执行model.matrix(y ~ . - 1, data = Train)。
默认情况下,glmnet中适合拦截(请参阅glmnet函数中的intercept参数)。因此,当您调用glmnet(x, y)时,您在技术上正在执行glmnet(x, y, intercept = T)。因此,即使您的x矩阵没有拦截,其中一个适合您。
https://stackoverflow.com/questions/39323328
复制相似问题