[Rd] Noncentral dt() with tiny 'x' values (PR#8874)

maechler at stat.math.ethz.ch maechler at stat.math.ethz.ch
Thu May 18 11:58:01 CEST 2006

>>>>> "MikeMer" == meredith  <meredith at easynet.co.uk>
>>>>>     on Thu, 18 May 2006 03:52:51 +0200 (CEST) writes:

    MikeMer> Full_Name: Mike Meredith
    MikeMer> Version: 2.3.0
    MikeMer> OS: WinXP SP2
    MikeMer> Submission from: (NULL) (

    MikeMer> Using dt() with a non-centrality parameter and near-zero values for 'x' results
    MikeMer> in erratic output. Try this:

    MikeMer> tst <- c(1e-12, 1e-13, 1e-14, 1e-15, 1e-16, 1e-17, 0)
    MikeMer> dt(tst,16,1)

    MikeMer> I get:  0.2381019 0.2385462 0.2296557 0.1851817 0.6288373 3.8163916 (!!)
    MikeMer> 0.2382217

I get quite different values (several '0', BTW), which just
confirms the erratic nature.

As often, plots give even a clearer picture:

if(!require(sfsmisc)) # pkg 'sfsmisc'
    lseq <- function (from, to, length) 
         2^seq(log2(from), log2(to), length.out = length)
x <- lseq(1e-3, 1e-33, length= 301)

plot(x, dt(x, df=16, ncp=1),   type = "o", cex=.5, log = "x")
plot(x, dt(x, df=16, ncp=0.1), type = "o", cex=.5, log = "x")
plot(x, dt(x, df= 3, ncp=0.1), type = "o", cex=.5, log = "x")

    MikeMer> The 0.238 values are okay, the others nonsense, and
    MikeMer> they cause confusing spikes on plots of dt() vs 'x'
    MikeMer> if 'x' happens to include tiny values. (Other
    MikeMer> values of df and ncp also malfunction, but not all
    MikeMer> give results out by an order of magnitude!)

I think almost all do, once you start looking at plots like the above.

    MikeMer> I'm using the work-around dt(round(x,10),...), but
    MikeMer> dt() should really take care of this itself.

or actually rather do something more smart; the cutoff at 1e-10
is quite crude.

Note that this is not a new bug at all; but rather as old as
we have dt(*, ncp= .) in R.

Thanks for reporting it!
Martin Maechler, ETH Zurich

More information about the R-devel mailing list