Mike Saunders
2004-Nov-05 18:46 UTC
[R] Problems running a 4-parameter Weibull function with nls
Hi, I am rather new to R, but both myself and another much more experience user cannot figure this out. I have a collegue who has a 800+ nonlinear regressions to run for seed germination (different species, treatments, etc.) over time. I created a looping structure to extract the parameters from each regression; I will then use the parameters themselves for further analysis. I would like to fit a 4-parameter, sigmoidal shape Weibull because it it paramatized to have a maximum germination rate (max), a time lag for the start of germination (lag), a germination rate (rate) and a shape parameter (shape). Here is a copy of this bit of the code: start.est=list(max=max(df$Y),rate=1/(df$X[tx]-((df$X[tz-1]+df$X[tz])/2)), lag=(df$X[tz-1]+df$X[tz])/2,shape=1.1) nls.control(maxiter=1000,minFactor=1/8192) fit<-nls(Y ~ max*(1 - exp(-(rate*(X-lag))^shape)),df,start=start.est) Here is one column of the data (X=Julian day, Y = % germination): X Y 1 111 0.0000000 2 125 0.0000000 3 131 0.0000000 4 138 0.3076923 5 145 0.4260355 6 152 0.4733728 7 159 0.5443787 8 166 0.5680473 9 173 0.5680473 10 180 0.5917160 11 187 0.5917160 12 194 0.5917160 13 201 0.6153846 14 208 0.6153846 15 215 0.6153846 16 223 0.6153846 17 229 0.6153846 18 236 0.6153846 19 245 0.6153846 Here is the error I keep getting: Error in numericDeriv(form[[3]], names(ind), env) : Missing value or an Infinity produced when evaluating the model I have tried these things to get this to work: 1) Mess with the starting values quite a bit 2) Seed the regression with linear estimates between my known points (i.e., figure out daily averages). I then wanted to regress on these to get starting estimates to use with the real data. 3) Drop out all the 0s in the seeded data 4) Add jitter to the seeded data I should note that this worked to get a 3-parameter Gompertz to work, but that functional form is more difficult to interpret biologically. I am out of ideas. Thoughts anyone? I would appreciate any help. Mike Saunders Research Assistant Department of Forest Ecosystem Sciences University of Maine [[alternative HTML version deleted]]
Spencer Graves
2004-Nov-05 20:28 UTC
[R] Problems running a 4-parameter Weibull function with nls
Might "nls" be testing values for "lag" that exceed min(X)? That might produce the error you observe. I routine reparameterize problems like this to send boundaries to Inf, e.g.: x0 <- min(df$X) fit<-nls(Y ~ max.*(1 - exp(-(rate*(X-x0+exp(ln.lag)))^shape)),df,start=start.est, x0=x0) ##NOT TESTED (Also, I try to avoid conficts between objects / variables I use and, e.g., standard system functions like "max" and "df". R can determine whether a function or a non-function is required in most but not all contexts.) hope this helps. spencer graves Mike Saunders wrote:>Hi, > >I am rather new to R, but both myself and another much more experience user cannot figure this out. I have a collegue who has a 800+ nonlinear regressions to run for seed germination (different species, treatments, etc.) over time. I created a looping structure to extract the parameters from each regression; I will then use the parameters themselves for further analysis. I would like to fit a 4-parameter, sigmoidal shape Weibull because it it paramatized to have a maximum germination rate (max), a time lag for the start of germination (lag), a germination rate (rate) and a shape parameter (shape). > >Here is a copy of this bit of the code: > >start.est=list(max=max(df$Y),rate=1/(df$X[tx]-((df$X[tz-1]+df$X[tz])/2)), > lag=(df$X[tz-1]+df$X[tz])/2,shape=1.1) >nls.control(maxiter=1000,minFactor=1/8192) >fit<-nls(Y ~ max*(1 - exp(-(rate*(X-lag))^shape)),df,start=start.est) > > >Here is one column of the data (X=Julian day, Y = % germination): > > X Y >1 111 0.0000000 >2 125 0.0000000 >3 131 0.0000000 >4 138 0.3076923 >5 145 0.4260355 >6 152 0.4733728 >7 159 0.5443787 >8 166 0.5680473 >9 173 0.5680473 >10 180 0.5917160 >11 187 0.5917160 >12 194 0.5917160 >13 201 0.6153846 >14 208 0.6153846 >15 215 0.6153846 >16 223 0.6153846 >17 229 0.6153846 >18 236 0.6153846 >19 245 0.6153846 > >Here is the error I keep getting: > >Error in numericDeriv(form[[3]], names(ind), env) : > Missing value or an Infinity produced when evaluating the model > > >I have tried these things to get this to work: > 1) Mess with the starting values quite a bit > 2) Seed the regression with linear estimates between my known points (i.e., figure out daily averages). I then wanted to regress on these to get starting estimates to use with the real data. > 3) Drop out all the 0s in the seeded data > 4) Add jitter to the seeded data >I should note that this worked to get a 3-parameter Gompertz to work, but that functional form is more difficult to interpret biologically. > >I am out of ideas. Thoughts anyone? I would appreciate any help. > >Mike Saunders >Research Assistant >Department of Forest Ecosystem Sciences >University of Maine > > > [[alternative HTML version deleted]] > >______________________________________________ >R-help at stat.math.ethz.ch mailing list >https://stat.ethz.ch/mailman/listinfo/r-help >PLEASE do read the posting guide! http://www.R-project.org/posting-guide.html > >-- Spencer Graves, PhD, Senior Development Engineer O: (408)938-4420; mobile: (408)655-4567