On 11/12/2020 6:50 p.m., Rolf Turner wrote:


I want to fit a model y = x/(x-a) where the value of a depends
on the level of a factor z.  I cannot figure out an appropriate
syntax for nls().  The "parameter" a (to be estimated) should be a
vector of length equal to the number of levels of z.

I tried:

strt <- rep(3,length(levels(z))
names(strt=levels(z)
fit <- nls(y ~ x/(x - a[z]),start=strt,data=xxx)

but of course got an error:

Error in nls(y ~ x/(x - a[z]), start = strt, data = xxx) :
   parameters without starting value in 'data': a

I keep thinking that there is something obvious that I should
be doing, but I can't work out what it is.

Does there *exist* an appropriate syntax for doing what I want
to do?  Can anyone enlighten me?  The data set "xxx" is given
in dput() form at the end of this message.


I don't know of anything easy here. I think you need to do some tricky stuff with formulas to get what you want. For example,

pred <- function(x, z, ...) {
  a <- unlist(list(...))
  names(a) <- levels(xxx$z)
  x/(x-a[z])
}
strt <- rep(3,length(levels(xxx$z)))
names(strt) <- levels(xxx$z)
fla <- y ~ pred(x, z)
fla[[3]] <- as.call(c(as.list(fla[[3]]), lapply(levels(xxx$z), as.name)))
fit <- nls(fla,start=strt,data=xxx)

That line starting fla[[3]] is the ugly part: it takes the simple formula y ~ pred(x, z) and changes it to y ~ pred(x, z, a1, a2, a3, a4, a5). As far as I know, nls() can't handle vector paramters, it only deals with scalars, so this passes them each as a separate argument.

Maybe rlang or one of the other packages like that has code to make this less obscure.

______________________________________________
R-help@r-project.org mailing list -- To UNSUBSCRIBE and more, see
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