Bug 14384 - Problem with NLSstClosestX; and suggested fix
Problem with NLSstClosestX; and suggested fix
Status: CLOSED FIXED
Product: R
Classification: Unclassified
Component: Accuracy
R 2.11.0
ix86 (32-bit) Windows 32-bit
: P5 minor
Assigned To: R-core
Depends on:
Blocks:
  Show dependency treegraph
 
Reported: 2010-09-22 11:11 UTC by K Jewell
Modified: 2010-10-01 22:57 UTC (History)
0 users

See Also:


Attachments

Note You need to log in before you can comment on or make changes to this bug.
Description K Jewell 2010-09-22 11:11:22 UTC
I sent this to R-help sometime in 2009, but I guess it wasn't noticed.

Problem is demonstrated with this code, intended to find the approximate 'x' 
at which the 'y' is midway between the left and right asymptotes. This 
particular data set returns NA, which is a bit silly!
--------------
sXY <- structure(list(x = c(0, 24, 27, 48, 51, 72, 75, 96, 99), y = 
c(4.98227,
6.38021, 6.90309, 7.77815, 7.64345, 7.23045, 7.27875, 7.11394,
6.95424)), .Names = c("x", "y"), row.names = c(NA, 9L), class = 
c("sortedXyData",
"data.frame"))
a <- NLSstLfAsymptote(sXY)
d <- NLSstRtAsymptote(sXY)
NLSstClosestX(sXY, (a+d)/2)
------------------------
I think the problem arises when the target y value is exactly equal to one 
of the y values in sXY and can be fixed by trapping that situation thus:
--------------------
NLSstClosestX.sortedXyData <-   function (xy, yval)
{
    deviations <- xy$y - yval
    if (any(deviations==0)) xy$x[match(0, deviations)] else {   # new line 
inserted
      if (any(deviations <= 0)) {
          dev1 <- max(deviations[deviations <= 0])
          lim1 <- xy$x[match(dev1, deviations)]
          if (all(deviations <= 0)) {
              return(lim1)
          }
      }
      if (any(deviations >= 0)) {
          dev2 <- min(deviations[deviations >= 0])
          lim2 <- xy$x[match(dev2, deviations)]
          if (all(deviations >= 0)) {
              return(lim2)
          }
      }
      dev1 <- abs(dev1)
      dev2 <- abs(dev2)
      lim1 + (lim2 - lim1) * dev1/(dev1 + dev2)
   }                                           # new line inserted
}
-------------------
Comment 1 Brian Ripley 2010-10-01 22:57:12 UTC
I get NaN ... division by zero.

Changed for R 2.12.0.