Альтернативна графіка для графіків "обробляти смугу"


15

У моєму дослідженні популярним способом відображення даних є використання комбінації діаграми з "ручками". Наприклад,

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

"Ручки" чергуються між стандартними помилками та стандартними відхиленнями залежно від автора. Зазвичай розміри вибірки для кожного «бруска» досить невеликі - близько шести.

Ці сюжети здаються особливо популярними в біологічних науках - див. Перші приклади BMC Biology, том 3 для прикладів.

То як би ви представили ці дані?

Чому мені не подобаються ці сюжети

Особисто мені не подобаються ці сюжети.

  1. Якщо розмір вибірки невеликий, чому б не просто відобразити окремі точки даних.
  2. Це відображається sd чи se? Ніхто не погоджується, яким користуватися.
  3. Навіщо взагалі використовувати бруски. Дані (як правило) не походять від 0, але перший пропуск на графіку говорить про це.
  4. Графіки не дають уявлення про діапазон чи розмір вибірки даних.

R сценарій

Це код R, який я використовував для створення сюжету. Таким чином ви можете (якщо хочете) використовувати ті самі дані.

                                        #Generate the data
set.seed(1)
names = c("A1", "A2", "A3", "B1", "B2", "B3", "C1", "C2", "C3")
prevs = c(38, 37, 31, 31, 29, 26, 40, 32, 39)

n=6; se = numeric(length(prevs))
for(i in 1:length(prevs))
  se[i] = sd(rnorm(n, prevs, 15))/n

                                        #Basic plot
par(fin=c(6,6), pin=c(6,6), mai=c(0.8,1.0,0.0,0.125), cex.axis=0.8)
barplot(prevs,space=c(0,0,0,3,0,0, 3,0,0), names.arg=NULL, horiz=FALSE,
        axes=FALSE, ylab="Percent", col=c(2,3,4), width=5, ylim=range(0,50))

                                        #Add in the CIs
xx = c(2.5, 7.5, 12.5, 32.5, 37.5, 42.5,  62.5, 67.5, 72.5)
for (i in 1:length(prevs)) {
  lines(rep(xx[i], 2), c(prevs[i], prevs[i]+se[i]))
  lines(c(xx[i]+1/2, xx[i]-1/2), rep(prevs[i]+se[i], 2))
}

                                        #Add the axis
axis(2, tick=TRUE, xaxp=c(0, 50, 5))
axis(1, at=xx+0.1, labels=names, font=1,
     tck=0, tcl=0, las=1, padj=0, col=0, cex=0.1)

6
Допомогти вашій галузі досягти консенсусу лише з питання про se v. Sd було б величезним прогресом. Вони означають абсолютно різні речі.
Іван

Я згоден - се зазвичай вибирається, оскільки він дає менший регіон!
csgillespie

Може, якась більш інформативна назва?

3
Тільки для довідки, я раніше бачив ці діаграми зі смужками помилок під назвою "Динамітні сюжети" раніше. Ось декілька посилань, які дають такі самі рекомендації, як і всі інші (крапки). Тацукі Кояма, остерігайся динамітових плакатів та Drummond & Vowler, 2011 .
Енді Ш

1
Будь ласка, додайте зображення ще раз, якщо зможете. Цього разу скористайтеся програмою для завантаження зображень, щоб вона не стала мертвою ланкою.
ендоліт

Відповіді:


16

Дякую за всі відповіді. Для повноти я подумав, що я повинен включати те, що зазвичай роблю. Я схильний робити комбінацію поданих пропозицій: крапки, діапазони (коли n великий) та se (або sd) діапазони.

( Видалено модератором, оскільки сайт, на якому розміщено зображення, більше не працює належним чином. )

З крапкового сюжету видно, що дані набагато більше розповсюджені на графіках "панелі обробки". Насправді в А3 є негативне значення!


Я відповів на цю відповідь CW, тому я не отримую респ


3
Це гарна відповідь. Крім того, я б запропонував горизонтально тремтіти очки, тому вони не перетинаються, особливо якщо у вас більше балів за групу, ніж ця. У ggplot2 це зробить geom_jitter ().
Харлан

@Harlan: Я згоден. Хоча якби у мене було набагато більше очок, я, мабуть, використав би боксер.
csgillespie

1
Мені також подобаються розсіювачі для невеликих наборів даних (nb, я використовую термін "dotplot" для позначення трохи іншого сюжету). Однак, для чого це варто, барплот вище є чистішим та легшим для читання, ніж цей. Я не впевнений, що це робить краще, але на це варто звернути увагу.
gung - Відновіть Моніку

@Harlan: Крім того, зробіть точки прозорими, щоб кілька крапок склалися вгору і створили більш темну точку?
ендоліт

