You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

R中IQR()、stats::quantile()与ggpubr的四分位距计算为何存在差异?

为什么median_iqr和median_q1q3返回的区间不同?

核心原因是两个函数的区间计算逻辑完全不一样:

  • median_q1q3的区间是第一四分位数(Q1)到第三四分位数(Q3),直接对应stats::quantile(x, probs = c(0.25, 0.75))的两个结果,这是统计学中四分位数区间的标准定义。
  • median_iqr的区间是中位数 ± 四分位距(IQR),而IQR本身是Q3与Q1的差值(即Q3 - Q1),因此这个区间是中位数 - IQR到中位数 + IQR,和Q1到Q3的范围完全不同。

验证你的代码逻辑

从你提供的复现代码可以清晰看到差异:
以dose=0.5组为例:

  • Q1=7.22,Q3=12.2,因此median_q1q3的区间是7.22到12.2;
  • IQR=12.2-7.22=5.03,中位数=9.85,因此median_iqr的区间是9.85-5.03=4.82到9.85+5.03=14.9,和前者区间明显不同。

另外,stats::IQR()和stats::quantile()的逻辑是一致的:IQR(x, type=7)确实等于quantile(x, 0.75, type=7) - quantile(x, 0.25, type=7),你的代码也验证了这一点,文档说明是准确的,问题出在对median_iqr计算逻辑的误解。


复现代码

sapply(c("reprex", "dplyr", "ggpubr"), require, character=TRUE)

tg <- ToothGrowth

# first two same
tg |>
  group_by(dose) |>
  summarise(med = median(len),
            iqr = median_q1q3(len))
#> # A tibble: 3 × 3
#>    dose   med iqr$y $ymin $ymax
#>   <dbl> <dbl> <dbl> <dbl> <dbl>
#> 1   0.5  9.85  9.85  7.22  12.2
#> 2   1   19.2  19.2  16.2   23.4
#> 3   2   26.0  26.0  23.5   27.8

tg |>
  group_by(dose) |>
  summarise(med = median(len),
            iqr = median_hilow_(len, ci=0.5))
#> # A tibble: 3 × 3
#>    dose   med iqr$y $ymin $ymax
#>   <dbl> <dbl> <dbl> <dbl> <dbl>
#> 1   0.5  9.85  9.85  7.22  12.2
#> 2   1   19.2  19.2  16.2   23.4
#> 3   2   26.0  26.0  23.5   27.8

# this is how the above are calculated:
tg |>
  group_by(dose) |>
  summarise(med = median(len),
            iqr = median_q1q3(len),
            lo = stats::quantile(len, probs = c(.25)),
            hi = stats::quantile(len, probs = c(.75)))
#> # A tibble: 3 × 5
#>    dose   med iqr$y $ymin $ymax    lo    hi
#>   <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>
#> 1   0.5  9.85  9.85  7.22  12.2  7.22  12.2
#> 2   1   19.2  19.2  16.2   23.4 16.2   23.4
#> 3   2   26.0  26.0  23.5   27.8 23.5   27.8

# 3rd one is using this derivation of +/- 1 ci
# this is how 3rd is calculated:
tg |>
  group_by(dose) |>
  summarise(med = median(len),
            iqr = median_iqr(len),
            ci = IQR(len, type = 7)) |>
  mutate(lo = med - ci,
         hi = med + ci)
#> # A tibble: 3 × 6
#>    dose   med iqr$y $ymin $ymax    ci    lo    hi
#>   <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>
#> 1   0.5  9.85  9.85  4.82  14.9  5.03  4.82  14.9
#> 2   1   19.2  19.2  12.1   26.4  7.12 12.1   26.4
#> 3   2   26.0  26.0  21.6   30.2  4.3  21.6   30.2

Created on 2024-04-29 by the reprex package (v2.0.1)


内容的提问来源于stack exchange,提问作者highlandsmain

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.24 23:25:36