# [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