2015-10-19 60 views
1

对不起,因为我觉得这个疑问应该更简单,但我找不到满意的答案。如何从两个双边网络建立定向三方网络?

我有两个定量的二分网络(显示A-B和B-C之间的生态关系)。我的问题是,我不知道为了建立定向的定量三方网络(如典型的食物网),如何加入这两个网络。 每个二分网络的B级具有相同的顶点组成(以数量和顶点名称)。另外,级别A和C不能相互影响。因此,最终三方网络的顺序和方向应该是C-> B-> A

有什么建议吗?

感谢您的关注!

+0

我对你如何写方向性感到困惑......你能提供一个(玩具)数据的例子吗? –

+0

您好, 起初,我有两个二分网络: 例如: 偶网络1探讨植物虫害(A-B)之间的关系。双向网络2探索草食动物捕食者(B-C)之间的关系。 我想获得一个代表A,B,C之间关系的新矩阵。 由于捕食者只能食草动物,而食草动物只能以植物为食(食肉动物不可能以食草动物为食,或食草动物以食肉动物为食),所以我需要一个定向网络(如食物网)。 请点击链接查看玩具数据。 [链接] https://goo.gl/Gc9tMF –

回答

2

如何:

库克,一些数据(我希望你会做饭对我来说:))

library(igraph) 
set.seed(666) 
# herbivore-plant 
m_hp <- matrix(rbinom(12, 10, p=0.2), 4, 3) 
dimnames(m_hp) <- list(
    consuming=paste0("h", seq(1, nrow(m_hp))), 
    consumed=paste0("p", seq(1, ncol(m_hp))) 
) 
# carnivore-herbivore 
m_ch <- matrix(rbinom(20, 10, p=0.2), 5, 4) 
dimnames(m_ch) <- list(
    consuming=paste0("c", seq(1, nrow(m_ch))), 
    consumed=paste0("h", seq(1, ncol(m_ch))) 
) 

...所以它看起来像你(我相信):

m_hp 

##   consumed 
## consuming p1 p2 p3 
##  h1 3 1 0 
##  h2 1 3 1 
##  h3 5 5 3 
##  h4 1 2 0 

m_ch 

##   consumed 
## consuming h1 h2 h3 h4 
##  c1 0 4 0 2 
##  c2 1 2 1 2 
##  c3 1 2 3 3 
##  c4 3 5 1 2 
##  c5 0 2 0 2 

现在通过edgelists把他们变成的igraph对象

el_hp <- as.data.frame(as.table(m_hp), stringsAsFactors = FALSE) 
el_ch <- as.data.frame(as.table(m_ch), stringsAsFactors = FALSE) 
el <- rbind(el_hp, el_ch) 
g <- graph.data.frame(el[el$Freq != 0 , ] ) 
V(g)$type <- substr(V(g)$name, 1, 1) 

联合网络的邻接矩阵:

get.adjacency(g, sparse=FALSE, attr="Freq") 

## h1 h2 h3 h4 c2 c3 c4 c1 c5 p1 p2 p3 
## h1 0 0 0 0 0 0 0 0 0 3 1 0 
## h2 0 0 0 0 0 0 0 0 0 1 3 1 
## h3 0 0 0 0 0 0 0 0 0 5 5 3 
## h4 0 0 0 0 0 0 0 0 0 1 2 0 
## c2 1 2 1 2 0 0 0 0 0 0 0 0 
## c3 1 2 3 3 0 0 0 0 0 0 0 0 
## c4 3 5 1 2 0 0 0 0 0 0 0 0 
## c1 0 4 0 2 0 0 0 0 0 0 0 0 
## c5 0 2 0 2 0 0 0 0 0 0 0 0 
## p1 0 0 0 0 0 0 0 0 0 0 0 0 
## p2 0 0 0 0 0 0 0 0 0 0 0 0 
## p3 0 0 0 0 0 0 0 0 0 0 0 0 

图形

t <- match(V(g)$type, c("p", "h", "c")) 
plot(g, vertex.color=t) 

enter image description here

甚至

l <- layout_with_fr(g, miny=t, maxy=t ) 
plot(g, vertex.color=t, layout=l, edge.width=E(g)$Freq) 

enter image description here