Боксплотный эквивалент для дистрибутивов с тяжелыми хвостами?

13

Для приблизительно нормально распределенных данных коробочные диаграммы - отличный способ быстро визуализировать медиану и распространение данных, а также присутствие любых выбросов.

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

Итак, что люди используют для визуализации такого рода данных? Есть что-то более адаптированное? Я использую ggplot на R, если это имеет значение.

static_rtti
источник
1
Образцы из распределений с тяжелыми хвостами, как правило, имеют огромный диапазон по сравнению со средними 50%. Что вы хотите с этим сделать?
Glen_b
7
Уже несколько релевантных тем, например stats.stackexchange.com/questions/13086/… Короткий ответ включает сначала преобразование! гистограмм; квантильные участки разных видов; стрип-участки разных видов.
Ник Кокс
@Glen_b: это именно моя проблема, она делает нечитаемыми коробочные сюжеты.
static_rtti
2
Дело в том, что можно сделать больше, чем одну вещь ... так что вы хотите от этого?
Glen_b
2
Возможно, стоит отметить, что большая часть статистического мира знает коробочные сюжеты по именам и (повторному) представлению Джона Тьюки в 1970-х годах. (Они использовались на несколько десятилетий раньше в климатологии и географии.) Но в более поздних главах его книги 1977 года об Исследовательском анализе данных (Рединг, Массачусетс: Аддисон-Уэсли) у него есть совершенно другие идеи относительно обработки распределений с тяжелыми хвостами. Кажется, что никто не завоевал популярность вообще. Но квантильные сюжеты в том же духе.
Ник Кокс

Ответы:

8

Центральная проблема ОП , как представляется, является то , что они имеют очень тяжелые-хвостатые данные - и я не думаю , что большинство настоящих ответов фактически имеем дело с этим вопросом на всех , поэтому я продвижения мой предыдущий комментарий к ответу.

Если вы хотите остаться с коробками, некоторые варианты перечислены ниже. Я создал некоторые данные в R, которые показывают основную проблему:

 set.seed(seed=7513870)
 x <- rcauchy(80)
 boxplot(x,horizontal=TRUE,boxwex=.7)

неудовлетворительный участок

Средняя половина данных уменьшается до крошечной полосы шириной в пару мм. Та же самая проблема затрагивает большинство других предложений - в том числе графики QQ, полосы, графики улья / пчелиного тепла и участки скрипки.

Теперь несколько потенциальных решений:

1) трансформация ,

Если бревна или перевернутые диаграммы дают удобочитаемую коробочную диаграмму, они могут быть очень хорошей идеей, и исходный масштаб все еще может быть показан на оси.

Большая проблема в том, что иногда нет «интуитивного» преобразования. Есть меньшая проблема, которая заключается в том, что, хотя сами квантили достаточно хорошо транслируют монотонные преобразования, заборы этого не делают; если вы просто нанесите на карту преобразованные данные (как я сделал здесь), усы будут иметь другие значения х, чем в исходном графике.

блокпост преобразованных значений

Здесь я использовал обратный гиперболический грех (asinh); это похоже на бревно в хвостах и ​​похоже на линейное приближение к нулю, но люди обычно не находят это интуитивно понятным преобразованием, поэтому в общем случае я бы не рекомендовал эту опцию, если не очевидно достаточно интуитивное преобразование, такое как log Код для этого:

xlab <- c(-60,-20,-10,-5,-2,-1,0,1,2,5,10,20,40)
boxplot(asinh(x),horizontal=TRUE,boxwex=.7,axes=FALSE,frame.plot=TRUE)
axis(1,at=asinh(xlab),labels=xlab)

2) разрывы шкалы - возьмите крайние выбросы и сожмите их в узкие окна на каждом конце с гораздо более сжатой шкалой, чем в центре. Я настоятельно рекомендую сделать полный перерыв по всей шкале, если вы сделаете это.

бокс с участками шкалы

opar <- par()
layout(matrix(1:3,nr=1,nc=3),heights=c(1,1,1),widths=c(1,6,1))
par(oma = c(5,4,0,0) + 0.1,mar = c(0,0,1,1) + 0.1)
stripchart(x[x< -4],pch=1,cex=1,xlim=c(-80,-5))
boxplot(x[abs(x)<4],horizontal=TRUE,ylim=c(-4,4),at=0,boxwex=.7,cex=1)
stripchart(x[x> 4],pch=1,cex=1,xlim=c(5,80))
par(opar)

3) обрезание экстремальных выбросов (что я бы обычно не советовал, не указав это очень четко, но похоже на следующий график, без "<5" и "2>" на обоих концах), и

4) то, что я буду называть экстремально-выпадающими "стрелками" - аналогично усечению, но с отсеченным значением, указанным на каждом конце

блокпост с количеством и стрелками, указывающими на экстремальные значения

xout <- boxplot(x,range=3,horizontal=TRUE)$out
xin <- x[!(x %in% xout)]
noutl <- sum(xout<median(x))
nouth <- sum(xout>median(x))
boxplot(xin,horizontal=TRUE,ylim=c(min(xin)*1.15,max(xin)*1.15))
text(x=max(xin)*1.17,y=1,labels=paste0(as.character(nouth)," >"))
text(x=min(xin)*1.17,y=1,labels=paste0("< ",as.character(noutl)))
Glen_b - Восстановить Монику
источник
Спасибо, что нашли время, чтобы написать это! Это именно тот ответ, который я ожидал. Теперь мне нужно только выяснить, как реализовать эти графики с помощью R :)
static_rtti
1
Некоторый код там сейчас. Я не дал код для 3), потому что это более простая версия 4); Вы должны быть в состоянии получить это, вырезав из этого строки.
Glen_b
Между прочим, большинство из этих идей работают и с другими великолепными демонстрациями, предложенными здесь - разбросанными полосковыми диаграммами и участками с пчелиным улеем и ульями и участками со скрипкой и тому подобным.
Glen_b
Еще раз спасибо. Я уверен, что этот ответ будет полезен довольно многим людям.
static_rtti
Я согласен, это решает вопрос гораздо лучше, чем мой ответ. Хорошая вещь.
TooTone
4

