R 在插入符号中拟合无截距模型

R 在插入符号中拟合无截距模型,r,regression,intercept,r-caret,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 数据(iris) lmFit圆形(coef(lmFit),2) 花瓣。长度。花瓣。宽度 2.86 -4.48

在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 
数据(iris)
lmFit圆形(coef(lmFit),2)
花瓣。长度。花瓣。宽度
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 
库(插入符号)
插入符号轮(coef(插入符号$finalModel),2)
(截距)花瓣长度花瓣宽度
4.19         0.54        -0.32 

如何告诉插入符号::train排除截取项?

@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)
跟踪(插入符号::createModel,

quote(modFormula正如在链接的SO问题中所讨论的,这在插入符号v6.0.76中有效(上面的跟踪答案似乎不再适用于插入符号中的代码重构):

caret\u lmFit caret\u lmFit$finalModel
电话:
lm(公式=结果0+,数据=数据)
系数:
花瓣。长度。花瓣。宽度
2.856        -4.479  

如果不更改源代码,这是不可能的。请参阅
createModel.R
第25行:
modFormula我不知道您可以使用跟踪修改函数。太好了!谢谢。
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