[R] Fix for nls bug???

Prof Brian Ripley ripley at stats.ox.ac.uk
Thu Aug 7 07:55:45 CEST 2008


Your example works in R-patched, as a consequence of investigations of a 
different problem.  (See the comments in the posting guide about updating 
your R and trying the very latest versions.)

Windows binaries for R-patched are available on CRAN.

On Tue, 5 Aug 2008, Keith Jewell wrote:

> Hi All,
>
> I've hit a problem using nls. I think it may be a restriction in the
> applicability of nls and I may have found a fix, but I've been wrong before.
>
> This example is simplified to the essentials. My real application is much
> more complicated.
>
> Take a function of matrix 'x' with additional arguments:
> matrix 'aMat' whose values are _not_ to be determined by nls
> vector 'Coeffs' whose vales _are_ to be determined.
> For simplicity, this isn't a selfStart function with an 'initial' attribute,
> but that doesn't change things.
>
> Myfunc<-function(x, aMat, Coeffs)
> {
> #
> # result = quadratic response in x with
> # terms selected by aMat
> #
> aMat[aMat!=0] <- Coeffs
> rowSums((x%*%aMat)%*%t(x))
> }
>
> If aMat is passed in by name (e.g. aMat = bMat) nls fails.
> e.g.
> #
> # data frame with some noise
> DF <- data.frame(x1 = runif(20, 1, 20), x2=runif(20, 1, 20))
> DF$y <- 1 +DF$x1 +DF$x2 +DF$x1*DF$x2 +DF$x1^2 + DF$x2^2 + rnorm(20)
> #
> # matrix to pass in as aMat
> bMat <- matrix(c(1,1,0,0), 2, 2)
> #
> # and nls fails
> nls(y ~ Myfunc(cbind(x1, x2), bMat, aVec), DF, start=list(aVec=c(1,2)))
> #
> # pass in the same matrix other than by name and it works
> nls(y ~ Myfunc(cbind(x1, x2), matrix(c(1,1,0,0), 2, 2), aVec), DF,
> start=list(aVec=c(1,2)))
>
> I think the problem lies in this line in nls
>
>  for (var in varNames[!varIndex]) mf[[var]] <- eval(as.name(var), data,
> env)
>
> This adds values for some named arguments (bMat) as columns of the data
> frame. The problem is that generally they don't have the same number of
> rows. I've made it work for my example by replacing that line with this
> line, which adds values for those arguments to the data frame as parameters
> rather than as a column
>
>  attributes(mf)[["parameters"]] <-
> c(attributes(mf)[["parameters"]],lapply(varNames[!varIndex], function(var)
> eval(as.name(var), data, env)) )
>
> Problem is, I really don't know nls internals enough to be sure I haven't
> broken something.
> And anyway, if this is really an improvement I ought to share it, but don't
> know how.
>
> Or I could have totally the wrong end of the stick...
>
> Comments, corrections and advice are welcome.
>
> Thanks in advance,
>
> Keith Jewell
> -----------------------
>> sessionInfo()
> R version 2.7.0 (2008-04-22)
> i386-pc-mingw32
>
> locale:
> LC_COLLATE=English_United Kingdom.1252;LC_CTYPE=English_United
> Kingdom.1252;LC_MONETARY=English_United
> Kingdom.1252;LC_NUMERIC=C;LC_TIME=English_United Kingdom.1252
>
> attached base packages:
> [1] stats     graphics  grDevices datasets  tcltk     utils     methods
> base
>
> other attached packages:
> [1] xlsReadWrite_1.3.2 svSocket_0.9-5     svIO_0.9-5         R2HTML_1.58
> [5] svMisc_0.9-5       svIDE_0.9-5
>
> loaded via a namespace (and not attached):
> [1] tools_2.7.0 VGAM_0.7-7
>
> ______________________________________________
> R-help at r-project.org mailing list
> 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.
>

-- 
Brian D. Ripley,                  ripley at stats.ox.ac.uk
Professor of Applied Statistics,  http://www.stats.ox.ac.uk/~ripley/
University of Oxford,             Tel:  +44 1865 272861 (self)
1 South Parks Road,                     +44 1865 272866 (PA)
Oxford OX1 3TG, UK                Fax:  +44 1865 272595



More information about the R-help mailing list