2016-09-05 8 views
1

GLMNETを使用した予測に関する質問が2つあります。インターセプトを使用した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

インターセプトでモデルを予測したい場合は、モデルをインターセプトで適合させる必要があります。あなたのコードでは、盗難防止のモデル・マトリックスx <- as.matrix(Train[,c('x1','x2')])が使用されています。したがって、predictを使用している場合に傍受を指定すると、エラーが発生します。

あなたが次の操作を行うことができます

を使用することが正当なものであるので、あなたは

model.matrix(~ . -y) 

model.matrixを行う必要はありません

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') 

注意が、式のLHSを無視します

model.matrix(y ~ .) 
+0

お返事いただきありがとうございます!私はy〜を見逃した。構文。 –

2

マトリクスxglmnet関数に切片列が含まれていません。したがって、テストマトリックスを構築するときにこのフォーマットを尊重する必要があります。すなわち、model.matrix(y ~ . - 1, data = Train)を実行してください。

デフォルトでは、インターセプトはglmnetに収まります(glmnet関数のinterceptパラメータを参照)。したがって、glmnet(x, y)を呼び出すと、技術的にはglmnet(x, y, intercept = T)を実行しています。したがって、あなたのxマトリックスには傍受されていないにもかかわらず、1つはあなたに合っていた。

関連する問題