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 How can I fix this, and supply _lists_ with parameter names (and data names) to fcn(...) in nls? Thanks a lot! :-) -- WBR, Timur.
Have you considered using "optim" to minimize a function that computes the sum of squares of residuals (SSR) from your model of interest? Contour plots of SSR over variations in any two parameters provide simultaneous confidence regions using the appropriate percentage points of the F distribution. If my memory is correct, I believe you can find this discussed in Bates and Watts (1988) Nonlinear Regression Analysis and Its Applications (Wiley). Setting "hessian=TRUE" gives you double the observed information matrix at the optima, which can be used to obtain confidence intervals using the less-accurate normal approximation for the distribution of parameter estimates. If your function in poorly parameterized or you have poor starting values, "optim" will usually give you something; "nls" will more often refuse to produce an answer. This is either a benefit or a deficiency, depending on your point of view. hope this helps. spencer graves Timur Elzhov wrote:>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 > >How can I fix this, and supply _lists_ with parameter names (and data names) >to fcn(...) in nls? >Thanks a lot! :-) > > >-- >WBR, >Timur. > >______________________________________________ >R-help at stat.math.ethz.ch mailing list >https://www.stat.math.ethz.ch/mailman/listinfo/r-help > >
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 typeI'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?