作者celestialgod (攸蓝)
看板R_Language
标题Re: [问题] 四分位数Q1和Q3的计算
时间Mon Apr 6 10:41:07 2015
※ 引述《yeuan (心要够坚定)》之铭言:
: [问题类型]:
: 一组数列 用R计算跟手算的不同
: [软体熟悉度]:
: 新手(刚开始摸索)
: [问题叙述]:
: 一组数列:-10,-6,-2,2,6,10 计算Q1与Q3
: Q1=0.25*6=1.5 →1.5不是整数 故找比1.5大的下一个整数为2
: 所以Q1应该为-6 以此类推Q3应该为6
: 但是R算出来Q1=-5 Q3=5
: 请问我有哪边弄错了吗@@ 不太明白为什麽会不一样
: [程式范例]:
: y=c(-10,-6,-2,2,6,10)
: quantile(y,probs=c(0.25,0.75))
According to R manual (部分节录)
quantile(x, probs = seq(0, 1, 0.25), na.rm = FALSE,
names = TRUE, type = 7, ...)
where type is an integer between 1 and 9 selecting one of the nine quantile
algorithms detailed below to be used.
For types 1, 2 and 3, quantile of type i at quantile p is a discontinuous
function of p. For types 4 through 9, it is a continuous function of p.
For R >= 2.0.0, the default type is 7.
接着实作type 7给你看
type 7: 利用内插找sample quantile,因此你要先决定每一个x是对应在哪
根据manual提供的公式,第k个x对应的p为 p[k] = (k - 1) / (n - 1)
f = function(k, n) (k-1) / (n-1)
f(1:6, 6)
# [1] 0.0 0.2 0.4 0.6 0.8 1.0
因此,当有6个sample时,分别对应到,0, 0.2,... , 1.0
你所求的0.25就是用x的第二个跟第三个资料做内插
假设所求是xx,0.25的quantile,资料同你的,是-10, -6, -2, 2, 6, 10
-2 - (-6) xx - (-6)
--------- = ----------- => 20 = (xx + 6)*20 => xx = -5
0.4 - 0.2 0.25 - 0.2
用程式算:
interpolate_f = function(x, q){
y = rep(NA, length(q))
p = (seq_along(x) - 1) / (length(x)-1)
for (i in seq_along(q)){
loc = sum(q[i] >= p)
y[i] = (x[loc+1] - x[loc]) / (p[loc+1] - p[loc]) *
(q[i] - p[loc]) + x[loc]
}
return(y)
}
interpolate_f(y, c(.25, .75)) # -5, 5
# 同quantile的答案
补充一点:你要的quatile应该是type 1
--
※ 发信站: 批踢踢实业坊(ptt.cc), 来自: 111.83.13.1
※ 文章网址: https://webptt.com/cn.aspx?n=bbs/R_Language/M.1428288069.A.E9C.html
※ 编辑: celestialgod (111.83.13.1), 04/06/2015 10:49:48
1F:推 yeuan: 谢谢! 04/06 22:12
2F:→ andrew43: 推追根究底。 04/06 23:46