Roly Russell
2004-Feb-04 15:47 UTC
[R] Fitting nonlinear (quantile) models to linear data.
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)
Brian S Cade
2004-Feb-04 19:54 UTC
[R] Fitting nonlinear (quantile) models to linear data.
Roly: I don't know if I can speak to your question about the linear model fit with the nonlinear function. But in general I have observed that when using a fairly flexible nonlinear model form in nlrq() that initial estimates obtained for any specified quantile may be quite erroneous in the sense that the proportion of residuals less than or greater than the estimate are way off what they should be for a specified quantile (e..g, for tau = 0.90, I've obtained initial estimates that might have as few as 75% of the residuals <= estimate or as many as 97% <= estimate; we would like a solution that has close to 90% <= estimate (with some inequality required because of the zero residuals associated with the fit). This seems to produce both some strange fits when plotted against the data as well as some fits that might seem reasonable but have to be wrong. It seems to be quite important with this nlrq() code to explore different starting values and tolerance values before you can believe that you've converged to a reasonable solution for any selected quantile. I always check the proportion of residuals <= estimate as I iterate through solutions. You might want to check this for your models. Again, I repeat the problems I've had with this occur with very heterogeneous data with fairly flexible nonlinear functions (e.g., piecewise linear models with unknown breakpoints and quadratic curvature allowed to connect the pieces). Any comments\suggestions from Roger Koenker? Brian Brian S. Cade U. S. Geological Survey Fort Collins Science Center 2150 Centre Ave., Bldg. C Fort Collins, CO 80526-8818 email: brian_cade at usgs.gov tel: 970 226-9326 Roly Russell <russelr at science.orego To: r-help at stat.math.ethz.ch nstate.edu> cc: Sent by: Subject: [R] Fitting nonlinear (quantile) models to linear r-help-bounces at stat.ma data. th.ethz.ch 02/04/2004 08:47 AM 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) ______________________________________________ R-help at stat.math.ethz.ch mailing list https://www.stat.math.ethz.ch/mailman/listinfo/r-help PLEASE do read the posting guide! http://www.R-project.org/posting-guide.html