On Sat, Oct 1, 2011 at 9:27 AM, Gabor Grothendieck <ggrothendi...@gmail.com> wrote: > On Sat, Oct 1, 2011 at 5:28 AM, Casper Ti. Vector > <caspervec...@gmail.com> wrote: >> Example: >> >>> f <- function(x) { 1 + 2 * log(1 + 3 * x) + rnorm(1, sd = 0.5) } >>> y <- f(x <- c(1 : 10)); y >> [1] 4.503841 5.623073 6.336423 6.861151 7.276430 7.620131 7.913338 8.169004 >> [9] 8.395662 8.599227 >>> nls(x ~ a + b * log(1 + c * x), start = list(a = 1, b = 2, c = 3), trace = >>> TRUE) >> 37.22954 : 1 2 3 >> Error in numericDeriv(form[[3L]], names(ind), env) : >> Missing value or an infinity produced when evaluating the model >> In addition: Warning message: >> In log(1 + c * x) : NaNs produced >> >> What's wrong here? Am I handling this problem in the wrong way? >> Any suggestions are welcome, thanks :) >> > > Its linear given c so calculate the residual sum of squares using lm > (or lm.fit which is faster) given c and optimize over c: > > set.seed(123) # for reproducibility > > # test data > x <- 1:10 > y <- 1 + 2 * log(1 + 3 * x) + rnorm(1, sd = 0.5) > > # calculate residual sum of squares for best fit given c > fitc <- function(c) lm.fit(cbind(1, log(1 + c * x)), y) > rssvals <- function(c) sum(resid(fitc(c))^2) > > out <- optimize(rssvals, c(0.01, 10)) > > which gives: > >> setNames(c(coef(fitc(out$minimum)), out$minimum), letters[1:3]) > a b c > 0.7197666 2.0000007 2.9999899
Also you probably intended to write 10 instead of 1 as the arg to rnorm. -- Statistics & Software Consulting GKX Group, GKX Associates Inc. tel: 1-877-GKX-GROUP email: ggrothendieck at gmail.com ______________________________________________ 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.