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
相关产品推荐
相关产品推荐

