适合插入符号无拦截模式(Fit a no-intercept model in caret)

2019-07-31 13:06发布

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

Answer 1:

正如在讨论链接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  


Answer 2:

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

不过,我不使用插入符号。 可能有无法预见的后果。 它也往往不排除从模型中的截距是个好主意。



文章来源: Fit a no-intercept model in caret