[R] 'nls' and its arguments

Douglas Bates bates at stat.wisc.edu
Thu Oct 30 19:02:15 CET 2003


Timur Elzhov <Timur.Elzhov at jinr.ru> writes:

> Dear R experts!
> 
> I'd to fit data by 'nls' with me-supplied function 'fcn'.
> 
> 1) I'd like 'fcn' to accept arbitrary arguments, i.e. I defined it
>    as f(...) {<body>}. (Ok, that's not actually impotant).
> 2) Second, I would NOT like to supply every parameter in the formula.
>    To illustrate this, let's look at the last example of 'nls' help
>    page:
> 
>     ## weighted nonlinear regression
>     data(Puromycin)
>     Treated <- Puromycin[Puromycin$state == "treated", ]
>     weighted.MM <- function(resp, conc, Vm, K)
>     {
>         ## Purpose: exactly as white book p.451 -- RHS for nls()
>         ##  Weighted version of Michaelis-Menten model
>         ## ---------------------------------------------------------------
>         ## Arguments: `y', `x' and the two parameters (see book)
>         ## ---------------------------------------------------------------
>         ## Author: Martin Maechler, Date: 23 Mar 2001, 18:48
>         print(resp)
>     
>         pred <- (Vm * conc)/(K + conc)
>         (resp - pred) / sqrt(pred)
>     }
>     Pur.wt <- nls( ~ weighted.MM(rate, conc, Vm, K), data = Treated,
>                   start = list(Vm = 200, K = 0.1))
> 
> So, in this example I wouldn't like to write `weighted.MM(rate, conc, Vm, K'),
> and `start = list(Vm = 200, K = 0.1)', instead I'd like to supply _lists_.
> With the 'start' parameter it's easy - I create list
> 
>     p.start <- list(Vm = 200, K = 0.1)
> 
> and assign it to 'start' in nls():
> 
>     start = p.start
> 
> - that works. But, with the formula it's not so simple. Well, I tried
> at first to make formula more "list-like":
> 
>     Pur.wt <- nls( ~ do.call("weighted.MM", list(rate, conc, Vm, K)),
>                   data = Treated,
>                   start = p.start)
> 
> - that works too. Now, let's try to separate data and parameters:
> 
>     Pur.wt <- nls( ~ do.call("weighted.MM", c(list(rate, conc), list(Vm, K))),
>                   data = Treated,
>                   start = p.start)
> 
> - that's right. So, I have a data 'Treated', and a start params list
> 'p.start'. Now, here is the _point_: I want nls to read names of
> variables from the lists and supply it to function in the formula.
> In this example 'weighted.MM' has a certain arg list, but my function is
> 'fcn(...)', and I want supply _all_ these names to the fcn. I tried to
> change 'list(Vm, K)' to list(as.name("Vm"), as.name("K")):
> 
>     Pur.wt <- nls( ~ do.call("weighted.MM", c(list(rate, conc), list(as.name("Vm"), as.name("K")))),
>                   data  = Treated, start = p.start)
> 
> - works again! Now,
>     p.arg  <- list(as.name("Vm"), as.name("K"))
>     Pur.wt <- nls( ~ do.call("weighted.MM", c(list(rate, conc), p.arg)),
>                              data  = Treated, start = p.start)
>     Error in model.frame(formula, rownames, variables, varnames, extras, extranames,  : 
>             invalid variable type

I'm not really sure what you want to do but the problem here is that
you are providing names as starting estimates, not the values of the
names.  You _may_ be able to use lapply(p.arg, eval) instead of p.arg
but you would have to be careful about exactly when the eval is
performed and in what environment.

I would say that this looks like a very complicated way of approaching
a problem and maybe it is time to step back and see if you can come up
with another approach.

> How can I fix this, and supply _lists_ with parameter names (and data names)
> to fcn(...) in nls?




More information about the R-help mailing list