The documentation for nls says the following about the starting values:

 start: a named list or named numeric vector of starting estimates.
          Since R 2.4.0, when 'start' is missing, a very cheap guess
          for 'start' is tried (if 'algorithm != "plinear"').

It may be a good idea to document that when algorithm = "port", if start
is a named list, the elements of the list must be numeric vectors of
length 1.  Ie, start = list(a=1,b=2,c=3) is ok, but start = list(a=c(1,2),
b=3) is not.  This is not the case when algorithm is "plinear" or the
default GN, and is because of the way that the "port" code in nls.R
transforms the starting values (the other options do something else):

nls_port_fit <- function(m, start, lower, upper, control, trace)
{
    ## Establish the working vectors and check and set options
    p <- length(par <- as.double(start))


Example:

## exponentially decaying data
getExpmat <- function(theta, t)
{
        conc <- matrix(nrow = length(t), ncol = length(theta))
        for(i in 1:length(theta)) {
                conc[, i] <- exp(- theta[i] * t)
        }
        conc
}

expsum <- as.vector(getExpmat(c(.05,.005), 1:100) %*% c(1,1))
expsumNoisy <- expsum + max(expsum) *.001 * rnorm(100)
expsum.df <-data.frame(expsumNoisy)

## estimate decay rates, amplitudes with default Gauss-Newton
summary (nls(expsumNoisy ~ getExpmat(k, 1:100) %*% sp, expsum.df, start =
list(k = c(.6,.02), sp = c(1,2)), trace=TRUE, control =
nls.control(maxiter=20,
warnOnly =  TRUE)))

## won't work with port
summary (nls(expsumNoisy ~ getExpmat(k, 1:100) %*% sp, expsum.df, start =
list(k = c(.6,.02), sp = c(1,2)), algorithm = "port",
trace=TRUE, control = nls.control(maxiter=20,
warnOnly =  TRUE)))

______________________________________________
R-devel@r-project.org mailing list
https://stat.ethz.ch/mailman/listinfo/r-devel

Reply via email to