Jak możesz wyobrazić sobie związek między 3 zmiennymi kategorycznymi?

21

Mam zestaw danych z trzema zmiennymi kategorialnymi i chcę wizualizować związek między wszystkimi trzema na jednym wykresie. Jakieś pomysły?

Obecnie używam następujących trzech wykresów: wprowadź opis zdjęcia tutaj

Każdy wykres dotyczy poziomu depresji wyjściowej (łagodny, umiarkowany, ciężki). Następnie na każdym wykresie patrzę na związek między leczeniem (0,1) a poprawą depresji (brak, umiarkowany, znaczny).

Te 3 wykresy działają, aby zobaczyć relację trójdrożną, ale czy istnieje znany sposób, aby to zrobić za pomocą jednego wykresu?

Alejandro Ochoa
źródło
4
Publikowanie danych pozwoliłoby ludziom grać.
Nick Cox
1
Masz 3 podstawowe kategorie, 2 kategorie leczenia i 3 wyniki depresji. Biorąc pod uwagę ostatni. proporcje każdego rodzaju depresji mogą być wyświetlane o 6 punktów na wykresie trójkątnym (trójliniowym, trójskładnikowym).
Nick Cox
4
Co jest nie tak z tymi wykresami?
Aksakal
Czy możesz podać dane zgodnie z żądaniami @NickCox? Rozumiem, że to tylko 18 liczb.
Gung - Przywróć Monikę

Odpowiedzi:

12

Jest to interesujący zestaw danych, który ma być reprezentowany graficznie, częściowo dlatego, że nie jest tak naprawdę kategoryczny. Oba trzypoziomowe czynniki są porządkowe i możliwe jest wzajemne oddziaływanie (przypuszczalnie trudniej jest mild baselineje mieć substantial improvement- a może substantial improvementoznacza coś innego dla każdego baseline).

W przypadku wielu zmiennych zwykle nie ma jednego widoku, który pokazuje wszystkie funkcje, które mogą Cię zainteresować. Niektóre czynniki będą łatwiejsze do porównania niż inne. Myślę, że twój oryginalny widok jest dobry i byłby lepszy z sugestiami Nicka Coxa: usunięcie duplikatów legend i użycie porządkowej skali kolorów.

Jeśli najbardziej interesuje Cię różnica między zabiegami, możesz podkreślić zmianę, używając wykresu stosu zamiast stosów.

wprowadź opis zdjęcia tutaj

Zazwyczaj jestem ostrożny w stosach, ponieważ trudniej jest odczytać wartości środkowe, ale to wymusza charakter tych danych o stałej kwocie. I ułatwia odczyt sumy moderate+, substantialjeśli jest to istotne. Zmieniłem kolejność improvementpoziomów, aby wyższy był lepszy dla częstotliwości.

Bez układania w stosy odpowiednikiem jest wykres nachylenia.

wprowadź opis zdjęcia tutaj

Łatwiej jest odczytać każdy poziom, ale trudniej zrozumieć wzajemne oddziaływanie. Trzeba pamiętać, że trzecia linia jest bezpośrednio zależna od pozostałych dwóch.

Biorąc pod uwagę porządkowy charakter danych, może być pomocne przekonwertowanie improvementwartości na wynik liczbowy, jak to często ma miejsce w przypadku danych Likerta . Na przykład none=0, moderate=1, substantial=2. Następnie możesz wykreślić tę zmienną w ciągłej skali. Minusem jest to, że musisz znaleźć rozsądną punktację (np. Może 0, 1 i 5 byłoby prawdziwszą reprezentacją).

wprowadź opis zdjęcia tutaj

Colophon : Te wykresy zostały wykonane przy użyciu funkcji Graph Builder w pakiecie oprogramowania JMP (który pomagam opracować). Chociaż skrypt został wykonany interaktywnie, na przykład dla wykresu obszaru, bez dostosowań kolorystycznych, to:

Graph Builder(
    Graph Spacing( 15 ),
    Variables( X( :treatment ), Y( :frequency ),
        Group X( :baseline ), Overlay( :improvement )
    ),
    Elements( Area( X, Y ) )
);
Xan
źródło
2
+1. Oto kilka świetnych pomysłów. Mimo, że nie lubię układania w stosy, myślę, że pierwszy wykres działa najlepiej. Uwydatnia interesującą interakcję: leczenie 1 zawsze powoduje więcej przypadków znacznej poprawy, a więcej żadnych!
Nick Cox
Wspaniały post. Czy w ogóle można zbudować pierwszy wykres wyświetlany w R? Od jakiegoś czasu nie używałem JMP.
Alejandro Ochoa
1
@AlejandroOchoa ggplot ma obszar geom. Zobacz Tworzenie wykresu obszaru ułożonego w stos za pomocą ggplot2 .
xan
10

