Como visualizar uma enorme tabela de contingência esparsa?

24

Eu tenho duas variáveis: Nome do Medicamento (DN) e Eventos Adversos (EA) correspondentes, que mantêm uma relação de muitos para muitos. Existem 33.556 nomes de medicamentos e 9.516 eventos adversos. O tamanho da amostra é de cerca de 5,8 milhões de observações.

Quero estudar e entender a associação / relação entre DN e AE. Estou pensando em uma maneira de visualizar esse conjunto em R, já que é melhor olhar para as fotos. Eu não tenho certeza de como fazer isso ...

user9292
fonte
3
(+1) À luz das informações adicionais apresentadas nesses comentários (desde que excluídas, porque as informações agora aparecem na própria pergunta), isso se tornou um problema interessante e desafiador. Encorajo os que rejeitaram votos anteriores a mudarem seus votos em reconhecimento a isso (e outros a aprovar a questão se você concorda comigo!).
whuber
11
Os dados estão disponíveis ao público?
cardeal
5
@ cardinal, sim ... os dados obtidos do FDA, são chamados AERS. Veja o link: fda.gov/Drugs/GuidanceComplianceRegulatoryInformation/…
user9292
Esse é um problema conhecido em uma ampla literatura: você pode dar uma olhada, por exemplo (em estatísticas da medicina, para download): "Métodos de detecção de sinais de farmacovigilância bayesiana revisitados em um cenário de comparação múltipla" e referências a eles.
Kjetil b halvorsen
Parece um artigo interessante (não tenho certeza de que esteja disponível gratuitamente, mas há um pacote R ). Agora, que solução gráfica você sugeriria?
chl

Respostas:

11

O que você pode fazer é usar as idéias de sombreamento residual de vcd aqui em combinação com a visualização de matriz esparsa, como por exemplo, na página 49 deste capítulo do livro . Imagine o último gráfico com sombras residuais e você entendeu.

A tabela de matriz / contingência esparsa normalmente conteria o número de ocorrências de cada medicamento com cada efeito adverso. Com a idéia de sombreamento residual, no entanto, você pode configurar um modelo linear de log de linha de base (por exemplo, um modelo de independência ou o que mais desejar) e usar o esquema de cores para descobrir qual combinação de drogas / efeitos ocorre com mais frequência / menos do que o modelo previa. . Como você tem muitas observações, você pode usar um limiar de cores muito fino e obter um mapa parecido com o modo como os microarrays na análise de cluster são frequentemente visualizados, por exemplo, aqui(mas provavelmente com "gradientes" de cores mais fortes). Ou você pode construir os limites de forma que somente se as diferenças de observações nas previsões excederem o limite, elas ficarão coloridas e o restante permanecerá branco. Como exatamente você faria isso (por exemplo, qual modelo usar ou quais limites) depende de suas perguntas.

Editar Então, aqui está como eu faria isso (já que eu teria RAM suficiente disponível ...)

  1. Crie uma matriz esparsa das dimensões desejadas (nomes de medicamentos x efeitos)
  2. Calcular os resíduos do modelo linear da independência
  3. Use um gradiente de cores em resolução fina, do mínimo ao máximo do residual (por exemplo, com um espaço de cores hsv)
  4. Inserir o valor da cor correspondente à magnitude dos resíduos na posição correspondente na matriz esparsa
  5. Plote a matriz com um gráfico de imagem.

Você acaba com algo assim (é claro que a imagem será muito maior e haverá um tamanho de pixel muito menor, mas você deve ter uma idéia. Com o uso inteligente da cor, você pode visualizar as associações / saídas da independência que você mais tem interessado em).

Um exemplo rápido e sujo com uma matriz 100x100. Este é apenas um exemplo de brinquedo com resíduos variando de -10 a 10, como você pode ver na legenda. Branco é zero, azul é menos frequente do que o esperado, vermelho é mais frequente do que o esperado. Você deve ter a ideia e levá-la de lá. Editar: eu consertei a configuração da trama e usei cores não violentas.

insira a descrição da imagem aqui

Isso foi feito usando a imagefunção e cm.colors()na seguinte função:

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 idéias daqui http://www.phaget4.org/R/image_matrix.html . Se sua matriz é tão grande que a imagefunção fica lenta, use o useRaster=TRUEargumento (você também pode usar objetos Matrix esparsos; observe que deve haver um imagemétodo para usar o código acima, consulte o pacote sparseM.)

Se você fizer isso, algumas ordens inteligentes das linhas / colunas podem se tornar úteis, que você pode calcular com o pacote arules (consulte as páginas 17 e 18). Geralmente, eu recomendaria os utilitários do arules para esse tipo de dados e problemas (não apenas na visualização, mas também para encontrar padrões). Lá você também encontrará medidas de associação entre os níveis que você pode usar em vez do sombreamento residual.

Você também pode querer olhar para as tabelas de tabelas que deseja investigar apenas alguns efeitos adversos posteriormente.

Momo
fonte
11
Aparentemente, hoje em dia isso é chamado de "enredo de quilt" plosone.org/article/info:doi/10.1371/journal.pone.0085047
Momo
Estou acostumado a ver mapas de calor como este com as linhas e colunas agrupadas, por exemplo, com agrupamentos hierárquicos. Embora 33556 x 9516 pareça muito para visualizar dessa maneira.
R Greg Stacey