Search code examples
rconstraintsregressionr-caret

Impose Constraint on Intercept in Linear Regression Using R


I have a linear regression of the form

Y = a + b1 * X1 + b2 * X2 + b3 * X4

I would like to constrain the intercept parameter a to be a => 0 (i.e., a should be a non-negative value).

What are possible ways to do this in R? Specifically, I would be interested in solutions using the caret package.

Thank you for your answers.


Solution

  • A linear model.

    m0 <- lm(wt ~ qsec + hp + disp, data = mtcars)
    m0
    # 
    # Call:
    # lm(formula = wt ~ qsec + hp + disp, data = mtcars)
    #
    # Coefficients:
    # (Intercept)         qsec           hp         disp  
    #   -2.450047     0.201713     0.003466     0.006755 
    

    Force the intercept to be zero.

    m1 <- lm(wt ~ qsec + hp + disp - 1, data = mtcars)
    m1
    # 
    # Call:
    # lm(formula = wt ~ qsec + hp + disp - 1, data = mtcars)
    #
    # Coefficients:
    #      qsec         hp       disp  
    # 0.0842281  0.0002622  0.0072967 
    

    You can use nls to apply limits to the paramaters (in this case the lower limit).

    m1n <- nls(wt ~ a + b1 * qsec + b2 * hp + b3 * disp, 
        data = mtcars, 
        start = list(a = 1, b1 = 1, b2 = 1, b3 = 1), 
        lower = c(0, -Inf, -Inf, -Inf), algorithm = "port")
    m1n
    # Nonlinear regression model
    #   model: wt ~ a + b1 * qsec + b2 * hp + b3 * disp
    #    data: mtcars
    #         a        b1        b2        b3 
    # 0.0000000 0.0842281 0.0002622 0.0072967 
    #  residual sum-of-squares: 4.926
    #
    # Algorithm "port", convergence message: relative convergence (4)
    

    See here for other example solutions.