Po pierwsze, oto mój odczyt z wykresu danych dla tych, którzy chcą grać (eksperymentuj, jeśli chcesz). NB błędy indywidualne są z pewnością możliwe, podobnie jak błędy rażące.

    improvement  treatment   baseline   frequency  
           none          0       mild          5  
       moderate          0       mild         41  
    substantial          0       mild          4  
           none          1       mild         19  
       moderate          1       mild         19  
    substantial          1       mild         12  
           none          0   moderate         19  
       moderate          0   moderate         24  
    substantial          0   moderate          7  
           none          1   moderate         20  
       moderate          1   moderate         14  
    substantial          1   moderate         16  
           none          0     severe          7  
       moderate          0     severe         21  
    substantial          0     severe         22  
           none          1     severe         12  
       moderate          1     severe         15  
    substantial          1     severe         23  

Oto przeróbka oryginalnego projektu. Jeden szczegół oryginalnych danych upraszcza sprawę: liczba osób w każdej kombinacji predyktorów jest taka sama, więc wykresy częstotliwości i procenty są takie same. Tutaj zamiast skumulowanego (podzielonego, segmentowanego) wykresu słupkowego, oddzielamy słupki w dwustronnym wykresie słupkowym lub projekcie wykresu tabelowego.

Wiele szczegółów w grafice jest właśnie tym szczegółem. Kilka niewielkich słabości wykresu może podważyć jego skuteczność, a także kilka drobnych ulepszeń.

wprowadź opis zdjęcia tutaj

Aby to przeliterować:

  1. Nie są tu potrzebne trzy panele z powtórzeniami osi, legendy i tekstu.

  2. Legenda jest zawsze przekleństwem i błogosławieństwem, zobowiązując czytelnika do mentalnego „w przód i w tył” (lub zapamiętania legendy, nie jest to coś, co by się podobało, jakkolwiek by to nie było łatwe). Tekst informacyjny tuż obok pasków jest łatwiejszy do naśladowania.

  3. Kodowanie kolorami sałatek owocowych jest zbędne. Wydaje się to również arbitralne: „znacząca” poprawa to wielka sprawa, ale uważam, że nawet mocny żółty kolor jest stonowany. Ale nie potrzebujemy koloru, gdy mamy tekst do wyjaśnienia.

  4. Chociaż niektórzy będą krzyczeć z przerażeniem, że naruszają rozróżnienie między figurą a tabelą, możemy również pokazać częstotliwości. Warto pomyśleć „4 osoby w tej kategorii”.

  5. Jest tu hołd dla tradycyjnego kreślenia odpowiedzi na osi pionowej, tak jak w oryginale.

To powiedziawszy, trudno jest dostrzec dużą strukturę tych danych. W takim przypadku trudno jest również podzielić się winą (a) danych bez dużej struktury i (b) słabości projektu graficznego do wybierania nie tylko efektów predykcyjnych, ale także możliwych interakcji. Leczenie wydaje się mniej ważne niż stan wyjściowy. Ale jeśli wartość wyjściowa była „łagodna”, to ile było możliwości „znaczącej” poprawy? Zatrzymam się tam, aby przestać się oszukiwać, gdy badanie danych dotyczących zdrowia psychicznego z pewnością nie jest specjalizacją, zwłaszcza jeśli dane okażą się fałszywe. Ale jeśli są prawdziwe, moglibyśmy zrobić z dużo większą próbką. (Zwykle to mówimy, ale proszę bardzo.)

EDYCJA Wykres może być naturalnie skomplikowany przez porządek kolorów, jeśli jest to pożądane:

wprowadź opis zdjęcia tutaj

Dla przypomnienia: wykresy wykorzystały kod Stata, w tym mój własny program do tabplotpobrania za pomocą ssc inst tabplot.

tabplot improvement group [w=frequency] , showval ///
xmla(1.5 "mild" 3.5 "moderate" 5.5 "severe", noticks labgap(*4) labsize(medsmall)) ///
xla(1 "0" 2 "1" 3 "0" 4 "1" 5 "0" 6 "1") ///
xtitle(baseline and treatment) xsc(titlegap(*4)) bfcolor(emerald*0.2)

