【问题标题】:Differences in quantile function分位数函数的差异
【发布时间】: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())
}

但是,当我在同一组数据上调用 quantilemy.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)] &lt;- range(x[!out], na.rm = TRUE) 修改了stats 的第一个和最后一个值,这是您看到差异的值。这就是正在发生的事情。箱线图统计代码正确与否(或它试图做什么)不是很清楚。
  • @Gregor - 谢谢,我认为你是对的。你知道吗: if (any(out[nna], na.rm = TRUE)) 实际上在做什么?似乎我的 sample_vocab 触发了这个,但 sample_lang 不是?我无法理解语法..

标签: r


【解决方案1】:

相关的代码就在这里:

  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)
  }

基本上,如果coef != 0(在你的情况下coef是1.5,默认函数参数),那么报告的分位数的第一个和最后一个元素将替换为coef * iqr内的最小和最大数据值25% 和 75% 分位数,其中iqr 是这些分位数之间的距离。

【讨论】:

  • 感谢您的帮助。但是为什么报告的 sample_lang 的 85% 不是 124?如果我理解正确,iqr 是 22,所以 108+1.5*22 = 130...
  • 我复习了,进一步从哪里得到了帮助:stackoverflow.com/questions/29070763/… - 实际上大部分代码与原始 boxplot.stats 函数没有变化,所以也许有一个规则,当第一个和第 5 个值更改为您准确提到的值..
  • 条件:if (any(out[nna], na.rm = TRUE)),似乎正在改变这些值。我不确定这个条件到底是什么意思,但似乎 sample_lang 不满足条件,但 sample_vocab 满足。
  • 对不起,我不明白。我上面提供的示例数据是我提到的一个示例。 sample_lang 分位数没有改变,但 sample_vocab 是。注意到我对您的回答的第一条评论,如果您说的是真的,我不明白为什么 sample_lang 的分位数没有改变。
猜你喜欢
  • 1970-01-01
  • 2019-04-28
  • 1970-01-01
  • 2013-05-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-08-18
  • 2017-08-09
相关资源
最近更新 更多