R 和 `ggpubr` 中 IQR() 和 stats::quantile() 之间四分位数范围计算的差异

问题描述 投票:0回答:1

根据我对与

ggpubr::add_summary()
stats::IQR()
stats::quantile()
相关的文档的阅读,我预计使用
median_iqr
median_q1q3
会返回相同的间隔。
IQR()
的文档说它正在使用
quantile()
...但是,并没有返回我期望的值。有人可以解释一下吗?

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

reprex 包于 2024 年 4 月 29 日创建(v2.0.1)

r ggpubr
1个回答
0
投票

这似乎是包作者的预期行为。

如果您仔细阅读了

?median_iqr()
的文档,其中指出:

median_iqr():返回由四分位数范围定义的中位数和误差限。

该公式应为中位数减去/加上四分位数范围。

在这个现在已关闭的 github 问题中,包作者拒绝更改

median_iqr()
的工作方式,而是提倡使用
median_q1q3()
median_hilow_(x, 0.5)

正如您已经想到的:

一级方程式

中位数以及第 25 个和第 75 个百分位适用于

median_q1q3()
median_hilow_(x, 0.5)

library(dplyr)
library(ggpubr)
library(tidyr)
library(purrr)

dfs_formula_1 <- list(
  df_1 = ToothGrowth |>
    group_by(dose) |>
    summarise(
      y = median(len),
      ymin = quantile(len, probs = 0.25),
      ymax = quantile(len, probs = 0.75)
    ) |>
    transmute(
      dose,
      formula_1 = sprintf("%05.2f [%05.2f, %05.2f]", y, ymin, ymax)
    ),
  
  df_2 = ToothGrowth |>
    group_by(dose) |>
    summarise(x = median_q1q3(len)) |>
    unnest(cols = c(x)) |> 
    transmute(
      dose, 
      median_q1q3 = sprintf("%05.2f [%05.2f, %05.2f]", y, ymin, ymax)
    ),
  
  df_3 = ToothGrowth |>
    group_by(dose) |>
    summarise(x = median_hilow_(len, 0.5)) |>
    unnest(cols = c(x)) |>
    transmute(
      dose,
      median_hilow_ = sprintf("%05.2f [%05.2f, %05.2f]", y, ymin, ymax)
    )
)

reduce(dfs_formula_1, left_join, by = 'dose')
#> # A tibble: 3 × 4
#>    dose formula_1            median_q1q3          median_hilow_       
#>   <dbl> <chr>                <chr>                <chr>               
#> 1   0.5 09.85 [07.22, 12.25] 09.85 [07.22, 12.25] 09.85 [07.22, 12.25]
#> 2   1   19.25 [16.25, 23.38] 19.25 [16.25, 23.38] 19.25 [16.25, 23.38]
#> 3   2   25.95 [23.53, 27.83] 25.95 [23.53, 27.83] 25.95 [23.53, 27.83]

公式2

中位数减去/加上四分位数范围适用于

median_iqr()

dfs_formula_2 <- list(
  df_4 = ToothGrowth |>
    group_by(dose) |>
    summarise(
      y = median(len),
      ymin = y - IQR(len),
      ymax = y + IQR(len)
    )|>
    transmute(
      dose,
      formula_2 = sprintf("%05.2f [%05.2f, %05.2f]", y, ymin, ymax)
    ),
    
  df_5 = ToothGrowth |>
    group_by(dose) |>
    summarise(x = median_iqr(len)) |>
    unnest(cols = c(x)) |>
    transmute(
      dose,
      median_iqr = sprintf("%05.2f [%05.2f, %05.2f]", y, ymin, ymax)
    )
)

reduce(dfs_formula_2, left_join, by = 'dose')
#> # A tibble: 3 × 3
#>    dose formula_2            median_iqr          
#>   <dbl> <chr>                <chr>               
#> 1   0.5 09.85 [04.82, 14.88] 09.85 [04.82, 14.88]
#> 2   1   19.25 [12.12, 26.38] 19.25 [12.12, 26.38]
#> 3   2   25.95 [21.65, 30.25] 25.95 [21.65, 30.25]

创建于 2024-04-29,使用 reprex v2.1.0

© www.soinside.com 2019 - 2024. All rights reserved.