... 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.
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 tolerance for real numbers. In my particular case, in order to set a tolerance, I need the scale used and I don't have this information. I prefer to test the "near 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> > 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. >[[alternative HTML version deleted]]
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 tolerance > for real numbers. In my particular case, in order to set a tolerance, I need > the scale used and I don't have this information. I prefer to test the "near > 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> >> > 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. > >