【问题标题】:Using linear regression (lm) in R caret, how do I force the intercept through 0? [duplicate]在 R 插入符号中使用线性回归 (lm),如何强制截距为 0? [复制]
【发布时间】:2017-01-18 22:22:46
【问题描述】:

我正在尝试使用 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 

【问题讨论】:

  • 我相信您希望公式y ~ -1 + x 明确排除截距。
  • @aichao 这两个在大多数函数中都可以工作,但是caret 的实现使得如果不编辑源代码就很困难。
  • @Chrisss:谢谢!很高兴知道。
  • 也许这会有所帮助:stackoverflow.com/questions/12394855/…
  • 如果你scale你所有的数据,你的拦截将[有效地]为零。

标签: r r-caret lm


【解决方案1】:

您可以利用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 语法,这很愚蠢,但唉。

【讨论】:

  • 这似乎有效。谢谢你。 (我也尝试过使用“trace”来修改公式,但没有成功 - stackoverflow.com/questions/12394855/…)
  • @SarahM 我相信caret 源代码在跟踪答案后发生了变化,因此它不再合适了。
  • @SarahM 你应该接受这个作为答案。至少在插入符号 v6.0.76 中很好
猜你喜欢
  • 2018-06-11
  • 2020-12-03
  • 1970-01-01
  • 2016-04-16
  • 2019-02-23
  • 1970-01-01
  • 2022-01-09
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多