[R] Fitting nonlinear (quantile) models to linear data.

Roly Russell russelr at science.oregonstate.edu
Wed Feb 4 16:47:11 CET 2004


Hello.

I am trying to fit an asymptotic relationship (nonlinear) to some 
ecological data, and am having problems.  I am interested in the upper 
bound on the data (i.e. if there is an upper limit to 'y' across a range 
of 'x').  As such, I am using the nonlinear quantile regression package 
(nlrq) to fit a michaelis mention type model.

The errors I get (which are dependant on the quantile of interest and the 
particular dataset) tend to result in illogical regression results with 
the nlqr package.  

To test this, I created artificial datasets that were based on underlying 
asymptotic or linear data.  When tested with a nonlinear model, the linear 
data produces an error (step factor reduced below 'midFactor'--a problem 
dealt with previously on this list).  This script is below, for interest.

My question is whether this is a problem that I should deal with through 
fixing my script somehow, or whether fitting a nonlinear model to data 
that may have an underlying linear pattern is inherently statistically 
wrong (I thought that I could use the estimate of the asymptote as a 
metric of how linear versus asymptotic the data were).  

Many thanks, in advance.

roly russell - oregon state university

PS - I have not consulted Bates & Watts yet; I will.



     # build artificial data with multiplicative error
     Dat <- NULL; Dat$x <- rep(seq(1,25,by=3), 5)
     set.seed(1)
     Dat$y <- SSmicmen(Dat$x, 50, 12)*rnorm(45, 1, 0.1)
     plot(Dat)
     # fit a classical least-square regression
     Dat.nls <- nls(y ~ SSmicmen(x, Vmax, Km), data=Dat); Dat.nls
     lines(1:25, predict(Dat.nls, newdata=list(x=1:25)), col=1)
     # the 1st and 3rd quartiles regressions
     Dat.nlrq <- nlrq(y ~ SSmicmen(x, Asym, mid), data=Dat, tau=0.25, 
trace=TRUE)
     lines(1:25, predict(Dat.nlrq, newdata=list(x=1:25)), col=3)
     Dat.nlrq <- nlrq(y ~ SSmicmen(x, Asym, mid), data=Dat, tau=0.75, 
trace=TRUE)
     lines(1:25, predict(Dat.nlrq, newdata=list(x=1:25)), col=3)


    # build artificial LINEAR data with multiplicative error
     Dat <- NULL; Dat$x <- rep(1:25, 2)
     set.seed(1)
     Dat$y <- (Dat$x)*rnorm(50, 1, 0.1)
     plot(Dat)
    # fit first a classical least-square regression
     Dat.nls <- nls(y ~ SSmicmen(x, Vmax, Km), 
data=Dat,control=nls.control(minFactor=1/4096)); Dat.nls
     lines(1:25, predict(Dat.nls, newdata=list(x=1:25)), col=1)




More information about the R-help mailing list