Skip to content

Can I build an array of regrssion model?

3 messages · Zhongming Yang, Jason Turner, Thomas Lumley

#
Hi,

I am trying to use piecewise linear regression to approximate a
nonlinear function. Actually, I don't know how many linear functions I
need, therefore, I want build an array of regression models to automate
the approximation job. Could you please give me any clue?

Attached is ongoing code:

rawData = scan("c:/zyang/mass/data/A01/1.PRN",
what=list(numeric(),numeric()));
len = length(rawData[[1]]);
cuts = len*c(0.01, 0.03, 0.08, 0.18, 0.38, 0.69, 1);
cuts = as.integer(cuts); 

mod1 = lm(rawData[[2]][1:cuts[1]]~rawData[[1]][1:cuts[1]]);
mod2 =
lm(rawData[[2]][cuts[1]:cuts[2]]~rawData[[1]][cuts[1]:cuts[2]]);
mod3 =
lm(rawData[[2]][cuts[2]:cuts[3]]~rawData[[1]][cuts[2]:cuts[3]]);
mod4 =
lm(rawData[[2]][cuts[3]:cuts[4]]~rawData[[1]][cuts[3]:cuts[4]]);
mod5 =
lm(rawData[[2]][cuts[4]:cuts[5]]~rawData[[1]][cuts[4]:cuts[5]]);
mod6 =
lm(rawData[[2]][cuts[5]:cuts[6]]~rawData[[1]][cuts[5]:cuts[6]]);
mod7 =
lm(rawData[[2]][cuts[6]:cuts[7]]~rawData[[1]][cuts[6]:cuts[7]]);

plot(rawData[[1]],rawData[[2]],type='l', col="green", xlab="Da/z",
ylab="m/z");
abline(mod1, lty="1", col="red");
abline(mod2, lty="1", col="red");
abline(mod3, lty="1", col="red");
abline(mod4, lty="1", col="red");
abline(mod5, lty="1", col="red");
abline(mod6, lty="1", col="red");
abline(mod7, lty="1", col="red");







Thanks in advance,
#
On Wed, Dec 18, 2002 at 03:51:47PM -0500, Zhongming Yang wrote:
Why not smooth regression, or non-linear regression?
Clue 1) See above.  You might be using the wrong tool.  A smooth
regression might be better here.  help(loess), library(gss), and
library(sm) are your friends.

Clue 2) If you really want piecewise linear, a list makes more
sense than a vector.  R does handle vectors quite nicely, but I
find its real strength is the way it handles complex lists with
ease.
#change cuts to a matrix of values, col 1 is the lower
#bound, col 2 is the upper bound for your segments.

cuts <- cbind(c(1,cuts[1:(length(cuts)-1)], cuts)

#make an empty list
mod.list <- list()
#fill that list with models
for(ii in 1:dim(cuts)[1]) { 
	start <- cuts[ii,1]
	end <- cuts[ii,2]
	mod.list[[ii]] <- lm(rawData[[2]][start,end] ~ rawData[[1]][start,end])
}

#to extract coefficients
lapply(mod.list,coef)

#to extract coefficients, and confidence intervals
lapply(mod.list,function(x,...){ coef(summary(x))} )

#to reproduce your ablines
lapply(mod.list,abline,col="red")

etc

Cheers

Jason
#
On Thu, 19 Dec 2002, Jason Turner wrote:

            
I don't see any problem with wanting to fit linear splines.  It's quite
easy, as well
eg
models <-  lapply( 1:8, function(n) lm(y~bs(x, n, degree=1)))

fits piecewise linear functions with 1 to 8 pieces.

	-thomas