у вас є оригінальне зображення для заміни цього мертвого посилання?
ендоліт

10

Френк Харрелл (найвидатніший) основний коментар під назвою "Інформаційна алергія" при використанніR! Минулий місяць показав альтернативи цим: замість того, щоб приховувати необроблені дані за допомогою агрегації, яку надають смуги, необроблені дані також відображаються у вигляді крапок (або крапок). "Навіщо приховувати дані?" був коментар Франка.

З огляду на змішування альпи, це вражає як найрозумніша пропозиція (і вся розмова найбільш повна хороших і важливих самородків).


1
Він доступний у вигляді відео? Звучить чудово.
Генрік

1
Я думаю, що слово "буде врешті-решт" - основні записи були записані.
Дірк Еддельбюттель

1
це легко в ggplot я думаю, тобто had.co.nz/ggplot2/geom_jitter.html
Майк Дьюар

1
jitter є також на рівній Р.

2
Тільки для протоколу тепер розмова Франка (у відео): r-bloggers.com/RUG/2010/08/user-2010-conference-videos
Тал Галілі

7

З психологічної точки зору я виступаю за складання даних плюс вашу непевність щодо цих даних. Таким чином, у сюжеті, як ви показуєте, я ніколи не заважав би простягати смуги до нуля, що служить лише для мінімізації здатності очей розрізняти відмінності в діапазоні даних.

Крім того, я відверто антибарграф; гістограми відображають дві змінні в одному естетичному атрибуті (розташування осі x), що може спричинити плутанину. Кращим підходом є уникнення зайвого естетичного відображення шляхом зіставлення однієї змінної на вісь x, а іншої змінної до іншого естетичного атрибута (наприклад, форми точки чи кольору або обох).

Нарешті, у своєму графіку вище ви включаєте лише смуги помилок вище значення, що перешкоджає можливості порівняння інтервалів невизначеності відносно барів вище та нижче значення.

Ось як я буду будувати дані (через пакет ggplot2). Зверніть увагу, що я додаю лінії, що з'єднують точки з тієї ж серії; дехто стверджує, що це доцільно лише тоді, коли рядки, через які з'єднуються лінії, є числовими (як здається, у цьому випадку), однак, поки існує якась розумна порядкова залежність між рівнями змінної осі x, я думаю з’єднувальні лінії корисні для допомоги точкам асоціації очей по осі x. Це може стати особливо корисним для виявлення взаємодій, які дійсно виділяються лініями.

library(ggplot2)
a = data.frame(names,prevs,se)
a$let = substr(a$names,1,1)
a$num = substr(a$names,2,2)
ggplot(data = a)+
layer(
    geom = 'point'
    , mapping = aes(
        x = num
        , y = prevs
        , colour = let
        , shape = let
    )
)+
layer(
    geom = 'line'
    , mapping = aes(
        x = num
        , y = prevs
        , colour = let
        , linetype = let
        , group = let
    )    
)+
layer(
    geom = 'errorbar'
    , mapping = aes(
        x = num
        , ymin = prevs-se
        , ymax = prevs+se
        , colour = let
    )
    , alpha = .5
    , width = .5
)

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


1
Варто додати, що моя рекомендація "тільки на основі даних та невизначеності" повинна бути кваліфікована: при представленні даних аудиторії, яка має досвід / досвід із змінною, що будується, описуйте лише дані та невизначеність. Представляючи дані наївній аудиторії та коли нуль є значущою точкою даних, спершу я б показав дані, що розширюються до нуля, щоб аудиторія може орієнтуватися на масштаб, а потім збільшити масштаб, щоб показати лише дані та невизначеність.
Майк Лоуренс

оскільки ви зіткнулися з проблемою написання коду R, чи можете ви включити зображення кінцевого сюжету jpeg. Я вважаю, що просто завантажувати зображення на img84.imageshack.us і посилатися на нього досить просто. О, дякую за відповідь :)
csgillespie

@csgillespie: зроблено.
Майк Лоуренс

Я виявив, що легше читати подібний сюжет із geom_ribbon()зазначенням помилки. Якщо вам не подобається створювати очевидні оцінки для регіонів від 1 до 2, принаймні зменшіть ширину рядка помилок.
JoFrhwld

@JoFrwld: Мені також подобаються стрічки, хоча я схильний резервувати їх для випадків, коли змінна осі x є справді числовою; моя версія "не малювати лінії, якщо змінна осі x не є числовою", яке я визнаю порушенням у своїй відповіді вище: Op
Майк Лоуренс

2

