Alternatywna grafika do wykresów „obsługi paska”

15

W moim obszarze badań popularnym sposobem wyświetlania danych jest użycie kombinacji wykresu słupkowego z „uchwytami”. Na przykład,

wprowadź opis zdjęcia tutaj

„Kierownice” zmieniają się pomiędzy standardowymi błędami i standardowymi odchyleniami w zależności od autora. Zazwyczaj rozmiary próbek dla każdego „słupka” są dość małe - około sześciu.

Te wykresy wydają się być szczególnie popularne w naukach biologicznych - przykłady można znaleźć w kilku pierwszych artykułach BMC Biology, tom 3 .

Jak więc przedstawiłbyś te dane?

Dlaczego nie lubię tych fabuł

Osobiście nie lubię tych fabuł.

  1. Jeśli wielkość próbki jest niewielka, dlaczego nie wyświetlić pojedynczych punktów danych.
  2. Czy wyświetla się SD lub SE? Nikt nie zgadza się, którego użyć.
  3. Po co w ogóle używać pasków. Dane nie (zwykle) nie zaczynają się od 0, ale sugeruje to pierwszy przebieg na wykresie.
  4. Wykresy nie dają wyobrażenia o zakresie lub wielkości próbki danych.

Skrypt R.

To jest kod R, którego użyłem do wygenerowania wykresu. W ten sposób możesz (jeśli chcesz) korzystać z tych samych danych.

                                        #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)
csgillespie
źródło
6
Pomaganie Twojej branży w osiągnięciu konsensusu w kwestii tylko pytania se v. Sd byłoby ogromnym postępem. Oznaczają zupełnie inne rzeczy.
John
Zgadzam się - zazwyczaj jest wybierany, ponieważ daje mniejszy region!
csgillespie
Może jakiś bardziej pouczający tytuł?
3
Dla porównania, widziałem wcześniej te wykresy słupkowe ze słupkami błędów zwanymi „wykresami dynamitu”. Oto kilka referencji podających dokładnie takie same rekomendacje, jak wszyscy inni (wykresy punktowe). Tatsuki Koyama, Beware of Dynamite Poster and Drummond & Vowler, 2011 .
Andy W
1
Dodaj obraz ponownie, jeśli możesz. Tym razem użyj programu do przesyłania zdjęć, aby nie stał się martwym linkiem.
endolith,

Odpowiedzi:

16

Dziękuję za wszystkie odpowiedzi. Dla kompletności pomyślałem, że powinienem uwzględnić to, co zwykle robię. Zazwyczaj robię kombinację podanych sugestii: kropki, wykresy pudełkowe (gdy n jest duże) i zakresy se (lub sd).

( Usunięty przez moderatora, ponieważ witryna, na której znajduje się obraz, nie działa już poprawnie ).

Z wykresu punktowego jasno wynika, że ​​dane są znacznie bardziej rozłożone, jak sugerują wykresy „paska uchwytów”. W rzeczywistości w A3 występuje wartość ujemna!


Uczyniłem tę odpowiedź CW, więc nie zyskuję rep

csgillespie
źródło
3
To dobra odpowiedź. Ponadto sugeruję drżenie w poziomie punktów, aby się nie nakładały, szczególnie jeśli masz więcej punktów na grupę niż to. W ggplot2 zrobi to geom_jitter ().
Harlan,
@Harlan: Zgadzam się. Chociaż gdybym miał więcej punktów, prawdopodobnie użyłbym wykresu pudełkowego.
csgillespie
1
Lubię również wykresy rozrzutu dla małych zestawów danych (nb, używam terminu „kropka” w odniesieniu do nieco innego wykresu). Jednak ze względu na swoją wartość powyższy wykres słupkowy jest czystszy i łatwiejszy do odczytania niż ten. Nie jestem pewien, czy to poprawia sytuację, ale warto to podkreślić.
gung - Przywróć Monikę
@Harlan: Alternatywnie, czy kropki są przezroczyste, aby wiele kropek układało się w stos i tworzyła ciemniejszą kropkę?
endolith
czy masz oryginalny obraz, aby zastąpić ten martwy link?
endolith
10

Keynote Franka Harrella (najdoskonalsza) zatytułowane „Alergia informacyjna” w useR! ostatni miesiąc pokazał alternatywy dla nich: zamiast ukrywać surowe dane poprzez agregację, którą zapewniają paski, surowe dane są również wyświetlane jako kropki (lub punkty). „Po co ukrywać dane?” był komentarz Franka.

