R语言分位数计算存疑:与约克大学文章算法不符?
为什么R的quantile计算和你提到的分位数算法结果不一致?
这是个非常普遍的困惑——不同统计工具对分位数的计算其实并没有一个统一的“标准”算法,R的quantile()函数默认采用的恰好不是你看到的i = q(n+1)这种逻辑。
先拆解你的例子
你用的数据集是:
nv <- c(10,20,30,40)
默认调用quantile(nv)得到的75%分位数是32.5,而按i = q(n+1)(q=0.75,n=4)计算,i=0.75*(4+1)=3.75,对应插值结果应该是30 + 0.75*(40-30) = 37.5,两者确实有差异。
原因:R默认用了不同的分位数算法
R的quantile()函数内置了9种分位数计算类型(可以通过?quantile查看详细文档),默认使用的是type=7,它的计算逻辑是:
- 对分位数q,计算
h = (n - 1)*q + 1 - 取第
floor(h)个元素,加上(h - floor(h))乘以相邻两个元素的差值
放到你的例子里:
- h = (4-1)*0.75 + 1 = 3.25
- floor(h)=3,对应元素是30
- 插值部分:0.25*(40-30)=2.5
- 最终结果:30+2.5=32.5,和R输出一致
而你看到的i = q(n+1)算法,对应R里的type=6,它的逻辑就是直接用i = q*(n+1)来确定位置,再做线性插值。
如何在R里得到你想要的结果?
只需要调用quantile()时指定type=6参数即可:
nv <- c(10,20,30,40) # 用type=6匹配你提到的算法 quantile(nv, type=6)
运行后你会得到:
0% 25% 50% 75% 100% 10.0 12.5 25.0 37.5 40.0
其中75%分位数就是37.5,和你根据文章公式计算的结果一致。
小总结
分位数的计算有多种主流实现,不同工具(甚至同一工具的不同参数)都会有差异,核心是要明确自己需要的是哪种算法,再对应调整参数就好。
内容的提问来源于stack exchange,提问作者MMEL
相关产品推荐
相关产品推荐

