0

I am working on rate measurements (y) over a range of temperatures (x), and i would like to curve-fit the scatterplot using the nls command. However, the fitting does not initialize, since the algorithm is apparently missing some starting values. Although i provide starting values for the model parameters, it throws an error saying that it wants also starting values for the x and y data, which i think should be calculated from the model parameters.. ? I am a bit lost here, and a bit afraid that the mistake i am making is stupid and obvious...

Here is a reproducible example:

#make up some data
d<-data.frame(x=c(0,2,4,6,8,10,12),
              y=c(0.05, 0.1, 0.2, 0.26, 0.28,0.23, 0.12))

#plot the data
plot(d$x, d$y)

# define the Blanchard equation
blanchard <- function(temp, rmax, tmax, topt,beta) {
  return(  (rmax*((tmax-temp)/(tmax-topt))^beta)   * exp( -beta*((topt-temp)/(tmax-topt)         )     )
        )}

#test proper functionality of the equation:
#I give some fantasy parameters and use x data to predict y:
d$prediction<-blanchard(temp = d$x, rmax = 0.3, topt = 8, tmax =12.1,beta = 1.5)

#visualize:
lines(d$x, d$prediction, col="red")

#The model apparently works

#Now obtain some sensible starting values for the curve fitting
rmax_start <- max(d$y, na.rm = TRUE)
tmax_start <- max(d$x, na.rm = TRUE)
topt_start <- mean(d$x[d$y == rmax_start])
beta_start = 1.5
  
#Now it should be possible to fit the data, but an error occurs...
blanchardfit <- nls(rate~blanchard(temp = temperature, rmax, tmax, topt,beta),
                     data = d,
                     start=list(rmax=rmax_start, tmax=tmax_start, topt=topt_start),
                     supp_errors = 'Y')

#Here i tried with an explicit formula-writing and also insulating the model with I():
blanchardfit <- nls(rate~I((rmax*((tmax-temp)/(tmax-topt))^beta)   * exp( -beta*((topt-temp)/(tmax-topt)))),
                    data = d,
                    start= list(rmax=rmax_start, tmax=tmax_start, topt=topt_start),
                    supp_errors = 'Y')

Hope you can help me with this! Best wishes, Sebastian

I tried to give different names to modelparameters (temp) and column names (temperature), so these don´t get mixed up.

Tried to copy another, structurally similar command that works, and replaced it term by term, but I replace the starting values, itr still asks for starting values of x and y..

SeRo1210
  • 13
  • 4

1 Answers1

0

The "guessed" values of the parameters (rmax, topt, tmax, beta) are requiered to start the iterative process. It seems that several of your values rmax = 0.3, topt = 8, tmax =12.1, beta = 1.5 are far from the optimal ones. This might cause trouble. I found the values below (LMSRE criteria).

enter image description here

JJacquelin
  • 1,529
  • 1
  • 9
  • 11
  • That was helpful, thank you very much JJacquelin! How did you produce the beautiful graphical output you posted, is there a package for this?? And can you point me towards a general approach (or package) of getting initial estimates for non-linear curve fitting? – SeRo1210 Apr 20 '23 at 07:55
  • This isn't a commercial package. I used some home-made applications written with Delphi from Borland. Since they are .exe applications without agreement they are not portable through internet. Using the numerical values of the parameters it is easy to draw with MathCad (or with other graphical tool ) the figure given in my answer. – JJacquelin Apr 20 '23 at 11:08