Odpowiednik Boxplot dla dystrybucji o grubych ogonach?

13

W przypadku normalnie dystrybuowanych danych wykresy pudełkowe są świetnym sposobem na szybką wizualizację mediany i rozprzestrzeniania się danych, a także obecności jakichkolwiek wartości odstających.

Jednak w przypadku bardziej ciężkich rozkładów wiele punktów jest pokazanych jako wartości odstające, ponieważ wartości odstające są zdefiniowane jako znajdujące się poza stałym współczynnikiem IQR, i zdarza się to oczywiście znacznie częściej w przypadku rozkładów ciężkich.

Czego ludzie używają do wizualizacji tego rodzaju danych? Czy jest coś bardziej dostosowanego? Używam ggplot na R, jeśli to ma znaczenie.

static_rtti
źródło
1
Próbki z dystrybucji o grubych ogonach mają zwykle duży zakres w porównaniu do średnich 50%. Co chcesz z tym zrobić?
Glen_b
7
Kilka istotnych wątków już np. Stats.stackexchange.com/questions/13086/... Krótka odpowiedź obejmuje najpierw transformację! histogramy; różnego rodzaju wykresy kwantowe; paski wykresów różnego rodzaju.
Nick Cox,
@Glen_b: to właśnie mój problem, sprawia, że ​​wykresy pudełkowe są nieczytelne.
static_rtti
2
Rzecz w tym, tam jest więcej niż jedna rzecz, która może to zrobić ... więc co ty chcesz to zrobić?
Glen_b
2
Być może warto zauważyć, że większość świata statystycznego zna wykresy pudełkowe z ich nazewnictwa i (ponownego) wprowadzenia przez Johna Tukeya w latach siedemdziesiątych. (Były one używane kilkadziesiąt lat wcześniej w klimatologii i geografii.) Ale w późniejszych rozdziałach jego książki z 1977 r. Na temat analizy danych eksploracyjnych (Reading, MA: Addison-Wesley) ma zupełnie inne pomysły na radzenie sobie z rozkładami o grubych ogonach. Wygląda na to, że w ogóle nikt się nie przyłapał. Ale wykresy kwantowe są w podobnym duchu.
Nick Cox,

Odpowiedzi:

8

Głównym problemem PO wydaje się, że jest to, że mają one bardzo ciężkie dane ogoniastych - i nie sądzę, większość obecnych odpowiedzi właściwie radzić sobie z tego problemu w ogóle , więc jestem promowanie mój poprzedni komentarz do odpowiedzi.

Jeśli chcesz pozostać przy boxplots, niektóre opcje są wymienione poniżej. Utworzyłem niektóre dane w R, które pokazują podstawowy problem:

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

niezadowalająca fabuła

Środkowa połowa danych jest zmniejszona do małego paska o szerokości kilku mm. Ten sam problem dotyczy większości innych sugestii - w tym wykresów QQ, wykresów paskowych, wykresów ulowych / rozgrzanych pszczół i wykresów skrzypcowych.

Teraz kilka potencjalnych rozwiązań:

1) transformacja ,

Jeśli logi lub odwrotności tworzą czytelny wykres pudełkowy, mogą być bardzo dobrym pomysłem, a oryginalna skala nadal może być pokazana na osi.

Dużym problemem jest to, że czasami nie ma „intuicyjnej” transformacji. Istnieje mniejszy problem, który wprawdzie same kwantyle tłumaczą się transformacjami monotonicznymi wystarczająco dobrze, ale płoty nie; jeśli po prostu wykreślisz przekształcone dane (tak jak ja tutaj), wąsy będą miały inne wartości x niż na oryginalnym wykresie.

wykres pudełkowy transformowanych wartości

Tutaj użyłem grzechu odwrotnego-hiperbolicznego (asinh); w ogonach jest trochę logarytmiczny i podobny do liniowego bliskiego zera, ale ludzie na ogół nie uważają za intuicyjną transformację, więc ogólnie nie poleciłbym tej opcji, chyba że dość intuicyjna transformacja taka jak log jest oczywista. Kod do tego:

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) podziałki skali - weź skrajne wartości odstające i ściśnij je w wąskie okna na każdym końcu o znacznie bardziej skompresowanej skali niż w środku. Jeśli to zrobisz, zdecydowanie polecam całkowite przełamanie całej skali.

wykres pudełkowy z podziałkami skali

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) przycinanie skrajnych wartości odstających (których normalnie nie radziłbym bez wyraźnego zaznaczenia tego, ale wygląda to na następny wykres, bez „<5” i „2>” na obu końcach), oraz

4) co nazywam „strzałkami” skrajnie odstających - podobnie jak przycinanie, ale z liczbą przyciętych wartości wskazanych na każdym końcu

wykres pudełkowy z liczbą ekstremalnych wartości i strzałkami do nich wskazującymi

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 - Przywróć Monikę
źródło
Dziękujemy za poświęcenie czasu na napisanie tego! To jest dokładnie taka odpowiedź, jakiej się spodziewałem. Teraz muszę tylko dowiedzieć się, jak zaimplementować te wykresy za pomocą R :)
static_rtti
1
Trochę kodu już tam jest. Nie podałem kodu dla 3), ponieważ jest to prostsza wersja 4); powinieneś być w stanie to uzyskać, wycinając z tego linie.
Glen_b
Nawiasem mówiąc, większość z tych pomysłów działa również z innymi sugerowanymi tutaj wspaniałymi pokazami - roztrzęsione paski i wykresy pszczół / uli i wykresy skrzypcowe i tym podobne.
Glen_b
Dzięki jeszcze raz. Jestem pewien, że ta odpowiedź przyda się wielu osobom.
static_rtti
Zgadzam się, to odnosi się do pytania znacznie lepiej niż moja odpowiedź. Dobry towar.
TooTone
4

