[R] approxfun-problems (yleft and yright ignored)

David Winsemius dwinsemius at comcast.net
Sat Sep 11 16:33:33 CEST 2010


On Sep 11, 2010, at 10:04 AM, Martin Maechler wrote:

>>>>>> "SW" == Samuel Wuest <wuests at tcd.ie>
>>>>>>    on Thu, 26 Aug 2010 14:34:26 +0100 writes:
>
>    SW> Hi Greg,
>    SW> thanks for the suggestion:
>
>    SW> I have attached some small dataset that can be used to  
> reproduce the
>    SW> odd behavior of the approxfun-function.
>
>    SW> If it gets stripped off my email, it can also be downloaded at:
>    SW> http://bioinf.gen.tcd.ie/approx.data.Rdata
>
>    SW> Strangely, the problem seems specific to the data structure  
> in my
>    SW> expression set, when I use simulated data, everything worked  
> fine.
>
>    SW> Here is some code that I run and resulted in the strange  
> output that I
>    SW> have described in my initial post:
>
>>> ### load the data: a list called approx.data
>>> load(file="approx.data.Rdata")
>>> ### contains the slots "x", "y", "input"
>>> names(approx.data)
>    SW> [1] "x"     "y"     "input"
>>> ### with y ranging between 0 and 1
>>> range(approx.data$y)
>    SW> [1] 0 1
>>> ### compare ranges of x and input-x values (the latter is a small  
>>> subset of 500 data points):
>>> range(approx.data$x)
>    SW> [1] 3.098444 7.268812
>>> range(approx.data$input)
>    SW> [1]  3.329408 13.026700
>>>
>>>
>>> ### generate the interpolation function (warning message benign)
>>> interp <- approxfun(approx.data$x, approx.data$y, yleft=1,  
>>> yright=0, rule=2)
>    SW> Warning message:
>    SW> In approxfun(approx.data$x, approx.data$y, yleft = 1, yright  
> = 0,  :
>    SW> collapsing to unique 'x' values
>>>
>>> ### apply to input-values
>>> y.out <- sapply(approx.data$input, interp)
>>>
>>> ### still I find output values >1, even though yleft=1:
>>> range(y.out)
>    SW> [1] 0.000000 7.207233
#-------------- on another  64 bit Mac -------------
 > load(file="approx.data.Rdata")
 > names(approx.data)
[1] "x"     "y"     "input"
 > range(approx.data$y)
[1] 0 1
 > range(approx.data$x)
[1] 3.098444 7.268812
 >
 > interp <- approxfun(approx.data$x, approx.data$y, yleft=1,  
yright=0, rule=2)
Warning message:
In approxfun(approx.data$x, approx.data$y, yleft = 1, yright = 0,  :
   collapsing to unique 'x' values
 > y.out <- sapply(approx.data$input, interp)
 > range(y.out)
[1] -5.143958e+284   9.816907e-01

 > interp
function (v)
.C("R_approxfun", as.double(x), as.double(y), as.integer(n),
     xout = as.double(v), as.integer(length(v)), as.integer(method),
     as.double(yleft), as.double(yright), as.double(f), NAOK = TRUE,
     PACKAGE = "stats")$xout
<environment: 0x1598c91b8>

# attempt to offer yright and yledft in the sapply call failed
 > y.out <- sapply(approx.data$input, interp, yright=0, yleft=1)
Error in FUN(c(6.99984458535897, 4.85139079147721, 7.58922165833,  
10.8135863246057,  :
   unused argument(s) (yright = 0, yleft = 1)

#Create yright and yleft in the calling environment:

 > yright=0; yleft=1
 > y.out <- sapply(approx.data$input, interp)
 > range(y.out)
[1] 0.0000000 0.9816907

Now it "works" as expected.


It seems to me that the yleft and yright values may not be properly  
incorporated into the constructed function.


 > sessionInfo()
R version 2.11.1 Patched (2010-06-14 r52281)
x86_64-apple-darwin9.8.0

locale:
[1] en_US.UTF-8/en_US.UTF-8/C/C/en_US.UTF-8/en_US.UTF-8

attached base packages:
[1] grid      splines   stats     graphics  grDevices
[6] utils     datasets  methods   base

other attached packages:
  [1] gplots_2.8.0     caTools_1.10     bitops_1.0-4.1
  [4] gdata_2.8.0      gtools_2.6.2     sos_1.2-9
  [7] brew_0.1-1       qpcR_1.3-2       minqa_1.1.9
[10] Rcpp_0.8.5       nlme_3.1-96      cluster_1.12.3
[13] rgl_0.91         minpack.lm_1.1-4 MASS_7.3-6
[16] chron_2.3-35     maps_2.1-4       gmodels_2.15.0
[19] rbenchmark_0.3   data.table_1.5   rms_3.0-0
[22] Hmisc_3.8-1      survival_2.35-8  plyr_1.1
[25] lattice_0.18-8

loaded via a namespace (and not attached):
[1] tools_2.11.1

-- 
David Winsemius

>
>
> I get completely different (and correct) results,
> by the way the *same* you have in the bug report you've
> submitted
> (https://bugs.r-project.org/bugzilla3/show_bug.cgi?id=14377)
> and which does *not* show any bug:
>
>> range(y.out)
> [1] 0.0000000 0.9816907
>
> Of course, I do believe that you've seen the above problems,
> -- on 64-bit Mac ? as you report in sessionInfo() ? --
> but I cannot reproduce them.
>
> And also, you seem yourself to be able to get different results
> for the same data... what are the circumstances?
>
> Regards,
> Martin Maechler, ETH Zurich
>

David Winsemius, MD
West Hartford, CT



More information about the R-help mailing list