从igraph网络中删除弱相关性(顶点和边)

4

我需要从相关矩阵中绘制一个网络图。 我的数据是一个小子集:

Taxon                                                          CD1         CD2
Actinomycetaceae;g__Actinomyces                        0.072998825 0.031399459
Coriobacteriaceae;g__Atopobium                         0.040946468 0.002703265
Corynebacteriaceae;g__Corynebacterium                  0.002517201 0.006446247
Micrococcaceae;g__Rothia                               0.001174694 0.002703265
Porphyromonadaceae;g__Porphyromonas                    0.023326061 0.114368892
Prevotellaceae;g__Prevotella                           0.252894781 0.102308172
Flavobacteriaceae;g__Capnocytophaga                    0.001174694 0.029320025
Aerococcaceae;g__Abiotrophia                           0.002013761 0.003327095
Carnobacteriaceae;g__Granulicatella                    0.042960228 0.049490539
Gemellaceae;g__Gemella                                 0.027857023 0.067165731
Streptococcaceae;g__Streptococcus                      0.220506796 0.182782283
ClostridialesFamilyXI.IncertaeSedis;g__                0.000000000 0.000623830
ClostridialesFamilyXIII.IncertaeSedis;g__Mogibacterium 0.006880349 0.002495321
Lachnospiraceae;Other                                  0.000335627 0.000831774
Clostridia                                             0.004363148 0.002079434
Lachnospiraceae;g__Oribacterium                        0.003524081 0.002079434
Peptostreptococcaceae;g__Peptostreptococcus            0.000167813 0.005198586
Veillonellaceae;Other                                  0.001342507 0.001455604
Veillonellaceae;g__Veillonella                         0.047323376 0.082553545
Fusobacteriaceae;g__Fusobacterium                      0.009229737 0.010813059
Fusobacteriaceae;g__Leptotrichia                       0.092465179 0.076523186
Neisseriaceae;g__Neisseria                             0.013592885 0.027656477
Pasteurellaceae;g__Haemophilus                         0.014431952 0.092534831
SR1;c__;f__;g__                                        0.000000000 0.002079434
TM7;c__TM7-3;f__;g__                                   0.065782849 0.018299023
Erysipelotrichaceae;g__Bulleidia                       0.007551603 0.004366812
Bacteroidia                                            0.000000000 0.000415887
Porphyromonadaceae;g__Tannerella                       0.000671254 0.002079434
Flavobacteriaceae                                      0.002013761 0.001247661
Bacilli                                                0.002181574 0.002911208
Clostridia;f__;g__                                     0.000671254 0.002703265
ClostridialesFamilyXIII.IncertaeSedis;g__Eubacterium   0.003020641 0.002079434
Lachnospiraceae;g__Moryella                            0.003188454 0.000623830
Veillonellaceae;g__Selenomonas                         0.004866588 0.021834061
Fusobacteriaceae                                       0.000335627 0.001871491
Campylobacteraceae;g__Campylobacter                    0.001510321 0.001247661
Pasteurellaceae;g__Actinobacillus                      0.002852828 0.000207943
Burkholderiaceae;g__Lautropia                          0.000000000 0.002495321
Lactobacillaceae;g__Lactobacillus                      0.000000000 0.000000000
Staphylococcaceae;g__Staphylococcus                    0.000000000 0.000000000

这是我所做的:


library(vegan)
library(psych)

mydata <- read.csv(file="L5_filt.txt", header=T, row.names=1, sep="\t")
mydata_t <- t(as.matrix(mydata))
graph.f<-graph.adjacency(cor.matrix$r, weighted=TRUE, mode="upper")

t.names <- colnames(cor.matrix)[as.numeric(V(t.graph)$name)]
graph.f = simplify(graph.f)

我希望只绘制强相关性(>+0.6和<-0.6)。 我想使用不同的颜色来表示正相关和负相关的边缘!

E(graph.f)[weight < 0.6 & weight > -0.6]$width<-0
E(graph.f)[weight > 0.6]$width<-2.5
E(graph.f)[weight < -0.6]$width<-2.5
E(graph.f)[weight > 0.6]$color<-"red"
E(graph.f)[weight < -0.6]$color<-"green"

par(mai=c(1,1,0.1,0.15), mar=c(1, 0, 1, 1), mgp=c(2,1,0), mfrow=c(1,2), cex=0.7, lwd=0.5)
plot (graph.f, vertex.size=5, vertex.shape="circle", vertex.label.color="red", 
    vertex.label=t.names, vertex.label.cex=0.9, layout=layout.fruchterman.reingold)

结果非常接近我想要的,但我不知道如何从图中删除具有弱相关性的顶点(我指的是与我设置为width=0的边相关的节点)以及这些顶点的名称。

我该如何修改我的代码?

谢谢!


我们没有您的数据文件,所以您能否使用一个简单的数据集制作一个示例,展示您拥有什么以及您想要得到什么? - Spacedman
这是一个与那个问题有点相关的进展。但无论如何,这都不是一个好问题。 - Spacedman
可能是r igraph:从2组向量中删除边缘的重复问题。 - Tyler Rinker
1个回答

20

如果我理解您的问题正确的话...

首先删除所有与您条件匹配的边。

然后删除所有没有邻居的顶点。

使用随机数据创建可重现的示例,其中我不想绘制小于0.1的相关性:

set.seed(999);mydata=matrix(runif(24),ncol=2)
rownames(mydata)=LETTERS[1:12]
g=graph.adjacency(cov(t(mydata)),weighted=TRUE)
plot(g)

这是一个有12个顶点的完全图。
g=delete.edges(g, which(E(g)$weight <=.1)) # here's my condition.
plot(g)

那会留下一个只有几个孤立顶点的细长图形。
g=delete.vertices(g,which(degree(g)<1))
plot(g)

清除那些东西。

如何删除正值和负值?因此,在您的示例中,两个相关性都低于0.1且高于-0.1(但低于0)都会被删除? - Francesca de Filippis
1
将其更改为 abs(previous_quantity) < 0.1。 - Dason
我需要在哪里添加这个? - Francesca de Filippis
1
在删除顶点和绘图之前,任何时候都应该正常工作。为要删除的边创建一个TRUE/FALSE向量,然后将其包装在which中并使用它。对于您来说,我认为是which(abs(E(g)$weight) < 0.6) - 使用abs简化查询。 - Spacedman
成功了!你知道怎么根据一些组来给我的节点上色吗?比如把我的节点分成A、B、C三组,然后用不同的颜色来标识它们... - Francesca de Filippis
是时候提出一个新问题了,请尽量使用简单的数据集,以便我们都可以使用相同的数据。 - Spacedman

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接