¿Cómo visualizar una enorme tabla de contingencia dispersa?

24

Tengo dos variables: Nombre del medicamento (DN) y los eventos adversos (AE) correspondientes, que están en una relación de muchos a muchos. Hay 33,556 nombres de medicamentos y 9,516 eventos adversos. El tamaño de la muestra es de aproximadamente 5,8 millones de observaciones.

Quiero estudiar y comprender la asociación / relación entre DN y AE. Estoy pensando en una forma de visualizar este conjunto en R ya que es mejor mirar imágenes. No estoy seguro de cómo hacerlo ...

usuario9292
fuente
3
(+1) A la luz de la información adicional presentada en estos comentarios (desde que se eliminó, porque la información ahora aparece en la pregunta), este se ha convertido en un problema interesante y desafiante. Animo a los votantes anteriores a cambiar sus votos en reconocimiento de esto (¡y a otros a votar la pregunta si está de acuerdo conmigo!).
whuber
1
¿Los datos están disponibles públicamente?
cardenal
55
@cardinal, sí ... los datos obtenidos de la FDA se llaman AERS. Vea el enlace: fda.gov/Drugs/GuidanceComplianceRegulatoryInformation/…
user9292
Este es un problema conocido con una gran literatura: podría echar un vistazo, por ejemplo (a partir de estadísticas en medicina, descargables): "Métodos de detección de señal de farmacovigilancia bayesiana revisados ​​en una configuración de comparación múltiple" y referencias allí.
kjetil b halvorsen
Parece un documento interesante (no estoy seguro de que esté disponible gratuitamente, pero hay un paquete R ). Ahora, ¿qué solución gráfica sugerirías?
chl

Respuestas:

11

Lo que podría hacer es usar las ideas de sombreado residual de vcd aquí en combinación con una visualización de matriz dispersa como, por ejemplo, en la página 49 de este capítulo del libro . Imagine la última trama con sombreados residuales y obtendrá la idea.

La tabla de matriz / contigencia escasa normalmente contendría el número de ocurrencias de cada fármaco con cada efecto adverso. Sin embargo, con la idea del sombreado residual, puede configurar un modelo lineal de registro de línea de base (por ejemplo, un modelo de independencia o cualquier otra cosa que desee) y usar el esquema de color para averiguar qué combinación de drogas / efecto ocurre con más frecuencia / menos frecuencia de lo que el modelo predeciría. . Dado que tiene muchas observaciones, puede usar un umbral de color muy fino y obtener un mapa que se parece a la forma en que a menudo se visualizan las microarrays en el análisis de conglomerados, por ejemplo, aquí(pero probablemente con "gradientes" de color más fuertes). O podría construir los umbrales de tal manera que solo si las diferencias de observaciones a predicciones exceden el umbral de lo que se colorean y el resto permanecerá blanco. Cómo exactamente haría esto (por ejemplo, qué modelo usar o qué umbrales) depende de sus preguntas.

Editar Así que así es como lo haría (dado que tendría suficiente RAM disponible ...)

  1. Cree una matriz dispersa de las dimensiones deseadas (nombres de drogas x efectos)
  2. Calcular los residuos del modelo loglineal de independencia
  3. Utilice un degradado de color en resolución fina desde el mínimo hasta el máximo del residual (por ejemplo, con un espacio de color hsv)
  4. Inserte el valor de color correspondiente de la magnitud residual en la posición correspondiente en la matriz dispersa
  5. Trace la matriz con un gráfico de imagen.

Luego terminas con algo como esto (por supuesto, tu imagen será mucho más grande y habrá un tamaño de píxel mucho más bajo, pero debes tener la idea. Con el uso inteligente del color puedes visualizar las asociaciones / salidas desde la independencia que eres más interesado en).

Un ejemplo rápido y sucio con una matriz de 100x100. Este es solo un ejemplo de juguete con residuos que van desde -10 a 10 como se puede ver en la leyenda. El blanco es cero, el azul es menos frecuente de lo esperado, el rojo es más frecuente de lo esperado. Debería poder tener la idea y tomarla desde allí. Editar: arreglé la configuración de la trama y usé colores no violentos.

ingrese la descripción de la imagen aquí

Esto se hizo usando la imagefunción y cm.colors()en la siguiente función:

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)

utilizando ideas de aquí http://www.phaget4.org/R/image_matrix.html . Si su matriz es tan grande que la imagefunción se vuelve lenta, use el useRaster=TRUEargumento (es posible que también quiera usar objetos Matrix dispersos; tenga en cuenta que debe haber un imagemétodo si desea usar el código de arriba, consulte el paquete sparseM).

Si hace esto, puede resultar útil realizar un ordenamiento inteligente de las filas / columnas, que puede calcular con el paquete arules (consulte las páginas 17 y 18 más o menos). En general, recomendaría las utilidades de arules para este tipo de datos y problemas (no solo visualización sino también para encontrar patrones). Allí también encontrará medidas de asociación entre los niveles que podría usar en lugar del sombreado residual.

También es posible que desee ver las tablas de las que desea investigar solo un par de efectos adversos más adelante.

Momo
fuente
1
Aparentemente, esto se llama hoy en día "parcela de colchas" plosone.org/article/info:doi/10.1371/journal.pone.0085047
Momo
Estoy acostumbrado a ver mapas de calor como este con las filas y columnas agrupadas, por ejemplo, con agrupamiento jerárquico. Aunque 33556 x 9516 parece mucho para visualizar de esta manera.
R Greg Stacey