2016-09-05 2 views
1

У меня есть два вопроса о прогнозировании с использованием 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, если я не удалить (Intercept) столбец матрицы - как в

Test_Matrix <- model.matrix(~.-y,data=Train)[,-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 ~ .) 
+0

благодарит за ваш ответ, он работает! Я пропустил y ~. синтаксис. –

2

Матрица x Вы питались вФункцияне содержит столбец перехвата. Поэтому вы должны уважать этот формат при построении тестовой матрицы: т. Е. Просто делать model.matrix(y ~ . - 1, data = Train).

По умолчанию перехват помещается в glmnet (см. Параметр intercept в функции glmnet). Поэтому, когда вы звоните glmnet(x, y), вы технически делаете glmnet(x, y, intercept = T). Таким образом, несмотря на то, что ваша матрица x не имела перехвата, вам было удобно.

Смежные вопросы