我想在R中创建双向网络。例如,如果您有两种物种的data.frame(只能跨物种交互,而不能在物种内部交互),并且每个物种都有一个特征值(例如,捕食者的嘴允许谁吃到哪种猎物),我们如何基于物种的特征模拟网络(也就是说,两个物种只有在其特征重叠时才能相互作用)?

更新:这是我要做什么的一个最小示例。 1)建立系统树; 2)在系统发育上模拟性状; 3)根据物种特征值创建网络。

# packages
install.packages(c("ape","phytools"))
library(ape); library(phytools)

# Make phylogenetic trees
tree_predator <- rcoal(10)
tree_prey <- rcoal(10)

# Simulate traits on each tree
trait_predator <- fastBM(tree_predator)
trait_prey <- fastBM(tree_prey)

# Create network of predator and prey
## This is the part I can't do yet. I want to create bipartite networks, where
## predator and prey interact based on certain crriteria. For example, predator
## species A and prey species B only interact if their body size ratio is
## greater than X.

最佳答案

答案的格式实际上取决于您下一步要做什么,但是尝试一下:

set.seed(101)
npred <- nprey <- 10
tree_predator <- rcoal(npred)
tree_prey <- rcoal(nprey)

## Simulate traits on each tree
trait_predator <- fastBM(tree_predator)
trait_prey <- fastBM(tree_prey)


(我使用set.seed(101)来实现可重复性,所以这些是我的特质结果...

> trait_predator
         t1          t9          t4          t8          t5          t2
-2.30933392 -3.17387148 -0.01447305 -0.01293273 -0.25483749  1.87279355
         t6         t10          t3          t7
 0.70646610  0.79508740  0.05293099  0.00774235
> trait_prey
         t10           t7           t9           t6           t8           t1
 0.849256948 -0.790261142  0.305520218 -0.182596793 -0.033589511 -0.001545289
          t4           t5           t3           t2
-0.312790794  0.475377720 -0.222128629 -0.095045954


...)

您生成的值在无限制的空间中,因此获取它们的比率实际上没有任何意义。我们假设它们是大小的对数,因此exp(x-y)是捕食者/猎物的大小比。任意地,我假定截止值为1.5 ...

使用outer比较所有捕食者与猎物的特征:这将创建一个二进制(0/1)矩阵。

bmatrix <- outer(trait_predator,trait_prey,
      function(x,y) as.numeric(exp(x-y)>1.5))


可视化结果的一种方法...

library(Matrix)
image(Matrix(bmatrix),xlab="Prey",ylab="Predator",sub="")




例如,您可以看到捕食者#6(在上面的输出中标记为t2)确实很大(日志大小= 1.87),因此它吞噬了所有猎物。

使用igraph(这里的某些方法有些怪异)

library(igraph)

edges <- which(bmatrix==1,arr.ind=TRUE)  ## extract vertex numbers
## distinguish prey (columns) from pred (rows)
edges[,2] <- npred+edges[,2]

gg <- graph.bipartite(rep(1:0,c(npred,nprey)),
             c(t(edges)))
## c(t(edges)) collapses the two-column matrix to a vector in row order ...
## now plot ...
plot(gg,vertex.color=rep(c("cyan","pink"),c(npred,nprey)),
     edge.arrow.mode=">")


这与上面的矩阵格式匹配-捕食者1和2(=顶点1和2)不吃任何东西,猎物2(=顶点12)被许多不同的捕食者吃掉...这种表示法更漂亮,但不一定更清晰(例如,捕食者7和8都吃猎物2(顶点12),但它们的箭头重合)。但是,如果要应用图论方法,则以igraph形式显示它可能会很好(并且有很多布局选项可以绘制图)。

08-24 16:02