tabplot improvement group [w=frequency] , showval ///
xmla(1.5 "mild" 3.5 "moderate" 5.5 "severe", noticks labgap(*4) labsize(medsmall)) ///
xla(1 "0" 2 "1" 3 "0" 4 "1" 5 "0" 6 "1") ///
xtitle(baseline and treatment) xsc(titlegap(*2)) ///
sep(improvement2) bar3(bfcolor(emerald*0.2)) bar2(bfcolor(emerald*0.6)) ///
bar1(bfcolor(emerald)) barall(blcolor(green)) 
Nick Cox
źródło
Czy istnieje możliwość przesłania wykresu za pomocą schematu kolorów odzwierciedlającego porządek danych? Jakiego oprogramowania użyłeś do stworzenia grafiki?
Alejandro Ochoa
To są bardzo przystojne wątki
shadowtalker
4

Lubię używać 2-poziomowej osi X dla takich danych. Tak więc kategorie osi X dla pojedynczego wykresu mogą być:

  • Leczenie = 0, poziom podstawowy = łagodny
  • Leczenie = 0, poziom podstawowy = umiarkowany
  • Leczenie = 0, poziom podstawowy = ciężkie
  • Leczenie = 1, poziom podstawowy = łagodny
  • Leczenie = 1, poziom podstawowy = umiarkowany
  • Leczenie = 1, poziom podstawowy = ciężkie

... z tymi samymi liczbami według kategorii [brak / umiarkowane / znaczne] słupki histogramu.

Maksymalna moc
źródło
+1. Zgadzam się z głównym pomysłem przedstawionym w mojej odpowiedzi. Nie mogę powiedzieć, jak blisko mój projekt wykresu słupkowego jest bliski temu, co sobie wyobrażałeś.
Nick Cox,
Dzięki, twoja mapa wygląda świetnie. Czy próbowałeś spojrzeć na to z Leczeniem 0/1 jako kategorią zewnętrzną, a Linia bazowa = Łagodna / Umiarkowana / Ciężka jako kategoria bliższa osi X? Myślę, że jeśli przedstawisz to w ten sposób, zobaczysz wyraźniejszy wzór - w przypadku leczenia = 0 „znaczące” paski poprawy rosną równomiernie wraz ze wzrostem linii podstawowej od Łagodnej / Umiarkowanej / Ciężkiej. I że zobaczysz ten sam wzór (w mniejszym stopniu) w trakcie leczenia = 1. Ogólnie umieszczam zmienną z mniejszą liczbą kategorii (np. Tutaj leczenie) na zewnątrz. Ale może już tak na to patrzyłeś.
Maksymalna moc
Nie próbowałem w inny sposób, ale miałem na uwadze, że badacz może najbardziej chcieć porównać efekty leczenia na podstawie danych wyjściowych, co powinno być łatwiejsze w ten sposób.
Nick Cox,
Ma to sens dla mnie.
Maksymalna moc
4

Czy fabuła Mozaika nie jest specjalnie zaprojektowana do tego celu?

W R byłoby to jak

library(vcd)
d = read.table("data.dat", header=TRUE)
tab = xtabs(frequency ~ treatment+baseline+improvement, data=d)
mosaic(data=tab,~ treatment+baseline+improvement, shade=TRUE, cex=2.5)

Każda zmienna kategorialna idzie do jednej krawędzi kwadratu, która jest podzielona przez jej etykiety. (Tak więc, jeśli podzielisz każdą krawędź tylko na jeden poziom, można przedstawić maksymalnie 4 zmienne kategoryczne. IMHO, powyżej 3, staje się nieporządna i trudniejsza do interpretacji). Rozmiar prostokątów jest proporcjonalny do częstotliwości. To jest główna idea stojąca za mozaiką fabuły i jest taka sama w tej odpowiedzi i odpowiedzi Pawła Kleki.

