Jak wizualizować ogromną rzadką tabelę awaryjną?

24

Mam dwie zmienne: nazwę leku (DN) i odpowiadające im zdarzenia niepożądane (AE), które stoją w relacji wiele do wielu. Istnieje 33.556 nazw leków i 9.516 zdarzeń niepożądanych. Wielkość próby wynosi około 5,8 miliona obserwacji.

Chcę przestudiować i zrozumieć związek / relację między DN a AE. Zastanawiam się nad sposobem wizualizacji tego zestawu w R, ponieważ lepiej patrzeć na zdjęcia. Nie jestem pewien jak to zrobić ...

użytkownik9292
źródło
3
(+1) W świetle dodatkowych informacji przedstawionych w tych komentarzach (ponieważ zostały usunięte, ponieważ informacje pojawiają się teraz w samym pytaniu), stał się to interesującym i trudnym problemem. Zachęcam poprzednich downvoters do zmiany głosów w uznaniu tego (i innych do głosowania za pytaniem, jeśli się ze mną zgadzasz!).
whuber
1
Czy dane są publicznie dostępne?
kardynał
5
@ cardinal, tak .. dane uzyskane od FDA, to się nazywa AERS. Zobacz link: fda.gov/Drugs/GuidanceComplianceRegulatoryInformation/…
user9292
Jest to znany problem związany z dużą literaturą: Można na przykład rzucić okiem (ze statystyk w medycynie, do pobrania): „Metody wykrywania sygnału bayesowskiego nadzoru nad bezpieczeństwem farmakoterapii powrócone w wielu ustawieniach porównania” i odniesienia do nich.
kjetil b halvorsen
Brzmi jak ciekawy papier (nie jestem pewien, czy jest dostępny za darmo, ale jest pakiet R ). Jakie rozwiązanie graficzne zaproponowałbyś?
chl

Odpowiedzi:

11

To, co możesz zrobić, to wykorzystać pozostałe pomysły cieniowania z vcd tutaj w połączeniu z rzadką wizualizacją macierzy, jak na przykład na stronie 49 tego rozdziału książki . Wyobraź sobie tę ostatnią fabułę z resztkowymi cieniowaniami, a otrzymasz pomysł.

Rzadka matryca / tabela zakaźności normalnie zawierałaby liczbę wystąpień każdego leku przy każdym działaniu niepożądanym. Jednak dzięki pomysłowi cieniowania resztkowego możesz ustawić podstawowy logiczny model liniowy (np. Model niezależności lub cokolwiek innego, co chcesz) i użyć schematu kolorów, aby dowiedzieć się, która kombinacja leków / efektów występuje częściej / rzadziej niż przewidywałby model . Ponieważ masz wiele obserwacji, możesz użyć bardzo dokładnego progu kolorów i uzyskać mapę, która wygląda podobnie do tego, jak często wizualizowane są mikromacierze w analizie skupień, np. Tutaj(ale prawdopodobnie z mocniejszymi „gradientami”). Możesz też zbudować progi w taki sposób, że tylko wtedy, gdy różnice obserwacji względem prognoz przekroczą próg, wówczas kolor się przybierze, a reszta pozostanie biała. To, jak dokładnie to zrobisz (np. Jaki model zastosować lub jakie progi) zależy od twoich pytań.

Edytuj Więc oto jak bym to zrobił (biorąc pod uwagę, że mam wystarczającą ilość dostępnej pamięci RAM ...)

  1. Utwórz rzadką macierz pożądanych wymiarów (nazwy leków x efekty)
  2. Obliczyć reszty z logicznego modelu niezależności
  3. Użyj gradientu kolorów w dokładnej rozdzielczości od minimalnej do maksymalnej wartości resztkowej (np. Z przestrzenią kolorów hsv)
  4. Wstaw odpowiednią wartość koloru wielkości resztkowej w odpowiednim miejscu w rzadkiej matrycy
  5. Narysuj matrycę za pomocą wykresu obrazu.

W efekcie powstaje coś takiego (oczywiście obraz będzie znacznie większy i rozmiar piksela będzie znacznie mniejszy, ale powinieneś pojąć ten pomysł. Dzięki sprytnemu użyciu koloru możesz wizualizować skojarzenia / odstępstwa od niezależności, na których jesteś najbardziej zainteresowany).

Szybki i brudny przykład z matrycą 100 x 100. To tylko przykład zabawki z resztkami od -10 do 10, jak można zobaczyć w legendzie. Biały jest zerowy, niebieski jest rzadszy niż oczekiwano, czerwony jest częstszy niż oczekiwano. Powinieneś być w stanie zdobyć pomysł i wziąć go stamtąd. Edycja: Poprawiłem ustawienia fabuły i użyłem kolorów bez przemocy.

wprowadź opis zdjęcia tutaj

Dokonano tego przy użyciu imagefunkcji i cm.colors()następującej funkcji:

ImagePlot <- function(x, ...){
 min <- min(x)
 max <- max(x)
 layout(matrix(data=c(1,2), nrow=1, ncol=2), widths=c(1,7), heights=c(1,1))

 ColorLevels <- cm.colors(255)

 # Color Scale
 par(mar = c(1,2.2,1,1))
 image(1, seq(min,max,length=255),
  matrix(data=seq(min,max,length=255), ncol=length(ColorLevels),nrow=1),
  col=ColorLevels,
  xlab="",ylab="",
  xaxt="n")


 # Data Map
 par(mar = c(0.5,1,1,1))
 image(1:dim(x)[1], 1:dim(x)[2], t(x), col=ColorLevels, xlab="",
 ylab="", axes=FALSE, zlim=c(min,max))

layout(1)
}

#100x100 example
x <- c(seq(-10,10,length=255),rep(0,600))
mat <- matrix(sample(x,10000,replace=TRUE),nrow=100,ncol=100)
ImagePlot(mat)

korzystając z pomysłów tutaj http://www.phaget4.org/R/image_matrix.html . Jeśli macierz jest tak duża, że imagefunkcja zwalnia, użyj useRaster=TRUEargumentu (możesz również użyć rzadkich obiektów Matrix; zwróć uwagę, że powinna istnieć imagemetoda, jeśli chcesz użyć powyższego kodu, zobacz pakiet sparseM).

Jeśli to zrobisz, przydatne może być sprytne uporządkowanie wierszy / kolumn, które możesz obliczyć za pomocą pakietu arules (sprawdź strony 17 i 18 lub więcej). Generalnie polecam narzędzia arules dla tego typu danych i problemów (nie tylko wizualizacji, ale także znajdowania wzorców). Znajdziesz tam również miary powiązania między poziomami, których możesz użyć zamiast resztkowego cieniowania.

Możesz także przyjrzeć się planom tabel, które później zbadasz tylko kilka działań niepożądanych.

Momo
źródło
1
Najwyraźniej nazywa się to obecnie „działką na kołdrę” plosone.org/article/info:doi/10.1371/journal.pone.0085047
Momo
Przyzwyczaiłem się widzieć takie mapy cieplne z klastrami wierszy i kolumn, np. Z hierarchicznym klastrowaniem. Chociaż 33556 x 9516 wydaje się zbyt wiele do wizualizacji w ten sposób.
R Greg Stacey