从小数到分数
很多时候,在社会调研中会出现一些小数(或百分数),而这些数字背后隐藏的信息也常常被统计人关注。比如 COS 主站上的这篇文章--《从调查报告中的比例数字说统计人如何甄别统计假象》,yihui 生动地为我们展示了一种考量问题的思路。
正如文章中所说的,如果我们对数字足够敏感的话,很容易判断出 0.6667 的分数是 2/3 ,0.625 的分数是 5/8,0.14286 的分数是 1/7。但我们的经验毕竟有限,不可能穷尽所有的数字,通过一个算法来确定分数是十分有必要的。
法里序列(farey sequence)也是考虑这类问题的一个角度。如果给定法里序列的 n 足够大,那么我们必定能够将逼近出一个和小数相等的分数Fi[j]。
法里序列 Fi (i=1 到 n):
- F1 = {0⁄1, 1⁄1}
- F2 = {0⁄1, 1⁄2, 1⁄1}
- F3 = {0⁄1, 1⁄3, 1⁄2, 2⁄3, 1⁄1}
- F4 = {0⁄1, 1⁄4, 1⁄3, 1⁄2, 2⁄3, 3⁄4, 1⁄1}
- F5 = {0⁄1, 1⁄5, 1⁄4, 1⁄3, 2⁄5, 1⁄2, 3⁄5, 2⁄3, 3⁄4, 4⁄5, 1⁄1}
- F6 = {0⁄1, 1⁄6, 1⁄5, 1⁄4, 1⁄3, 2⁄5, 1⁄2, 3⁄5, 2⁄3, 3⁄4, 4⁄5, 5⁄6, 1⁄1}
- F7 = {0⁄1, 1⁄7, 1⁄6, 1⁄5, 1⁄4, 2⁄7, 1⁄3, 2⁄5, 3⁄7, 1⁄2, 4⁄7, 3⁄5, 2⁄3, 5⁄7, 3⁄4, 4⁄5, 5⁄6, 6⁄7, 1⁄1}
- F8 = {0⁄1, 1⁄8, 1⁄7, 1⁄6, 1⁄5, 1⁄4, 2⁄7, 1⁄3, 3⁄8, 2⁄5, 3⁄7, 1⁄2, 4⁄7, 3⁄5, 5⁄8, 2⁄3, 5⁄7, 3⁄4, 4⁄5, 5⁄6, 6⁄7, 7⁄8, 1⁄1}
但这个过程会比较麻烦,F1000 已经达到300927 个数字。幸好 R 中的 MASS 包提供了 fractions 函数。这个函数使用有理近似的方式,将小数转化为分数(连分数)形式。比如《从调查报告中的比例数字说统计人如何甄别统计假象》中提到的 29.1667% 这个数值:
> fractions(0.291667)
[1] 7/24
不过,既然是近似算法,这个函数对小数的精确度要求还是蛮高的,而且最好不要用无理数去逗人家。
> fractions(pi)
[1] 4272943/1360120