2016-09-05 2 views
1

Ich habe zwei Fragen zu Vorhersage GLMNET mit - speziell über das Intercept.GLMNET Vorhersage mit Intercept

machte ich ein kleines Beispiel für Zug Datenerstellung, GLMNET Schätzung und Vorhersage auf den Bahndaten (die ich später ändern wird Daten Test):

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

Ich möchte einen Schnittpunkt in der geschätzten Formel haben . Dieser Code gibt einen Fehler in Bezug auf die Abmessungen der Test_Matrix Matrix, es sei denn ich die (Intercept) Spalte der Matrix entfernen - wie in

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

Meine Fragen sind:

  • Ist es der richtige Weg Tun Sie dies, um die Vorhersage zu erhalten - wenn ich möchte, dass die Vorhersageformel den Schnittpunkt enthält?

  • Wenn es der richtige Weg ist: Warum muss ich das abfangen in der Matrix entfernen?

Vielen Dank im Voraus.

Antwort

2

Wenn Sie ein Modell mit Intercept vorhersagen wollen, müssen Sie ein Modell mit Intercept passen. Ihr Code verwendet die Modellmatrix x <- as.matrix(Train[,c('x1','x2')]), die intercept-frei ist, daher erhalten Sie einen Fehler, wenn Sie bei Verwendung von predict einen Intercept angeben.

Sie können wie folgt vorgehen:

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

Hinweis, Sie müssen nicht tun

model.matrix(~ . -y) 

model.matrix die LHS der Formel ignorieren, so ist es legitim zu verwenden

model.matrix(y ~ .) 
+0

vielen Dank für Ihre Antwort, es funktioniert! Ich habe das y verpasst. Syntax. –

2

Die Matrix x Sie wurden in dieeingegebenFunktion enthält keine Abfangspalte. Daher sollten Sie dieses Format beim Erstellen Ihrer Testmatrix beachten: d. H. Einfach model.matrix(y ~ . - 1, data = Train).

Standardmäßig ist ein Abschnitt in glmnet eingepasst (siehe Parameter intercept in der glmnet-Funktion). Wenn Sie also glmnet(x, y) aufrufen, machen Sie technisch glmnet(x, y, intercept = T). Auch wenn Ihre x Matrix keinen Schnittpunkt hatte, war einer für Sie geeignet.