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@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,                  [EMAIL PROTECTED]
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@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.

Reply via email to