Paul Bernal
2023-Aug-20 17:15 UTC
[R] Issues when trying to fit a nonlinear regression model
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]]
Bert Gunter
2023-Aug-20 18:20 UTC
[R] Issues when trying to fit a nonlinear regression model
I got starting values as follows: Noting that the minimum data value is .38, I fit the linear model log(y - .37) ~ x to get intercept = -1.8 and slope = -.055. So I used .37, exp(-1.8) and -.055 as the starting values for theta0, theta1, and theta2 in the nonlinear model. This converged without problems. Cheers, Bert On Sun, Aug 20, 2023 at 10:15?AM Paul Bernal <paulbernal07 at gmail.com> 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 at 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. >[[alternative HTML version deleted]]
Ben Bolker
2023-Aug-20 18:28 UTC
[R] Issues when trying to fit a nonlinear regression model
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 at 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.
Berwin A Turlach
2023-Aug-21 03:21 UTC
[R] Issues when trying to fit a nonlinear regression model
G'day Paul, On Sun, 20 Aug 2023 12:15:08 -0500 Paul Bernal <paulbernal07 at gmail.com> wrote:> Any idea on how to proceed in this situation? What could I do?You are fitting a simple asymptotic model for which nls() can find good starting values if you use the self starting models (SSxyz()). Well, Doug (et al.) choose to parameterise the asymptotic model differently, but you can easily change to your parameterisation if you want: ``` fm1 <- nls(y ~ SSasymp(x, Asym, R0, lrc), data=mod14data2_random) theta1 <- coef(fm1)["Asym"] theta2 <- coef(fm1)["Asym"] - coef(fm1)["R0"] theta3 <- exp(coef(fm1)["lrc"]) fm2 <- nls(y ~ theta1 - theta2 * exp(-theta3*x), start=list(theta1=theta1, theta2=theta2, theta3=theta3), data=mod14data2_random) summary(fm2) ``` Cheers, Berwin