Zach Zach - 1 month ago 16
R Question

Fit a no-intercept model in caret

In R, I specify a model with no intercept as follows:

data(iris)
lmFit <- lm(Sepal.Length ~ 0 + Petal.Length + Petal.Width, data=iris)
> round(coef(lmFit),2)
Petal.Length Petal.Width
2.86 -4.48


However, if I fit the same model with caret, the resulting model includes an intercept:

library(caret)
caret_lmFit <- train(Sepal.Length~0+Petal.Length+Petal.Width, data=iris, "lm")
> round(coef(caret_lmFit$finalModel),2)
(Intercept) Petal.Length Petal.Width
4.19 0.54 -0.32


How do I tell
caret::train
to exclude the intercept term?

Answer

@rcs already told you which line in which function you need to change.

Just use trace to modify that function:

trace(caret::createModel, 
       quote(modFormula <- as.formula(".outcome ~ .-1")), at=5, print=FALSE)
caret_lmFit <- train(Sepal.Length~0+Petal.Length+Petal.Width, data=iris, "lm")
round(coef(caret_lmFit$finalModel),2)
#Petal.Length  Petal.Width 
#        2.86        -4.48 
untrace(caret::createModel)

However, I don't use caret. There might be unforeseen consequences. It's also often not a good idea to exclude the intercept from the model.