如何可视化一个巨大的稀疏列联表?

机器算法验证 r 分类数据 数据可视化 大数据 关联度量
2022-02-12 17:52:10

我有两个变量:药物名称 (DN) 和相应的不良事件 (AE),它们处于多对多关系。有 33,556 个药物名称和 9,516 个不良事件。样本量约为 580 万个观测值。

我想研究和了解DN和AE之间的关联/关系。我正在考虑一种在 R 中可视化该集合的方法,因为最好看图片。我不知道该怎么做...

1个回答

您可以做的是使用 vcd here中的剩余着色思想与稀疏矩阵可视化相结合,例如本书章节的第 49 页。想象后一个带有残余阴影的情节,你就会明白。

稀疏矩阵/列联表通常包含每种药物与每种不良反应的发生次数。然而,使用残留阴影的想法,您可以设置基线对数线性模型(例如独立模型或您喜欢的任何其他模型)并使用配色方案来找出比模型预测的更频繁/更少发生的药物/效果组合. 由于您有很多观察结果,您可以使用非常精细的颜色阈值并获得一个看起来类似于集群分析中的微阵列通常如何可视化的地图,例如这里(但可能具有更强的颜色“渐变”)。或者您可以建立阈值,这样只有当观察与预测的差异超过阈值时才会着色,其余部分将保持白色。您将如何做到这一点(例如使用哪个模型或使用哪个阈值)取决于您的问题。

编辑 所以我会这样做(假设我有足够的可用内存......)

  1. 创建所需维度的稀疏矩阵(药物名称 x 效果)
  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参数(您可能还想使用稀疏矩阵对象;请注意,image如果您想使用上面的代码,应该有一个方法,请参阅 sparseM 包。)

如果你这样做,一些巧妙的行/列排序可能会变得很方便,你可以使用arules 包计算(查看第 17 页和第 18 页左右)。对于此类数据和问题,我通常会推荐 arules 实用程序(不仅是可视化,还可以查找模式)。在那里,您还将找到可以使用的级别之间的关联度量,而不是残余阴影。

您可能还想查看您以后只想调查几个不利影响的表格图。