Does not min(abs(diff(z))) give you the scaling you need to set a
tolerance?
-- 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 2:55 PM, Marc Lamblin <marcgg.lamblin at gmail.com>
wrote:
The first solution with diff works for uniform abscissa only with integer
values.
z <- seq(0, 10, length=100)
all(diff(z) == z[2] - z[1] )
## FALSE
In this case, as you recommended, I could use signif or round or a
for real numbers. In my particular case, in order to set a tolerance, I
the scale used and I don't have this information. I prefer to test the
uniformity".
I didn't know the function zapsmall. It could be useful!
Thanks Sarah and Bert!!!
Marc
2015-04-06 19:51 GMT+02:00 Bert Gunter <gunter.berton at gene.com>:
... 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>
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) -
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) -
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
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
now
this control is working correctly. I have seen in the documentation
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
increase the number of digits with respect to default because, in
case, you are not using an handy scale.
Maybe it could be better directly to ask user if the abscissa passed
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
fine), the code you used (NOT in HTML format), and some clear idea
what output you expect, it's impossible to figure out how to help
Here are some suggestions for creating a good reproducible example:
Without knowing what you want, it looks like abscissa is a vector,
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]]
[[alternative HTML version deleted]]