从小数到分数

很多时候,在社会调研中会出现一些小数(或百分数),而这些数字背后隐藏的信息也常常被统计人关注。比如 COS 主站上的这篇文章--《从调查报告中的比例数字说统计人如何甄别统计假象》,yihui 生动地为我们展示了一种考量问题的思路。

正如文章中所说的,如果我们对数字足够敏感的话,很容易判断出 0.6667 的分数是 2/3 ,0.625 的分数是 5/8,0.14286 的分数是 1/7。但我们的经验毕竟有限,不可能穷尽所有的数字,通过一个算法来确定分数是十分有必要的。

法里序列(farey sequence)也是考虑这类问题的一个角度。如果给定法里序列的 n 足够大,那么我们必定能够将逼近出一个和小数相等的分数Fi[j]。

法里序列 Fi (i=1 到 n):

F1 = {01, 11}
F2 = {01, 12, 11}
F3 = {01, 13, 12, 23, 11}
F4 = {01, 14, 13, 12, 23, 34, 11}
F5 = {01, 15, 14, 13, 25, 12, 35, 23, 34, 45, 11}
F6 = {01, 16, 15, 14, 13, 25, 12, 35, 23, 34, 45, 56, 11}
F7 = {01, 17, 16, 15, 14, 27, 13, 25, 37, 12, 47, 35, 23, 57, 34, 45, 56, 67, 11}
F8 = {01, 18, 17, 16, 15, 14, 27, 13, 38, 25, 37, 12, 47, 35, 58, 23, 57, 34, 45, 56, 67, 78, 11}

但这个过程会比较麻烦,F1000 已经达到300927 个数字。幸好 R 中的 MASS 包提供了 fractions 函数。这个函数使用有理近似的方式,将小数转化为分数(连分数)形式。比如《从调查报告中的比例数字说统计人如何甄别统计假象》中提到的 29.1667% 这个数值:

> fractions(0.291667)
[1] 7/24

不过,既然是近似算法,这个函数对小数的精确度要求还是蛮高的,而且最好不要用无理数去逗人家。

> fractions(pi)
[1] 4272943/1360120