在R中,我指定一个没有截距的模型如下:
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
但是,如果我使用插入符号匹配相同的模型,则生成的模型包含截距:
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
如何告诉caret::train
排除拦截术语?
答案 0 :(得分:8)
@rcs已经告诉你需要更改哪一行功能。
只需使用trace
修改该功能:
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)
但是,我不使用插入符号。可能会出现无法预料的后果。从模型中排除拦截通常也不是一个好主意。
答案 1 :(得分:2)
正如链接的SO问题https://stackoverflow.com/a/41731117/7613376中所讨论的,这在插入符号v6.0.76中有效(上面的跟踪答案似乎不再适用于插入符号中的代码重构):
caret_lmFit <- train(Sepal.Length~0+Petal.Length+Petal.Width, data=iris, "lm",
tuneGrid = expand.grid(intercept = FALSE))
> caret_lmFit$finalModel
Call:
lm(formula = .outcome ~ 0 + ., data = dat)
Coefficients:
Petal.Length Petal.Width
2.856 -4.479