[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