在R,I指定不含截距的模型如下:
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
排除截距项?
正如在讨论链接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
@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)
不过,我不使用插入符号。 可能有无法预见的后果。 它也往往不排除从模型中的截距是个好主意。