[R] Issues when trying to fit a nonlinear regression model

Ben Bolker bbo|ker @end|ng |rom gm@||@com
Sun Aug 20 20:28:55 CEST 2023


   My answer is WAY longer than Bert Gunter's but maybe useful nonetheless.

   (Q for John Nash:  why does the coef() method for nlmrt objects 
return the coefficient vector **invisibly**?  That seems confusing!)

   Here's what I did:

* as a preliminary step, adjust the formula so that I don't have to 
think as hard to eyeball starting values from the plot: in particular, 
replace (x) with (x-8) so that the data start from x = 0

* with this adjustment, we can approximate as follows:
     * theta1-theta2 is the value at (x' = 0) (or x = 8)
     * theta1 is the value as x goes to infinity
     * so since y(0) approx. 0.5 and y(inf) approx 0.4, we can use 
theta1 = 0.4, theta2 = -0.1
     * theta3 gives the rate of decline. Since the curve drops by 
*approximately* a factor of e over the range from x'=0 to x'=5, 1/5 
should be a good starting value for this

n1 <- nlxb(y~theta1 - theta2*exp(-theta3*(x-8)),
      start = list(theta1 = 0.4, theta2 = -0.1, theta3 = 1/5),
      data = dd2)

residual sumsquares =  0.00076151  on  15 observations
     after  6    Jacobian and  9 function evaluations
   name            coeff          SE       tstat      pval      gradient 
    JSingval
theta1          0.391967      0.006128      63.96          0  -2.629e-11 
       4.085
theta2        -0.0997234      0.007897     -12.63  2.733e-08  -1.035e-12 
      0.9956
theta3          0.107376       0.02365       4.54  0.0006777  -1.327e-11 
      0.3276

   Now if the formula is

theta1 - theta2*exp(-theta3*(x-8))

this is equivalent to

theta1 - theta2*exp(-theta3*x)*exp(8*theta3) =
theta1 - (theta2*exp(8*theta3))*exp(-theta3*x))

cc <- coef(n1)
start2 <- with(as.list(cc), list(theta1 = theta1, theta2 = 
theta2*exp(8*theta3), theta3 = theta3))
unlist(start2)
  theta1   theta2   theta3
  0.39197 -0.23543  0.10738

To confirm, rerun the fit with these starting values:

n1 <- nlxb(y~theta1 - theta2*exp(-theta3*x),
    start = start2,
   data = dd2)


nlmrt class object: x
residual sumsquares =  0.00076151  on  15 observations
     after  4    Jacobian and  5 function evaluations
   name            coeff          SE       tstat      pval      gradient 
    JSingval
theta1          0.391967      0.006128      63.96          0  -4.066e-12 
       4.228
theta2         -0.235429       0.04553     -5.171  0.0002328   3.151e-12 
      0.8508
theta3          0.107376       0.02365       4.54  0.0006777  -5.795e-12 
      0.1569



On 2023-08-20 1:15 p.m., Paul Bernal wrote:
> Dear friends,
> 
> This is the dataset I am currently working with:
>> dput(mod14data2_random)
> structure(list(index = c(14L, 27L, 37L, 33L, 34L, 16L, 7L, 1L,
> 39L, 36L, 40L, 19L, 28L, 38L, 32L), y = c(0.44, 0.4, 0.4, 0.4,
> 0.4, 0.43, 0.46, 0.49, 0.41, 0.41, 0.38, 0.42, 0.41, 0.4, 0.4
> ), x = c(16, 24, 32, 30, 30, 16, 12, 8, 36, 32, 36, 20, 26, 34,
> 28)), row.names = c(NA, -15L), class = "data.frame")
> 
> I did the following to try to fit a nonlinear regression model:
> 
> #First, Procedure to Find Starting (initial) Values For Theta1, Theta2, and
> Theta3
> 
> mymod2 <- y ~ theta1 - theta2*exp(-theta3*x)
> 
> strt2 <- c(theta1 = 1, theta2 = 2, theta3 = 3)
> 
> trysol2<-nlxb(formula=mymod2, data=mod14data2_random, start=strt2,
> trace=TRUE)
> trysol2
> trysol2$coefficients[[3]]
> 
> #Fitting nonlinear Regression Model Using Starting Values From Previous Part
> nonlinearmod2 <- nls(mymod2, start = list(theta1 =
> trysol2$coefficients[[1]],
>                       theta2 = trysol2$coefficients[[2]],
>                       theta3 = trysol2$coefficients[[3]]), data =
> mod14data2_random)
> 
> And I got this error:
> Error in nlsModel(formula, mf, start, wts, scaleOffset = scOff, nDcentral =
> nDcntr) :
>    singular gradient matrix at initial parameter estimates
> 
> Any idea on how to proceed in this situation? What could I do?
> 
> Kind regards,
> Paul
> 
> 	[[alternative HTML version deleted]]
> 
> ______________________________________________
> R-help using r-project.org mailing list -- To UNSUBSCRIBE and more, see
> https://stat.ethz.ch/mailman/listinfo/r-help
> PLEASE do read the posting guide http://www.R-project.org/posting-guide.html
> and provide commented, minimal, self-contained, reproducible code.



More information about the R-help mailing list