在插入符号中安装无拦截模型

时间:2012-09-12 19:20:02

标签: r regression intercept r-caret

在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排除拦截术语?

2 个答案:

答案 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