[R] optimize linear function

Prof Brian Ripley ripley at stats.ox.ac.uk
Sat Jun 12 23:35:07 CEST 2004


This is just a linear programming problem.  So the packages which do 
linear programming are `particularly well suited to this sort of task'
and theory tells you a lot about the solution.

Resarching how L_1 regression is done (that is that sum of the absolute 
values of the errors) should give you a lot of help.  This exact 
problem is a special case of one formulation of support vector machines.

On Sat, 12 Jun 2004, Michaell Taylor wrote:

> I am attempting to optimize a regression model's parameters to meet a specific 
> target for the sum of positive errors over sum of the dependent variable 
> (minErr below).  

The sum of the dependent variable is a constant so can be ignored.

> I see two courses of action , 1) estimate a linear model then iteratively 
> reduce the regressors to achieve the desired positive error threshold 
> (naturally the regressors and predicted values are biased - but this is 
> acceptable).  Were the problem only a single independent variable problem, 
> this approach would be fairly trivial.  But the two variable model proves 
> more troublesome from an efficiency point of view (efficiency being the mean 
> negative error for a given minErr).
> 
> The second method, which seems more efficient, is to optimize the linear 
> regressors until the criteria is met.  There are several optimizer packages 
> out there, but none seem particularly well suited to this sort of task.  
> 
> Any suggestions out there?
> 
> ===========  Sample Problem = first approach  ================
> 
> # if we say... 
> B1 <- .8
> B2 <- .2
> 
> # then construct some data..
> x1 <- rnorm(100,mean=100,sd=20)
> x2 <- rnorm(100,mean=10,sd=2)
> y <- B1*x1+B2*x2+rnorm(100,mean=5,sd=10)
> # normally of course B1 and B2 are unknown to begin with
> 
> # linear model  (presumably yielding B1=.8 and B2=.2)
> m<-lm(y ~ x1+ x2)
> # test on summation of positive errors.
> e <- resid(m)
> minErr <- (sum(ifelse(e<0,0,e))/sum(y))-.03
> while (minErr>.03){
> 	Make some adjustment to B1 and B2
> 	minErr <- (sum(ifelse(e<0,0,e))/sum(y))-.03
> 	}
> 
> ======== Second Approach ===========
> 
> construct a function to minimize minErr with beginning values from 'm'.

-- 
Brian D. Ripley,                  ripley at stats.ox.ac.uk
Professor of Applied Statistics,  http://www.stats.ox.ac.uk/~ripley/
University of Oxford,             Tel:  +44 1865 272861 (self)
1 South Parks Road,                     +44 1865 272866 (PA)
Oxford OX1 3TG, UK                Fax:  +44 1865 272595




More information about the R-help mailing list