我有一个包含 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)
默认情况下,为每个组分配的扇区(饼图)大小与链接数成正比。
> 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
但对于扇区来说却不多。有没有办法做到这一点?