[R] Fix for nls bug???

Prof Brian Ripley ripley at stats.ox.ac.uk
Fri Aug 8 13:41:24 CEST 2008


On Fri, 8 Aug 2008, Keith Jewell wrote:

> Dear Prof. Ripley,
>
> Thank you for your helpful reply. I will download and try R-patched ASAP.
>
> I take your point, I should have tried the latest version (R-patched) before
> posting.
>
> With respect to R-patched, would you recommend its use routinely, or only in
> investigation of "unexpected behaviour"?

I use it routinely.

In this case I was not expecting this to be fixed, but just tried your 
example in my usual R-patched (when it worked) and then in 2.7.1 (to 
confirm I could reproduce it) -- I then had to figure out what fix also 
fixed this one -- as it was

     o   nls() was only finding its 'weights' argument in the case when
         all the variables in the formula were of the same length and
         hence that model.frame() could be used.

it would have been obvious to no one.  Hence the advice to try R-patched 
(rather than just read about the changes) can pay off.

>
> Thanks again,
>
> Keith Jewell
> -------------
> "Prof Brian Ripley" <ripley at stats.ox.ac.uk> wrote in message
> news:alpine.LFD.1.10.0808070651030.14363 at gannet.stats.ox.ac.uk...
>> 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
>>
>> ______________________________________________
>> 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.
>>
>
> ______________________________________________
> 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