hi list,

used versions: 2.12.1 and 2.14.0 under ubuntu and macosx.

I recently stumbled over a problem with `nls', which occurs if the model is not specified explicitly but via an evaluation of a 'call' object. simple example:

8<--------------------------------------------------------------------------------------

nlsProblem <- function (len = 5) {
#=======================================================================
   # purpose: to demonstrate an apparent problem with `nls' which occurs,
   # if the model is specified by passing th lhs as an evaled 'call'
   # object.  The problem is related to the way `nls' tries to compute
   # its internal variable `varIndex' which rests on the assumption that
   # the dependent ("y") and, possibly, the independent ("x") variable
   # are identified by having a length equal to the `nls' variable
   # `respLength'. the problem arises when there are `varNames'
   # components accidentally having this length, too.

   # in the present example, setting the number of data points to
   # len=2 triggers the error since the `call' object `fifu' has this
   # length, too and `nls' constructs an erroneous `mf$formula' internally.
#=======================================================================
   #generate some data
   x <- seq(0, 4, len = len)
   y <- exp(-x)
   y <- rnorm(y, y, .001*y)
   data <- list(x = x, y = y)

   #define suitable model
   model <- y ~ exp(-k*x)
   fifu  <- model[[3]]

   #this fit is fine:
   fit1 <- nls(model, data = data, start = c(k = 1))
   print(summary(fit1))

   #this fit crashes `nls' if len = 2:
   fit2 <- nls(y ~ eval(fifu), data = data, start = c(k = 1))
   print(summary(fit2))
}

8<--------------------------------------------------------------------------------------

to see the problem call `nlsProblem(2)'.

as explained in the above comments in the example function, I tracked it down to the way `nls' identifies x and y in the model expression. the problem surfaces in the line

        varIndex <- n%%respLength == 0

(line 70 in the function listing from within R) which, in the case of `fit2' in the above example always returns a single TRUE index as long as `len != 2' (which seems fine for the further processing) but returns a TRUE value for the index of `fifu' as well if `len == 2'.

question1: I'm rather sure it worked about 6 months ago with (ca.) 2.11.x under ubuntu. have there been changes in this area? question2: is something like the `fit2' line in the example expected to work or not? qeustion3: if it is not expected to work, should not the manpage include a corresponding caveat? question4: is there a a substitute/workaround for the `fit2' line which still allows to specify the rhs of the model via a variable instead of a constant (explicit) expression or function call?

the above example is of course construed but in my use case I actually need this sort of thing. is there any chance that the way `nls' analyzes its `model' argument can be changed to parse the `eval(fifu)' construct correctly in all cases?

since I'm currently not subscribed to the list I'd appreciate if responses could be Cc'ed to me directly.

thanks in advance,

joerg

______________________________________________
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.

Reply via email to