0

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.

StupidWolf
  • 45,075
  • 17
  • 40
  • 72
  • Sorry. There seems to be a misunderstanding here. I would like to constrain the intercept to be equal or larger than zero. Not imposing it to be exactly zero. In other words, I am looking for a non-negative intercept. – quantmarketing Apr 08 '21 at 08:02
  • 1
    the `colf` package cited in the duplicate question works. – Ben Bolker Apr 08 '21 at 14:30

1 Answers1

2

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.

CSJCampbell
  • 2,025
  • 15
  • 19