Различные квантили: коробчатая диаграмма против скрипичной диаграммы

require(ggplot2)
require(cowplot)
d = iris

ggplot2::ggplot(d, aes(factor(0), Sepal.Length)) + 
    geom_violin(fill="black", alpha=0.2, draw_quantiles = c(0.25, 0.5, 0.75)
                , colour = "red", size = 1.5) +
    stat_boxplot(geom ='errorbar', width = 0.1)+
    geom_boxplot(width = 0.2)+
    facet_grid(. ~ Species, scales = "free_x") +
    xlab("") + 
    ylab (expression(paste("Value"))) +
    coord_cartesian(ylim = c(3.5,9.5)) + 
    scale_y_continuous(breaks = seq(4, 9, 1)) + 
    theme(axis.text.x=element_blank(),
          axis.text.y = element_text(size = rel(1.5)),
          axis.ticks.x = element_blank(),
          strip.background=element_rect(fill="black"),
          strip.text=element_text(color="white", face="bold"),
          legend.position = "none") +
    background_grid(major = "xy", minor = "none") 

Коробчатый сюжет против скрипичного

Насколько мне известно, прямоугольные диаграммы, оканчивающиеся на прямоугольные диаграммы, представляют собой квантиль 25% и 75% соответственно, а медиана = 50%. Таким образом, они должны быть равны квантилям 0,25 / 0,5 / 0,75, которые нарисованы geom_violin в аргументе draw_quantiles = c(0.25, 0.5, 0.75).

Среднее и 50% квантильное соответствие. Однако квантиль 0,25 и 0,75 не соответствуют рамкам коробчатой ​​диаграммы (см. Рисунок, особенно грань «virginica»).

Использованная литература:

  1. http://docs.ggplot2.org/current/geom_violin.html

  2. http://docs.ggplot2.org/current/geom_boxplot.html


person pat-s    schedule 16.03.2016    source источник


Ответы (2)


Это слишком долго для комментария, поэтому я публикую его как ответ. Я вижу два потенциальных источника расхождения. Во-первых, я понимаю, что boxplot относится к boxplot.stats, который использует hinges, которые очень похожи, но не обязательно идентичны квантилям. ?boxplot.stats говорит:

Две «петли» представляют собой варианты первого и третьего квартилей, то есть близкие к квантилю (x, c (1,3) / 4). Петли равны квартилям для нечетных n (где n ‹- длина (x)) и различаются для четных n. В то время как квартили равны наблюдениям только для n %% 4 == 1 (n = 1 mod 4), петли делают это дополнительно для n %% 4 == 2 (n = 2 mod 4) и находятся в середине двух наблюдения в противном случае.

Таким образом, hinge vs quantile различие могло быть одним из источников различия.

Во-вторых, geom_violin относится к оценке плотности. Исходный код здесь указывает на функцию StatYdensity, которая приводит меня к здесь. Мне не удалось найти функцию compute_density, но я думаю (также из-за некоторых указателей в файлах справки), по сути, это density, который по умолчанию использует оценку ядра Гаусса для оценки плотности. Это может (или не может) объяснить различия, но

by(d$Sepal.Length, d$Species, function(x) boxplot.stats(x, coef=5)$stats )
by(d$Sepal.Length, d$Species, function(v) quantile(density(v)$x))

действительно показывают разные значения. Итак, я предполагаю, что разница связана с тем, смотрим ли мы на квантили на основе эмпирической функции распределения наблюдений или на основе оценок плотности ядра, хотя я признаю, что я не доказал это окончательно.

person coffeinjunky    schedule 16.03.2016
comment
Ваш ответ имеет смысл, спасибо! Проблема, которую я вижу во всех этих модификациях значений квантилей (либо «петель», либо оценок плотности), заключается в том, что все они относятся к «квантилям» в их последнем смысле. geom_boxplot doc относится к верхнему шарниру, 75% квантилю, а geom_violin doc вызывает его напрямую draw_quantiles. Это позволяет пользователю предполагать, что имеет дело с одной и той же статистикой, тогда как на самом деле обе они различаются. - person pat-s; 16.03.2016

Второй фактор, вызванный @coffeinjunky, кажется основной причиной. Вот еще несколько доказательств, подтверждающих это.

Переключившись на geom_ydensity, можно эмпирически подтвердить, что разница связана с geom_violin использованием оценка плотности ядра для вычисления квантилей, а не фактических наблюдений. Например, если мы установим широкую полосу пропускания (bw=1), то оценочные плотности будут чрезмерно сглаженными и будут еще больше отклоняться от квантилей на основе наблюдений, используемых в коробчатых диаграммах:

require(ggplot2)
require(cowplot)

theme_set(cowplot::theme_cowplot())

d = iris

ggplot2::ggplot(d, aes(factor(0), Sepal.Length)) + 
  stat_ydensity(bw=1, fill="black", alpha=0.2, draw_quantiles = c(0.25, 0.5, 0.75)
              , colour = "red", size = 1.5) +
  stat_boxplot(geom ='errorbar', width = 0.1)+
  geom_boxplot(width = 0.2)+
  facet_grid(. ~ Species, scales = "free_x") +
  xlab("") + 
  ylab (expression(paste("Value"))) +
  coord_cartesian(ylim = c(3.5,9.5)) + 
  scale_y_continuous(breaks = seq(4, 9, 1)) + 
  theme(axis.text.x=element_blank(),
        axis.text.y = element_text(size = rel(1.5)),
        axis.ticks.x = element_blank(),
        strip.background=element_rect(fill="black"),
        strip.text=element_text(color="white", face="bold"),
        legend.position = "none") +
  background_grid(major = "xy", minor = "none") 

введите описание изображения здесь

Так что да, будьте осторожны с этим - параметры оценки плотности могут повлиять на результаты!

person merv    schedule 27.04.2020