Лично мне нравится использовать стрипплот с джиттером, чтобы хотя бы почувствовать данные. График ниже с решеткой в ​​R (извините, не ggplot2). Мне нравятся эти графики, потому что их очень легко интерпретировать. Как вы говорите, одна из причин этого заключается в том, что нет никаких преобразований.

df <- data.frame(y1 = c(rnorm(100),-4:4), y2 = c(rnorm(100),-5:3), y3 = c(rnorm(100),-3:5))
df2 <- stack(df)
library(lattice)
stripplot(df2$values ~ df2$ind, jitter=T)

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

Пакет beeswarm предлагает отличную альтернативу стрипплоту (спасибо @January за предложение).

beeswarm(df2$values ~ df2$ind)

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

С вашими данными, поскольку они примерно нормально распределены, еще одна вещь, которую можно попробовать - это qqplot, в данном случае qqnorm .

par(mfrow=c(1,3))
for(i in 1:3) { qqnorm(df[,i]); abline(c(0,0),1,col="red") }

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

TooTone
источник
2
Мне тоже нравятся стрипплоты, но вопрос явно в том, что делать с дистрибутивами с тяжелыми хвостами.
Ник Кокс
1
Дело в том, что совет использовать qqnorm не соответствует вопросу. Я согласен, что другие виды квантильно-квантильных графиков могут быть очень хорошей идеей, как я упоминал ранее.
Ник Кокс
1
Еще лучше, чем стрипплоты из R, являются сюжеты из beeswarmпакета.
января
1
@ Январь Да, это круто, я добавляю это к своему ответу (если вы возражаете, пожалуйста, так и скажите).
TooTone
1
Мой ответ был размещен по адресу stats.stackexchange.com/questions/13086 , который я рассматриваю как (несущественно более узкую) версию этого вопроса. Я резюмировал это как «не меняйте алгоритм коробочного графика: вместо этого переэкспрессируйте данные». Проблема, на которую намекают «адаптированные» в этом вопросе, решается с помощью стандартных методов исследовательского анализа данных для поиска полезных повторных выражений переменных.
whuber
2

Вы можете придерживаться коробок. Существуют разные возможности определения усов. В зависимости от толщины хвоста, количества образцов и допуска к выбросам вы можете выбрать два более или менее экстремальных квантиля. Учитывая вашу проблему, я бы избегал усов, определенных в IQR.
Если, конечно, вы не хотите преобразовать свои данные, что в этом случае затрудняет понимание.

кварцевый
источник
1
Последнее предложение слишком неквалифицированно, чтобы пропустить его без комментариев. Преобразование не является панацеей, но отсутствие трансформации сильно искаженных данных не облегчает понимание. Если все данные положительные, вы можете, по крайней мере, попытаться использовать корень, логарифмическую или обратную шкалу. Если это действительно не поможет, тогда отойди.
Ник Кокс
На какие трудности в понимании искаженных данных вы ссылаетесь? Те, с IQR-зависимыми усами? Это проблема даже со светлыми хвостами. И не говорим ли мы о тяжелых хвостах, независимо от асимметрии? Преобразования, освещающие хвосты, несомненно, дают более регулярные сюжеты, но добавляют слой интерпретации, торгуя пониманием для комфорта. Но это можно назвать функцией, если ему нравится.
Кварц
2
Преобразования часто помогают: это мой итог. Статистик, который не узнал, что многие вещи выглядят яснее в логарифмическом масштабе (особенно), серьезно упускает один из самых старых и эффективных приемов. Вы, казалось, отрицали это; Я надеюсь, что я неправильно вас понял.
Ник Кокс
1
Я не согласен. Я постоянно преобразую сильно искаженные данные, и мой опыт показывает, что это гораздо больше, чем вопрос эстетики. Это часто работает. Некоторое время назад анонимный статистик написал, что логнормальное нормальное явление более нормальное. Он / она был немного шутливым, но там тоже есть важная правда. (Не то чтобы многие другие дистрибутивы могли бы не подходить лучше.)
Ник Кокс
1
Я думаю, мне нужно остановиться здесь, чтобы позволить другим судить, но мой взгляд не эксцентричен. Трансформация обсуждается как одна из возможностей, например, на stats.stackexchange.com/questions/13086/… Я предлагаю вам ответить или прокомментировать там, чтобы объяснить, почему этот совет не обоснован.
Ник Кокс
0

Я предполагаю, что этот вопрос о понимании данных (в отличие от «управления» ими в противном случае).
Если данные являются «тяжелыми хвостами» и / или мультимодальными, я считаю эти «слои» ggplot2 очень полезными для цели: geom_violinи geom_jitter.

шестые
источник
3
Не могли бы вы вкратце рассказать, почему графики для скрипки и / или дрожащие точки были бы полезны в дистрибутивах с тяжелыми хвостами?
chl