42

我想使用 R 中的 lm() 函数计算线性回归。此外,我想获得回归的斜率,其中我明确地将截距赋予lm().

我在互联网上找到了一个示例,并尝试阅读 R 帮助“?lm”(不幸的是,我无法理解),但没有成功。谁能告诉我我的错误在哪里?

lin <- data.frame(x = c(0:6), y = c(0.3, 0.1, 0.9, 3.1, 5, 4.9, 6.2))
plot (lin$x, lin$y)

regImp = lm(formula = lin$x ~ lin$y)
abline(regImp, col="blue")

# Does not work:
# Use 1 as intercept
explicitIntercept = rep(1, length(lin$x))
regExp = lm(formula = lin$x ~ lin$y + explicitIntercept)
abline(regExp, col="green")

感谢您的帮助。

4

3 回答 3

47

您可以从回归中减去显式截距,然后拟合无截距模型:

> intercept <- 1.0
> fit <- lm(I(x - intercept) ~ 0 + y, lin)
> summary(fit)

0 +抑制了截距的拟合lm

编辑要绘制拟合,请使用

> abline(intercept, coef(fit))

PS 你的模型中的变量看起来是错误的:它通常是y ~ x,而不是x ~ y(即回归应该在左边,回归量在右边)。

于 2011-09-07T11:44:12.763 回答
19

我看到您已经接受了使用 I() 的解决方案。我原以为基于 offset() 的解决方案会更明显,但口味各不相同,在完成 offset 解决方案后,我可以欣赏 I() 解决方案的经济性:

with(lin, plot(y,x) )
lm_shift_up <- lm(x ~ y +0 + 
                       offset(rep(1, nrow(lin))), 
             data=lin)
abline(1,coef(lm_shift_up))
于 2011-09-07T13:25:54.060 回答
1

我同时使用了偏移量和 I()。我还发现偏移更容易使用(如 BondedDust),因为您可以设置截距。

假设截距为 10。

plot (lin$x, lin$y) fit <-lm(lin$y~0 +lin$x,offset=rep(10,length(lin$x))) abline(fit,col="blue")

于 2015-10-18T07:34:21.397 回答