[R] Can I build an array of regrssion model?

Zhongming Yang Zhongming.Yang at cchmc.org
Thu Dec 19 16:48:02 CET 2002


Thank you for your time.

Actually, the purpose of this program is not smoothing but rather to
pick some peaks from the noisy exponential decay data.  Piecewise linear
regression is ued to find the baseline. I don't know whether there is
other technique to solve this problem.

Could you please check the following code? The concern is how to draw
the raw data and piecewise linear functions on one diagram.

rawData = scan("c:/zyang/mass/data/A01/1.PRN",
what=list(numeric(),numeric()));
#write.table(rawData, 'rawdata.txt', quote=FALSE, row.names=FALSE,
col.names=FALSE);
len = length(rawData[[1]]);
cuts = len*c(0.01, 0.03, 0.08, 0.18, 0.38, 0.69, 1);
cuts = as.integer(cuts); 

#make an empty list
mod.list <- list();
for(i in 1:length(cuts)) 
{ 
      if (i==1)
      {
	start = 1;
      }
      else
      {
   	start = cuts[i-1];
      }
      end = cuts[i];
      mod.list[[i]] = lm(rawData[[2]][start:end] ~
rawData[[1]][start:end])
}

plot(rawData[[1]],rawData[[2]],type='l', col="green", xlab="Da/z",
ylab="m/z");
for(i in 1:length(cuts)) 
{ 
      if (i==1)
      {
	start = 1;
      }
      else
      {
   	start = cuts[i-1];
      }
      end = cuts[i];
      fitted.value[start:end] = predict(mod.list[[i]],
newdata=rawData[[1]][start:end], type='response' );
}
abline(rawData[[1]],fitted.value, col="red");

Thanks,



  






>>> Jason Turner <jasont at indigoindustrial.co.nz> 12/18/02 05:08PM >>>
On Wed, Dec 18, 2002 at 03:51:47PM -0500, Zhongming Yang wrote:
> I am trying to use piecewise linear regression to approximate a
> nonlinear function. 

Why not smooth regression, or non-linear regression?

> 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?

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.

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

#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
-- 
Indigo Industrial Controls Ltd.
64-21-343-545
jasont at indigoindustrial.co.nz




More information about the R-help mailing list