Różnice polegają na układzie tych prostokątów i „drobiazgach” zapewnianych przez konkretny pakiet R zastosowany dla tego typu wykresu. Jak widać z odpowiedzi Pawła Kleki, graphicspakiet dzieli górną krawędź na 2 poziomach zamiast używać prawej krawędzi. Użyłem vcdpakietu z domyślnymi opcjami, aby kolor wskazywał stopień powiązania między zmiennymi. Szary oznacza, że ​​dane są zgodne z (niezależną od hipotezy) zmienną niezależnością. Niebieski oznacza, że ​​istnieje pozytywny związek między „ciężką” linią podstawową a „znaczącą” poprawą zarówno dla leczenia „0”, jak i „1”. (Niespodzianka, niespodzianka! Tłumaczę to w następujący sposób: jeśli masz ciężką depresję, prawdopodobnie polepszysz się, niezależnie od tego, czy masz leczenie, czy nie.

Można dostosować fabułę do własnych potrzeb, patrz na przykład tutaj . Pakiet ma również kilka winiet, google „przykład mozaiki vcd” (tak jak właśnie to zrobiłem). Artykuł w Wikipedii cytowany na samym początku wyjaśnia również, jak zbudować tego rodzaju fabułę i intuicję.

wprowadź opis zdjęcia tutaj

Gdy porównasz moje zdjęcie ze zdjęciem w odpowiedzi Pawła Kleki, nie ma znaczenia, że ​​„zabieg” znajduje się na lewej krawędzi każdego zdjęcia. Możesz łatwo zmienić lokalizację krawędzi, zmieniając ostatni wiersz mojego kodu i dostosowując układ do swoich potrzeb. Powszechną praktyką jest to, że po lewej stronie znajduje się najważniejsza zmienna lub zmienna o najmniejszej liczbie etykiet. Można również zmienić kolejność etykiet (na przykład tak, że przy prawej krawędzi zamówienia jest „none umiarkowanego istotne”) poprzez odpowiedni zmienny czynnik R uporządkowane i dostosowanie jego poziomu.

lanenok
źródło
W chwili pisania dwóch odpowiedzi na temat mozaiki. Byłoby pomocne, gdyby każdy z was rozwinął to, co pokazuje fabuła i dlaczego jest to pomocne, zwłaszcza dlatego, że fabuły są zupełnie inne.
Nick Cox
@NickCox ten z pewnością wygląda inaczej niż inne. Nie są to prawie takie same wyświetlacze
shadowtalker
Obaj mają leczenie na osi y. To, co byłoby złotem od ich zwolenników, to komentarz na temat zalet i ograniczeń każdego ekranu.
Nick Cox
Dziękujemy za rozszerzenie odpowiedzi. Sądzę, że zainteresowanie tutaj może polegać na porównaniu odpowiedzi w przypadku leczenia i wartości początkowej. Oczywiście zgadzam się, że możesz majstrować przy której zmiennej idzie, ale czy wypróbowałeś inne możliwości i która działa najlepiej? Patrząc na odpowiedź tutaj, czytelnik musi porównać dwa rzędy bloków jednocześnie.
Nick Cox
@Nick Cox Dzięki za komentarze. To była jedyna rzecz, która zmotywowała mnie do rozwoju. I nie nie spróbować innych możliwości. Właściwie myślę, czy autor uzna, ten typ działki użytecznego, że należy spróbować wszystkiego, czym pisać i tłumaczyć wyników dla społeczności. Nawiasem mówiąc, nie mówię, że ten rodzaj fabuły jest lepszy od innych. Chodzi o to: został specjalnie zaprojektowany dla zmiennych kategorialnych i do wizualizacji niezależności i / lub naruszenia niezależności.
lanenok
3

Sugeruję użycie mozaiki

mosaicplot(table(moz), sort = c(3,1,2), color = T)

mozaika ()

Paweł Kleka
źródło
W chwili pisania dwóch odpowiedzi na temat mozaiki. Byłoby pomocne, gdyby każdy z was rozwinął to, co pokazuje fabuła i dlaczego jest to pomocne, zwłaszcza dlatego, że fabuły są zupełnie inne.
Nick Cox
2

Rozważam opcję użycia zestawów równoległych. Niektóre porównania będą łatwiejsze niż inne, ale nadal widać relacje między trzema zmiennymi kategorialnymi.

Oto przykład z danymi Titanic Survival:

Oto przykład z danymi dotyczącymi przeżycia Titanica.

W R (biorąc pod uwagę twoje tagi) użyłem ggparallel do jego wdrożenia. Niektórzy ludzie dyskutowali tutaj na temat CV, jak wdrożyć go na inne sposoby.

nazareno
źródło
Mam problem z wyobrażeniem sobie tego. Czy jest jakaś szansa, że ​​będziesz w stanie wykpić przykład?
shadowtalker
Linia na wykresie ma szerokość proporcjonalną do częstotliwości współbieżności dwóch kategorii. Dla danych wykorzystanych na wykresach pierwotnego pytania byłyby trzy osie poziome: depresja wyjściowa, leczenie i poprawa depresji. W każdym są osobne obszary dla każdego poziomu tej kategorii. Współbieżności są powiązane, a ich szerokość reprezentuje ich częstotliwość.
nazareno
2

Informacje można również przekazać za pomocą następującego prostego wykresu liniowego:

wprowadź opis zdjęcia tutaj

Ulepszenie jest pokazane przez różne typy linii, podczas gdy grupa linii bazowej jest wyświetlana w kolorach. Te i parametr osi X (tutaj leczenie) można również zamieniać w razie potrzeby.

rnso
źródło
1

Podobnie do zestawów równoległych, zamieszczonych powyżej przez nazareno, możesz używać wykresów aluwialnych, które są dostępne z pakietu aluwialnego R. http://www.r-bloggers.com/alluvial-diagrams/

Ankur Chakravarthy
źródło