你的教科书很混乱。 很少有人或软件以这种方式定义四分位数。(它往往会使第一个四分位数太小,而第三个四分位数太大。)
中的quantile
函数R
实现了九种不同的计算分位数的方法!要查看其中哪些(如果有)对应于该方法,让我们从实现它开始。根据描述,我们可以编写一个算法,首先是数学,然后是R
:
订购数据x1≤x2≤⋯≤xn.
对于任何一组数据,当有奇数个值时,中位数是它的中间值;否则,当有偶数个值时,它是两个中间值的平均值。 R
的median
函数计算这个。
中间值的索引是m=(n+1)/2. 当它不是整数时,(xl+xu)/2是中位数,其中l和u是m向下和向上舍入。否则当m是一个整数,xm是中位数。在这种情况下采取l=m−1和u=m+1. 在任一情况下l是紧靠中位数左侧的数据值的索引,并且u是紧靠中位数右侧的数据值的索引。
“第一个四分位数”是所有的中位数xi为此i≤l. “第三四分位数”是(xi)为此i≥u.
这是一个实现。它可以帮助你在这本教科书中做练习。
quart <- function(x) {
x <- sort(x)
n <- length(x)
m <- (n+1)/2
if (floor(m) != m) {
l <- m-1/2; u <- m+1/2
} else {
l <- m-1; u <- m+1
}
c(Q1=median(x[1:l]), Q3=median(x[u:n]))
}
例如,输出quart(c(6,7,8,9,10,15,16,16,20,20,23,33,50,58,104))
与文本一致:
Q1 Q3
9 33
让我们使用所有十种方法计算一些小数据集的四分位数:九R
和教科书的:
y <- matrix(NA, 2, 10)
rownames(y) <- c("Q1", "Q3")
colnames(y) <- c(1:9, "Quart")
for (n in 3:5) {
j <- 1
for (i in 1:9) {
y[, i] <- quantile(1:n, probs=c(1/4, 3/4), type=i)
}
y[, 10] <- quart(1:n)
cat("\n", n, ":\n")
print(y, digits=2)
}
当您运行它并检查时,您会发现教科书值与所有三种样本大小的任何输出都不一致。R
(分歧模式在第三周期的循环中继续存在,表明无论样本有多大,问题仍然存在。)
教科书可能误解了 John Tukey 计算“铰链”(又名“四分之二”)的方法。不同之处在于,当围绕中位数分割数据集时,他将中位数包含在两半中。 那会产生9.5和28对于示例数据集。