[R] Verify that a grid is uniform

Bert Gunter gunter.berton at gene.com
Mon Apr 6 19:51:48 CEST 2015


... correction: you need to use absolute value for the comparison, of course.

all(abs(diff(z) - z[2] + z[1]) < tol)

-- Bert

Bert Gunter
Genentech Nonclinical Biostatistics
(650) 467-7374

"Data is not information. Information is not knowledge. And knowledge
is certainly not wisdom."
Clifford Stoll




On Mon, Apr 6, 2015 at 10:47 AM, Bert Gunter <bgunter at gene.com> wrote:
> Perhaps ?diff might be useful here:
>
> z <- runif(20)
> all(diff(z) == z[2] - z[1] )
> ## FALSE
>
> z <- seq_len(10)
> all(diff(z) == z[2] - z[1] )
> ##TRUE
>
> You can use signif or round as before to allow for "near uniformity"
> or use ?zapsmall or an explicit comparison with a tolerancec instead
> of ==, e.g. all(diff(z) - z[2] + z[1] < tol)
>
> Cheers,
> Bert
>
> Bert Gunter
> Genentech Nonclinical Biostatistics
> (650) 467-7374
>
> "Data is not information. Information is not knowledge. And knowledge
> is certainly not wisdom."
> Clifford Stoll
>
>
>
>
> On Mon, Apr 6, 2015 at 10:11 AM, Marc Lamblin <marcgg.lamblin at gmail.com> wrote:
>> The aim is to control if a given abscissa/grid is uniform or not. Abscissa
>> in generic vector of real ordered numbers.
>>
>> Here a reproducibile code:
>>
>> # uniform abscissa/grid
>> abscissa1 <- seq(0, 1, length=100)
>> # non-uniform abscissa/grid
>> abscissa2 <- sort(runif(100))
>>
>> control1 <- all(signif(abscissa1[1:(length(abscissa1) - 1) + 1] -
>> abscissa1[1:(length(abscissa1) - 1)]) == signif(rep((range(abscissa1)[2] -
>> range(abscissa1)[1])/(length(abscissa1) - 1), length(abscissa1) - 1)))
>> control2 <- all(signif(abscissa2[1:(length(abscissa2) - 1) + 1] -
>> abscissa2[1:(length(abscissa2) - 1)]) == signif(rep((range(abscissa2)[2] -
>> range(abscissa2)[1])/(length(abscissa2) - 1), length(abscissa2) - 1)))
>>
>> control1
>> control2
>>
>> As expected control1 is TRUE and control2 is FALSE. Actually in this code
>> it is possible also to use
>> diff inside signif.
>> Do you mean that the control to perform can be done in this manner
>>
>> if (length(unique(diff(vec))) == 1) {
>>   control <- TRUE
>> } else {
>>   control <- FALSE
>> }
>>
>> I have tried to apply this control on abscissa1 which is uniform but
>> length(unique(diff(abscissa1))) was greater than one; probably, as you
>> said, this is due to the fact that in this way I don't take into account
>> the machine precision.
>> What I want to understand is if there is a SAFE solution, even if until now
>> this control is working correctly. I have seen in the documentation of
>> signif that by default the number of digits considered are 6. The number of
>> digits to consider depends on the scale used. It doesn't make sense to
>> increase the number of digits with respect to default because, in this
>> case, you are not using an handy scale.
>> Maybe it could be better directly to ask user if the abscissa passed as
>> argument is uniform or not.
>> Thanks a lot for the link!!!
>>
>> Marc
>>
>>
>>
>>
>> 2015-04-06 16:32 GMT+02:00 Sarah Goslee <sarah.goslee at gmail.com>:
>>
>>> Without a reproducible example that includes some sample data (fake is
>>> fine), the code you used (NOT in HTML format), and some clear idea of
>>> what output you expect, it's impossible to figure out how to help you.
>>> Here are some suggestions for creating a good reproducible example:
>>>
>>> http://stackoverflow.com/questions/5963269/how-to-make-a-great-r-reproducible-example
>>>
>>> Without knowing what you want, it looks like abscissa is a vector, and
>>> so I'm not sure how this defines a grid, but
>>> length(unique(diff(vec)))
>>> might help. Note that this DOES NOT account for machine precision in any
>>> way.
>>>
>>> Sarah
>>>
>>> On Mon, Apr 6, 2015 at 7:50 AM, Marc Lamblin <marcgg.lamblin at gmail.com>
>>> wrote:
>>> > I need to control of a given grid is uniform. This control using signif
>>> > until now works:
>>> >
>>> > if (all(signif(abscissa[1:(length(abscissa) - 1) + 1] -
>>> > abscissa[1:(length(abscissa) - 1)]) == signif(rep((range(abscissa)[2] -
>>> >          range(abscissa)[1])/(length(abscissa) - 1), length(abscissa) -
>>> > 1)))) {
>>> > # other stuff
>>> > }
>>> >
>>> > Does someone have some suggestions to improve this control? Thanks in
>>> > advance!! :)
>>> >
>>> > Marc
>>> >
>>> >         [[alternative HTML version deleted]]
>>> >
>>>
>>>
>>> --
>>> Sarah Goslee
>>> http://www.functionaldiversity.org
>>>
>>
>>         [[alternative HTML version deleted]]
>>
>> ______________________________________________
>> R-help at r-project.org mailing list -- To UNSUBSCRIBE and more, see
>> https://stat.ethz.ch/mailman/listinfo/r-help
>> PLEASE do read the posting guide http://www.R-project.org/posting-guide.html
>> and provide commented, minimal, self-contained, reproducible code.



More information about the R-help mailing list