Hi- I am trying to fit a log function to my data, with the ultimate goal of finding the second derivative of the function. However, I am stalled on the first step of fitting a curve. When I use the following code: FG2.model<-(nls((CO2~log(a*Time)+b), start=setNames(coef(lm(CO2 ~ log(Time), data=FG2)), c("a", "b")),data=FG2)) I get the following error: Error in numericDeriv(form[[3L]], names(ind), env) : Missing value or an infinity produced when evaluating the model In addition: Warning messages: 1: In min(x) : no non-missing arguments to min; returning Inf 2: In max(x) : no non-missing arguments to max; returning -Inf 3: In log(a * Time) : NaNs produced 4: In log(a * Time) : NaNs produced When I fit the curve in Plot and use the coefficients as starting values: start=c(a=68,b=400) FG2.model<-(nls((CO2~log(a*Time)+b), start=start,data=FG2)) I get the following error: Error in nls((CO2 ~ log(a * Time) + b), start = start, data = FG2) : singular gradient In addition: Warning messages: 1: In min(x) : no non-missing arguments to min; returning Inf 2: In max(x) : no non-missing arguments to max; returning -Inf So then when I substituded nlxb for nls in the above two models, I got this error: Error in nlxb((CO2 ~ log(a * Time) + b), start = start, data = FG2) : NaN in Jacobian A few questions: 1.) How can I get R to fit my curve without returning errors? 2.) I am not sure that this data is log base 10. Is there a way I can ask R to try for logs of different functions? For example, FG2.model<-(nlxb((CO2~log(a*Time,c)+b), start=start,data=FG2)), where c is an additional variable. When I try this, R tells me Non-numeric argument to mathematical function Thank you in advance, Elizabeth [[alternative HTML version deleted]]
Elizabeth, It's difficult to troubleshoot without the data. Could you provide the output from dput(FG2) or if your data set is quite large, perhaps dput(FG2[1:50, ]) If you want to fit a third parameter to represent the base of the log, you could use nls(CO2 ~ log(a*Time) / log(c) + b, start=c(a=68, b=400, c=10), data=FG2) where c represents the base of the log in this relation: CO2 = log_c(a*Time) + b Jean On Mon, Jul 8, 2013 at 9:27 PM, Elizabeth Webb <webb.elizabeth.e@gmail.com>wrote:> Hi- > I am trying to fit a log function to my data, with the ultimate goal of > finding the second derivative of the function. However, I am stalled on > the first step of fitting a curve. > > When I use the following code: > FG2.model<-(nls((CO2~log(a*Time)+b), start=setNames(coef(lm(CO2 ~ > log(Time), data=FG2)), c("a", "b")),data=FG2)) > I get the following error: > Error in numericDeriv(form[[3L]], names(ind), env) : > Missing value or an infinity produced when evaluating the model > In addition: Warning messages: > 1: In min(x) : no non-missing arguments to min; returning Inf > 2: In max(x) : no non-missing arguments to max; returning -Inf > 3: In log(a * Time) : NaNs produced > 4: In log(a * Time) : NaNs produced > > When I fit the curve in Plot and use the coefficients as starting values: > start=c(a=68,b=400) > FG2.model<-(nls((CO2~log(a*Time)+b), start=start,data=FG2)) > I get the following error: > Error in nls((CO2 ~ log(a * Time) + b), start = start, data = FG2) : > singular gradient > In addition: Warning messages: > 1: In min(x) : no non-missing arguments to min; returning Inf > 2: In max(x) : no non-missing arguments to max; returning -Inf > > So then when I substituded nlxb for nls in the above two models, I got this > error: > Error in nlxb((CO2 ~ log(a * Time) + b), start = start, data = FG2) : > NaN in Jacobian > > > A few questions: > 1.) How can I get R to fit my curve without returning errors? > > 2.) I am not sure that this data is log base 10. Is there a way I can ask > R to try for logs of different functions? For example, > > FG2.model<-(nlxb((CO2~log(a*Time,c)+b), start=start,data=FG2)), where c is > an additional variable. When I try this, R tells me Non-numeric argument > to mathematical function > > Thank you in advance, > Elizabeth > > [[alternative HTML version deleted]] > > ______________________________________________ > R-help@r-project.org mailing list > 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]]
Elizabeth, You should cc rhelp on all correspondence so other readers can follow the thread of conversation. Now that I have some data to play with, I see where I went wrong in my previous e-mail. First of all, you can't fit a model CO2 ~ log(a*Time) + b because log(a*Time) can be rewritten as log(a) + log(Time) and there's no way that the two parameters, log(a) and b, can be uniquely estimated. You could change your model to CO2 ~ a*log(Time) + b I did this and fit the model using both the base 10 and base e logs ... same result. So the base of the logs doesn't matter. However, this model doesn't do a great job of fitting the curve. I tried another model CO2 ~ a*(1-exp(-b*Time)) which seemed to do better. Still not great, though. So, I tried it with one more parameter CO2 ~ c + a*(1-exp(-b*Time)) and that improved it further. Jean fit1 <- nls(CO2 ~ a*log(Time) + b, start=c(a=68, b=400), data=FG2) plot(FG2$Time, FG2$CO2) lines(FG2$Time, predict(fit1), col="red") fit2 <- nls(CO2 ~ a*log10(Time) + b, start=c(a=68, b=400), data=FG2) lines(FG2$Time, predict(fit1), col="blue", lty=2, lwd=2) fit3 <- nls(CO2 ~ a*(1-exp(-b*Time)), start=c(a=500, b=0.03), data=FG2) lines(FG2$Time, predict(fit3), col="green", lwd=2) fit4 <- nls(CO2 ~ c + a*(1-exp(-b*Time)), start=c(a=500, b=0.03, c=0), data=FG2) lines(FG2$Time, predict(fit4), col="brown", lwd=2) On Tue, Jul 9, 2013 at 8:10 AM, Elizabeth Webb <webb.elizabeth.e@gmail.com>wrote:> Hi Jean- > Thanks for responding. Below I have provided dput(FG2[1:50, ]). I have > also attached a graph of my data. > Thanks for the hint on working a third parameter into my model. I will > certainly try that once I get the model working. > Elizabeth > > dput(FG2[1:50, ]) > structure(list(CO2 = c(383.29, 392, 394.38, 392.85, 413.14, 394.56, > 405.83, 409.61, 408.15, 412.63, 414.62, 423.19, 422.39, 426.81, > 433.34, 433.95, 438.02, 438.21, 442.84, 441.81, 444.09, 444.59, > 446.35, 447.11, 450.03, 452.03, 452.69, 453.7, 455.17, 456.65, > 458.72, 458.88, 459.25, 459.88, 464.06, 461.34, 464.66, 465.19, > 466.96, 466.86, 468.41, 469.49, 471.08, 471.61, 472.95, 473.94, > 474.63, 475.79, 477.07, 476.53), Time = c(53, 54, 55, 56, 57, > 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, > 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, > 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102)), .Names = c("CO2", > "Time"), row.names = c(NA, 50L), class = "data.frame") > > > On Tue, Jul 9, 2013 at 4:16 AM, Adams, Jean <jvadams@usgs.gov> wrote: > >> Elizabeth, >> >> It's difficult to troubleshoot without the data. Could you provide the >> output from >> dput(FG2) >> or if your data set is quite large, perhaps >> dput(FG2[1:50, ]) >> >> If you want to fit a third parameter to represent the base of the log, >> you could use >> nls(CO2 ~ log(a*Time) / log(c) + b, start=c(a=68, b=400, c=10), >> data=FG2) >> where c represents the base of the log in this relation: >> CO2 = log_c(a*Time) + b >> >> Jean >> >> >> >> >> On Mon, Jul 8, 2013 at 9:27 PM, Elizabeth Webb < >> webb.elizabeth.e@gmail.com> wrote: >> >>> Hi- >>> I am trying to fit a log function to my data, with the ultimate goal of >>> finding the second derivative of the function. However, I am stalled on >>> the first step of fitting a curve. >>> >>> When I use the following code: >>> FG2.model<-(nls((CO2~log(a*Time)+b), start=setNames(coef(lm(CO2 ~ >>> log(Time), data=FG2)), c("a", "b")),data=FG2)) >>> I get the following error: >>> Error in numericDeriv(form[[3L]], names(ind), env) : >>> Missing value or an infinity produced when evaluating the model >>> In addition: Warning messages: >>> 1: In min(x) : no non-missing arguments to min; returning Inf >>> 2: In max(x) : no non-missing arguments to max; returning -Inf >>> 3: In log(a * Time) : NaNs produced >>> 4: In log(a * Time) : NaNs produced >>> >>> When I fit the curve in Plot and use the coefficients as starting values: >>> start=c(a=68,b=400) >>> FG2.model<-(nls((CO2~log(a*Time)+b), start=start,data=FG2)) >>> I get the following error: >>> Error in nls((CO2 ~ log(a * Time) + b), start = start, data = FG2) : >>> singular gradient >>> In addition: Warning messages: >>> 1: In min(x) : no non-missing arguments to min; returning Inf >>> 2: In max(x) : no non-missing arguments to max; returning -Inf >>> >>> So then when I substituded nlxb for nls in the above two models, I got >>> this >>> error: >>> Error in nlxb((CO2 ~ log(a * Time) + b), start = start, data = FG2) : >>> NaN in Jacobian >>> >>> >>> A few questions: >>> 1.) How can I get R to fit my curve without returning errors? >>> >>> 2.) I am not sure that this data is log base 10. Is there a way I can >>> ask >>> R to try for logs of different functions? For example, >>> >>> FG2.model<-(nlxb((CO2~log(a*Time,c)+b), start=start,data=FG2)), where c >>> is >>> an additional variable. When I try this, R tells me Non-numeric argument >>> to mathematical function >>> >>> Thank you in advance, >>> Elizabeth >>> >>> [[alternative HTML version deleted]] >>> >>> ______________________________________________ >>> R-help@r-project.org mailing list >>> 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]]
Prof J C Nash (U30A)
2013-Jul-10 14:55 UTC
[R] fitting log function: errors using nls and nlxb
This reply only addresses the NaN in Jacobian matter. I believe it is a result of getting a perfect fit (0 sum of squares). I have amended the r-forge version of nlmrt package in routines nlfb and nlxb and did not get the error running Elizabeth's example. This only answers the software issue, of course, not the statistical one. Use the version of nlmrt from the SCM repository on https://r-forge.r-project.org/R/?group_id=395 or email me for a tarball of this. JN On 13-07-10 06:00 AM, r-help-request at r-project.org wrote:> On Mon, Jul 8, 2013 at 9:27 PM, Elizabeth Webb > <webb.elizabeth.e at gmail.com>wrote: >> >Hi- >> >I am trying to fit a log function to my data, with the ultimate goal of >> >finding the second derivative of the function. However, I am stalled on >> >the first step of fitting a curve. >> > >> >When I use the following code: >> >FG2.model<-(nls((CO2~log(a*Time)+b), start=setNames(coef(lm(CO2 ~ >> >log(Time), data=FG2)), c("a", "b")),data=FG2)) >> >I get the following error: >> >Error in numericDeriv(form[[3L]], names(ind), env) : >> > Missing value or an infinity produced when evaluating the model >> >In addition: Warning messages: >> >1: In min(x) : no non-missing arguments to min; returning Inf >> >2: In max(x) : no non-missing arguments to max; returning -Inf >> >3: In log(a * Time) : NaNs produced >> >4: In log(a * Time) : NaNs produced >> > >> >When I fit the curve in Plot and use the coefficients as starting values: >> >start=c(a=68,b=400) >> >FG2.model<-(nls((CO2~log(a*Time)+b), start=start,data=FG2)) >> >I get the following error: >> >Error in nls((CO2 ~ log(a * Time) + b), start = start, data = FG2) : >> > singular gradient >> >In addition: Warning messages: >> >1: In min(x) : no non-missing arguments to min; returning Inf >> >2: In max(x) : no non-missing arguments to max; returning -Inf >> > >> >So then when I substituded nlxb for nls in the above two models, I got this >> >error: >> >Error in nlxb((CO2 ~ log(a * Time) + b), start = start, data = FG2) : >> > NaN in Jacobian >> >
Maybe Matching Threads
- SSweibull() : problems with step factor and singular gradient
- Issues when trying to fit a nonlinear regression model
- Determining Starting Values for Model Parameters in Nonlinear Regression
- Issues when trying to fit a nonlinear regression model
- R_using non linear regression with constraints