根据我对与
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)
这似乎是包作者的预期行为。
如果您仔细阅读了
?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]
中位数减去/加上四分位数范围适用于
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