Linear Regression with a known fixed intercept in R

60,686

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")

Share:
60,686
R_User
Author by

R_User

I really like programming in R, although the documentation is rarly helpful,...

Updated on July 09, 2022

Comments

  • R_User
    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
    Joris Meys over 12 years
    or I(x - 1.0)~ y-1 surpresses the fitting of the intercept as well.
  • NPE
    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
    R_User over 12 years
    But 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
    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
    Aaron left Stack Overflow over 12 years
    See also the offset argument.
  • IRTFM
    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
    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
    Roman Luštrik about 10 years
    @qed, no, y - 1 will. Try abline(lm(x ~ y - 1, data=lin)).