Skip to content

approxfun(*, ties=) returning "random" result (PR#986)

2 messages · Martin Maechler, Thomas Lumley

#
Platforms  : SunOS and Linux, both using gcc 2.95.[23]
  R versions : 1.2.3 and "R-devel"

I came accross this when trying to debug a somewhat sub-optimal behavior of
ecdf() from package stepfun.
What happens is that  approxfun(*, ties = <function>)
does not always return the same result for identical arguments.
I tried "min", "max", and "mean" all of which are mentioned on the help page.
inside where .C(......) is handled, or somewhere else ``deep down''...

I could debug more myself, but given the ``immediate release'' and my
limited resources, I'll pass this on :

###---------- the following is executable; read and follow the comments

n <- length(xt <- c(.4,.4,.4,1,1.05,2,3,3,3.4, 4,4,4,4:5, 7,7))

e2 <- approxfun(xt,(1:n)/n, method = "const", yl=0, yr=1, f=0, ties=max)
e2(xt)# all "1" (well mostly...)
gcinfo(TRUE)
## Execute the following (long) line a few times...
## the non-1 solution happens often (not always!) immediately *after* GC..
for(i in 1:100) {ee <- e2(xt);if(!is.na(b <- all(ee == 1)) && b) cat(".") else cat("\n",16*ee,"\n")}

## The problem happens only when  ties = <function>, not for ties = "ordered":
e1 <- approxfun(xt,(1:n)/n, method = "const", yl=0, yr=1, f=0, ties="ordered")
e1xt <- c(3,3,3:6,8,8,9,rep(13,4),14,15,15)/16
stopifnot(e1(xt) == e1xt)

## Execute the following (long) line a few times...
## -- no problem, always "........."
for(i in 1:100) {ee <- e1(xt);if(!is.na(b <- all(ee == e1xt))&& b)cat(".") else cat("\n",16*ee,"\n")}

-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-
r-devel mailing list -- Read http://www.ci.tuwien.ac.at/~hornik/R/R-FAQ.html
Send "info", "help", or "[un]subscribe"
(in the "body", not the subject !)  To: r-devel-request@stat.math.ethz.ch
_._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._
#
On Mon, 18 Jun 2001 maechler@stat.math.ethz.ch wrote:

            
No, the problem is that `n', the length of the x and y vectors, is not
recomputed when the ties are removed.  Thus in your example two 9-element
vectors are passed down to a C routine that is told they are 16 elements
long. Bad.

I'll commit the obvious fix after make check.

	-thomas


-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-
r-devel mailing list -- Read http://www.ci.tuwien.ac.at/~hornik/R/R-FAQ.html
Send "info", "help", or "[un]subscribe"
(in the "body", not the subject !)  To: r-devel-request@stat.math.ethz.ch
_._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._