Come visualizzare un'enorme tabella di contingenza sparsa?


24

Ho due variabili: Drug Name (DN) e corrispondenti eventi avversi (AE), che si trovano in una relazione molti-a-molti. Ci sono 33.556 nomi di farmaci e 9.516 eventi avversi. La dimensione del campione è di circa 5,8 milioni di osservazioni.

Voglio studiare e comprendere l'associazione / relazione tra DN e AE. Sto pensando a un modo per visualizzare questo set in R poiché è meglio guardare le foto. Non sono sicuro di come procedere ...


3
(+1) Alla luce delle informazioni aggiuntive presentate in questi commenti (poiché cancellate, poiché le informazioni ora appaiono nella domanda stessa), questo è diventato un problema interessante e stimolante. Incoraggio i precedenti downvoter a cambiare i loro voti in riconoscimento di questo (e altri a votare la domanda se sei d'accordo con me!).
whuber

1
I dati sono disponibili al pubblico?
cardinale

5
@ cardinale, sì .. i dati ottenuti dalla FDA, si chiama AERS. Vedi il link: fda.gov/Drugs/GuidanceComplianceRegulatoryInformation/…
user9292

Questo è un problema noto con una vasta letteratura: si potrebbe dare uno sguardo, ad esempio (da statistiche in medicina, scaricabile): "Metodi di rilevamento del segnale di farmacovigilanza bayesiana rivisitati in un'impostazione di confronto multiplo" e riferimenti ad essi.
kjetil b halvorsen,

Sembra un documento interessante (non sono sicuro che sia disponibile gratuitamente, ma c'è un pacchetto R ). Ora, quale soluzione grafica suggeriresti?
chl

Risposte:


11

Quello che potresti fare è usare le idee di ombreggiatura residua di vcd qui in combinazione con la visualizzazione a matrice sparsa come ad esempio a pagina 49 di questo capitolo del libro . Immagina quest'ultima trama con sfumature residue e ottieni l'idea.

La tabella delle matrici / contigenze sparse normalmente contiene il numero di occorrenze di ciascun farmaco con ciascun effetto avverso. Con l'idea dell'ombreggiatura residua, tuttavia, è possibile impostare un modello lineare di registro di base (ad esempio un modello di indipendenza o qualsiasi altra cosa ti piace) e utilizzare lo schema di colori per scoprire quale combinazione di farmaci / effetti si verifica più spesso / meno spesso di quanto il modello prevederebbe . Dato che hai molte osservazioni, potresti usare un limite di colore molto fine e ottenere una mappa che assomiglia a come vengono spesso visualizzati i microarrays nell'analisi dei cluster, ad esempio qui(ma probabilmente con "gradienti" di colore più forti). Oppure potresti costruire le soglie in modo tale che solo se le differenze delle osservazioni rispetto alle previsioni superano la soglia di quella che viene colorata e il resto rimarrà bianco. Come esattamente faresti (ad es. Quale modello usare o quali soglie) dipende dalle tue domande.

Modifica Quindi ecco come lo farei (dato che avrei abbastanza RAM disponibile ...)

  1. Crea una matrice sparsa delle dimensioni desiderate (nomi di farmaci x effetti)
  2. Calcola i residui dal modello loglinear di indipendenza
  3. Usa una sfumatura di colore a risoluzione fine dal minimo al massimo del residuo (ad es. Con uno spazio cromatico hsv)
  4. Inserire il valore di colore corrispondente della grandezza residua nella posizione corrispondente nella matrice sparsa
  5. Traccia la matrice con una trama dell'immagine.

Quindi si finisce con qualcosa del genere (ovviamente la tua immagine sarà molto più grande e ci sarà una dimensione dei pixel molto più bassa ma dovresti avere l'idea. Con un uso intelligente del colore puoi visualizzare le associazioni / le partenze dall'indipendenza che sei più interessato a).

Un esempio veloce e sporco con una matrice 100x100. Questo è solo un esempio di giocattolo con residui che vanno da -10 a 10, come puoi vedere nella legenda. Il bianco è zero, il blu è meno frequente del previsto, il rosso è più frequente del previsto. Dovresti essere in grado di ottenere l'idea e prenderla da lì. Modifica: ho corretto l'impostazione della trama e usato colori non violenti.

inserisci qui la descrizione dell'immagine

Ciò è stato fatto utilizzando la imagefunzione e cm.colors()nella seguente funzione:

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)

usando idee da qui http://www.phaget4.org/R/image_matrix.html . Se la tua matrice è così grande che la imagefunzione diventa lenta, usa l' useRaster=TRUEargomento (potresti anche voler usare oggetti Matrix sparsi; nota che dovrebbe esserci un imagemetodo se vuoi usare il codice dall'alto, vedi il pacchetto sparseM).

Se lo fai, potrebbe essere utile un ordinamento intelligente delle righe / colonne, che puoi calcolare con il pacchetto arules (controlla le pagine 17 e 18 o giù di lì). Consiglierei generalmente le utility arules per questo tipo di dati e problemi (non solo visualizzazione ma anche per trovare schemi). Lì troverai anche misure di associazione tra i livelli che potresti usare al posto dell'ombreggiatura residua.

Potresti anche voler esaminare i grafici di tabella che desideri esaminare solo un paio di effetti avversi in seguito.


1
Apparentemente questo è oggigiorno chiamato "trama trapunta" plosone.org/article/info:doi/10.1371/journal.pone.0085047
Momo

Sono abituato a vedere mappe di calore come questa con le righe e le colonne raggruppate, ad esempio con il raggruppamento gerarchico. Anche se 33556 x 9516 sembra un modo per visualizzare molto in questo modo.
R Greg Stacey,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.