在 R 插入符号中使用线性回归 (lm),如何强制截距通过 0?

Using linear regression (lm) in R caret, how do I force the intercept through 0?

我正在尝试使用 R 插入符号对我的线性回归模型执行交叉验证。在某些情况下,我想通过 0 强制拦截。我使用标准 lm 语法尝试了以下操作:

regressControl  <- trainControl(method="repeatedcv",
                        number = 4,
                        repeats = 5
                        )                      

regress         <- train(y ~ 0 + x,
               data = myData,
               method  = "lm",
               trControl = regressControl)

Call:
lm(formula = .outcome ~ ., data = dat)

Coefficients:
(Intercept)     x 
-0.0009585    0.0033794  `

此语法似乎适用于标准 'lm' 函数,但不适用于 caret 包。有什么建议吗?

test <- lm(y ~ 0 + x,
       data = myData)


Call:
lm(formula = y ~ 0 + x, data = myData)

Coefficients:
x 
0.003079 

您可以利用 caret::train 中的 tuneGrid 参数。

regressControl  <- trainControl(method="repeatedcv",
                    number = 4,
                    repeats = 5
                    ) 

regress <- train(mpg ~ hp,
           data = mtcars,
           method  = "lm",
           trControl = regressControl, 
           tuneGrid  = expand.grid(intercept = FALSE))

使用 getModelInfo("lm", regex = TRUE)[[1]]$param 查看您可以在 tuneGrid 中调整的所有内容(在 lm 案例中,唯一的调整参数是截距)。不能简单地依赖 formula 语法是愚蠢的,但是唉。