Biorąc pod uwagę mieszanie alpy, jest to najbardziej sensowna sugestia (i cała rozmowa najbardziej pełna dobrych i ważnych samorodków).

Dirk Eddelbuettel
źródło
1
Czy jest dostępny jako film? To brzmi świetnie.
Henrik,
1
Myślę, że słowo brzmi „w końcu będzie” - nagrano keynotes.
Dirk Eddelbuettel
1
myślę, że jest to łatwe w ggplot, tj. had.co.nz/ggplot2/geom_jitter.html
Mike Dewar
1
jitterjest również zwykły R.
2
Tylko dla protokołu rozmowa Franka (na wideo) jest teraz online: r-bloggers.com/RUG/2010/08/user-2010-conference-videos
Tal Galili
7

Z psychologicznego punktu widzenia zalecam wykreślanie danych plus twoją niepewność co do danych. Dlatego na wykresie takim, jak pokazujesz, nigdy nie zawracałbym sobie głowy przedłużeniem słupków do zera, co służy jedynie zminimalizowaniu zdolności oka do rozróżniania różnic w zakresie danych.

Poza tym jestem szczerze przeciwny bargrafowi; wykresy słupkowe odwzorowują dwie zmienne na ten sam atrybut estetyczny (położenie na osi x), co może powodować zamieszanie. Lepszym podejściem jest uniknięcie zbędnego mapowania estetycznego poprzez mapowanie jednej zmiennej na oś x, a innej zmiennej na inny atrybut estetyczny (np. Kształt lub kolor punktu lub oba).

Wreszcie na powyższym wykresie uwzględniane są tylko słupki błędów powyżej wartości, co utrudnia zdolność do porównywania przedziałów niepewności względem słupków powyżej i poniżej wartości.

Oto, jak wykreślam dane (za pośrednictwem pakietu ggplot2). Zauważ, że dodaję linie łączące punkty w tej samej serii; niektórzy twierdzą, że jest to właściwe tylko wtedy, gdy szeregi, przez które linie są połączone, są numeryczne (jak wydaje się w tym przypadku), jednak dopóki istnieje jakakolwiek uzasadniona zależność porządkowa między poziomami zmiennej osi x, myślę linie łączące są przydatne do wspomagania oka w kojarzeniu punktów na osi x. Może to stać się szczególnie przydatne do wykrywania interakcji, które naprawdę wyróżniają się liniami.

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
)

wprowadź opis zdjęcia tutaj

Mike Lawrence
źródło
1
Powinienem dodać, że moje zalecenie „wykreśl tylko dane i niepewność” powinno zostać zakwalifikowane: przedstawiając dane publiczności, która ma doświadczenie / wiedzę w zakresie wykreślania zmiennej, wykreśl tylko dane i niepewność. Kiedy prezentuję dane naiwnym odbiorcom i kiedy zero jest znaczącym punktem danych, najpierw pokazuję dane rozciągające się do zera, aby odbiorcy mogli się zorientować na skalę, a następnie powiększać, aby pokazać tylko dane i niepewność.
Mike Lawrence
skoro masz problem z pisaniem kodu R, czy możesz dołączyć obraz JPEG końcowego wykresu. Uważam, że przesłanie obrazu do img84.imageshack.us i połączenie z nim jest dość łatwe. Och, dzięki za odpowiedź :)
csgillespie
@csgillespie: gotowe.
Mike Lawrence
Odkryłem, że łatwiej jest odczytać taki wykres ze geom_ribbon()wskazaniem błędu. Jeśli nie lubisz generować szacunkowych oszacowań dla regionów od 1 do 2, przynajmniej zmniejsz szerokość paska błędów.
JoFrhwld,
@JoFrwld: Lubię też wstążki, choć zwykle rezerwuję je na przypadki, w których zmienna osi x jest naprawdę numeryczna; moja wersja zasady „nie rysuj linii, chyba że zmienna osi x jest liczbowa”, co, jak twierdzę, narusza powyższą odpowiedź: Op
Mike Lawrence
2

Jestem ciekawy, dlaczego nie lubisz tych fabuł. Używam ich cały czas. Nie chcąc stwierdzić, że kwitnienie jest oczywiste, pozwalają ci porównać średnie różnych grup i sprawdzić, czy ich 95% CI pokrywają się (tj. Prawdziwa średnia prawdopodobnie będzie inna).

