15

在 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排除截距项?

4

2 回答 2

7

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

但是,我不使用插入符号。可能会有无法预料的后果。从模型中排除截距通常也不是一个好主意。

于 2013-11-29T23:29:18.857 回答
4

正如链接的 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  
于 2017-05-29T14:27:22.037 回答