2

我有一个包含 100 人的数据集,他们诊断出 5 种疾病。条件的任何组合都可能发生,但我已将其设置为条件 D 的概率取决于条件 A,而 E 取决于条件 B。

set.seed(14)
numpeople <- 100
diagnoses <- data.frame(A=rbinom(100, 1, .15), 
                        B=rbinom(100, 1, .1),
                        C=rbinom(100, 1, .2)
                        )
# Probability of diagnosis for D increases by .4 if patient has A, otherwise .5
diagnoses$D <- sapply(diagnoses$A, function(x) rbinom(1, 1, .4*x+.2))
# Probability of diagnosis for E increases by .3 if patient has B, otherwise rare
diagnoses$E <- sapply(diagnoses$B, function(x) rbinom(1, 1, .7*x+.1))

为了制作一个共现矩阵,其中每个单元格是在行和列中同时诊断的人数,我使用矩阵代数:

diagnoses.dist <- t(as.matrix(diagnoses))%*%as.matrix(diagnoses)
diag(diagnoses.dist) <- 0
diagnoses.dist
> diagnoses.dist
   A B C  D E
A  0 1 1 11 3
B  1 0 0  1 7
C  1 0 0  5 4
D 11 1 5  0 4
E  3 7 4  4 0

然后我想用一个和弦图来显示每个诊断的共同诊断的比例。

circos.clear()
circos.par(gap.after=10)
chordDiagram(diagnoses.dist, symmetric=TRUE)

带有 5 个组的示例和弦图

默认情况下,为每个组分配的扇区(饼图)大小与链接数成正比。

> colSums(diagnoses.dist) #Number of links related to each diagnosis
 A  B  C  D  E 
16  9 10 21 18 

是否可以设置扇区宽度来说明每次诊断的人数?

> colSums(diagnoses) #Number of people with each diagnosis
 A  B  C  D  E 
16  8 20 29 18 

这个问题似乎与 circlize 书的第 14.5 节有些相关,但我不确定如何为这个gap.after论点进行数学运算。

根据circlize book 的第 2.3 节circos.initalize,我尝试使用设置扇区大小,但我认为该chordDiagram函数会覆盖它,因为外部的比例完全相同。

circos.clear()
circos.par(gap.after=10)
circos.initialize(factors=names(diagnoses), x=colSums(diagnoses)/sum(diagnoses), xlim=c(0,1))
chordDiagram(diagnoses.dist, symmetric=TRUE)

在此处输入图像描述

我看到了很多微调轨道的选项,chordDiagram但对于扇区来说却不多。有没有办法做到这一点?

4

1 回答 1

3

在您的情况下,该类别中的人数有时可能小于其他类别的共现总数。比如B类共有9个同现,但人数只有8个。

如果这不是问题,您可以在矩阵图上放置一些值,这些值对应于仅属于一个类别的人数。在下面的示例代码中,我只是在图中添加随机数来说明这个想法:

diagnoses.dist <- t(as.matrix(diagnoses))%*%as.matrix(diagnoses)
diag(diagnoses.dist) = sample(10, 5)

# since the matrix is symmetric, we set the uppper diagnal to zero.
# we don't use `symmetrix = TRUE` here because the values on the diagonal
# are still used.
diagnoses.dist[upper.tri(diagnoses.dist)] = 0

par(mfrow = c(1, 2))
# here you can remove `self.link = 1` to see the difference
chordDiagram(diagnoses.dist, grid.col = 2:6, self.link = 1)

# If you don't want to see the "mountains"
visible = matrix(TRUE, nrow = nrow(diagnoses.dist), ncol = ncol(diagnoses.dist))
diag(visible) = FALSE
chordDiagram(diagnoses.dist, grid.col = 2:6, self.link = 1, link.visible = visible)

在此处输入图像描述

PS:link.visible选项仅在最新版本的 circlize 中可用。

于 2017-07-17T15:21:53.733 回答