线性回归在R中具有已知的固定截距

时间:2011-09-07 11:38:15

标签: r regression linear-regression lm

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

我在互联网上找到了一个例子,我试图阅读R-help“?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")

感谢你的帮助。

3 个答案:

答案 0 :(得分:37)

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

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

0 +通过lm来抑制截距的拟合。

编辑要绘制拟合,请使用

> abline(intercept, coef(fit))

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

答案 1 :(得分:14)

我看到您已使用I()接受了解决方案。我曾经认为基于偏移()的解决方案会更加明显,但是品味会有所不同,在完成偏移解决方案后,我可以理解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))

答案 2 :(得分:1)

我使用了offset和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")