From wdunlap at tibco.com  Thu Feb 19 21:21:53 2009
From: wdunlap at tibco.com (William Dunlap)
Date: Thu, 19 Feb 2009 12:21:53 -0800
Subject: [Rd] bugfix for nls with port algorithm (PR#13540)
In-Reply-To: <20090219195514.17727282C765@mail.pubhealth.ku.dk>
References: <20090219195514.17727282C765@mail.pubhealth.ku.dk>
Message-ID: <77EB52C6DD32BA4D87471DCD70C8D700BE9776@NA-PA-VBE03.na.tibco.com>

> -----Original Message-----
> From: r-devel-bounces at r-project.org 
> [mailto:r-devel-bounces at r-project.org] On Behalf Of 
> Manuel.A.Morales at williams.edu
> Sent: Thursday, February 19, 2009 11:55 AM
> To: r-devel at stat.math.ethz.ch
> Cc: R-bugs at r-project.org
> Subject: [Rd] bugfix for nls with port algorithm (PR#13540)
> 
> Full_Name: Manuel A. Morales
> Version: 2.8.1
> OS: Linux
> Submission from: (NULL) (137.165.199.246)
> 
> 
> When fitting a model in nls using the algorithm port with 
> constraints and the
> shorthand parameter[factor] in the model, I get the following 
> error message:
> 
> "Error in nls_port_fit(m, start, lower, upper, control, trace) : 
>   (list) object cannot be coerced to type 'double'
> In addition: Warning message:
> In start < low :
>   longer object length is not a multiple of shorter object length"
> 
> This error can be fixed by changing line 423 in nls.R from:
> 
> if(any(start < low || start > upp)) {
> 
> to:
> 
> if(any(unlist(start) < low || unlist(start) > upp)) {

The || should be changed to | or this should be converted
to 2 calls to any() joined by a ||.  (I prefer the latter.)
Otherwise you get no notice that your start value is out
of bounds in many cases.  E.g., with your data and fix the
following ought to complain:
  nls(y~b0[fac]+b1*x, start=list(b0=c(1,-1),b1=101), algorithm="port",
    upper=c(100,100,100), lower=c(0,0,0))
Changing that line to
  if (any(unlist(start) < low) || any(unlist(start) > upp)) {
makes it give a proper complaint:
  > nls(y~b0[fac]+b1*x, start=list(b0=c(1,-1),b1=101), algorithm="port",
  +   upper=c(100,100,100), lower=c(0,0,0))
  Error in nls(y ~ b0[fac] + b1 * x, start = list(b0 = c(1, -1), b1 =
101),  :
    Convergence failure: initial par violates constraints

Should '||' and '&&' warn if their arguments are not scalar (or perhaps
0-long also)?  The related 'if' does:
  > if(c(TRUE,FALSE)) cat("yes\n") else cat("no\n")
  yes
  Warning message:
  In if (c(TRUE, FALSE)) cat("yes\n") else cat("no\n") :
    the condition has length > 1 and only the first element will be used

Bill Dunlap
TIBCO Software Inc - Spotfire Division
wdunlap tibco.com 
> 
> The following code will generate the error:
> x = runif(200)
> b0 = c(rep(0,100),runif(100))
> b1 = 1
> fac <- as.factor(rep(c(0,1), each=100))
> y = b0+b1*x+rnorm(200,sd=0.05)
> nls(y~b0[fac]+b1*x, start=list(b0=c(1,1),b1=1), algorithm="port",
>     upper=c(100,100,100))
> 
> Manuel
> 
> ______________________________________________
> R-devel at r-project.org mailing list
> https://stat.ethz.ch/mailman/listinfo/r-devel
> 



[Rd] bugfix for nls with port algorithm (PR#13540)
William Dunlap