Linear Regression with a known fixed intercept in R
Solution 1
You could subtract the explicit intercept from the regressand and then fit the intercept-free model:
> intercept <- 1.0
> fit <- lm(I(x - intercept) ~ 0 + y, lin)
> summary(fit)
The 0 +
suppresses the fitting of the intercept by lm
.
edit To plot the fit, use
> abline(intercept, coef(fit))
P.S. The variables in your model look the wrong way round: it's usually y ~ x
, not x ~ y
(i.e. the regressand should go on the left and the regressor(s) on the right).
Solution 2
I see that you have accepted a solution using I(). I had thought that an offset() based solution would have been more obvious, but tastes vary and after working through the offset solution I can appreciate the economy of the I() solution:
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))
Solution 3
I have used both offset and I(). I also find offset easier to work with (like BondedDust) since you can set your intercept.
Assuming Intercept is 10.
plot (lin$x, lin$y)
fit <-lm(lin$y~0 +lin$x,offset=rep(10,length(lin$x)))
abline(fit,col="blue")
R_User
I really like programming in R, although the documentation is rarly helpful,...
Updated on July 09, 2022Comments
-
R_User almost 2 years
I want to calculate a linear regression using the lm() function in R. Additionally I want to get the slope of a regression, where I explicitly give the intercept to
lm()
.I found an example on the internet and I tried to read the R-help "?lm" (unfortunately I'm not able to understand it), but I did not succeed. Can anyone tell me where my mistake is?
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")
Thanls for your help.
-
Joris Meys over 12 yearsor
I(x - 1.0)~ y-1
surpresses the fitting of the intercept as well. -
NPE over 12 years@Joris Meys: Yes. I believe the two ways are synonymous. I chose the other way to avoid having two
-1
terms and having to explain which is which. -
R_User over 12 yearsBut when I plot the regression-curve abline(regExp, col="green"), it does not go through 1. I have not figured out how to extract the slope (and/or intercept) from the lm ouput. For mee it seems that you always have to know the position of the values in the coef-array, and than extract in (and hope that the position is right). So, is the following code the "golden way" to plot the correct regression curve?
abline(b=coef(regExp)[1], a= explicitIntercept, col="green")
-
NPE over 12 years@Sven:
abline(1.0, coef(fit))
plots the fit (here, 1.0 is the explicit intercept). I've updated the answer to include this. -
Aaron left Stack Overflow over 12 yearsSee also the
offset
argument. -
IRTFM over 12 years
offset
can be used either as an argument or as a term in the model. (You were posting your comment as the same time as I was offering an alternate answer.) -
qed about 11 years
fit = lm(x~0+y, lin)
will have the effect of forcing the line through the origin then? Thanks. -
Roman Luštrik about 10 years@qed, no,
y - 1
will. Tryabline(lm(x ~ y - 1, data=lin))
.