By interpreting the code line by line and looking at the output of the lines, I got the

following result. It looks like it needs the fifu converted to an expression, then

evaluated. This suggests a workaround, but doesn't answer the underlying question about

whether this is supposed to work this way.

JN

> str(fifu)

language exp(-k * x)

> fifu2<-as.expression(fifu)

> fit2b <- nls(y ~ fifu2, data = data, start = c(k = 1))

Error in lhs - rhs : non-numeric argument to binary operator

> fifu2

expression(exp(-k * x))

> fit2be <- nls(y ~ eval(fifu2), data = data, start = c(k = 1))

> fit2be

Nonlinear regression model

model: y ~ eval(fifu2)

data: data

k

1

residual sum-of-squares: 1.604e-06

Number of iterations to convergence: 1

Achieved convergence tolerance: 1.603e-06

--------------------------------------

>

> Message: 13

> Date: Tue, 03 Jul 2012 13:54:11 +0200

> From: "joerg van den hoff" <

[hidden email]>

> To:

[hidden email]
> Subject: [R] nls problem

> Message-ID: <

[hidden email]>

> Content-Type: text/plain; charset=iso-8859-15; format=flowed;

> delsp=yes

>

> 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 is where my output above should be placed. JN

> #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

>

>

______________________________________________

[hidden email] mailing list

https://stat.ethz.ch/mailman/listinfo/r-helpPLEASE do read the posting guide

http://www.R-project.org/posting-guide.htmland provide commented, minimal, self-contained, reproducible code.