Мені цікаво, чому вам не подобаються ці сюжети. Я їх постійно використовую. Не бажаючи констатувати очевидне цвітіння, вони дозволяють порівнювати засоби різних груп і перевіряти, чи перекриваються їх 95% ІС (тобто справжня середня величина, ймовірно, буде різною).

Важливо, щоб отримати баланс простоти та інформації для різних цілей, я думаю. Але коли я використовую ці сюжети, я кажу: "ці дві групи якісь важливі способи відрізняються одна від одної" [чи ні].

Мені це здається дуже чудовим, але мені було б цікаво почути зустрічні приклади. Я припускаю, що при використанні сюжету неявним є те, що в даних немає розбірливого розподілу, що робить це значення недійсним або оманливим.


Я додав невеликий розділ про те, чому мені не подобаються ці сюжети.
csgillespie

1
@Chris ознайомтеся з інтерпретацією перекриваючих CIs pubs.amstat.org/doi/abs/10.1198/000313001317097960 Оригінальне питання також полягає в плутанині використання SE або SD взаємозамінно, тоді як вони є двома різними речами
tosonb1

Або про аналіз цього веб-сайту див. Stats.stackexchange.com/questions/18215 . @ tosonb1 Ваше посилання закінчується. Не могли б ви надати посилання на папір?
whuber

2

Якщо дані є показниками : це кількість успіхів, поділених на кількість випробувань, то дуже елегантним методом є сюжет воронки. Наприклад, див. Http://qshc.bmj.com/content/11/4/390.2.full (вибачте, якщо посилання вимагає підписки - повідомте мене, і я знайду інше).

Можливо, можливо адаптувати їх до інших типів даних, але я не бачив жодного прикладу.

ОНОВЛЕННЯ:

Ось посилання на приклад, який не вимагає підписки (і має чітке пояснення, яким чином вони можуть бути використані): http://understandingucurityty.org/fertility

Їх можна використовувати для даних, що не мають швидкості, просто побудувавши середнє значення щодо стандартної помилки, однак вони можуть втратити частину своєї простоти.

Стаття у вікіпедії не є великою, оскільки вона лише обговорює їх використання в метааналізах. Я б стверджував, що вони можуть бути корисними у багатьох інших контекстах.


Дані не потрібні. Це може бути що завгодно.
csgillespie

На жаль, посилання на підписку.
Метт Паркер

... але ось посилання Вікіпедії на сюжетні послідовності: en.wikipedia.org/wiki/Funnel_plot
Метт Паркер

2

Я б тут використовував коробки; чистий, змістовний, непараметричний ... Або фіалка, якщо дистрибуція цікавіша .


2
Я не впевнений, що боксерські або фіолетові підійдуть з таким невеликим розміром зразка (n = 6)
csgillespie

Правильно, зізнаюся, я недостатньо уважно прочитав питання, тому це було досить загальною ідеєю; все-таки я думаю, що 6 балів мінімально, але достатньо для боксплоту. Я зробив кілька експериментів, і вони були змістовними. З іншого боку, очевидно, що boxplot не вказує кількість спостережень (що тут є важливим бітом інформації), тому я б скоріше використовував поєднання цього та пунктів.

З 6 очками - мабуть, найкраще розкидання сюжету (можливо, із середнім додаванням червоної точки)
Тал Галілі

2
Я зазвичай використовую коробки з накладними точками, я вважаю це дуже "візуальним". Натомість сюжетні скрипки, на мою думку, трохи важко зрозуміти.
nico

1
@csgillespie: Що вказуватиме на те, що кращі сюжетні смуги та вуса? Вони показують в основному ту саму інформацію, що і боксер (як ви вказуєте, вуса можуть представляти різні речі), вони просто дають помилку лише в одному напрямку, що може бути досить заплутаним, якщо не безтурботним ... Не сперечаючись за боксерські машини . Але квасоля / скрипка повинні все-таки працювати, навіть для відносно низьких розмірів зразків, оскільки це лише оцінка гауссової щільності, як я пояснив тут .
naught101

1

Спрощення приголомшливого коду @ csgillespie:

qplot(
    data=a,
    x=num,
    y=prevs,
    colour=let,
    shape=let,
    group=let,
    ymin=prevs-se,
    ymax=prevs+se,
    position=position_dodge(width=0.25),
    geom=c("point", "line", "errorbar")
    )

0

Я вважаю за краще geom_pointrange перед панеллю помилок і думаю, що лінії відволікають, а не корисні. Ось версія, яку я вважаю набагато чистішою, ніж версія @James або @csgillespie:

qplot(
 data=a,
 x=num,
 y=prevs,
 colour=let,
 ymin=prevs-se,
 ymax=prevs+se,
 position=position_dodge(width=0.25),
 geom=c("pointrange"), size=I(2)
 )
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.