Как визуализировать огромную разреженную таблицу непредвиденных обстоятельств?


24

У меня есть две переменные: название лекарственного средства (DN) и соответствующие нежелательные явления (AE), которые находятся в отношении многих ко многим. Есть 33 556 наименований лекарств и 9 516 побочных эффектов. Размер выборки составляет около 5,8 миллиона наблюдений.

Я хочу изучить и понять связь / отношения между DN и AE. Я думаю о способе визуализации этого набора в R, так как лучше смотреть на картинки. Я не уверен, как это сделать ...


3
(+1) В свете дополнительной информации, представленной в этих комментариях (после удаления, поскольку информация теперь появляется в самом вопросе), это стало интересной и сложной проблемой. Я призываю предыдущих downvoters изменить свои голоса в знак признания этого (и другие, чтобы поднять вопрос, если вы согласны со мной!).
whuber

1
Являются ли данные общедоступными?
кардинал

5
@ cardinal, да .. данные, полученные от FDA, называются AERS. Смотрите ссылку: fda.gov/Drugs/GuidanceComplianceRegulatoryInformation/...
user9292

Это известная проблема с большой литературой: например, вы можете взглянуть (из загружаемой статистики в медицине): «Байесовские методы обнаружения сигналов фармаконадзора, пересмотренные в настройке множественного сравнения» и ссылаются на них.
kjetil b halvorsen

Это звучит как интересная статья (не уверен, что она свободно доступна, но есть пакет R ). Теперь, какое графическое решение вы бы предложили?
ЧЛ

Ответы:


11

То, что вы могли бы сделать, это использовать остаточные идеи затенения из vcd здесь в сочетании с разреженной матричной визуализацией, как, например, на странице 49 этой главы книги . Представьте себе последний сюжет с остаточной штриховкой, и вы получите идею.

Таблица разреженных матриц / случайностей обычно содержит количество случаев каждого лекарства с каждым побочным эффектом. Однако, имея идею остаточного затенения, вы можете установить базовую линейную модель журнала (например, модель независимости или что-то еще, что вам нравится) и использовать цветовую схему, чтобы выяснить, какая комбинация лекарство / эффект встречается чаще / реже, чем предсказывает модель , Поскольку у вас много наблюдений, вы можете использовать очень точную цветовую границу и получить карту, которая выглядит примерно так, как часто визуализируются микрочипы в кластерном анализе, например здесь(но, вероятно, с более сильными «градиентами» цвета). Или вы можете построить пороговые значения так, чтобы только в случае, если различия в наблюдениях и прогнозах превышали пороговые значения, они окрашивались, а остальное оставалось белым. Как именно вы это сделаете (например, какую модель использовать или какие пороги) зависит от ваших вопросов.

Редактировать Итак, вот как бы я это сделал (если бы у меня было достаточно оперативной памяти ...)

  1. Создайте разреженную матрицу желаемых размеров (названия препаратов х эффектов)
  2. Рассчитать невязки из независимости логлинеарной модели
  3. Используйте градиент цвета в хорошем разрешении от минимального до максимального остатка (например, с цветовым пространством hsv)
  4. Вставьте соответствующее значение цвета величины остатков в соответствующей позиции в разреженной матрице
  5. Построить матрицу с графиком изображения.

Затем вы получите что-то вроде этого (конечно, ваша картинка будет гораздо больше и будет иметь гораздо меньший размер пикселя, но вы должны понять. С умным использованием цвета вы можете визуализировать ассоциации / отклонения от независимости, которые вы наиболее увлекающийся).

Быстрый и грязный пример с матрицей 100x100. Это просто игрушечный пример с остатками от -10 до 10, как вы можете видеть в легенде. Белый - ноль, синий - реже, чем ожидалось, красный - чаще, чем ожидалось. Вы должны быть в состоянии получить идею и взять ее оттуда. Редактировать: я исправил настройку сюжета и использовал ненасильственные цвета.

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

Это было сделано с помощью imageфункции и cm.colors()в следующей функции:

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)

используя идеи отсюда http://www.phaget4.org/R/image_matrix.html . Если ваша матрица настолько велика, что imageфункция работает медленно, используйте useRaster=TRUEаргумент (вы также можете использовать разреженные объекты Matrix; обратите внимание, что должен бытьimage метод, если вы хотите использовать код сверху, см. Пакет sparseM.)

Если вы сделаете это, может оказаться полезным некоторое умное упорядочение строк / столбцов, которое вы можете рассчитать с помощью пакета arules. (см. Стр. 17 и 18 или около того). Я бы обычно рекомендовал утилиты arules для этого типа данных и проблем (не только для визуализации, но и для поиска шаблонов). Там вы также найдете меры связи между уровнями, которые вы могли бы использовать вместо остаточного затенения.

Вы можете также захотеть взглянуть на столы, если вы хотите исследовать только пару побочных эффектов позже.


1
По-видимому, в настоящее время это называется «сюжет лоскутного одеяла» plosone.org/article/info:doi/10.1371/journal.pone.0085047
Момо

Я привык видеть подобные тепловые карты с кластеризованными строками и столбцами, например, с иерархической кластеризацией. Хотя 33556 x 9516 кажется, способ много визуализировать таким образом.
Р Грег Стейси
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.