【发布时间】:2015-07-08 06:00:20
【问题描述】:
我正在努力解决 R 中的一些奇怪行为,使用 quantile 函数。
我有两组数值数据和一个自定义的箱线图统计函数(有人帮我写的,所以我实际上对每个细节都不太确定):
sample_lang = c(91, 122, 65, 90, 90, 102,
98, 94, 84, 86, 108, 104,
94, 110, 100, 86, 92, 92,
124, 108, 82, 65, 102, 90, 114,
88, 68, 112, 96, 84, 92,
80, 104, 114, 112, 108, 68,
92, 68, 63, 112, 116)
sample_vocab = c(96, 136, 81, 92, 95,
112, 101, 95, 97, 94,
117, 95, 111, 115, 88,
92, 108, 81, 130, 106,
91, 95, 119, 103, 132, 103,
65, 114, 107, 108, 86,
100, 98, 111, 123, 123, 117,
82, 100, 97, 89, 132, 114)
my.boxplot.stats <- function (x, coef = 1.5, do.conf = TRUE, do.out = TRUE) {
if (coef < 0)
stop("'coef' must not be negative")
nna <- !is.na(x)
n <- sum(nna)
#stats <- stats::fivenum(x, na.rm = TRUE)
stats <- quantile(x, probs = c(0.15, 0.25, 0.5, 0.75, 0.85), na.rm = TRUE)
iqr <- diff(stats[c(2, 4)])
if (coef == 0)
do.out <- FALSE
else {
out <- if (!is.na(iqr)) {
x < (stats[2L] - coef * iqr) | x > (stats[4L] + coef *
iqr)
}
else !is.finite(x)
if (any(out[nna], na.rm = TRUE))
stats[c(1, 5)] <- range(x[!out], na.rm = TRUE)
}
conf <- if (do.conf)
stats[3L] + c(-1.58, 1.58) * iqr/sqrt(n)
list(stats = stats, n = n, conf = conf, out = if (do.out) x[out &
nna] else numeric())
}
但是,当我在同一组数据上调用 quantile 和 my.boxplot.stats 时,我得到 sample_vocab 数据的不同分位数结果(但它似乎与 sample_lang 数据一致),我是不知道为什么:
> quantile(sample_vocab, probs = c(0.15, 0.25, 0.5, 0.75, 0.85), na.rm=TRUE)
15% 25% 50% 75% 85%
89.6 94.5 101.0 114.0 118.4
>
> my.boxplot.stats(sample_vocab)
$stats
15% 25% 50% 75% 85%
81.0 94.5 101.0 114.0 136.0
有人可以帮助我了解发生了什么吗?请注意,我在编程方面有相当丰富的经验,但没有接受过 R 方面的正式培训,我正在自学。
提前非常感谢!
【问题讨论】:
-
好吧,quantile 会按照文档中的说明进行操作。您的函数调用分位数,但显然
if (any(out[nna], na.rm = TRUE))被触发,因此下一行stats[c(1, 5)] <- range(x[!out], na.rm = TRUE)修改了stats的第一个和最后一个值,这是您看到差异的值。这就是正在发生的事情。箱线图统计代码正确与否(或它试图做什么)不是很清楚。 -
@Gregor - 谢谢,我认为你是对的。你知道吗: if (any(out[nna], na.rm = TRUE)) 实际上在做什么?似乎我的 sample_vocab 触发了这个,但 sample_lang 不是?我无法理解语法..
标签: r