Объединение medcouple в boxplot ggplot

Boxplot ggplot отображает любую точку за пределами диапазона [Q1 - 1,5 * IQR, Q3 + 1,5 * IQR] как выброс. Как обсуждалось в блоге R, это не всегда хорошая идея, так как из-за асимметричного распределения могут сообщаться ложные выбросы. В этом случае часто предлагается adjbox из пакета R robustbase. Однако качество сюжета не такое хорошее, как у ggplot2.

Мой вопрос: кто-нибудь знает, как объединить экспоненциальную модель, используемую в adjbox, для использования ggplot при обнаружении выбросов?


person leco    schedule 16.05.2014    source источник


Ответы (1)


Вероятно, вам придется указать значения самостоятельно. Ссылка на пример, использованный в файле справки adjbox():

library(robustbase)
if(require("boot")) {
  ### Hubert and Vandervieren (2006), p. 10, Fig. 4.
  data(coal, package = "boot")
  coaldiff <- diff(coal$date)
  op <- par(mfrow = c(1,2))
  boxplot(coaldiff, main = "Original Boxplot")
  adjbox(coaldiff, main  = "Adjusted Boxplot")
  par(op)
}

В результате получаются следующие диаграммы:

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

Затем вы можете получить значения, которые использовала функция adjbox():

coald <- data.frame(coaldiff = diff(coal$date))  #$
adjboxStats(coald$coaldiff)$stats
# [1] 0.0000000 0.1013005 0.3107461 0.7529090 3.7180014

Это значения, используемые для построения скорректированной коробчатой ​​диаграммы. Вы можете использовать эту информацию для ggplot(), а затем рассчитать свои собственные диаграммы. Вероятно, есть лучшие способы сделать это, но первое, что я подумал сделать, это создать новый набор данных, включающий скорректированные значения блочной диаграммы:

library(ggplot2)
library(plyr)
d <- ddply(coald, .(coaldiff), transform,
  ymin = adjboxStats(coald$coaldiff)$stats[1],
  ymax = adjboxStats(coald$coaldiff)$stats[5],
  middle = adjboxStats(coald$coaldiff)$stats[3],
  lower = adjboxStats(coald$coaldiff)$stats[2],
  upper = adjboxStats(coald$coaldiff)$stats[4])

# Boxplot with unadjusted values:
p <- ggplot(d, aes(factor(1), coaldiff)) 
p + geom_boxplot()

# Boxplot with adjusted values (note that you have to add the outliers back in):
p + geom_boxplot(aes(ymin=ymin, ymax=ymax, middle=middle, upper=upper, lower=lower),
  stat="identity") + 
  geom_point(data=subset(d, coaldiff < ymin | coaldiff > ymax))

Это даст вам ggplot2 версий приведенных выше графиков:

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

Также обратите внимание, что Хэдли Уикхэм советует не делать этого «без долгих размышлений» в ответе на аналогичный вопрос.

person smillig    schedule 23.05.2014