Wydaje mi się, że ważna jest równowaga prostoty i informacji do różnych celów. Ale kiedy używam tych fabuł, mówię: „te dwie grupy różnią się między sobą w jakiś ważny sposób” [lub nie].

Wydaje mi się to świetne, ale chciałbym usłyszeć kontrprzykłady. Podejrzewam, że domyślnie w użyciu fabuły dane nie mają dziwnego rozkładu, co czyni średnią nieważną lub wprowadzającą w błąd.

Chris Beeley
źródło
Dodałem krótką sekcję o tym, dlaczego nie lubię tych fabuł.
csgillespie
1
@Chris sprawdź to na temat interpretacji nakładających się elementów CI pubs.amstat.org/doi/abs/10.1198/000313001317097960 Również pierwotne pytanie dotyczy także zamieszania związanego z używaniem SE lub SD zamiennie, gdy są to dwie różne rzeczy
tosonb1
Lub, dla analizy na tej stronie, patrz stats.stackexchange.com/questions/18215 . @ tosonb1 Upłynął limit czasu Twojego łącza. Czy możesz podać odniesienie do artykułu?
whuber
2

Jeśli dane są stawkami : to jest liczba sukcesów podzielona przez liczbę prób, wówczas bardzo elegancką metodą jest wykres lejek. Na przykład zobacz http://qshc.bmj.com/content/11/4/390.2.full (przepraszam, jeśli link wymaga subskrypcji - daj mi znać, a ja znajdę inną).

Może być możliwe dostosowanie go do innych typów danych, ale nie widziałem żadnych przykładów.

AKTUALIZACJA:

Oto link do przykładu, który nie wymaga subskrypcji (i ma dobre wyjaśnienie, w jaki sposób można z nich korzystać): http://understandinguncertainty.org/fertility

Można ich użyć do danych innych niż stawki, po prostu wykreślając średnią ze standardowego błędu, jednak mogą stracić część swojej prostoty.

Artykuł w Wikipedii nie jest świetny, ponieważ omawia tylko ich zastosowanie w metaanalizach. Twierdziłbym, że mogą być przydatne w wielu innych kontekstach.

Simon Byrne
źródło
Dane nie są konieczne stawki. To może być cokolwiek.
csgillespie,
Link do subskrypcji niestety.
Matt Parker,
... ale tutaj jest link do Wikipedii na temat wykresów lejkowych
Matt Parker
2

Użyłbym tu wykresów pudełkowych; czysty, znaczący, nieparametryczny ... Lub vioplot, jeśli rozkład jest bardziej interesujący.


źródło
2
Nie jestem pewien, czy wykresy pudełkowe lub vioploty byłyby odpowiednie przy tak małej próbce (n = 6)
csgillespie
Zgadzam się, przyznaję, że nie przeczytałem pytania wystarczająco uważnie, więc był to raczej ogólny pomysł; niemniej jednak uważam, że 6 punktów jest minimalne, ale wystarcza na fabułę. Przeprowadziłem kilka eksperymentów, które miały sens. Z drugiej strony, oczywiście wykres pudełkowy nie wskazuje liczby obserwacji (co jest tutaj ważną informacją), więc wolałbym użyć kombinacji tego i punktów.
Z 6 punktami - wykres rozproszenia jest prawdopodobnie najlepszy (być może z dodaniem czerwonej kropki jako średniej)
Tal Galili
2
Zazwyczaj używam wykresów pudełkowych z nałożonymi punktami, uważam to za bardzo „wizualne”. Moim zdaniem wątki skrzypcowe są nieco trudne do zrozumienia.
nico
1
@csgillespie: Co wskazuje na to, że wykresy słupków i wąsów są lepsze? Pokazują w zasadzie te same informacje co fabuła (jak wskazujesz, wąsy mogą reprezentować różne rzeczy), po prostu dają błąd tylko w jednym kierunku, co może być dość mylące, jeśli nie nieszczere ... . Ale wykresy bean / wykresy skrzypcowe powinny nadal działać, nawet w przypadku stosunkowo małych rozmiarów próbek, ponieważ jest to po prostu oszacowanie gęstości gaussowskiej, jak wyjaśniłem tutaj .
naught101
1

Uproszczenie wspaniałego kodu @ csgillespie z góry:

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")
    )
James Waters
źródło
0

Wolę geom_pointrange niż pasek błędów i uważam, że linie są bardziej rozpraszające niż pomocne. Oto wersja, którą uważam za znacznie czystszą niż wersja @James lub @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)
 )
Kent Johnson
źródło