Osobiście lubię używać stripplotu z fluktuacją przynajmniej w celu wyczucia danych. Poniższy wykres przedstawia sieć w R (przepraszam, że nie ggplot2). Lubię te wątki, ponieważ są bardzo łatwe do interpretacji. Jak mówisz, jednym z powodów tego jest brak transformacji.

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)

wprowadź opis zdjęcia tutaj

Beeswarm pakiet oferuje doskonałą alternatywą dla stripplot (dzięki @January za sugestię).

beeswarm(df2$values ~ df2$ind)

wprowadź opis zdjęcia tutaj

Z twoimi danymi, ponieważ są one w przybliżeniu normalnie rozpowszechniane, kolejną rzeczą do wypróbowania może być qqplot, w tym przypadku qqnorm .

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

wprowadź opis zdjęcia tutaj

TooTone
źródło
2
Lubię też stripplots, ale pytanie wyraźnie dotyczy tego, co zrobić z dystrybucjami o dużych rozmiarach.
Nick Cox,
1
Chodzi o to, że wskazówka dotycząca użycia np. Qqnorm nie pasuje do pytania. Zgadzam się, że inne rodzaje wykresów kwantylowo-kwantylowych mogą być bardzo dobrym pomysłem, jak wspomniałem wcześniej.
Nick Cox,
1
Jeszcze lepsze niż wykresy rozbierania z R są wykresy z beeswarmpaczki.
stycznia 13
1
@ Stycznia Tak, to całkiem fajne, dodaję to do mojej odpowiedzi (jeśli sprzeciwiasz się, powiedz tak).
TooTone
1
Moja odpowiedź została opublikowana na stronie stats.stackexchange.com/questions/13086 , którą uważam za (niekonsekwentnie węższą) wersję tego pytania. Podsumowałem to jako „nie zmieniaj algorytmu boxplot: zamiast tego ponownie wyraż dane”. Problem wskazany przez „dostosowanego” w tym pytaniu jest rozwiązany za pomocą standardowych technik analizy danych eksploracyjnych w celu znalezienia pomocnych ponownych wyrażeń zmiennych.
whuber
2

Możesz trzymać się wykresów pudełkowych. Istnieją różne możliwości definiowania wąsów. W zależności od grubości ogona, liczby próbek i tolerancji na wartości odstające możesz wybrać dwa bardziej lub mniej skrajne kwantyle. Biorąc pod uwagę twój problem, unikałbym wąsów określonych w IQR.
Chyba że oczywiście chcesz przekształcić swoje dane, co w tym przypadku utrudnia zrozumienie.

Kwarc
źródło
1
Ostatnie zdanie jest zbyt niekwalifikowane, aby przejść bez komentarza. Transformacja nie jest panaceum, ale brak transformacji mocno wypaczonych danych nie ułatwia zrozumienia. Jeśli wszystkie dane są pozytywne, możesz przynajmniej spróbować użyć skali root, logarytmicznej lub odwrotnej. Jeśli to naprawdę nie pomaga, to wycofaj się.
Nick Cox,
Do jakich trudności w zrozumieniu wypaczonych danych masz na myśli? Ci z wąsami zależnymi od IQR? To problem nawet w przypadku lekkich ogonów. I czy nie mówimy o ciężkich ogonach, niezależnie od skosu? Transformacje rozjaśniające ogony z pewnością dają więcej regularnych wykresów pudełkowych, ale dodają warstwę interpretacyjną, wymieniając zrozumienie dla wygody. Ale można to nazwać funkcją, jeśli mu się podoba.
Kwarc
2
Transformacje często pomagają: to moja podstawowa zasada. Osoba statystyczna, która nie nauczyła się, że wiele rzeczy wygląda na wyraźniej w skali logarytmicznej (szczególnie), poważnie traci na jednej z najstarszych i najskuteczniejszych sztuczek. Wydawało się, że temu zaprzeczasz; Mam nadzieję, że źle cię odczytałem.
Nick Cox,
1
Nie zgadzam się. Cały czas przekształcam mocno wypaczone dane, a moje doświadczenie jest takie, że to coś więcej niż tylko kwestia estetyki. To często działa. Anonimowy statystyk napisał jakiś czas temu, że lognormal jest bardziej normalny niż normalny. Był trochę żartobliwy, ale jest też ważna prawda. (Nie tak wiele innych dystrybucji może nie pasować lepiej.)
Nick Cox,
1
Chyba muszę się tu zatrzymać, aby inni mogli osądzić, ale mój pogląd nie jest ekscentryczny. Transformacja jest omawiana jako jedna z możliwości na np. Stats.stackexchange.com/questions/13086/ ... Sugeruję, abyś odpowiedział tam lub skomentował, aby wyjaśnić, dlaczego taka rada jest niesłuszna.
Nick Cox,
0

Zakładam, że to pytanie dotyczy zrozumienia danych (w przeciwieństwie do „zarządzania” nimi).
Jeśli dane są grubościenne i / lub multimodalne, uważam, że te „warstwy” ggplot2 są bardzo przydatne w tym celu: geom_violini geom_jitter.

6.
źródło
3
Czy mógłbyś podsumować, dlaczego wykresy skrzypiec i / lub roztrzęsione punkty byłyby przydatne w przypadku dystrybucji o dużych rozmiarach?
chl